Repository navigation
Description
Parent
Refs #7555. Source: PLAN Phase 10, topic poteto-review. Thread: Work-item status (fields versus
labels).
Depends on
- config-cascade: settings resolution and convention home #7571 Settings resolution and convention home (role-label remap setting)
- pr-pipeline: probe token broker grants #7601 broker-mint probe (closed: lane tokens hold
issues: write, enough for field writes) - Child work-items: probe org issue field for work status #7600 (Q563 status-field probe, closed with its result) is this thread's gating probe.
Outcome
A work item's status lives in one single-valued field when the tracker offers one (the org field
Work status here), with labels as the fallback, detected by the tracker adapter; lanes trigger on
the field change.
Decisions
- Status set
needs-triage,needs-reporter-info,needs-owner-decision,needs-spec,
agent-ready; Issue Type field, never a type label (D76, Q505). Origin: ours, owner-decided. - A single-valued attribute (status) is a field when the tracker offers fields (native first, else a
created org field); labels where a label fits better (multi-valued tags) and as the fallback
(user-owned repos, no field access); the adapter detects field availability; prefer the field
trigger when both work (Q563). - Setting: role labels remap for status and pair labels, names per D76, D94 (repo).
- Q563 probe result (owner sitting, GUIDE 123): GitHub reserves the name
status, so the field is
Work status(single-select, visibility all, the five options above); writes through the
issue-field-values API succeeded; the Issue events API keeps no value history, so the lane
triggers on Actionsissues: field_addedwithchanges.issue_field_value.from, checked live on
the first trigger run. - Migration (B5, owner): one cut-over, scoped to the open
agent-readyissues in this repository,
count first, dry run, recount; dual-write only if a label reader cannot move in the slice; move
work-resolve-issue.yml's trigger in the same slice. - Rejected: Projects v2 Status (per project, no Actions trigger); Issue Types and
state_reason(do
not model status).
Key interfaces
From the design's contracts, "Pipeline and verdict": "Statuses: needs-triage,
needs-reporter-info, needs-owner-decision, needs-spec, agent-ready; Issue Type field, never a
type label. Status is a field when the tracker offers one (adapter detects), labels as fallback."
"Tracker adapter": "Contract and conformance tests in the work-items tracker contract;
schema_version covers versions."
Variation verdicts: "Work-item status storage: abstract now; tracker adapter; field where offered,
labels as fallback (Q563)."
Slices, filed when this phase starts: status-field-adapter, status-migration.
Done when
- The tracker test suite and the conformance suite pass for
githubandlocal-markdownwith
field detection. Delivered by feat(work-items): detect whether the tracker stores status in the Work status field or in labels #11123 (closed by merged feat(work-items): detect whether the tracker stores status in the Work status field or in labels #11138, field detection tested inwork-item-tracker.test.sh); all 71 tracker test files, both adapters included, passed on main 2026-11-06 ~22:4xZ. - After migration,
gh issue list --label agent-ready --state open --json number --jq length
returns 0, and the migration comment lists the same issues with field valueagent-ready. - The first
field_addedtrigger run logs a non-emptychanges.issue_field_value.fromand
concludessuccess. Met by run 42241474462 (2026-11-06T15:16Z, actor kyle-sexton): "Log the Work status change" succeeded withfrom=confirmed.
Out of scope
- Creating or changing org-level issue fields (owner stop).
- Status writes from decompose and
track addbefore this thread lands.
Metadata
Metadata
Assignees
Labels
Type
Fields
Work status
Activity
github-actions commentedon Oct 16, 2026
Proposed work class: none
Size: Medium
Complexity: Medium
Uncertainty: Known
Flags: none
Blocked by: #13486
#7577 (comment)
This decision settles the open question on criterion 1, so nothing is asked again. Per the close audit, criterion 3 is met. Criterion 2 still waits on the
agent-readycut-over tracked in #13486, so I list it as the blocker.Automated triage. A maintainer reviews it.
40 remaining items
kyle-sexton commentedon Nov 7, 2026
kyle-sexton commentedon Nov 7, 2026
Status, 2026-11-07 (poteto, hub-assigned remainder).
plugins/work-items/tools/work-item-tracker/work-item-tracker.test.sh. All 71 tracker test files,githubandlocal-markdownadapters included, passed on main at 2026-11-06 ~22:4xZ.field_addedrun to log a non-emptychanges.issue_field_value.fromand conclude success..github/workflows/work-resolve-issue.yml:47. The admit gate is at:78-80; it fires only for field 48484079, option agent-ready (84879220), and aUsersender. The log step is at:166-170.issuesruns since 2026-11-06T14:00Z executed "Log the Work status change". So far only the lanes App has written the field, and an App sender skips the job.intake-reenter.ymlalso reacts to a person's change of that field. Setting it to agent-ready on a real issue would tell every reader the issue is admitted. A throwaway issue would also go through intake triage first.{from, to}pair.admit.mjs:2771, the labeled trigger).This issue stays open for done-when 2 and 3.
kyle-sexton commentedon Nov 7, 2026
Done-when 3 met (field_added trigger run).
issues, created 2026-11-06T15:16:17Z, actor and triggering actorkyle-sexton(not the lanes App), conclusionsuccess.admitjob runsjq -c '{from: .changes.issue_field_value.from, to: .issue_field_value}' "$GITHUB_EVENT_PATH"and logged at 15:16:28Z a non-emptyfrom: optionconfirmed(id 86380002) on field 16338354.Done-when 2 stays open:
admit.mjsstill writesagent-readyand the lane trigger still listens onlabeleduntil #13486's S4 lands. This issue stays open for that item.Posted by the github-support hub session. This was generated by AI.
kyle-sexton commentedon Nov 7, 2026
#13486 S4 (d) migration record: none moved.
agent-readylabel now: 0 (gh issue list --label agent-ready --state open).agent-ready(field 48484079, option agent-ready). It closed through its own lane PR before the strip ran, so no label was removed from an open issue.status: ready: 0, and the other status labels were stripped in S3 (chore(pr-pipeline): retire issue status labels after the Work status cutover #13486 issuecomment-6709149268).agent-readyadmissions run on the field from then on (chore(pr-pipeline): retire issue status labels after the Work status cutover #13486 done-when 1 and 2).kyle-sexton commentedon Nov 7, 2026
Done-when 2: met. All three done-when items now hold, so this closes as completed.
gh issue list --label agent-ready --state open --json number --jq lengthreturned 0 at 2026-11-07T20:13Z (poteto's own read).agent-ready. fix(skills): keep an unsubstituted ${user_config.medium} out of the view resolver command #13955 is now closed as completed through its own lane PR. No label was stripped from an open issue, which matches a count of 0.Follow-up work stays on #13486 (#14017, the last capped-close label writer).