#503 Implement .claude Config Tickets From an Operator Session - #520
Merged
b-at-neu merged 5 commits intoAug 20, 2026
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
34 tasks
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rker One marker string in the issue plan and the PR description, read from the body field the cockpit's trigger queries already return. Names the routing rather than the cause, so future non-.claude categories reuse it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#513 gated approval-check.yml on the claude label, so an operator-run PR opened without it would merge with no approval gate. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
b-at-neu
force-pushed
the
503-implement-claude-config-tickets-from-an-operator-session
branch
from
August 19, 2026 23:03
42f329a to
b15a8fa
Compare
b-at-neu
commented
Aug 19, 2026
b-at-neu
left a comment
Collaborator
Author
There was a problem hiding this comment.
Code Review — Cycle 1 · needs revision
1 open — 1 🟠 Medium (see inline)
Step 3 checks the item's body for the SESSION REQUIRED marker but the gh pr view / gh issue view calls above it didn't request the body field, so there was nothing to inspect at that point. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Collaborator
Author
Revision — Cycle 1Fixed R1-M1: added |
b-at-neu
commented
Aug 20, 2026
b-at-neu
left a comment
Collaborator
Author
There was a problem hiding this comment.
Code Review — Cycle 2 · approved
0 open — prior R1-M1 resolved, no regressions
Announcing was a caveat buried in the dispatch table, not a tick step, and nothing said the human must run /implement in a session other than the cockpit's own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
b-at-neu
commented
Aug 20, 2026
b-at-neu
left a comment
Collaborator
Author
There was a problem hiding this comment.
Code Review — Cycle 3 · approved
0 open — prior R1-M1 stayed resolved, no regressions in the post-approval commit (docs/prose clarifications only)
b-at-neu
deleted the
503-implement-claude-config-tickets-from-an-operator-session
branch
August 20, 2026 04:05
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #503
Summary
Adds a third route through the pipeline for tickets that can't be handed to a dispatched agent at all. Today that means anything touching
CLAUDE.mdor.claude/**, where the harness denies a subagent'sEditandsettings.jsoncannot grant it back — but the mechanism is built around the routing, not the cause, so a future category reuses it by supplying a different reason.plan-agentmarks such a planSESSION REQUIRED; the cockpit finds the marker and announces the command instead of dispatching stages 2 and 4. A new/implementskill runs those two stages in the operator's own named session, in a dedicated worktree, by reading and following the unmodifiedimpl-agent.md/revise-agent.mdplus a short, explicit list of subagent-only overrides.Stages 1 and 3 are untouched —
plan-agentandreview-agentare read-only and work throughgh, so a session-required ticket is not out of the pipeline.refresh branchstill dispatches torevise-agent(a rebase and force-push edit no files).The trigger label stays on the item and the skill performs the same label swaps the agent files already specify, so there are no new trigger semantics and recovery is still "re-apply the trigger". The cockpit gains one rule: the
SESSION REQUIREDmarker suppresses dispatch — a deliberate deviation from "a trigger label always means dispatch", documented as such.One marker, no label
The signal is a single literal string, same rendering, on both surfaces:
plan-agent## Overview/implementCloses #NThere is deliberately no label. The cockpit reads the marker from the
bodyfield of the trigger query it already runs (--json number,title,body), so the check costs no extra call and there is nothing to keep in sync. The string is the contract; the reason after the colon is free text and is the part that generalizes.Bootstrap note: #503 is itself session-required and
/implementdid not exist yet, so this was implemented by hand from an operator session followingimpl-agent.md— the workflow being codified. This PR description carries the marker, as/implementwould have written it.Changes
.claude/skills/implement/SKILL.md— new. Name the session, record the main checkout, resolve the stage from labels, create the worktree, follow the agent file, carry the marker into the PR, apply the six overrides, hand off..claude/agents/plan-agent.md— emit the marker when## Changesneeds it, in revision mode too..claude/skills/pipeline/SKILL.md—bodyadded to the two trigger queries; a safety rail forbidding impl/revise dispatch for a marked item; announcement copy;statusreporting..claude/docs/PIPELINE.md— new "Session-required tickets" section (harness constraint, whysettings.jsoncan't grant it, the marker table, the route, the invariant deviation, session naming, the worktree requirement); the marker in the plan format; a Stages-table note; a runbook row..claude/skills/worktree-clean/SKILL.md—impl-*worktrees are in scope alongsideagent-*.CLAUDE.md— one line under "Worktrees & local dev" pointing at the new section.Testing plan
work on #395(interactive gate). The resulting plan's first line is theSESSION REQUIREDmarker with a reason. Negative control: a source-only ticket's plan has no marker.plan approvedand no extra label; noimpl-agentis dispatched (TaskListshows none); the announcement gives bothclaude -n "#395: …"and/implement 395.statuslists it under the human-gated group taggedSESSION REQUIRED, with both commands.claude -n "#395: <short name>"in a separate session and run/implement 395: the name shows in the prompt box / terminal title, the skill's first line re-states it, the worktree appears at.claude/worktrees/impl-395on branch395-…, the main checkout's working tree stays clean throughout (git statusthere), and labels goplan approved→in progress→pr opened.dev, title#395 …, body hasCloses #395and the marker directly under it, plus a Testing plan; assignee = the issue's assignee; labelready for review; commit subject matches#395 <lowercase imperative>with theCo-Authored-Bytrailer.review-agentfor that PR unchanged and posts a real review.needs revision→ the cockpit reads the marker from the PR body and announces/implement <pr>, dispatching nothing. Run it; the PR goesrevising→ready for reviewand the addressed threads are resolved.plan approvedstill auto-dispatchesimpl-agent; running/implementon it raises the double-dispatch confirmation first.revise-agentagain. Confirms the body is genuinely the signal..claude/agents/impl-agent.md— the session's own behaviour doesn't shift mid-run, and the edit lands only on the worktree copy./worktree-cleanlists and reclaims.claude/worktrees/impl-395after the PR merges.Automated checks
npm run prettier:check,npm run eslint:check,npm run tsc:checkall pass.npm run testneeds Postgres (unavailable locally), sonpm run test:unitwas run instead: 146 passed. The diff is documentation and skill/agent instructions only — no runtime code.Notes
-nis set at launch and a running session can neither read nor change its own display name, so the skill can only tell the operator the string; the cockpit's pre-filled command is what makes it happen.npm ciin the worktree costs minutes and disk even for a markdown-only ticket. Kept anyway — it makes the CI gate real for mixed tickets and removes an override./worktree-cleanis the reclamation path.claude --agent impl-agent(the runbook's manual escape hatch) carries the same restriction is untested; PIPELINE.md records it as unverified. If a future Claude Code version lifts the harness restriction, the whole route can be deleted — the marker is the only thing to unwind.