Skip to content

Move the DLC's tracker contract from config into the repo docs #389

Closed

Description

@orioltf

Question

Move the DLC's tracker contract out of .archon/unic-dlc.config.yaml and into the two repo docs the
Methods already read. This is the plugin half of
#387; its resolution comment holds the whole
decision and this ticket executes it.

The shape of the change is deletion. Four Box prompts learn one new sentence — name a role and a file,
never a host word — and the config loses everything that existed to translate a role into a host
string.

Acceptance criteria

  • The four unic-dlc-*.yaml Boxes read docs/agents/issue-tracker.md and
    docs/agents/triage-labels.md, and no node reads tracker, classification.labels,
    project.pr_strategy or repo_ref.
  • No bootstrap node derives a repository from a remote URL, and the ambiguous-repo status is
    gone from all four output schemas.
  • unic-dlc-pr-review.yaml describes a pull-request discussion in terms both hosts satisfy — it
    no longer promises a PR-level comment.
  • commands/tickets.md states that the tracker id of each published ticket is written into
    issues.json. Nothing downstream can reference a tracker item without it — on GitHub the PR
    does not close its issue either, so this is a host-agnostic gap, not an ADO one. Rewrite commands/tickets.md from scratch against the to-tickets Method #382 rewrites
    this file later and must preserve the rule.
  • unic-dlc-build.yaml open-pr states that it links each work item in the baton through the
    registered skill's own link capability, naming no text token.
  • docs/adr/0024-triage-intake-on-ramp.md states which of its rules are dead: the compose rule
    that forbids reading Matt's setup artefacts, and the claim that the tier carries the axis.
  • CONTEXT.md no longer defines Repository derivation, and its glossary names whatever term
    replaces it.
  • commands/cleanup.md names no provider and no subcommand where it tells a reader to compose
    the registered skill. Today line 193 forbids a hardcoded CLI and then gives gh pr close and
    az repos pr update --status abandoned as its example.
  • The Consumer is left consistent. ~/Sites/<customer>/DXP-DesignSystem/.archon/unic-dlc.config.yaml
    carries the deleted keys plus transitional comments naming this ticket; both are wrong the
    moment this lands. That is a second commit, in the Consumer repository, on its own branch.

Added 2026-08-19, while implementing. Moving the axis into the contract makes a defect reachable
that the config shape could not express. Before this ticket every state role resolved to a
single-value field, so nothing could accumulate. triage-labels.md puts two of them on a many-value
axis, and the Harness only ever adds — so /tickets writes a role that nothing retracts. That is a
defect this ticket introduces, not an adjacent improvement, so it is fixed here.

  • docs/agents/triage-labels.md carries a Holds column, one or many, on every row. The
    Harness rule below reads that column and never an axis name: Tag and Label are host words,
    and a rule phrased on one breaks on the next host.
  • A state, type or priority role is single-valued. Only one role of a tier is true of an
    item at a time. Before the Harness writes such a role, it reads the other rows of that tier and
    retracts every one whose axis holds many values; an axis that holds one value retracts the old
    value itself. Stated in every Box and command that writes a role. The neighbouring rule — a row
    with no axis writes nothing — is stated in the same places; today only /triage says it.
  • unic-dlc-qa.yaml's merge node writes the resolved role on each linked item, so the rule
    above has a firing path. Without it the rule never executes and reads as coverage it does not
    buy. A tracker that cannot set the role says so and merges anyway.
  • The plugin's AGENTS.md states the transition table — every point in the lifecycle where the
    Harness writes a role, and which role. The two holes above were invisible because nothing stated
    the whole, and the table is what makes the rule above checkable. One row records that /build
    writes no role on purpose: the pull-request link its open-pr creates already carries "an agent
    started this", natively, on every host, so no in-progress role is needed.
  • The plugin says out loud that an extra row in triage-labels.md changes no Box. A Box names its
    roles literally, so a team-added role is inert — the roles are the protocol the Boxes share, and
    the door for a team that wants different behaviour is a Method fork, not a row.

