feat(specverb): let an action input constrain its value, not just demand one #323
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
sunday-sprint
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/umbra!323
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/1105-input-matches"
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 #322. Unblocks
coilyco-flight-deck/agentic-os#1105.What was missing
#319 cleared presence: an action input can carry an
array, andrequiredis enforced while inputs bind, before the request is assembled. What it cannot do is say anything about the shape of the value, so a shadow can demand a label set and not demand a well-formed one.agentic-os#1105 needs exactly that, and is explicit that a bare rejection does not count:
matcheson an inputOn an
arrayinput each constraint demands at least one matching element. Constraints are checked independently, which is the property that lets the error name the missing axis rather than the whole set: four labels carrying nopriority/*fail on the priority constraint alone. On a scalar input the bound value itself must match.Checked where
requiredis checked, so a refusal ends the run before any request exists. The tests prove that rather than assert it: both refusal cases run with a transport that fails the test if anything reaches the wire.Why this spelling
matchesis already the DSL's word for a glob guard in three places -restrict <param> matches <glob...>at wrap scope,when first input matches ...on afetch, andwhen/deny-when <sel> matches <glob...>in execverb. This reuses the word and the matcher rather than adding a second vocabulary for the same idea.matchesAnyGlobis exported asopcore.MatchesAnyGlobso the input guard and the wrap restriction cannot drift apart, following #319's precedent of moving shared encoding into opcore rather than letting it exist twice.Checking on names, not ids
Worth recording, because it is why the guard is useful at all. agentic-os#1105 rules out an id allowlist: label names are consistent across the estate and ids are not, so an allowlist is one stale table per org. Resolving names to ids in a lookup step is separately blocked, since
stepflow.SliceRefsdocuments that a step-output reference is never a list. Constraining the tokens the caller already passed needs neither.Fail-closed edges
An absent glob, an empty glob, a second glob, and any property other than
messageeach fail at parse rather than silently constraining nothing.Verification
make test(34 packages, no failures),make vet,make lint(0 issues),make tidy, andgodoc-current.txtregenerated. Seven new tests: three on the composition guard end to end, four on the parser's fail-closed edges.pre-commit run --all-filespasses every hook exceptcode-comments, which reports 18 violations onmainunchanged - this branch adds none. Confirmed by diffing the hook's output against the base commit.No API break
Additive.
Inputgains a field andopcore.matchesAnyGlobis exported under the same behaviour, so no consumer signature changes.