Repository navigation
feat(lib): add a current-facts-not-targets check for conventions files #9827
Copy link
Copy link
Open
Labels
priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.A maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Description
Refs #6594. Slice 4 of 4. Blocked by #9801 (slice 1, the owner doc). Runs in parallel with slices 2 and 3.
Problem
Setup runs wrote targets as current facts ("every command supports non-interactive flags"), which would make an agent hang on commands that do not (#6594 Problem 4). Only developer-experience guards against it, and only in model prose (plugins/developer-experience/skills/setup/SKILL.md:95-99, the ## Not yet rule). No shared, deterministic check exists for other adopting plugins.
Fix
- Add a shared checker under
lib/(for examplelib/check-convention-facts.mjs, generated intoplugins/developer-experience/lib/throughscripts/sync-shared-copies.shwith ascripts/cross-plugin-source-registry.txtrow) that reads a conventions.mdand prints one finding per line for each universal claim (every,all,always,never,eachfollowed by a statement about the repository) outside the## Not yetsection, withfile:line. It is advisory: exit 0 with findings printed, exit 2 on a usage error. Label it heuristic in its header. - Have
developer-experiencesetup's check step 5 call it and list its findings for the model to verify, keeping the model's own verification. - Document the rule (current facts only; targets go under
## Not yetor a work item) in the## Current facts, not targetssection ofdocs/conventions/setup-lifecycle/README.md.
Done when
-
bash lib/check-convention-facts.test.sh(or the.test.mjsthe repository's test runner picks up) exits 0, with cases for: a universal claim outside## Not yetreported with its line number; the same sentence under## Not yetnot reported; a file with no claims printing nothing -
grep -c 'check-convention-facts' plugins/developer-experience/skills/setup/SKILL.mdprints 1 or more -
bash scripts/sync-shared-copies.sh --checkexits 0 (the DX copy is generated and registered inscripts/cross-plugin-source-registry.txt) - A
developer-experiencechangelog fragment exists in the PR diff, per ADR 0048 -
grep -c '## Not yet' docs/conventions/setup-lifecycle/README.mdprints 1 or more -
ci-statusis green on the PR head
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.A maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Type
Fields
No fields configured for Feature.
Activity
github-actions commentedon Oct 24, 2026
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Medium
Complexity: Medium
Uncertainty: Known
Flags: none
Blocked by: #9801
Understood: add an advisory, heuristic
lib/checker that flags universal claims ("every", "all", "always", "never", "each") in conventions files outside## Not yet, withfile:line. It would be synced intodeveloper-experience, called from setup check step 5, and documented in the setup-lifecycle conventions README. The done-when list is concrete and checkable, and the approach is clear. The issue names #9801 (the owner doc, slice 1) as a prerequisite, so it is listed as blocking. I found no duplicate among the open issues I was given.Automated triage, applied by the lanes App.
melodic-automation-lanes commentedon Oct 24, 2026
Not admitted to the issue lane: a Feature needs an open parent issue a listed human filed that awaits no decision. Admission takes the issue once each of those is met, when intake triages it again (
.github/actions/resolve-config/admission-rules.json).kyle-sexton commentedon Oct 26, 2026
Released for re-triage under the owner's 2026-10-26 rule: a person is involved only for "1. A change in original intent/vision 2. Something comes up during implementation ... that alters intent/vision or the primary design 3. If there is a HIGH/CRITICAL security issue". None applies here, so the hold label came off and intake triage runs again now.
To hold this issue again, add
needs-human(orstatus: needs-decision) and name which of the three applies.melodic-automation-lanes commentedon Oct 26, 2026
The latest triage verdict holds nothing: admission moved the issue to
status: confirmed; its comment says why.kyle-sexton commentedon Oct 27, 2026
Released for re-triage under the owner's 2026-10-26 rule: a person is involved only for "1. A change in original intent/vision 2. Something comes up during implementation ... that alters intent/vision or the primary design 3. If there is a HIGH/CRITICAL security issue". None applies here, so the hold label came off and intake triage runs again now.
To hold this issue again, add
needs-human(orstatus: needs-decision) and name which of the three applies.