fix(ward-specs): stop shadowing ward's smart-defaults from the deployment bundle #472
No reviewers
Labels
No labels
burndown-2026-06
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
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!472
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/defaults-are-wards-not-aos"
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?
Third of the
ward doctorfailures blocking the dev-base image (aos#452). ward doctor against this branch goes from 2 failures to 1.ward's defaults are THE defaults
loadBundleSmartDefaultsFromstarts frombakedSmartDefaults()and applies this block as an overlay, so a key omitted here keeps ward's product value. Every tuning key in this block just restated ward's own default - it bought nothing and rotted the moment ward moved.One had already rotted:
agent-reservation-ttl "1h"here shadowed ward's"3h"and undercut the engineer role's 90m execution limit, so a reservation expired mid-run. doctor fails that invariant fail-closed, and doctor gates thecoretier of the dev-base image - so this is one of the checks keepingpublish-dev-basered and the published image stale at v0.245.0.It was masked until now behind the
burndownparse error that ward#1121 fixed.agent-workflowstays: which repos are PR-gated is a coilyco deployment fact, not a ward product default. The test now pins that no ward tuning key comes back.Verification
Inside
agentic-os:latest:uv run pytest- 455 passeduv run pre-commit run --all-files- all hooks passward doctor(ward main, this bundle):PASS smart defaults,PASS repo authority,PASS fleet,PASS exec bundle- 1 failure leftThe one remaining failure needs a decision, and it looks like a real leak
Two files in
.ward/both declarewrap ward-kdl ops forgejo:guardfile.forgejo.kdl-forgejo.coilysiren.me/api/v1,/forgejo/coilyco-ops/api-token,restrict owner matches coily*ops.forgejo.kdl-git.example.com/api/v1,/example/forgejo/api-token,restrict owner matches example*ward merges both. I measured the effective result two ways and they disagree:
ward doctorreports the effectivebase-urlasgit.example.comward ops forgejo get repo ...actually requestsssm get-parameter --name /forgejo/coilyco-ops/api-token- the real tokenSo the merged ops surface appears to pair the example host with the real credential. If that is what ships, ward sends Kai's live Forgejo token at
git.example.com. doctor's placeholder check is the thing catching it, so it should not be silenced.I did not touch this. Deciding whether
ops.forgejo.kdlis a generic authoring source that should be excluded from the deployment bundle, or a deployment file that never got melded, is Kai's call - and it changes the live permission surface. Tracked in ward#1120.ward embeds the smart-defaults, and this bundle only overlays them: loadBundleSmartDefaultsFrom starts from bakedSmartDefaults, so a key omitted here keeps ward product value. Every tuning key in this block just restated ward own default, so it bought nothing and rotted the moment ward moved. One had already rotted. agent-reservation-ttl "1h" shadowed ward "3h" and undercut the engineer role 90m execution-time-limit, so a reservation expired mid-run. ward doctor fails that invariant fail-closed: FAIL smart defaults: agent-reservation-ttl 1h must exceed role "engineer" execution-time-limit 90m (fail-closed) doctor gates the core tier of the dev-base image, so this is one of the checks keeping publish-dev-base red and the published image stale (aos#452). It was masked until now behind the burndown parse error that ward#1121 fixed. agent-workflow stays: which repos are PR-gated is a coilyco deployment fact, not a ward product default. Refs aos#452, ward#1120. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>agentic-os#446 added the commit-status verbs (repoGetCombinedStatusByRef, repoListStatusesByRef) to guardfile.forgejo.kdl, but the spec lock was never regenerated. It carried 47 operationIds and zero status ops, so specverb failed the merged ops surface fail-closed: FAIL ops bundle: specverb: operationId repoGetCombinedStatusByRef not found in spec (fail-closed) That failure was invisible until now: the placeholder base-url check short-circuited validateGuardfileOperational before buildForgejoOps ever ran, so the stale lock never got a chance to fail. ward#1123 clears the placeholder and uncovers this. Regenerated with the kdl-specs driver (lock --guardfile), which refetches the upstream spec and prunes it to the verbs the guardfile declares: 52 ops now, including the status pair. Refs aos#452, ward#1123.