feat(aosguard): refuse an issue filed with no priority or autonomy label #1318
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agentic-os!1318
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/1105-require-issue-labels-v2"
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 #1105.
The gap, measured before the change
An unlabelled issue is the fail-closed default that reaches no queue, which is
coilyco-gaming/sirens-echo#437's subject.What now happens
issue createbecomes an action shadow whose--labelsis required and must carry one priority and one autonomy label. Every case below is from the built binary:Nothing is created by any refusal. The check runs while the flags bind, before the create request is assembled, so this is not the response-side reporting the acceptance rejects.
Labels are names now, not ids
--labels priority/P2, not--labels 199. The names are identical across every org and repo thecoily*gate reaches and the ids are not, so a name needs no per-org table and no lookup - the friction the director measured eleven times in one day on #1105.CreateIssueOption.labelsdeclaresitems: {type: integer}, ids only, so the labels are applied by a second call to the labels sub-collection whoseIssueLabelsOptiondeclares the id-or-name union. The policy check precedes both calls, so a violating call creates nothing.The globs enumerate rather than wildcard
The part worth reviewing hardest. An unknown label name is dropped silently with a 200:
So
priority/*would acceptpriority/p2orpriority/P9, let the write through, and apply nothing - the control reporting success over the hazard it exists to prevent. umbra#324 madematchescarry alternative globs so the vocabulary is enumerated instead.The full flag surface is preserved
The first draft dropped six optional flags, because an action arg bound to an unsupplied input failed the whole call. Kai's call was to fix that upstream rather than accept the reduction, so two umbra fixes landed first:
$refnoinputdeclares, so a runtime miss can only be a declared-but-omitted input.--milestone 16reaches the wire as16and not"16". Without this, carrying--milestonewould have silently sent the wrong type, which is worse than dropping it.The shadow now carries
--body,--milestone,--assignees,--due_dateand--ref. Only the deprecated single--assigneeand--closedstay off:--assigneessupersedes the first, and filing an already-closed issue is not something this surface should make easy.The two-taxonomy problem dissolved
#1105 asks for the rule to cover
coilysiren/inbox's unprefixed labels or be scoped around them. Neither is needed. coilysiren/inbox#392 closed on 2026-08-27, and the live label sets confirminboxandwebsitenow carrypriority/P0..P4andautonomy/*, allexclusive=true. One rule covers every repo this surface writes, and no exemption exists to go stale.Verification
Proved live end to end before the flags were restored: probe issue #1310 filed through the shadow, both label names applied by the second call,
$issue.numberthreaded, labels confirmed on re-read, then closed.move-issuedry-run checked for regression and is unaffected - a shadow replaces the CLI leaf, not the grant.pre-commit run --all-filespasses.Follow-ups filed
docs/page, because the repo is at its 40-doc budget ceiling.move-issueis a second path to an unlabelled issue, and its "deferred (array flow)" note is now stale.