feat(work-items): extract shared self-observation filing contract (#540) - #762
Conversation
The cross-lane "file what you will not fix" rule (dedupe -> categorize -> fixed shape -> needs-triage) was slated to be absorbed privately into each lane's skill, manufacturing three drift-prone copies of one contract. Extract it into one shared reference surface, reference/dogfood-filing.md, that composes the existing mechanics by pointer (the Search-items dedupe read and body template track add owns, the create-item seam write, the needs-triage status label) and adds only the self-observation policy. No new script: the mechanical core is already the seam + adapter + track add machinery, so the doc points at it rather than forking the template and search mechanics. Wire the three in-repo filing sites (work post-green deferred finding, triage follow-up creation, scan-todos file-a-work-item) to reference the contract instead of leaving the sequence implicit. Co-Authored-By: Claude Opus <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 49s —— View job PR Review:
|
| Link in doc | Resolves to |
|---|---|
tracker-seam.md |
reference/tracker-seam.md ✓ |
../skills/work/SKILL.md |
skills/work/SKILL.md ✓ |
../skills/track/actions/add.md |
skills/track/actions/add.md ✓ |
label-taxonomy.md |
reference/label-taxonomy.md ✓ |
../skills/triage/SKILL.md |
skills/triage/SKILL.md ✓ |
The ${CLAUDE_PLUGIN_ROOT}/reference/dogfood-filing.md paths in the three skill files are consistent with how other plugin-root-relative links are expressed throughout the skill files.
Wiring sites: correct placement
Each of the three wiring sites is placed exactly where the filing decision is made:
work/SKILL.md:189— wired at "VALID-but-deferred finding requires a filed follow-up issue" ✓triage/SKILL.md:140— wired at "when triage spawns follow-up work" ✓scan-todos/SKILL.md:62— wired at the "file a work item" classification branch ✓
One observation worth noting (not blocking)
triage wiring scope is clear but subtle. The sentence at triage/SKILL.md:140 reads:
"Item creation, when triage spawns follow-up work, goes through the seam
create-itemverb... and follows the shared self-observation contract"
The qualifying clause "when triage spawns follow-up work" correctly scopes this away from triage's primary outcome writes (briefing and labeling the item being triaged) — those don't go through the self-observation contract and shouldn't. A reader who skims Item creation... without the qualifier might misread it as applying to all item creation in triage, including the briefed-item outcomes from step 5. The current phrasing is defensible, but a small clarification like "Item creation for incidental follow-up work" would make the scope unmissable. Not a blocker — just flagging for future readability.
Policy content: accurate
- "Fix, not file" default (
tracker-seam.mdalignment) is correctly stated and cited ✓ - Authorization model (interactive draft-then-ask vs autonomous lane's standing rules) matches the existing
triage/SKILL.md"Direction gate" exactly ✓ - The four-beat sequence (dedupe → categorize → file via
track add→ labelneeds-triage) is internally consistent and correctly marks the mechanical vs judgment split ✓ #506placeholder for eventual auto-label ownership is honest ✓- Reconciliation note about
#477(babysit-prs still absorbing) is an appropriate forward-reference, not a gap ✓
Version bump: correct
0.17.1 → 0.18.0 is the right semver call — a new file added and existing skills updated constitutes a minor feature bump. CHANGELOG entry is thorough and matches what changed.
Verdict: ready to merge. The extraction is clean, the wiring is precise, and the design avoids the drift-prone copy problem it targets.
|
Claude finished @kyle-sexton's task in 1m 12s —— View job Security Review — PR #762
No security issues found. This PR is entirely documentation and configuration — one new markdown reference doc, three single-line wiring edits in existing SKILL.md files, a version bump in Injection (command, path, template). The three SKILL.md edits each add a GitHub Actions. No Secrets / credentials / tokens. None present or referenced in any changed file. Supply chain / dependency pins. No new package dependencies, action pins, or external MCP connections introduced. Autonomous authorization model (the policy itself, Information disclosure. Internal issue numbers ( Nothing in this changeset introduces a new executable path, external trust dependency, or policy that expands the plugin's security boundary. |
|
Claude finished @kyle-sexton's task in 1m 55s —— View job PR Review:
|
| Reference | Target | Status |
|---|---|---|
tracker-seam.md "Default = fix, not file" |
reference/tracker-seam.md line 92 |
✓ |
add.md "Duplicate check" |
skills/track/actions/add.md line 36 |
✓ |
add.md "Authorization gate" |
skills/track/actions/add.md line 32 |
✓ |
add.md "Build body" |
skills/track/actions/add.md line 44 |
✓ |
add.md "Create the item" |
skills/track/actions/add.md line 74 |
✓ |
triage/SKILL.md "Recommend category + state" |
skills/triage/SKILL.md line 90 |
✓ |
triage/SKILL.md "Attention view" |
skills/triage/SKILL.md line 70 |
✓ |
triage/SKILL.md "Direction gate" |
skills/triage/SKILL.md line 98 |
✓ |
triage/SKILL.md "AI disclaimer" |
skills/triage/SKILL.md line 162 |
✓ |
label-taxonomy.md (status axis) |
reference/label-taxonomy.md |
✓ |
work/SKILL.md "Post-green review pass" |
skills/work/SKILL.md line 189 |
✓ |
The ${CLAUDE_PLUGIN_ROOT}/reference/dogfood-filing.md paths in the three wiring sites are consistent with the plugin-root-relative convention used elsewhere in the skill files.
Wiring sites: correct placement
Each wiring edit inserts the reference exactly at the decision point:
work/SKILL.md:189— at "VALID-but-deferred finding requires a filed follow-up issue" ✓triage/SKILL.md:140— at "when triage spawns follow-up work" ✓scan-todos/SKILL.md:62— at the "file a work item" classification branch ✓
One readability observation (not blocking)
triage/SKILL.md:140 now reads:
"Item creation, when triage spawns follow-up work, goes through the seam
create-itemverb... and follows the shared self-observation contract"
The qualifying clause "when triage spawns follow-up work" correctly scopes this away from triage's primary outcome writes (briefing and labeling the item under review) — those don't go through the self-observation contract and shouldn't. A reader skimming from "Item creation..." without the qualifier might misread it as applying to all item creation in triage, including step 5 outcome writes. The current phrasing is defensible; "Item creation for incidental follow-up work" would make the scope unmissable at a glance. Not a blocker.
Policy content: accurate
- "Fix, not file" default and the narrow-exception framing align exactly with
tracker-seam.mdline 92 ✓ - The four-beat sequence (dedupe → categorize → file via
track add→needs-triage) is internally consistent and correctly partitions mechanical vs. judgment steps ✓ - Authorization model (interactive draft-and-ask vs. autonomous standing-rules) matches
triage/SKILL.mdDirection gate exactly ✓ #506placeholder for eventual auto-label ownership is honest about current state ✓- Reconciliation note for
#477(babysit not yet absorbed) is an appropriate forward-reference ✓
Version bump and CHANGELOG
0.17.1 → 0.18.0 is the correct semver call — a new reference file added plus three skill updates constitutes a minor feature bump. CHANGELOG entry is thorough and matches what changed.
Verdict: ready to merge. The extraction is clean, the wiring is precise, all references resolve, and the design correctly avoids the drift-prone copy problem it targets.
|
Claude finished @kyle-sexton's task in 1m 5s —— View job Security Review — PR #762
No security issues found. This PR is entirely documentation and configuration: one new markdown reference doc, three single-line wiring edits in existing Injection (command, path, template). The three Autonomous authorization model ( GitHub Actions. No Secrets / credentials / tokens. None present or referenced in any changed file. Supply chain / dependency pins. No new package dependencies, action pins, or external MCP connections introduced. Information disclosure. Internal issue numbers ( Nothing in this changeset introduces a new executable path, external trust dependency, or policy that expands the plugin's security boundary. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1859d9c118
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Move the "when triage spawns follow-up work" qualifier to the front of the sentence so a reader skimming from "Item creation..." cannot misread the shared self-observation contract as applying to triage's primary outcome writes. Addresses a readability note from the PR review bots; no semantic change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 23s —— View job PR Review:
|
| Prior observation | Status |
|---|---|
| Triage sentence scope "unmissable" wording | Fixed in 6e4c2d2 ✓ |
| All link paths resolve | Unchanged, still verified ✓ |
Version bump 0.17.1 → 0.18.0 |
Correct ✓ |
| Policy content accuracy (fix-not-file, auth model, four-beat sequence) | Unchanged, still correct ✓ |
Verdict: ready to merge. The latest commit correctly resolves the outstanding readability observation. The Codex P2 finding describes a pre-existing seam-level gap not caused by this PR; it warrants a follow-up issue against the seam contract or work skill rather than blocking this extraction.
|
Claude finished @kyle-sexton's task in 2m 0s —— View job Security Review — PR #762
No security issues found. This PR is entirely documentation and configuration: one new markdown reference doc ( Injection (command, path, template). The three Autonomous authorization model ( GitHub Actions. No Secrets / credentials / tokens. None present or referenced in any changed file. Supply chain / dependency pins. No new package dependencies, action pins, or external MCP connections introduced. Information disclosure. Internal issue numbers ( Re: Codex P2 comment on frontier exclusion. The concern is valid as a design observation — Nothing in this changeset introduces a new executable path, external trust dependency, or policy that expands the plugin's security boundary. |
Fixed in Separately, the Codex P2 on |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6e4c2d2053
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Codex's list-frontier gap finding (comment 3617886236) is tracked in #764 rather than left as a bare deferred reply — filed by the orchestrator on the worker's recommendation. |
…fic wording Non-triage lanes routed to triage's "AI disclaimer" section were told to reuse its literal "during triage" wording, mislabeling the provenance phase of items filed during work / scan-todos / babysit cycles. Instruct each lane to name its own lane and treat triage's section as the canonical form only; track the lane-neutral disclaimer SSOT that collapses this to one pointer in #768. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 16s —— View job PR Review:
|
| Finding | Source | Status |
|---|---|---|
| Triage sentence scope unmissable | Claude review | Fixed in 6e4c2d2 ✓ |
Frontier exclusion gap (needs-triage on autonomous frontier) |
Codex P2 | Deferred to #764 — pre-existing seam gap, out of scope for this doc-only PR ✓ |
| AI disclaimer names wrong lane for non-triage filings | Codex P2 | Fixed in c1df8d1 ✓ |
Verdict: ready to merge. All three findings from prior rounds are addressed. The extraction is clean, wiring is precise, all references resolve, the disclaimer fix closes the audit-trail gap, and the two deferred items (#764 frontier semantics, #768 disclaimer SSOT) are correctly scoped to their own follow-up issues.
|
Claude finished @kyle-sexton's task in 1m 21s —— View job Security Review — PR #762
No security issues found. This PR consists of one new markdown reference doc (84 lines), three single-line wiring edits in existing Injection (command, path, template). The three Autonomous authorization model ( AI disclaimer accuracy. The Codex finding from the prior review round (non-triage lanes inheriting triage's literal GitHub Actions. No Secrets / credentials / tokens. None present or referenced in any changed file. Supply chain / dependency pins. No new package dependencies, action pins, or external MCP connections introduced. Information disclosure. Internal issue numbers ( Re: Codex P2 frontier exclusion finding. The concern (raw Nothing in this changeset introduces a new executable path, external trust dependency, or policy that expands the plugin's security boundary. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c1df8d1468
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…tions only The new pointer to the shared self-observation contract read as if every triage-spawned follow-up gets needs-triage, including work triage has already scoped and the item under evaluation. Clarify that the contract (-> needs-triage) governs only a fresh, orthogonal problem triage surfaces but will not fix this pass: that new item is genuinely raw, while the evaluated item's raw marker is cleared by the closing invariant and already-decided follow-up is routed through the outcome labels — so neither loops back into raw intake. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 59s —— View job PR Review:
|
| Case | Treatment | Grounding |
|---|---|---|
| Fresh, orthogonal problem (not fixable this pass) | Self-observation contract → needs-triage |
Genuinely raw; this is the qualifying case |
| Item triage is currently evaluating | Never needs-triage again |
Raw marker cleared by the closing invariant |
| Follow-up whose scope triage has already decided | Outcome labels (step 5), not self-observation | Already routed; not raw intake |
The references are grounded: "closing invariant below" points to the existing invariant in the same skill; "outcome labels above" points to step 5's routing label table. Both are facts that are already in the document — the sentence surfaces them for the reader rather than asserting them in isolation.
Other wiring sites: unaffected
work/SKILL.md and scan-todos/SKILL.md don't share the same ambiguity — their filing cases are always genuinely fresh raw intake (a VALID-but-deferred finding from a post-green review, and a TODO marker requiring separate planning), so their wiring sentences need no qualification. Confirmed unchanged.
All findings across all review rounds — resolved
| Finding | Source | Status |
|---|---|---|
| Triage wiring sentence scope unmissable | Claude review (round 1) | Fixed in 6e4c2d2 ✓ |
needs-triage items on autonomous frontier before triage vets them |
Codex P2 (round 1) | Deferred to #764 — pre-existing seam gap, not introduced here ✓ |
Non-triage lanes inherit triage-specific during triage disclaimer wording |
Codex P2 (round 2) | Fixed in c1df8d1 ✓ |
Triage-created follow-ups sent back to raw intake as needs-triage |
Codex P2 (round 3) | Fixed in cbcbf81 ✓ |
Verdict: ready to merge. Four rounds of review iterated to a clean result. The extraction is precise, the wiring is scoped correctly at all three sites, all references resolve, the AI disclaimer is accurate per lane, and the triage-follow-up invariant is now explicitly stated. The two deferred items (#764 frontier semantics, #768 disclaimer SSOT) are correctly scoped to their own follow-up issues.
|
Claude finished @kyle-sexton's task in 2m 5s —— View job Security Review — PR #762
No security issues found. This PR is entirely documentation and configuration: one new markdown reference doc ( Injection (command, path, template). Each of the three SKILL.md wiring edits adds a Autonomous authorization model (
Scope of the last commit ( GitHub Actions. No Secrets / credentials / tokens. None present or referenced in any changed file. Supply chain / dependency pins. No new package dependencies, action pins, or external MCP connections introduced. Information disclosure. Internal issue numbers ( Re: Codex P2 frontier exclusion (tracked in #764). The concern that raw Nothing in this changeset introduces a new executable path, external trust dependency, or policy that expands the plugin's security boundary. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cbcbf81b1c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Claude finished @kyle-sexton's task in 2m 2s —— View job PR Review:
|
| Finding | Source | Status |
|---|---|---|
| Triage wiring sentence scope unmissable | Claude review (round 1) | Fixed in 6e4c2d2 ✓ |
needs-triage items on autonomous frontier before triage vets them |
Codex P2 (round 1) | Deferred to #764 ✓ |
Non-triage lanes inherit triage's during triage disclaimer wording |
Codex P2 (round 2) | Fixed in c1df8d1 ✓ |
Triage-created follow-ups sent back to raw intake as needs-triage |
Codex P2 (round 3) | Fixed in cbcbf81 ✓ |
| Closed-item duplicate comment buries observation outside triage queue | Codex P2 (round 4) | Open — needs decision |
Verdict: one finding open. The Codex P2 on closed-item dedup handling is valid, lives in the new dogfood-filing.md (not pre-existing), and has a small targeted fix. All prior findings remain resolved. Recommend addressing before merge or explicitly deferring with a follow-up issue.
|
Claude finished @kyle-sexton's task in 2m 19s —— View job Security Review — PR #762 (HEAD
|
|
Claude finished @kyle-sexton's task in 1m 32s —— View job PR Review:
|
| Finding | Source | Status |
|---|---|---|
| Triage wiring sentence scope unmissable | Claude review (round 1) | Fixed in 6e4c2d2 ✓ |
needs-triage items on autonomous frontier before triage vets them |
Codex P2 (round 1) | Deferred to #764 — pre-existing seam gap ✓ |
Non-triage lanes inherit triage's during triage disclaimer wording |
Codex P2 (round 2) | Fixed in c1df8d1 ✓ |
Triage-created follow-ups sent back to raw intake as needs-triage |
Codex P2 (round 3) | Fixed in cbcbf81 ✓ |
| Closed-item duplicate comment buries observation outside triage queue | Codex P2 (round 4) | Open — unaddressed in 518f0f5 |
Verdict: one finding remains open. The latest sync commit introduces no new content. The closed-item duplicate burial gap at dogfood-filing.md:34 is the new artifact this PR introduces (not pre-existing), and the fix is a one-sentence prose addition. All four prior findings remain resolved.
|
Claude finished @kyle-sexton's task in 1m 40s —— View job Security Review — PR #762 (HEAD
|
|
Claude finished @kyle-sexton's task in 1m 54s —— View job Security Review — PR #762 (HEAD
|
|
Claude finished @kyle-sexton's task in 1m 33s —— View job PR Review:
|
| Finding | Source | Status |
|---|---|---|
| Triage wiring sentence scope unmissable | Claude review (round 1) | Fixed in 6e4c2d2 ✓ |
needs-triage items on autonomous frontier before triage vets them |
Codex P2 (round 1) | Deferred to #764 — pre-existing seam gap ✓ |
Non-triage lanes inherit triage's during triage disclaimer wording |
Codex P2 (round 2) | Fixed in c1df8d1 ✓ |
Triage-created follow-ups sent back to raw intake as needs-triage |
Codex P2 (round 3) | Fixed in cbcbf81 ✓ |
| Closed-item duplicate comment buries observation outside triage queue | Codex P2 (round 4) | Open — unaddressed in b45bb9d |
Verdict: one finding remains open. The latest sync commit introduces no changes to the work-items content. The closed-item duplicate burial gap at dogfood-filing.md:34 is the new artifact this PR introduces (not pre-existing in the prior skill files), and the fix is a one-sentence prose replacement. All four prior findings remain resolved.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b45bb9d3d2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A self-observation whose only match is a closed item was told to comment on that item. Closed items are absent from the triage attention view, so a still-live or regressed observation would be buried where no lane re-enters it. Distinguish open vs closed matches: an open match comments; a closed match reopens the item (or files a fresh active one linking it) so it re-queues.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @kyle-sexton's task in 2m 31s —— View job PR Review:
|
| Finding | Source | Status |
|---|---|---|
| Triage wiring sentence scope unmissable | Claude review (round 1) | Fixed in 6e4c2d2 ✓ |
needs-triage items on autonomous frontier before triage vets them |
Codex P2 (round 1) | Deferred to #764 — pre-existing seam gap ✓ |
Non-triage lanes inherit triage's during triage disclaimer wording |
Codex P2 (round 2) | Fixed in c1df8d1 ✓ |
Triage-created follow-ups sent back to raw intake as needs-triage |
Codex P2 (round 3) | Fixed in cbcbf81 ✓ |
| Closed-item duplicate comment buries observation outside triage queue | Codex P2 (round 4) | Fixed in ce16c6d ✓ |
| "team-authored track add items" phrasing ambiguous re: self-observations | Codex P2 (round 5) | Pre-existing ambiguity in triage/SKILL.md, not introduced here; actual runtime behavior is correct; suggest follow-up clarity edit to triage/SKILL.md:38 |
Verdict: ready to merge. The closed-duplicate burial fix (ce16c6d) closes the last open blocking finding. Five rounds of review iterated to a clean result: the extraction is precise, the wiring is scoped correctly at all three sites, all references resolve, the AI disclaimer is accurate per lane, the triage follow-up invariant is explicitly stated, and closed-match handling is now correct. The Codex P2 from round 5 is a pre-existing phrasing issue in a sibling skill — worth a follow-up but not a condition on this PR.
|
Claude finished @kyle-sexton's task in 1m 49s —— View job Security Review — PR #762 (HEAD
|
|
Tower blitz (thread-stalled, 2h with auto-merge armed): resolving both Codex P2 threads per defer pattern.
Auto-merge already armed; merge proceeds when BLOCKED clears. This was generated by AI (control-tower blitz, session 6). |
Summary
The cross-lane self-observation filing rule — file a problem you will not fix in-cycle: dedupe → categorize → fixed shape →
needs-triage— is cross-lane-identical. The v4 loop-prompt absorption umbrellas (#477 babysit, #478 triage, #479 work) each absorb lane-specific rules into their own skill; absorbing this shared block three times would manufacture three drift-prone copies of one contract. This extracts it into a single in-repo surface the lanes reference instead.Fix
plugins/work-items/reference/dogfood-filing.md— the single source of truth for the self-observation filing contract. It composes the existing mechanics by pointer (pointer-not-copy): the Search items dedupe read and the body templatetrack addalready owns, thecreate-itemseam write, and theneeds-triagestatus label. It restates none of them; it adds only the self-observation policy — when to file vs thetracker-seam.md"Default = fix, not file" posture, the mechanical-vs-model split, autonomous-lane authorization, and the AI disclaimer.work's post-green deferred-finding follow-up,triage's follow-up-work creation, andscan-todos's "file a work item" branch.reference/permission-preflight.md: a shared reference doc consumed by multiple lanes, with its script owned by one skill), not a new user-invocable skill.Veto points before merge (decision-defaulted per the triage brief)
reference/doc (permission-preflight.md), which is reversible and does not ship a hard-to-unship slash command. Chose the precedent.create-item+ bound-adapter Search items +track addbody template. A standalone wrapper would fork the very template and search mechanics this doc single-sources, so the doc references them instead.Verification
Ran locally against
origin/main:check-changed-skills.sh— 3 skills PASS, 0 errors; all base-ref trigger phrases preserved; broken-ref check confirms the newreference/dogfood-filing.mdlinks resolve.check-skill-portability.sh— no coupling tokens.check-changelog-parity.sh --check-bump— version bump + CHANGELOG entry present (0.17.1 → 0.18.0).validate-plugins.sh— all manifests + catalog validate.markdownlint-cli2— 0 errors on the new doc and CHANGELOG.Closes #540
Related
needs-triagelabeler (consumes the same filing shape; noted in the doc as the eventual owner of step 4's label application).