Skip to content

docs: agent operations roadmap + telemetry plan - #26

Merged
wren-nutthouse merged 14 commits into
mainfrom
roadmap/agent-ops-telemetry
Mar 16, 2026
Merged

docs: agent operations roadmap + telemetry plan#26
wren-nutthouse merged 14 commits into
mainfrom
roadmap/agent-ops-telemetry

Conversation

@nutt-adam

@nutt-adam nutt-adam commented Mar 15, 2026

Copy link
Copy Markdown
Contributor

Adds docs/AGENT_OPS_ROADMAP.md with a prioritized 10-item roadmap plus telemetry/activation instrumentation plan.

Summary by CodeRabbit

  • Documentation

    • Added an Agent Operations Roadmap and a Codex SDLC Orchestration guide with priorities, 8‑week sequencing, telemetry planning (North Star metric, event taxonomy, deliverables), safety guidelines, runbook notes, prerequisites, and success criteria.
    • Added an example workspace configuration demonstrating Codex-driven SDLC automation and workflows.
  • New Features

    • Added automation utilities to select issues, create branches, verify branch changes, open PRs, wait for automated checks, and collect automated review feedback.
    • Added a GitHub Actions workflow to run smoke or full SDLC automation from the repository.

@coderabbitai

coderabbitai Bot commented Mar 15, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: b991541e-76de-42cb-827d-4f1a2ddaa123

📥 Commits

Reviewing files that changed from the base of the PR and between 6ff9e88 and c53d7db.

📒 Files selected for processing (2)
  • scripts/automation/collect_coderabbit_feedback.sh
  • scripts/automation/wait_coderabbit.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • scripts/automation/collect_coderabbit_feedback.sh
  • scripts/automation/wait_coderabbit.sh

📝 Walkthrough

Walkthrough

Adds agent-ops roadmap and Codex SDLC orchestration docs and examples; introduces automation tooling (issue selection, branch creation, PR creation/verification, branch validation, CodeRabbit polling and feedback collection), a GitHub Actions orchestrator, and supporting Bash/Python scripts to run SDLC workflows.

Changes

Cohort / File(s) Summary
Roadmap doc
docs/AGENT_OPS_ROADMAP.md
New agent-operations roadmap describing goals, priorities (P0/P1), telemetry taxonomy, 8-week sequencing, and success criteria.
SDLC docs & example workspace
docs/CODEX_SDLC_ORCHESTRATION.md, docs/examples/tutti-codex-sdlc.toml
New Codex SDLC orchestration guide and TOML workspace defining agents, workflows (sdlc-smoke, sdlc-auto), step triggers, prompts, timeouts, fail modes, runbook, and safety guidance.
Automation — selection & branch
scripts/automation/select_issue.sh, scripts/automation/create_issue_branch.sh
New scripts to select an open labeled issue, claim it, and create a timestamped feature branch, emitting JSON state files.
Automation — PR & branch checks
scripts/automation/open_or_create_pr.py, scripts/automation/verify_branch_has_changes.py
New Python helpers to open/create PRs for a branch and verify the branch contains commits relative to origin/main.
Automation — CodeRabbit integration
scripts/automation/wait_coderabbit.sh, scripts/automation/wait_and_collect_coderabbit.py, scripts/automation/collect_coderabbit_feedback.sh
New polling and orchestration for CodeRabbit checks: wait for check completion with structured JSON status/exit codes, collect/filter CodeRabbit comments/reviews into a Markdown report, and a Python orchestrator to wire waiting + collection.
CI orchestration
.github/workflows/sdlc-orchestrator.yml
New GitHub Actions workflow "Tutti SDLC Orchestrator" (workflow_dispatch) to run smoke or auto modes: setup, preflight tests, copy workspace config, and invoke chosen SDLC workflow with conditional steps.

Sequence Diagram(s)

sequenceDiagram
    participant User as "User"
    participant GHAction as "GitHub Actions\nOrchestrator"
    participant Runner as "Runner\n(scripts)"
    participant Agents as "Codex Agents"
    participant GitHub as "GitHub API / PRs / Checks"

    User->>GHAction: trigger workflow (mode, issue_label)
    GHAction->>Runner: run `select_issue.sh`
    Runner->>GitHub: list/edit issues (gh)
    GitHub-->>Runner: selected issue JSON
    Runner->>GHAction: selected_issue.json

    GHAction->>Runner: run `create_issue_branch.sh`
    Runner->>GitHub: fetch/create branch
    GitHub-->>Runner: branch created
    Runner->>GHAction: branch.json

    GHAction->>Agents: run SDLC workflow (sdlc-auto/sdlc-smoke)
    Agents-->>Runner: produce changes on branch
    Runner->>GHAction: files/commit results

    GHAction->>Runner: run `open_or_create_pr.py`
    Runner->>GitHub: create/list PR
    GitHub-->>Runner: PR number

    GHAction->>Runner: run `wait_coderabbit.sh`
    Runner->>GitHub: poll status checks for CodeRabbit
    GitHub-->>Runner: check results (pass/fail/timeout)
    Runner->>GHAction: coderabbit_status.json

    alt CodeRabbit feedback present
        GHAction->>Runner: run `collect_coderabbit_feedback.sh`
        Runner->>GitHub: fetch comments & reviews
        Runner-->>GHAction: coderabbit-feedback.md
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I nibbled issues, named a branch in bloom,

