Repository navigation
work-items: bug path, triage clusters, claim protocol, trackers and morning brief #7578
Description
Parent
Refs #7555. Source: PLAN Phase 11, topic poteto-review. Thread: work-items.
Depends on
- config-cascade: settings resolution and convention home #7571 Settings resolution and convention home
- work-items: work-item status as a field with labels as fallback #7577 Work-item status as a field
- Pending, set on the slices when filed: slice h (cloud cost per item) waits on child work-items: probe ccr.session.id in a routine OTEL run #7595 (Q560
probe); the work-class removal waits on the Merge authority thread's verifier-merge-criterion slice.
Outcome
/work-items:work gains a bug path that reproduces before fixing; triage clusters shared signatures
under one parent; one claim protocol covers every worker; trackers ship as two bundled adapters plus
seeds; the morning brief moves into work-items with a Landed section.
Decisions
/work-items:workbug path: reproduce twice through the real surface or verify an existing fix
against the prior commit, objection window, bounded fix with failing test first, draft PR only with
before-and-after proof, never merge; seven-condition fix gate, each condition a named setting on by
default, tighten-only (D43, Q527; Lauren's bug bot). Investigate-only mode, later startable from
an incident thread (Q530).- Attended pickup shows "I read this item as: <goal; done when>" above "Proceed?" (D104, Q171;
Matt's restate). - Triage cluster step: one parent per shared signature, symptom or suspect commit; only the parent
getsagent-ready; defaults tuned on the first 20 clusters (D68, D70, Q55, Q76). - No ticket when unsure (one question or
needs-info, a "seen again" note);filing_posturemoves to
work-items config (D68, Q56). Triage reads the glossary, ADRs and a scope statement first;
outside-PR intake default off (Q524). - Stale reporter-info: repo setting, default off; only
needs-reporter-infoitems whose reporter
lacks write access; closed on the operator's yes; lanes never close (D110, Q545). - Work classes and their labels dropped;
needs-human-implementationdropped; agents settle a
missing classification (D76, Q505; owner's). The issue-work lane takes onlyagent-readyitems
(Q581). - One claim protocol for every worker, covering any agent write;
work.authoritydropped (D93, D94,
Q515). - Lifecycle: automated pre-work posted with marker comments; desired-state/result-state pairs;
prod-error intake; an idea issue gets an interview first (D94, Q522). One engine decides
agent-readiness; wayfind map items stay out of/work-items:work(D108, Q535). - Trackers:
githubandlocal-markdownbundled;jira,gitea,linearseeds/work-items:setup
copies; content hash fast-forwards an untouched copy, an edited copy shows the diff and stops (D86,
Q514; combined). Tracker binding<home>/work-items.yaml, schema-checked; stop and ask when the
tracker cannot be determined (Q534, Q551). Seam:add-recurrencenow,compensatewith the first
two-way adapter (Q529). /harness-ops:morning-briefmoves to/work-items:morning-brief: read-only, Attention first,
Landed section with 3 sampled PRs under "Read these",landed_atsaved after a full read, per
machine (D68, D72, D87, Q516). Setting: landed-PR sample size 3.- One read-only lifecycle-metrics skill (name via
/naming:name-it-better): per-issue stage times and
the five DORA delivery metrics as a team trend, never per person; called by morning-brief,
go-faster, retro (Q521). Setting: deploy signal, default merge to main. - Cost per work item: lanes tag telemetry with the item URL, cloud lanes map
ccr.session.idto items,
/harness-ops:observabilityrolls up usage per item, never prices (D68, Q58, Q560). /work-items:decompose: each Done-when check is false at the starting commit or the item says why
(D95, Q523). Day job: Jira first, Teams second and read-only (Q59).- Research tags: Q560 OTEL routine; day-job Jira needs no local edits (D86); cluster thresholds on the
first 20 clusters; forge history readable within API limits for Landed (assumption 12). - Sub-topic promotion: this thread gets its own plan at phase start (B7).
Key interfaces
From the design's module layout: "work-items: /work-items:work bug path; triage cluster step;
/harness-ops:morning-brief moves in as /work-items:morning-brief; one read-only lifecycle-metrics
skill (name via /naming:name-it-better); /work-items:decompose Done-when rule. Bundled trackers
github and local-markdown; jira, gitea, linear are seeds /work-items:setup copies."
Contracts, "Tracker adapter": "Contract and conformance tests in the work-items tracker contract;
schema_version covers versions; content hash fast-forwards an untouched seed copy, an edited copy
shows the diff and stops. Seam verbs: add-recurrence now, compensate with the first two-way
adapter. Claim protocol is one for every worker."
Variation verdicts: "Tracker adapters: abstract now; work-items tracker seam; github,
local-markdown bundled, jira/gitea/linear seeds, add-recurrence, later compensate (C4, D86,
Q514, Q529)." "Telemetry sink and cost rollup: contain now; item URL tag, ccr.session.id map,
observability rollup; OTel read-back adapter deferred (Q58, Q560, D61)."
Slices, filed when this phase starts: bug-path-and-pickup, triage-cluster, claim-and-classes,
lifecycle-prework, tracker-seeds-and-binding, and the rest of the phase plan's list.
Done when
- The
morning-briefskill lives under work-items, not harness-ops, and
rg -n 'harness-ops:morning-brief' plugins docs --glob '!**/CHANGELOG.md' --glob '!.changes/**'
prints nothing. - The tracker test suite exits 0 and
rg -l 'work-class' plugins/work-items/skills | wc -l
returns 0 (14 on main). - The triage-cluster and tracker-seeds slices each carry a
Probe result:comment. - Every slice sub-issue is closed by a merged PR.
Out of scope
- Status storage (Work-item status thread).
- Dossier branches (Dossier thread).
Related
- feat(work-items): route an undiagnosed bug through diagnosis on the autonomous path #6314 route an undiagnosed bug through diagnosis (sub-issue of this thread); overlaps the bug path.
- Collides with pr-pipeline: admit marked epic slices in the resolve-issue lane #7596: fix(pr-pipeline): work-resolve-issue admits an issue that carries a held class beside an allowed one #7491 (under source-control: PR pipeline states, review venue, findings lane and statuses #7576) edits the same resolve-issue class filter; pr-pipeline: admit marked epic slices in the resolve-issue lane #7596 is blocked by fix(pr-pipeline): work-resolve-issue admits an issue that carries a held class beside an allowed one #7491.
Metadata
Metadata
Assignees
Labels
Type
Fields
Work status
Activity
github-actions commentedon Oct 16, 2026
Proposed work class: work-class: structural
Basis: automated intake triage; the lanes App applied this class.
Size: Large
Complexity: High
Uncertainty: Knowable
Flags: none
Blocked by: none
#7578 (comment)
This decision, with the earlier naming decision, settles the open questions. This is a multi-slice thread: the bug path, triage clusters, claim protocol, tracker adapters and morning brief. It needs splitting into the slice sub-issues it lists. #7571 and #7577 are listed as dependencies. I could not confirm whether they are still open, so I list no blockers.
Automated triage, applied by the lanes App.
37 remaining items
kyle-sexton commentedon Nov 1, 2026
Issue Triage session hand split (owner decision Q-D: a local session splits size-large issues by hand). Each slice traces to this body or the owner's poteto-review design record, and a fresh-context verifier checked each one against main before filing.
Filed as sub-issues (21):
agent-ready): feat(work-items): show "I read this item as" above the attended Proceed prompt #11864, feat(work-items): bug path reproduces twice and proves the fix before a draft PR #11865, feat(work-items): add-recurrence seam verb #11866, feat(work-items): triage reads the glossary, ADRs and scope statement first; outside-PR intake off by default #11867, feat(work-items): stale reporter-info setting, default off, closes only on the operator's yes #11868, feat(work-items): an idea issue gets an interview before exploration #11869, fix(work-items): keep wayfind map items out of /work-items:work's frontier #11870, feat(work-items): lease comments carry the phase of the work #11871, feat(work-items): the seam reads the tracker binding from the convention home #11872, feat(work-items): jira, gitea and linear ship as seeds that setup copies #11873, feat(work-items): add /work-items:measure-delivery with the five DORA delivery metrics #11874, feat(harness-ops): observability rolls up usage per work item #11875, feat(work-items): decompose writes why a Done-when check cannot fail at the starting commit #11876.agent-readythen): feat(work-items): investigate-only mode on the bug path #11877 on feat(work-items): bug path reproduces twice and proves the fix before a draft PR #11865; feat(work-items): triage and attend-queue claim an item before writing to it #11878 on feat(work-items): lease comments carry the phase of the work #11871; feat(work-items): setup writes the binding to the convention home and migrates the JSON file #11879, refactor(work-items): skills, references and evals name the binding in the convention home #11880, refactor(source-control): babysit scripts read the tracker binding from the convention home #11881, refactor(planning): wayfind reads the container label from the convention home #11882 on feat(work-items): the seam reads the tracker binding from the convention home #11872; feat(performance): go-faster reads delivery metrics from measure-delivery #11883, feat(session-flow): retro reads delivery metrics from measure-delivery #11884 on feat(work-items): add /work-items:measure-delivery with the five DORA delivery metrics #11874.Edges: #7579 and #10149 now wait on #11872 (the tracker binding readable at its new home) instead of this issue; #10150 no longer waits on it (the pre-push secrets check reads no binding); this issue no longer waits on #7577 (status storage is out of scope in the body).
needs-specandwork-class: structuralare off.Not filed yet (15 slices; this issue stays open for them):
work-class: untrusted-provenance(a trust label read at admission) and the public OTLP collector for the live cost probe (could bill).kyle-sexton commentedon Nov 1, 2026
Owner decisions, 2026-11-01, answered in the Issue Triage session with "go w/ recommendations" to these two questions:
Q2. What replaces
work-class: untrusted-provenance(a trust marker read at.github/scripts/intake-triage/admit.mjs:175andcheck-blockers.mjs:13) when the work-class labels go? Options were (a) rename it toprovenance: untrustedbeside the existingprovenance: signal(plugins/work-items/scripts/rule-admit.sh:196), (b) keep it as the one surviving work-class label, (c) fold it intoarea: security. Decided: (a). The label source is updated first, then one builder change for the CI readers (Automation Lanes session) and one plugin change for the plugin readers, so no reader ever sees neither label. This unblocks the parent's "0 work-class files" check and the label-removal slices, which stay held as host-run work (they need before-and-after evals) and wait on the CI lanes dropping the class labels.Q3. The live cost probe needs a public OTLP collector, which may bill. Where does it export? Options were (a) provision nothing until the owner approves a specific collector, (b) a free-tier collector, (c) skip the live check. Decided: (a). The live-probe slice stays held; nothing is provisioned.