Repository navigation
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). Met 2026-11-06 on main after refactor(work-items): drop remaining work-class references from skills #13748: 71/71 tracker test files pass,work-classcount 0. -
The triage-cluster and tracker-seeds slices each carry aDropped as notProbe result:comment.
worth doing now (owner Q14 (a), 2026-11-06): tuning the cluster defaults needs 20 real clusters, and the
tracker-seeds probe needs a live Jira, Gitea or Linear that is not in use. Both are kept on the hub's
hardening seed list for when the data exists. - Every slice sub-issue is closed by a merged PR. All 32 are closed; 29 by a closing PR. refactor(work-items): move /harness-ops:morning-brief to /work-items:morning-brief #11124 was
delivered by refactor(work-items): move the morning-brief skill tree to work-items byte-identical #12423 and refactor(work-items): move morning-brief's settings, data dir and in-file references to work-items #12561, refactor(planning): wayfind reads the container label from the convention home #11882 by refactor(planning): wayfind reads the container label from the convention home #11942, and work-items: probe ccr.session.id in a routine OTEL run #7595 is a probe whose result is posted on it.
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
I read this as the parent tracking issue for the work-items thread: a bug path, triage clusters, a claim protocol, tracker adapters and the morning brief move. It has been split into 21 sub-issues, and 15 more slices are not filed yet.
The "Done when" items are lane-checkable, apart from the host-run and eval slices. Those are routed separately.
I found no duplicate. #6314 and #7596 are named in the body as related, not as duplicates. The earlier owner decisions are in the comments, but none starts with
**Decision recorded.**, so I treat them as context and not as a recorded decision.Automated triage, applied by the lanes App.
62 remaining items
kyle-sexton commentedon Nov 5, 2026
Claimed by the poteto session: auditing the Decisions items against origin/main and building what is missing in one or two PRs (Refs, not Closes). The work-class removal stays out of scope here; it waits on #13526.
kyle-sexton commentedon Nov 5, 2026
Status audit against origin/main (38ca30f), 2026-11-05.
agent-ready)plugins/work-items/skills/triage/SKILL.md:388,context/apply-outcome.md:35). #13555 adds signature clusters: members close as duplicates with anadd-recurrencenote on the parent and noblocked-byedge, since work-unblock promotes an item when its last blocker closes (.github/scripts/work-unblock/label-unblocked.test.mjs:377).track/actions/add.mdgains the rule and uses the seam'sadd-recurrence(tools/work-item-tracker/CONTRACT.md:247).filing_posturemoves to work-items configplugins/bugs/reference/config.md:41,docs/conventions/bugs.yaml:47).plugins/harness-ops/skills/changelog/context/native-drift.md:148records that work-items has no such key. The move touches 12 files across bugs, docs and harness-ops, including/bugs:setup apply, which writes the key. Left for a follow-up build.landed_atafter a full read, per machine)plugins/work-items/skills/morning-brief. The move half holds (done-when 1, ticked).Probe result:on the triage-cluster and tracker-seeds slicesProbe result:comment. Its probe needs a live seed tracker (Jira, Gitea or Linear) copied by/work-items:setup.What remains:
work-classremoval: 16 files inplugins/work-items/skillson main. It waits on refactor(work-items,source-control): read provenance: untrusted as the untrusted-provenance label #13526 (provenance: untrusted), which is blocked by feat(pr-pipeline): CI readers hold provenance: untrusted beside the legacy untrusted-provenance label #13525.filing_posturemove.kyle-sexton commentedon Nov 6, 2026
kyle-sexton commentedon Nov 6, 2026
Lane 2: the work-class label slice is blocked on the untrusted-provenance writer; nothing built. Agent finding, not an owner answer.
The done-when line "
rg -l 'work-class' plugins/work-items/skills | wc -lreturns 0" can't be met yet without loosening the untrusted hold:.github/scripts/intake-triage/admit.mjs:217export const UNTRUSTED = UNTRUSTED_LABEL;, and.github/scripts/pr-merge/merge-holds.mjs:1634export const UNTRUSTED_LABEL = "work-class: untrusted-provenance";("Writers still apply UNTRUSTED_LABEL until every reader takes both",:1633). The triage prompt still proposes it (.github/workflows/intake-triage.yml:301-306).work-loop/SKILL.md:335,395,399,triage/SKILL.md:43,242,attend-queue/SKILL.md:210,242,247,390. Removing those lines while the writer stamps only the legacy name would let work-loop, triage and attend-queue treat an untrusted item as unheld.reference/work-class-labels.md:24says "writers apply onlyprovenance: untrusted", which contradicts the code above.Owner decision Q2 (a) sets the order: label source, then CI readers (#13525, closed), then plugin readers (#13526, closed). The step left is switching the writer (
UNTRUSTEDinadmit.mjs, the triage prompt's class line) toprovenance: untrusted. Every reader already holds both labels (UNTRUSTED_LABELS,merge-holds.mjs:1635), so the switch loosens nothing.Size. The hub's "45 references" doesn't reproduce. On main d23b140,
work-class/work_classis in 341 files: 85 use the label family (481 lines), 233 belong to autonomy's separate C1 to C5 risk classes (976 lines are security-binding fixtures), 12 are merge or admission controls, and 11 are prose only. Inplugins/work-items/skillsalone: 14 files.Order that meets the line without loosening anything (recommended):
.github/, Automation Lanes or a host session): intake writesprovenance: untrusted; the triage prompt offers only that hold;work-class-labels.md:24stays true.read-only/mechanical/scoped/structuraland the legacy-name reads fromplugins/work-items/skills(14 files), plus setup's work-class axis migration and probe 7. It changes skill bodies, so it carriesdo-not-mergeuntil a VALID before/after eval.Lane 2 released its claim on #7578.
ci(intake): read untrusted from any Flags line
fix(intake): stub the request hooks the compose script now registers
refactor(work-items): keep the class-labels doc at its old path
refactor(work-items): spell out the legacy untrusted label at each hold
kyle-sexton commentedon Nov 6, 2026
Rescope after the 2026-11-06 issue validation. The owner answered the validation's questions, verbatim: "Jesus, just go with recommended. Be smart." (2026-11-06T19:27Z, relayed verbatim by the GitHub Support hub).
Q14 (a), owner decision. Two items are dropped as not worth doing now, and done-when 3 is edited to say so:
Probe result:on feat(work-items): jira, gitea and linear ship as seeds that setup copies #11873. That needs a live Jira, Gitea or Linear, and none is in use.Both are on the hub's hardening seed list for when the data exists.
Q15, the pre-work recording form. Agent choice; the owner handed it back. Already decided on evidence and built in feat(work-items): pre-work comments carry desired and result state #13745 (merged 2026-11-06T16:38:43Z). The desired/result pair is a
desired=field besideoutcome=in the existing<!-- work-items:investigation ... -->marker comment. It adds no label pair.research-r12-prework-intake.md:105-106,141, quoted in feat(work-items): pre-work comments carry desired and result state #13745's body).What remains on this issue:
UNTRUSTED_LABEL = "provenance: untrusted"(.github/scripts/pr-merge/merge-holds.mjs:1640), whichadmit.mjs:218writes. The legacy name stays a read-only hold for issues that still carry it.filing_posturemove: feat(work-items): filing_posture moves to work-items config #13747.kyle-sexton commentedon Nov 6, 2026
Correction to the earlier comment: more remains than the four PRs it listed. I audited every Decisions line against origin/main 41f3a2b, read-only. The 2026-11-01 split's "15 unfiled slices" list can't be recovered whole, so the Decisions list is the checklist.
Being built now (hub-assigned to poteto, with Automation Lanes agreeing on the order):
.github/scripts/intake-triage/apply-verdict.mjs:298-309still applies awork-class:label.intake-triage.yml:304-306still asks the model for one, andreentry-eval/build-suite.mjs:35-38lists them.merge-holds.mjs:1624,pr-unblock/lane-hold.mjs:28,pr-merge.yml:1221-1226and about 23 other.githubfiles read only/.work-item-tracker.json. That file is removed once nothing in this repo reads it. Plugin readers keep the legacy fallback for consumer repos.Delete the fiveDropped (agent choice). Deleting a label strips it from everywork-class:label objects.issue, closed ones included, and can't be undone. Readers still hold the legacy
work-class: untrusted-provenance(merge-holds.mjs:1641), so deleting it would drop the hold on a reopenedissue. Once nothing applies them, the unused labels cost nothing.
Remaining, not buildable now:
autonomy.work_item.url(feat(harness-ops): roll up observability usage per work item #11909), but no lane sets it. The CI half waits on owner Q3 (a) (2026-11-01): "provision nothing until the owner approves a specific collector".Decided out, with a recorded basis:
plugins/autonomy/reference/trigger-dispatch.md:148).admit.mjsis the only automated admission. Triage applies the role label only as a person's outcome, and a lane's triage sweep proposes and never admits (plugins/work-items/skills/triage/context/apply-outcome.md:50). The wayfind half shipped in feat(planning): wayfind absorbs the wayfinder decisions and accept list #12574.admission-deferredlabel is a place in the capacity queue, not a work claim (admit.mjs:95-102). Workers claim through the lease (feat(work-items): lease comments carry the phase of the work #11871, feat(work-items): triage and attend-queue claim an item before writing to it #11878, the CI lane lease in feat(work-items): claim the issue with a lane lease before the model starts #11263).work.authorityhas no hit on main.Done-when 4 evidence. All 32 sub-issues are closed; 29 were closed by a merged PR. The other three are covered as follows (the bar is not reworded):
kyle-sexton commentedon Nov 6, 2026
Closing: every done-when is met, and every Decisions line is built or recorded with a basis. The full audit is in issuecomment-6694018067.
work-classcount inplugins/work-items/skillsis 0.Merged today:
filing_posturemoved to work-items config.docs/conventions/work-items.yaml;/.work-item-tracker.jsonremoved.desired=marker field.Not built, carried where it can be picked up:
The
work-class:label objects stay. Deleting them would strip them from closed issues irreversibly, and the legacy untrusted label is still a held read (merge-holds.mjs:1641).Post-merge watch (R21) for #13826: