unic / unic/unic-agents-plugins
bug(unic-archon-dlc): /setup authors a Ref: tag definition it cannot observe, and triage-labels.md does not say which parts a run rewrites
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 1
- Forks
- 0
- Avg merge
- 16h 43m
- Merged PRs (30d)
- 19
Description
Found while grilling WI 42991 on 2026-08-28.
Related to #427, which is the same family — generated content against hand-written content — but a
different file and a different mechanism, so it is filed separately.
The mechanism
commands/setup.md:316 writes docs/agents/triage-labels.md wholesale from TRACKER_VOCABULARY.
There are no markers and no managed block, unlike Step 7's targets. Its own rule is:
The role names in the left column are this Plugin's, and the team owns every other column.
That rule covers columns. It says nothing about a section. So a tenant fact a human adds to that
file as its own section has no protection, and the next /setup run in that Consumer loses it.
The instance that exposed it
DXP-DesignSystem's triage-labels.md carries an H2 section, § The Ref: tags are not one of these
tiers, which defines the Ref: family as recording "discipline — who does the work".
That definition is wrong. The maintainer, who owns the board, states that Ref: means
refinement: Ref: FE is a ticket to be refined with Frontend roles. He also states the tags exist
only in DXP-DesignSystem, DXP-ProfileServices and DXP-Website, and that he expects the family to
fade — once setup and skills land in every project, developers write specs themselves and traditional
human refinement stops.
Measured alongside it, across all 39 work items under dxp\DXP - ZRH\DS - Design System: zero carry a
Ref: tag, every one carries an undocumented project tag P: DesignSystem, and Specs is live on
42964, 42966 and 42968 where the file says retire it on sight. Proof: wit_work_item action=get_batch
over the 39 ids with System.Tags, and a project-wide wiql on [System.Tags] CONTAINS 'Ref: FE'
(alive elsewhere: 28328, 29003, 41333-41335).
The decision
Do not correct the definition. Delete the section from what /setup authors.
A corrected tenant fact in a generated file is still a tenant fact in a generated file. The Plugin cannot
observe a tag family that exists in three of a client's repositories, and it got the meaning wrong
precisely because it cannot. The meaning belongs in the Consumer's own glossary, which is the team's file
and which no command writes — that half is tracked on the Consumer's board, not here.
Then fix the mechanism, because deleting one section does not stop the next one being lost.
Acceptance criteria
/setupno longer authors a definition of a tag family it cannot observe. TheRef:section is gone
from what the command writes.triage-labels.mdstates which parts of itself a re-run rewrites and which it preserves. A human
reading the file knows where it is safe to add a tenant fact.- A second
/setuprun over a Consumer whosetriage-labels.mdcarries a hand-added section preserves
that section, or refuses and says what it would have overwritten. Silent loss is the defect. - The bar
issue-tracker.mdalready carries — a section earns its place only if it states a fact about
this tenant — is stated fortriage-labels.mdtoo, or the issue records why the two files differ. - Verified by running
/setuptwice in a real Consumer through a marketplace install, not by a test in
this repository.
Note on sizing
The tag family is expected to die. Do not build machinery for Ref: specifically. The finding worth
fixing is the wholesale overwrite; Ref: is the instance that revealed it.
AMENDED 2026-08-28 — this issue's central premise is FALSE. Read this before the text above.
/setup does not write triage-labels.md wholesale, and a tenant fact added by hand is NOT lost.
The mechanism half of this issue is void. It was written from commands/setup.md:316 — "Write
triage-labels.md from TRACKER_VOCABULARY" — read as unconditional. It is not. That line is the
instruction for when the file is absent.
The treatments table 280 lines above it says what actually happens (commands/setup.md:29):
report — a file the tenant owns — written when absent; when present, read it and report what
differs, changing nothing
Repeated at commands/setup.md:249: "Each one is written when it is absent. When it is present, read
it, report what differs from what this run would write, and change nothing — unless MODE = 'reconfigure', which offers the change per file." And again in README.md:197, and the run output at
commands/setup.md:402 prints "written, or reported unchanged".
So both tracker-contract files are tenant-owned with report treatment. A hand-written correction in
either survives every later /setup run. Only reconfigure offers a change, and an operator must accept
it.
Found by the worker on WI 42995, verified
independently. Worth naming how it survived: three documents said "wholesale" — this issue, and two
Azure DevOps work-item bodies — while the one document that had actually measured it, the Consumer's
docs/agents/unic-archon-dlc.md treatments table, said "report". The claim propagated because nobody
re-read the source; each restatement cited the previous one.
What survives, and it is smaller
One thing, and it is worth keeping: /setup should not author a definition of a tag family it cannot
observe. The Ref: section it writes into triage-labels.md defines the family as recording
"discipline — who does the work". It means refinement — Ref: FE is a ticket to be refined with
Frontend roles — and the family exists only in three of the client's repositories. The Plugin cannot see
that and got it wrong.
So the remaining criteria are:
/setupno longer authors a definition of a tag family it cannot observe. TheRef:passage is gone
from what the command writes.triage-labels.mdstates which parts of itself a run would rewrite and which it reports on, so a human
reading the file knows a hand-added tenant fact is safe. The behaviour is already correct; the file
does not say so.- Verified by running
/setuptwice in a real Consumer through a marketplace install.
Criteria withdrawn
The former criterion 3 — "a second /setup run over a Consumer whose triage-labels.md carries a
hand-added section preserves that section, or refuses" — is withdrawn as already satisfied. Report
treatment does exactly that. A criterion satisfied by changing nothing reads as coverage and buys none.
Consequence beyond this issue
Anything that routed a fact away from docs/agents/ on durability grounds was routed on a false
premise. Those files are not volatile. The placement ladder itself is unaffected — it decides by reader,
not by durability — but the durability argument must not propagate.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by rereading the treatments table and the triage-labels.md generation instructions in commands/setup.md, then compare the corresponding wording in README.md. Remove the unobservable Ref: definition from the content /setup would write, document the existing report treatment and preserved tenant-owned content, and run /setup twice in a real Consumer through a marketplace install to verify the result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- markdown
- Domain
- documentation
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100