Activity

  1. orioltf commented on Aug 18, 2026

    @orioltf
    MemberAuthor

    Measured on Azure DevOps, 2026-08-18 — two of this ticket's premises are weaker than recorded

    unic-dlc-pr-review ran against the live Consumer pull request (DXP-DesignSystem !5769, run
    59373a2ae11ce7d2f993f28b3bd9e86b). It was cancelled after prep on purpose — the Azure DevOps
    signal is all in that node, and review was fanning out over a 6 959-line diff.

    Finding 1 did not fire. prep received repo_ref as the single opaque string
    https://<org>@dev.azure.com/<org>/dxp/_git/DXP-DesignSystem, with nothing telling it how to
    decompose it. It composed the registered MCP server unaided and printed no BLOCKED. The tool log:

    3  mcp__azure-devops__repo_pull_request
    2  mcp__azure-devops__wit_work_item
    1  mcp__azure-devops__repo_pull_request_thread
    0  az …
    

    Finding 7 did not fire either. The two-level thread shape did not defeat the marker scan:
    iteration: 1, prior_findings: [], and System.CommentCount read correctly as 0.

    prep also resolved intent from four sources, produced a correct ten-criterion brief, and recorded
    two genuine contradictions between the work item and the diff.

    What this changes. Nothing about the decision — the tracker contract still belongs in two repo
    docs, and a Box still must name no host word. What it changes is the premise: the addressing gap
    is a latent risk, not an established break. Do not write this ticket up as fixing something that a
    real run disproved. State it as removing a derivation nobody needs, which is the argument #387
    actually made.

    One fact worth keeping, because it was unknown before. The MCP server registered in the
    Consumer's .mcp.json does load inside an Archon worktree, at a path
    (~/.archon/workspaces/_git/DXP-DesignSystem/worktrees/…) that no human ever approved. Every Box
    prompt that says "compose the system-skill the team registered under tracker.access" depends on
    that, and until now nothing had tested it. It belongs in the plugin's own docs.

    One more criterion for this ticket

    commands/cleanup.md:193 states the rule and then breaks it in its own example:

    Stale/leftover PRs → close via the composed TRACKER.access (e.g. the tracker MCP close tool,
    or gh pr close / az repos pr update --status abandoned), never a hardcoded CLI.

    Two provider names and a subcommand, inside the sentence that forbids them. Added to the acceptance
    criteria below.

  2. orioltf commented on Aug 18, 2026

    @orioltf
    MemberAuthor

    How to start this session

    Produces: the four Boxes reading the two repo docs, and a config with almost nothing left in it.
    This is an editing session, not a deciding one — #387
    is closed and its resolution comment holds the whole decision.

    1. Run /wayfinder 373 #389 here to claim it. Invoke /writing-for-agents — every file this
      ticket touches is a prompt or an AGENTS.md, which is exactly that skill's subject. Do not
      invoke /grilling: nothing here is undecided.
    2. Read in this order. The resolution comment on Decide the DLC's tracker contract on Azure DevOps #387, then the "Measured on Azure DevOps" comment
      on this ticket, then the four .archon/workflows/unic-dlc-*.yaml files.
    3. Read the worked example before editing anything:
      ~/Sites/<customer>/DXP-DesignSystem/docs/agents/issue-tracker.md and triage-labels.md, merged as
      4a9e227. That is the shape a Box must be able to consume. Three unic-dlc-pr-review runs read
      those files and reasoned from them by line number, so the shape is proven, not proposed.

    Traps

    • Do not write this up as fixing a break. A live run against Azure DevOps composed the MCP from
      the one opaque repo_ref string with no help and printed no BLOCKED; the two-level thread scan
      worked too. The addressing gap is a latent risk, not an observed failure. This ticket removes a
      derivation nobody needs — that is the argument Decide the DLC's tracker contract on Azure DevOps #387 actually made.
    • Deletion is most of the work. The whole tracker block, classification.labels,
      project.pr_strategy, repo_ref and the ambiguous-repo guard all go, and MANDATORY_PATHS
      becomes project.branching alone. Resist replacing any of them with a smaller key.
    • The Consumer is not finished when this repo is. The Consumer's config still carries the deleted keys
      behind transitional comments that name this ticket. Leaving them is how the two repositories start
      disagreeing again. Second commit, second branch, its own PR.
    • Check Delete lib/ and test/ — take the plugin to zero code #381 first. It deletes lib/ and test/. If it has landed, config-schema.mjs and its
      MANDATORY_PATHS no longer exist and the config shape is prose — which changes what "delete the
      key" means. If it has not, this ticket edits a module Delete lib/ and test/ — take the plugin to zero code #381 then deletes.
    • Decision 3 stands: the plugin is prose. The answer is a rule a node reads, never a module.
  3. orioltf commented on Aug 19, 2026

    @orioltf
    MemberAuthor

    Merged: PR #393 (624de9e) in this repository, and !5775 in DXP-DesignSystem for the Consumer half. Two unic-dlc-pr-review iterations ran against !5775 and proved the parts nothing here could test — bootstrap ready with no tracker block, § Access composing the MCP with no tracker.access, § Addressing finding the PR with no repo_ref, and reconcile matching three findings by hash across iterations. Follow-ups filed: #394, #395, #396.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions