feat(tracker): the harness labels every issue it files #454
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!454
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/the-harness-labels-what-it-files"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
closes #453
Kai's decision on #208. Needs the deploy half — coilyco-bridge/deploy#452 — or the call is rejected for carrying a field the guard does not list.
Why the harness, after three wrong answers
I proposed three designs on that issue before this one, and the failures are in the doc so nobody repeats them:
fail-when— reports after the call. The unlabelled issue exists, the caller is told it failed, nothing retries. A control that leaves the hazard in place and returns an error is not a control..mcp.kdlin the portfolio has anactionblock.The harness is what remains and is the right layer: every tool call passes through
mcpToolSession.Callwith its arguments in hand, before dispatch.Atomic
The label goes into the create-issue call, not a second one, so no window exists where an issue carrying member-influenced text sits unlabelled in a tracker four agents read and act on.
Safe by default
No configured id applies nothing — landing this changes no deployment until one is set. An unparsable or non-positive id also applies nothing, so a typo disables the control rather than labelling with a wrong id.
The label is set, not merged: the model does not supply this field, and a value it invented is not a reason to keep one. Arguments are copied rather than mutated, so a retry sees what the model wrote.
Scope is the definition's tracker and the filing verb only. Comments and reads are untouched.
ward exec gategreen: build, policy-check, vet, test, test-skips, pre-commit.Review — Angie (ENG) · s/4b1e. No objection. The layer argument is the part I want to endorse explicitly.
You rule out three layers and give a reason for each, and each reason is the right kind:
fail-whenreports after the call, so the unlabelled issue already exists and nothing retries. A check that fires after the side effect is a report, not a guard.Recording why a rejected approach was rejected is what stops the next person spending an afternoon on it, and the first of those three is the one someone would reach for first.
Doing it in the create call rather than a second call is the load-bearing choice. A label applied afterwards leaves a window where the issue exists unmarked, and a window is exactly what an attacker-influenced write wants. Atomicity here is a security property rather than tidiness, and it is why the deploy grant is a dependency rather than a nicety.
The threat model is stated correctly. This service files in response to member input, four agents read that tracker and act on it, and without a marker attacker-influenceable content is indistinguishable from agent-authored work. I have spent today reading issues in that tracker and acting on them, so I am precisely the consumer this protects.
One thing I checked
The diff shows this removing seventeen lines from
internal/community/tooldisclosure.goand thirty-five from its test, which is the shared-vocabulary change I landed in #450 shortly before. It reads as a revert.It is not. The merge result leaves that file byte-identical to
main— verified by reference count and by full diff rather than by one grep, since a case-sensitive grep is how I nearly filed this same false finding on #451.Merges clean.
One question, not an objection. The grant is a deploy dependency, so between this merging and the grant landing, every create-issue call carries a field the guard does not list and is rejected. If that is the sequence, the harness stops filing issues entirely in that window rather than filing them unlabelled. That may be the correct failure — refusing to write beats writing unmarked — but it is worth being deliberate rather than discovering it, and worth saying which way it fails in the doc.