Agents hummed plans and pushed out a room,
CodeRabbit chattered, left notes in the night,
I gathered them tidy, each comment in sight,
Hop—automation stitched the SDLC bright.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'docs: agent operations roadmap + telemetry plan' accurately and concisely describes the main changes: adding documentation for an agent operations roadmap and telemetry plan, which is the primary focus of the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch roadmap/agent-ops-telemetry
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

Rust Clippy can be used to improve the quality of Rust code reviews.

Clippy is the official Rust linter. It provides lints to catch common mistakes and improve your Rust code.

To configure Clippy, add a clippy.toml file to your project root.

See Clippy Documentation for more details.

coderabbitai[bot]
coderabbitai Bot previously requested changes Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
docs/AGENT_OPS_ROADMAP.md (2)

50-50: Consider markdown-safe formatting for time duration.

The <30 min notation may render inconsistently in some markdown parsers due to the less-than symbol being interpreted as an HTML tag start.

📝 Suggested formatting alternatives
-   - <30 min time-to-first-value path
+   - Under 30 min time-to-first-value path

or

-   - <30 min time-to-first-value path
+   - < 30 min time-to-first-value path
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/AGENT_OPS_ROADMAP.md` at line 50, The markdown line containing "<30 min
time-to-first-value path" can be misinterpreted as an HTML tag; update that
token to a markdown-safe form such as "Under 30 min time-to-first-value path",
"`<30 min` time-to-first-value path" (wrap in backticks), or replace "<" with
the HTML entity "&lt;" so the text renders consistently across parsers; modify
the literal "<30 min time-to-first-value path" accordingly.

87-91: Consider adding quantifiable success metrics.

The success criteria are primarily qualitative. While appropriate for a strategic roadmap, adding specific measurable targets would make it easier to track progress and declare success objectively.

Examples of quantifiable metrics:

  • Activation: "≥ 60% of installs reach first successful workflow within 24h"
  • Reliability: "Run failure rate < 5% and MTTR < 2 hours"
  • Adoption: "≥ 3 production-ready templates with documented use cases"
  • Retention: "D7 retention ≥ 40%"

These can supplement the existing qualitative criteria.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/AGENT_OPS_ROADMAP.md` around lines 87 - 91, Update the "Success
criteria" section to include specific, measurable targets alongside the
qualitative bullets: under the "Success criteria" heading add numeric goals for
Activation (e.g., "≥ 60% of installs reach first successful workflow within
24h"), Reliability (e.g., "Run failure rate < 5% and MTTR < 2 hours"), Adoption
(e.g., "≥ 3 production-ready templates with documented use cases"), and
Retention (e.g., "D7 retention ≥ 40%"); ensure each existing qualitative item is
supplemented with a corresponding quantifiable metric so progress can be
objectively tracked.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/AGENT_OPS_ROADMAP.md`:
- Line 88: The success criterion line "Activation >= target baseline and
trending up" lacks a concrete baseline; update that line to either include a
specific numeric target (for example "Activation >= 60% within 24h") or
explicitly reference where/when the baseline will be defined (for example
"Activation >= target baseline [to be defined after initial 2-week data
collection] and trending up"); make the chosen approach clear in the document so
the activation metric in AGENT_OPS_ROADMAP.md is measurable and tied to a stated
baseline or process for establishing it.
- Around line 67-72: The event instrumentation section lacks explicit PII
boundaries; update the Event instrumentation block to list for each event (e.g.,
tutti_install_started, tutti_install_completed, first_workspace_created,
first_up_success, first_send, first_workflow_run) the allowed data fields,
explicit exclusions (e.g., no workspace names, user emails, full message
content), and the required hashing/anonymization scheme for identifiers (salted
hash or one-way pseudonymization) plus retention rules and examples of safe
fields (counts, booleans, timestamps). Ensure the note references the
outcome/failure categories (routing/tool/model/policy) and DAW/cohort metrics so
implementers know how to record those without PII, and add a short line pointing
to the "Redaction/privacy defaults" deliverable for enforcement and verification
steps.

---

Nitpick comments:
In `@docs/AGENT_OPS_ROADMAP.md`:
- Line 50: The markdown line containing "<30 min time-to-first-value path" can
be misinterpreted as an HTML tag; update that token to a markdown-safe form such
as "Under 30 min time-to-first-value path", "`<30 min` time-to-first-value path"
(wrap in backticks), or replace "<" with the HTML entity "&lt;" so the text
renders consistently across parsers; modify the literal "<30 min
time-to-first-value path" accordingly.
- Around line 87-91: Update the "Success criteria" section to include specific,
measurable targets alongside the qualitative bullets: under the "Success
criteria" heading add numeric goals for Activation (e.g., "≥ 60% of installs
reach first successful workflow within 24h"), Reliability (e.g., "Run failure
rate < 5% and MTTR < 2 hours"), Adoption (e.g., "≥ 3 production-ready templates
with documented use cases"), and Retention (e.g., "D7 retention ≥ 40%"); ensure
each existing qualitative item is supplemented with a corresponding quantifiable
metric so progress can be objectively tracked.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 314fc895-3489-4f26-a55a-7b4df5ed69db

📥 Commits

Reviewing files that changed from the base of the PR and between 3344c80 and e936e8b.

📒 Files selected for processing (1)
  • docs/AGENT_OPS_ROADMAP.md

Comment thread docs/AGENT_OPS_ROADMAP.md
Comment thread docs/AGENT_OPS_ROADMAP.md Outdated
coderabbitai[bot]
coderabbitai Bot previously requested changes Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/examples/tutti-codex-sdlc.toml`:
- Around line 87-100: The current wait_coderabbit step's Python run block uses
subprocess.check_call to invoke wait_coderabbit.sh which raises
CalledProcessError on 'fail' or 'timeout' and prevents
collect_coderabbit_feedback.sh from running; change the invocation in the Python
here-doc so wait_coderabbit.sh is executed without raising on non-zero exit
(e.g., use subprocess.run([...], check=False) or wrap
subprocess.check_call([...]) in try/except and continue), ensuring
collect_coderabbit_feedback.sh always runs afterward; update the references in
the same block (the calls to wait_coderabbit.sh and
collect_coderabbit_feedback.sh) so the feedback markdown is collected regardless
of wait_coderabbit.sh exit status.
- Around line 49-74: The implement prompt will commit to the wrong branch
because ensure_conductor initializes the conductor worktree on tutti/conductor
while create_branch runs in the project root and does not switch the conductor's
worktree; fix by either scoping the create_branch step to the conductor agent
(add agent = "conductor" to the [[workflow.step]] with id = "create_branch" so
the branch is created in the conductor worktree), or modify the implement prompt
(id = "implement") to explicitly run a git checkout to the branch from
.tutti/state/auto/branch.json before making changes, committing, and pushing.

In `@scripts/automation/collect_coderabbit_feedback.sh`:
- Around line 13-15: The script currently assigns DATA from gh pr view (variable
DATA) and pipes it into the Python heredoc (python3 <<'PY' "$OUT_FILE" "$DATA"),
but gh pr view --json comments,reviews omits inline diff comments; call gh api
repos/{owner}/{repo}/pulls/{pull_number}/comments (store in a new variable like
INLINE_COMMENTS) and merge or package both RESULTS (DATA and INLINE_COMMENTS)
into a single JSON/markdown payload passed to the Python block so the heredoc
receives inline review comments as well as conversation comments; update
references to DATA in the heredoc invocation (or pass a second arg) and adjust
the Python input handling so it consumes the combined data.

In `@scripts/automation/select_issue.sh`:
- Around line 13-33: The script currently picks the first matching open issue
but never reserves it, allowing duplicates; modify the Python selection to
filter out issues already labeled e.g. "automation-claimed" (change the items
parsing to exclude any issue where "automation-claimed" is in issue["labels"])
and after selecting issue (after building payload) call the GH CLI to reserve it
(run gh issue edit <issue_number> --add-label "automation-claimed") so
concurrent or re-run workflows skip claimed issues; update references in this
script (the JSON variable, the python block that defines items/issue/payload) to
implement both the filter and the post-selection label-add.

In `@scripts/automation/wait_coderabbit.sh`:
- Around line 44-49: The current logic computes states and then treats anything
not in the `bad` list as PASS; change it to whitelist accepted conclusions
instead: keep the existing `states` and the pending check (`any(s != "COMPLETED"
for s,_ in states)`), but replace the `bad` computation with a check for any
completed conclusion not in an explicit allowlist (e.g., define `allowed =
("SUCCESS",)` and compute `bad = [x for x in states if x[1] not in allowed]`),
then print "FAIL" if `bad` else "PASS" so only whitelisted conclusions produce
PASS; update references to `states` and `bad` accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 9b4f876b-42ad-4c99-b239-9c41378b7ead

📥 Commits

Reviewing files that changed from the base of the PR and between e936e8b and ad6f468.

📒 Files selected for processing (6)
  • docs/CODEX_SDLC_ORCHESTRATION.md
  • docs/examples/tutti-codex-sdlc.toml
  • scripts/automation/collect_coderabbit_feedback.sh
  • scripts/automation/create_issue_branch.sh
  • scripts/automation/select_issue.sh
  • scripts/automation/wait_coderabbit.sh
✅ Files skipped from review due to trivial changes (1)
  • docs/CODEX_SDLC_ORCHESTRATION.md

Comment thread docs/examples/tutti-codex-sdlc.toml
Comment thread docs/examples/tutti-codex-sdlc.toml Outdated
Comment thread scripts/automation/collect_coderabbit_feedback.sh Outdated
Comment thread scripts/automation/select_issue.sh Outdated
Comment thread scripts/automation/wait_coderabbit.sh
coderabbitai[bot]
coderabbitai Bot previously requested changes Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
.github/workflows/sdlc-orchestrator.yml (1)

56-59: Prefer environment variables for input interpolation.

Passing ${{ inputs.issue_label }} directly in the run: block can be fragile with special characters. Using an environment variable is a safer pattern.

♻️ Suggested improvement
       env:
         GH_TOKEN: ${{ github.token }}
+        ISSUE_LABEL: ${{ inputs.issue_label }}
       run: |
-        scripts/automation/select_issue.sh .tutti/state/auto/selected_issue.json "${{ inputs.issue_label }}"
+        mkdir -p .tutti/state/auto
+        scripts/automation/select_issue.sh .tutti/state/auto/selected_issue.json "$ISSUE_LABEL"
         cargo run --quiet -- run sdlc-smoke --strict
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/sdlc-orchestrator.yml around lines 56 - 59, The run block
is interpolating ${{ inputs.issue_label }} directly which can break with special
characters; set an environment variable (e.g., ISSUE_LABEL) from inputs and
reference that variable inside the run step instead of inline
interpolation—update the step to export ISSUE_LABEL from inputs.issue_label and
call scripts/automation/select_issue.sh .tutti/state/auto/selected_issue.json
"$ISSUE_LABEL" (and keep GH_TOKEN as-is); this change affects the run invocation
that calls select_issue.sh and uses inputs.issue_label.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/sdlc-orchestrator.yml:
- Around line 44-48: The workflow step name "Install gh auth" is misleading
because the step only runs the command `gh auth status`; rename the step (change
the value of the name key) to something accurate like "Verify gh auth" or "Check
gh authentication" and keep the existing env GH_TOKEN and run command `gh auth
status` intact so the intent matches the step name.
- Around line 66-72: The Run full auto workflow step currently calls
scripts/automation/select_issue.sh with a path
.tutti/state/auto/selected_issue.json and an inputs.issue_label directly; update
the step to first create the target directory (mkdir -p .tutti/state/auto)
before invoking the script, and change the label argument to use an environment
variable (e.g., ISSUE_LABEL) by adding env: ISSUE_LABEL: ${{ inputs.issue_label
}} and passing "$ISSUE_LABEL" to scripts/automation/select_issue.sh so the
script receives the label via env variable and the directory always exists.
- Around line 57-59: The workflow fails when select_issue.sh writes to
.tutti/state/auto/selected_issue.json because the parent directory may not
exist; update the writer to ensure the parent directory is created before
opening the file (in the shell-based select_issue.sh create the parent directory
for the target path, or in the Python code that calls open(out, "w") call
os.makedirs on dirname(out) with exist_ok=True) so the open(out, "w") no longer
raises FileNotFoundError.

---

Nitpick comments:
In @.github/workflows/sdlc-orchestrator.yml:
- Around line 56-59: The run block is interpolating ${{ inputs.issue_label }}
directly which can break with special characters; set an environment variable
(e.g., ISSUE_LABEL) from inputs and reference that variable inside the run step
instead of inline interpolation—update the step to export ISSUE_LABEL from
inputs.issue_label and call scripts/automation/select_issue.sh
.tutti/state/auto/selected_issue.json "$ISSUE_LABEL" (and keep GH_TOKEN as-is);
this change affects the run invocation that calls select_issue.sh and uses
inputs.issue_label.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 88cb46cd-1070-441f-acea-8084c400592e

📥 Commits

Reviewing files that changed from the base of the PR and between ad6f468 and 501d8e4.

📒 Files selected for processing (1)
  • .github/workflows/sdlc-orchestrator.yml

Comment thread .github/workflows/sdlc-orchestrator.yml Outdated
Comment thread .github/workflows/sdlc-orchestrator.yml
Comment thread .github/workflows/sdlc-orchestrator.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
docs/examples/tutti-codex-sdlc.toml (1)

181-185: ⚠️ Potential issue | 🟠 Major

Feedback collection still bypassed on CodeRabbit failure.

The Python script at line 184 uses subprocess.check_call for wait_coderabbit.sh, which raises CalledProcessError on non-zero exit (fail/timeout). This prevents collect_coderabbit_feedback.sh from running, leaving .tutti/state/auto/coderabbit-feedback.md missing when the apply_coderabbit_feedback step tries to inject it.

Use subprocess.run(..., check=False) or wrap in try/except to ensure feedback is always collected:

🛠️ Proposed fix
-run = "python3 - <<'PY'\nimport subprocess,json\nbranch=json.load(open('.tutti/state/auto/branch.json'))['branch']\nout=subprocess.check_output(['gh','pr','list','--state','open','--head',branch,'--json','number'], text=True)\npr=json.loads(out)[0]['number']\nsubprocess.check_call(['scripts/automation/wait_coderabbit.sh',str(pr),'45','.tutti/state/auto/coderabbit_status.json'])\nsubprocess.check_call(['scripts/automation/collect_coderabbit_feedback.sh',str(pr),'.tutti/state/auto/coderabbit-feedback.md'])\nPY"
+run = "python3 - <<'PY'\nimport subprocess,json,sys\nbranch=json.load(open('.tutti/state/auto/branch.json'))['branch']\nout=subprocess.check_output(['gh','pr','list','--state','open','--head',branch,'--json','number'], text=True)\npr=json.loads(out)[0]['number']\nwait_result=subprocess.run(['scripts/automation/wait_coderabbit.sh',str(pr),'45','.tutti/state/auto/coderabbit_status.json'])\nsubprocess.check_call(['scripts/automation/collect_coderabbit_feedback.sh',str(pr),'.tutti/state/auto/coderabbit-feedback.md'])\nsys.exit(wait_result.returncode)\nPY"

,

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/examples/tutti-codex-sdlc.toml` around lines 181 - 185, The inline
Python step "wait_coderabbit" currently uses subprocess.check_call for
'scripts/automation/wait_coderabbit.sh' which raises CalledProcessError and
aborts before 'scripts/automation/collect_coderabbit_feedback.sh' runs; update
the inline script to either (a) call subprocess.run([...], check=False) for
wait_coderabbit.sh so the script continues regardless of non-zero exit, or (b)
wrap the check_call in try/except (catch subprocess.CalledProcessError) and
ensure the except block still invokes
subprocess.check_call(['scripts/automation/collect_coderabbit_feedback.sh',
str(pr), '.tutti/state/auto/coderabbit-feedback.md']) and optionally write a
failure marker to '.tutti/state/auto/coderabbit_status.json' so downstream
apply_coderabbit_feedback has a deterministic file to read.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@docs/examples/tutti-codex-sdlc.toml`:
- Around line 181-185: The inline Python step "wait_coderabbit" currently uses
subprocess.check_call for 'scripts/automation/wait_coderabbit.sh' which raises
CalledProcessError and aborts before
'scripts/automation/collect_coderabbit_feedback.sh' runs; update the inline
script to either (a) call subprocess.run([...], check=False) for
wait_coderabbit.sh so the script continues regardless of non-zero exit, or (b)
wrap the check_call in try/except (catch subprocess.CalledProcessError) and
ensure the except block still invokes
subprocess.check_call(['scripts/automation/collect_coderabbit_feedback.sh',
str(pr), '.tutti/state/auto/coderabbit-feedback.md']) and optionally write a
failure marker to '.tutti/state/auto/coderabbit_status.json' so downstream
apply_coderabbit_feedback has a deterministic file to read.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 9438a22a-f458-4b68-8e0d-ebcf7fcb58e1

📥 Commits

Reviewing files that changed from the base of the PR and between 501d8e4 and c48b1ac.

📒 Files selected for processing (2)
  • docs/CODEX_SDLC_ORCHESTRATION.md
  • docs/examples/tutti-codex-sdlc.toml
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/CODEX_SDLC_ORCHESTRATION.md

@nutt-adam

Copy link
Copy Markdown
Contributor Author

Follow-up with clean formatting (previous comment had shell-escaping artifacts).

Addressed review feedback in 916ab11

Fixed

  • wait_coderabbit now always collects CodeRabbit feedback before propagating status (no more feedback bypass on non-zero wait exit).
  • select_issue.sh now claims work by adding automation-claimed, skips already-claimed issues, and selects deterministically (oldest unclaimed).
  • Roadmap doc updates:
    • replaced markdown-fragile "<30 min" phrasing
    • added concrete, measurable success criteria
    • added explicit telemetry PII boundaries (allowed fields, exclusions, pseudonymization, retention).
  • Workflow hygiene updates:
    • renamed auth step to Verify gh auth
    • use ISSUE_LABEL env var instead of inline interpolation
    • ensure .tutti/state/auto directory exists before issue selection
    • raised workflow issues permission to write so issue-claim labeling works in automation.

Will merge once checks are green.

coderabbitai[bot]
coderabbitai Bot previously requested changes Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
scripts/automation/select_issue.sh (1)

36-42: ⚠️ Potential issue | 🟡 Minor

Consider atomic write or cleanup on claim failure.

If gh issue edit fails after the payload is written (line 36-37), the script exits but leaves selected_issue.json on disk with an unclaimed issue. A subsequent manual or partial re-run could pick up stale state.

Consider either:

  • Writing to a temp file and renaming atomically after successful claim
  • Removing the output file on claim failure
🛡️ Suggested fix using atomic rename
-with open(out, "w", encoding="utf-8") as f:
-    json.dump(payload, f, indent=2)
+import tempfile, os
+tmp = out + ".tmp"
+with open(tmp, "w", encoding="utf-8") as f:
+    json.dump(payload, f, indent=2)
 print(issue["number"])
 PY
 )
 
 gh issue edit "$ISSUE_NUM" --repo "$REPO" --add-label "automation-claimed" >/dev/null
+
+# Finalize output only after successful claim
+mv "${OUT_FILE}.tmp" "$OUT_FILE"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/automation/select_issue.sh` around lines 36 - 42, The script writes
the claim payload to the output file (variable out / selected_issue.json) before
running gh issue edit, leaving a stale file on failures; change the flow in
select_issue.sh to write to a temporary file (e.g., out.tmp) and only atomically
rename it to the final out after gh issue edit succeeds, or alternatively trap
failures and remove the created out file if gh issue edit("$ISSUE_NUM") exits
non‑zero; update the block around json.dump/write (the lines that open out and
print issue["number"]) and the gh issue edit invocation to implement the
temp-and-rename or cleanup on error so stale selected_issue.json is never left
behind.
docs/examples/tutti-codex-sdlc.toml (1)

115-119: ⚠️ Potential issue | 🟠 Major

Branch creation is not bound to the implementer worktree, so commits can land on the wrong branch.

Line 116-119 creates the issue branch without an agent, while Line 133-140 asks the implementer agent to commit/push. This can desync branch state between workspace and implementer worktree.

Proposed fix
 [[workflow.step]]
 id = "create_branch"
 type = "command"
+agent = "implementer"
 run = "scripts/automation/create_issue_branch.sh .tutti/state/auto/selected_issue.json .tutti/state/auto/branch.json"
 fail_mode = "closed"

Also applies to: 133-140

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/examples/tutti-codex-sdlc.toml` around lines 115 - 119, The
create_branch workflow step (id "create_branch", run
"scripts/automation/create_issue_branch.sh ...") runs outside the implementer
agent, causing branch creation to occur in a different worktree than the
subsequent implementer commit/push steps and risking desynced branches; fix by
binding branch creation to the same agent/worktree as the implementer (add agent
= "implementer" to the "create_branch" step or move the script invocation into
the implementer step) and apply the same change to any other branch-creation
steps referenced near the commit/push steps so branch creation and commits occur
in the same worktree.
🧹 Nitpick comments (1)
docs/examples/tutti-codex-sdlc.toml (1)

175-178: Make PR creation idempotent for reruns.

open_pr always calls gh pr create; rerunning the workflow for the same branch will fail hard when a PR already exists.

Proposed fix
 run = "python3 - <<'PY'\nimport json,subprocess\ni=json.load(open('.tutti/state/auto/selected_issue.json'))\nb=json.load(open('.tutti/state/auto/branch.json'))\nbranch=b['branch']\nissue=i['issue_number']\ntitle=f\"[auto] #{issue} {i['title']}\"\nbody=f\"Automated SDLC cycle for #{issue}.\\n\\n- planner: completed\\n- implementation: completed\\n- tests: updated\\n- docs/changelog: updated\\n- version: bumped if required\"\n-subprocess.check_call(['gh','pr','create','--title',title,'--body',body,'--head',branch,'--base','main'])\n+existing=subprocess.check_output(['gh','pr','list','--state','open','--head',branch,'--json','number'], text=True)\n+prs=json.loads(existing)\n+if prs:\n+    print(f\"PR already exists: #{prs[0]['number']}\")\n+else:\n+    subprocess.check_call(['gh','pr','create','--title',title,'--body',body,'--head',branch,'--base','main'])\n PY"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/examples/tutti-codex-sdlc.toml` around lines 175 - 178, The open_pr task
always runs gh pr create and fails on reruns; update the run script in the id =
"open_pr" block to first check for an existing PR for the branch (e.g., call gh
pr view --head branch or attempt gh pr list with head) and, if a PR exists, exit
successfully (or optionally update the PR body/title) instead of calling
subprocess.check_call(['gh','pr','create',...]); only call subprocess.check_call
to create the PR when the branch has no existing PR. Ensure you reference the
branch variable (branch) and the subprocess.check_call invocation when making
the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/examples/tutti-codex-sdlc.toml`:
- Around line 46-47: The scope "docs/**" contradicts the agent's prompt which
instructs it to update files outside that scope (README, CHANGELOG, Cargo.toml);
update the config so the docs-release agent can modify those files by expanding
the scope (e.g., include "README", "CHANGELOG", "Cargo.toml", or use a broader
pattern like "." or "{.,docs/**}") or change the prompt to limit changes to
docs/** only; edit the scope value and/or the prompt in the docs-release config
so they match (referencing the scope and prompt entries in the toml).

In `@scripts/automation/select_issue.sh`:
- Around line 13-42: Add a workflow-level concurrency guard to prevent TOCTOU
races between runs selecting issues in scripts/automation/select_issue.sh:
update the orchestrator job (job name orchestrate in
.github/workflows/sdlc-orchestrator.yml) to include a concurrency block (group
name including sdlc-orchestrator and the repository, e.g., sdlc-orchestrator-${{
github.repository }}) with cancel-in-progress: false so simultaneous runs cannot
both fetch JSON and race to label an issue; alternatively, if you must change
the script instead, modify select_issue.sh to attempt the label addition (gh
issue edit --add-label "automation-claimed") immediately after selecting an
issue number and then re-fetch the issue labels (via gh issue view or a
subsequent gh issue list JSON check) to confirm this run holds the
"automation-claimed" label before proceeding with the chosen ISSUE_NUM.

---

Duplicate comments:
In `@docs/examples/tutti-codex-sdlc.toml`:
- Around line 115-119: The create_branch workflow step (id "create_branch", run
"scripts/automation/create_issue_branch.sh ...") runs outside the implementer
agent, causing branch creation to occur in a different worktree than the
subsequent implementer commit/push steps and risking desynced branches; fix by
binding branch creation to the same agent/worktree as the implementer (add agent
= "implementer" to the "create_branch" step or move the script invocation into
the implementer step) and apply the same change to any other branch-creation
steps referenced near the commit/push steps so branch creation and commits occur
in the same worktree.

In `@scripts/automation/select_issue.sh`:
- Around line 36-42: The script writes the claim payload to the output file
(variable out / selected_issue.json) before running gh issue edit, leaving a
stale file on failures; change the flow in select_issue.sh to write to a
temporary file (e.g., out.tmp) and only atomically rename it to the final out
after gh issue edit succeeds, or alternatively trap failures and remove the
created out file if gh issue edit("$ISSUE_NUM") exits non‑zero; update the block
around json.dump/write (the lines that open out and print issue["number"]) and
the gh issue edit invocation to implement the temp-and-rename or cleanup on
error so stale selected_issue.json is never left behind.

---

Nitpick comments:
In `@docs/examples/tutti-codex-sdlc.toml`:
- Around line 175-178: The open_pr task always runs gh pr create and fails on
reruns; update the run script in the id = "open_pr" block to first check for an
existing PR for the branch (e.g., call gh pr view --head branch or attempt gh pr
list with head) and, if a PR exists, exit successfully (or optionally update the
PR body/title) instead of calling
subprocess.check_call(['gh','pr','create',...]); only call subprocess.check_call
to create the PR when the branch has no existing PR. Ensure you reference the
branch variable (branch) and the subprocess.check_call invocation when making
the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 134188fd-48f4-4750-a368-8a301364c08d

📥 Commits

Reviewing files that changed from the base of the PR and between c48b1ac and c3dc86f.

📒 Files selected for processing (2)
  • docs/examples/tutti-codex-sdlc.toml
  • scripts/automation/select_issue.sh

Comment thread docs/examples/tutti-codex-sdlc.toml Outdated
Comment thread scripts/automation/select_issue.sh
@nutt-adam

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Mar 15, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@nutt-adam

Copy link
Copy Markdown
Contributor Author

Pushed another hardening pass in 4090d6a to close the remaining actionables:

  • bound create_branch to agent = "implementer" (smoke + auto workflows) to keep branch creation/commits in the same worktree
  • made open_pr idempotent (checks for existing head PR before create)
  • made select_issue.sh safer on claim failures (write temp file, claim label, then atomic move)
  • added workflow-level concurrency guard in .github/workflows/sdlc-orchestrator.yml
  • aligned docs-release scope with its prompt (scope = "**")

If checks/review are green after this, I’ll merge immediately.

@nutt-adam

Copy link
Copy Markdown
Contributor Author

@coderabbitai resume

@coderabbitai

coderabbitai Bot commented Mar 15, 2026

Copy link
Copy Markdown
✅ Actions performed

Reviews resumed.

coderabbitai[bot]
coderabbitai Bot previously requested changes Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/sdlc-orchestrator.yml:
- Around line 62-64: Remove the duplicate pre-selection step that calls
scripts/automation/select_issue.sh and writes
.tutti/state/auto/selected_issue.json before invoking the sdlc jobs;
specifically, delete the mkdir -p .tutti/state/auto and
scripts/automation/select_issue.sh .tutti/state/auto/selected_issue.json
"$ISSUE_LABEL" (and the associated cargo run invocation if it was only there to
exercise that pre-selection) in the orchestrator so that sdlc-smoke and
sdlc-auto rely on their own internal select_issue logic; ensure no other steps
still depend on .tutti/state/auto/selected_issue.json being created earlier.

In `@docs/examples/tutti-codex-sdlc.toml`:
- Line 63: The run command entries currently pass the hard-coded label
"agent-ops" to the selector script (the run value
"scripts/automation/select_issue.sh .tutti/state/auto/selected_issue.json
agent-ops"); replace that literal with the runtime workflow input variable
(e.g., use the workflow dispatch input like "${{ inputs.issue_label }}" or an
env var such as "$ISSUE_LABEL") in both places where the run key calls
scripts/automation/select_issue.sh so the workflow-dispatch issue_label is
honored; ensure the selector invocation and any related environment/export in
the workflow propagate that variable to the script.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d9a85685-edc8-4868-96fa-5a61ce39e917

📥 Commits

Reviewing files that changed from the base of the PR and between c48b1ac and 4090d6a.

📒 Files selected for processing (4)
  • .github/workflows/sdlc-orchestrator.yml
  • docs/AGENT_OPS_ROADMAP.md
  • docs/examples/tutti-codex-sdlc.toml
  • scripts/automation/select_issue.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/automation/select_issue.sh

Comment thread .github/workflows/sdlc-orchestrator.yml Outdated
Comment thread docs/examples/tutti-codex-sdlc.toml Outdated
@nutt-adam

Copy link
Copy Markdown
Contributor Author

Yes — choir is addressing it. I just pushed 59eec6f with these exact fixes:

  • Removed duplicate pre-selection from .github/workflows/sdlc-orchestrator.yml:
    • no more mkdir -p .tutti/state/auto
    • no more pre-call to scripts/automation/select_issue.sh in smoke/auto wrapper steps
    • sdlc-smoke and sdlc-auto now rely on their internal select_issue step only
  • Replaced hard-coded agent-ops label in docs/examples/tutti-codex-sdlc.toml with runtime label propagation:
    • "${ISSUE_LABEL:-agent-ops}" in both selector invocations

This removes double-claim risk and ensures workflow-dispatch issue_label is honored end-to-end.

@nutt-adam

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Mar 15, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
docs/examples/tutti-codex-sdlc.toml (1)

172-186: Consider extracting inline Python scripts for maintainability.

The inline Python heredocs (lines 172, 179, 186) contain non-trivial logic for branch verification, PR creation, and CodeRabbit polling. While functional, extracting these to separate scripts in scripts/automation/ (alongside the existing select_issue.sh, create_issue_branch.sh, etc.) would improve:

  • Testability (scripts can be unit tested independently)
  • Debuggability (clearer stack traces, easier local testing)
  • Consistency with existing script organization
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/examples/tutti-codex-sdlc.toml` around lines 172 - 186, The workflow
embeds non-trivial inline Python heredocs in the "run" of steps that perform
branch verification, PR creation, and CodeRabbit polling (the blocks under the
steps with ids implied by their comments like the branch-check, "open_pr", and
"wait_coderabbit" logic); extract each heredoc into a dedicated executable
script under scripts/automation (e.g., branch_check.py, create_pr.py,
wait_coderabbit.py or similar), preserve behavior (stdout messages, exit codes,
JSON file reads/writes, and gh/git calls), update the workflow steps' run to
invoke python3 scripts/automation/<script>.py with the same arguments or env
expectations, and ensure scripts are covered by tests or have logging/error
handling consistent with existing scripts/automation/*.sh so maintainability and
debuggability improve.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@docs/examples/tutti-codex-sdlc.toml`:
- Around line 172-186: The workflow embeds non-trivial inline Python heredocs in
the "run" of steps that perform branch verification, PR creation, and CodeRabbit
polling (the blocks under the steps with ids implied by their comments like the
branch-check, "open_pr", and "wait_coderabbit" logic); extract each heredoc into
a dedicated executable script under scripts/automation (e.g., branch_check.py,
create_pr.py, wait_coderabbit.py or similar), preserve behavior (stdout
messages, exit codes, JSON file reads/writes, and gh/git calls), update the
workflow steps' run to invoke python3 scripts/automation/<script>.py with the
same arguments or env expectations, and ensure scripts are covered by tests or
have logging/error handling consistent with existing scripts/automation/*.sh so
maintainability and debuggability improve.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 94fabcd1-17b0-4740-bea1-5a1147766655

📥 Commits

Reviewing files that changed from the base of the PR and between 4090d6a and 59eec6f.

📒 Files selected for processing (2)
  • .github/workflows/sdlc-orchestrator.yml
  • docs/examples/tutti-codex-sdlc.toml

@nutt-adam

Copy link
Copy Markdown
Contributor Author

Pushed 4465a31 to address the latest CodeRabbit maintainability feedback.

What changed

  • Extracted inline Python heredocs from docs/examples/tutti-codex-sdlc.toml into dedicated scripts:
    • scripts/automation/verify_branch_has_changes.py
    • scripts/automation/open_or_create_pr.py
    • scripts/automation/wait_and_collect_coderabbit.py
  • Updated workflow step run commands to invoke those scripts directly.
  • Preserved behavior (exit codes, stdout messaging, file I/O paths, and gh/git calls).

Requesting fresh review to clear the block.
@coderabbitai review

@coderabbitai

coderabbitai Bot commented Mar 15, 2026

Copy link
Copy Markdown

@nutt-adam: Acknowledged — triggering a fresh incremental review to cover the extracted scripts (verify_branch_has_changes.py, open_or_create_pr.py, wait_and_collect_coderabbit.py) and the updated tutti-codex-sdlc.toml invocations from commit 4465a31.

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

coderabbitai[bot]
coderabbitai Bot previously requested changes Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/automation/wait_and_collect_coderabbit.py`:
- Around line 25-31: The call to subprocess.check_call(...) for collecting
feedback can raise CalledProcessError and bypass
sys.exit(wait_result.returncode), so wrap the feedback collection (the
subprocess.check_call call that runs
"scripts/automation/collect_coderabbit_feedback.sh" with str(pr) and
feedback_file) in a try-except that catches subprocess.CalledProcessError (and
optionally Exception) and logs or warns but does not re-raise, ensuring
execution falls through to sys.exit(wait_result.returncode) so the original
wait_result.returncode is always used as the process exit status.
- Around line 15-20: The code assumes json.loads(out)[0] exists when calling
subprocess.check_output to list PRs; change the logic after running
subprocess.check_output and json.loads(out) to verify the resulting list is
non-empty before accessing index 0 (the PR number), and if empty print or log a
clear error referencing the branch and exit cleanly (e.g., sys.exit(1)); update
references to pr, branch, subprocess.check_output and json.loads accordingly so
you only set pr when the list contains at least one item.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 84617435-bb9d-4ccc-8699-a94ec96e6725

📥 Commits

Reviewing files that changed from the base of the PR and between 59eec6f and 4465a31.

📒 Files selected for processing (4)
  • docs/examples/tutti-codex-sdlc.toml
  • scripts/automation/open_or_create_pr.py
  • scripts/automation/verify_branch_has_changes.py
  • scripts/automation/wait_and_collect_coderabbit.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/examples/tutti-codex-sdlc.toml

Comment thread scripts/automation/wait_and_collect_coderabbit.py
Comment thread scripts/automation/wait_and_collect_coderabbit.py Outdated
@nutt-adam

Copy link
Copy Markdown
Contributor Author

Addressed the new actionable items in 6ff9e88.

Changes in scripts/automation/wait_and_collect_coderabbit.py:

  • Guarded PR lookup result from gh pr list:
    • now checks prs is non-empty before indexing
    • logs clear branch-specific error and exits 1 if no open PR
  • Wrapped feedback collection call in non-fatal handling:
    • catches subprocess.CalledProcessError and logs warning
    • catches unexpected exceptions and logs warning
    • always exits using wait_result.returncode as intended

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Mar 15, 2026

Copy link
Copy Markdown

@nutt-adam: Acknowledged — the hardening in 6ff9e88 looks well-targeted:

  • PR lookup guard: checking prs is non-empty before indexing eliminates the IndexError on branches with no open PR, and the explicit exit with a clear message makes failures easy to diagnose.
  • Non-fatal feedback collection: wrapping collect_coderabbit_feedback.sh invocation with subprocess.CalledProcessError and broad exception catches ensures feedback collection failures don't mask the wait result exit code.
  • Exit code propagation: always exiting with wait_result.returncode keeps the caller's signal semantics intact regardless of feedback collection outcome.

Triggering a fresh incremental review to cover the updated wait_and_collect_coderabbit.py.

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@nutt-adam
nutt-adam dismissed stale reviews from coderabbitai[bot], coderabbitai[bot], coderabbitai[bot], coderabbitai[bot], coderabbitai[bot], and coderabbitai[bot] March 15, 2026 13:02

Dismissing stale CodeRabbit block per maintainer force-merge request after fixes applied.

@nutt-adam

Copy link
Copy Markdown
Contributor Author

Addressed the remaining unresolved review items in c53d7db:\n\n- collect_coderabbit_feedback.sh now includes inline PR review comments via GitHub API () and appends them to feedback markdown with path/line context.\n- wait_coderabbit.sh now uses a strict allowlist ( only) for PASS classification; any other completed conclusion is treated as FAIL.\n\nRequesting fresh review.

@nutt-adam

Copy link
Copy Markdown
Contributor Author

Follow-up (clean): addressed remaining unresolved review items in commit c53d7db.

  • collect_coderabbit_feedback.sh now includes inline PR review comments via GitHub API endpoint repos/{owner}/{repo}/pulls/{pull_number}/comments and appends them to feedback markdown with path/line context.
  • wait_coderabbit.sh now uses a strict allowlist (SUCCESS only) for PASS classification; any other completed conclusion is treated as FAIL.

Requesting fresh review.

@wren-nutthouse
wren-nutthouse merged commit 5de3786 into main Mar 16, 2026
10 checks passed
@wren-nutthouse
wren-nutthouse deleted the roadmap/agent-ops-telemetry branch March 16, 2026 00:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants