Track one rendered prompt snapshot per composed role #125

Closed
opened 2026-08-12 00:29:17 +00:00 by coilyco-ops · 3 comments
Member

Deferred from #98, whose Complete when asks for "one prompt snapshot per role tracked and gated".

Current state

agent/rendered/sirens-deep.prompt.txt renders PlaceholderComposed rather than a real bundle, the same way it renders PlaceholderPrincipal. That keeps prompt-check hermetic: pre-commit runs on a laptop with no coilyco-flight-deck/agentic-os checkout and no composed bundles on disk, and a snapshot that needed either would fail there.

The cost is that the tracked byte count no longer warns about what a role bundle actually adds, which is the specific thing issue 98 wanted the snapshot for: "A role bundle will move that materially, and the byte count is the cheapest early warning."

What is needed

A real snapshot per role, generated where the bundles exist and committed, without making local pre-commit depend on a catalogue checkout. Options worth weighing:

  • Generate in CI after the compose stage and fail the build on drift, leaving the local hook on the placeholder.
  • Track a small committed catalogue fixture so a real bundle can be composed offline. Deterministic, but it is a second copy of upstream bodies.
  • Split the hook: hermetic structure check locally, byte-count check in CI.

Complete when

  • Each baked role has a tracked rendered snapshot reflecting its real bundle.
  • Drift fails a gate.
  • pre-commit run --all-files still passes on a machine with no catalogue checkout and no bundles.
Deferred from https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/98, whose **Complete when** asks for "one prompt snapshot per role tracked and gated". ## Current state `agent/rendered/sirens-deep.prompt.txt` renders `PlaceholderComposed` rather than a real bundle, the same way it renders `PlaceholderPrincipal`. That keeps `prompt-check` hermetic: pre-commit runs on a laptop with no `coilyco-flight-deck/agentic-os` checkout and no composed bundles on disk, and a snapshot that needed either would fail there. The cost is that the tracked byte count no longer warns about what a role bundle actually adds, which is the specific thing issue 98 wanted the snapshot for: "A role bundle will move that materially, and the byte count is the cheapest early warning." ## What is needed A real snapshot per role, generated where the bundles exist and committed, without making local pre-commit depend on a catalogue checkout. Options worth weighing: * Generate in CI after the compose stage and fail the build on drift, leaving the local hook on the placeholder. * Track a small committed catalogue fixture so a real bundle can be composed offline. Deterministic, but it is a second copy of upstream bodies. * Split the hook: hermetic structure check locally, byte-count check in CI. ## Complete when * Each baked role has a tracked rendered snapshot reflecting its real bundle. * Drift fails a gate. * `pre-commit run --all-files` still passes on a machine with no catalogue checkout and no bundles.
Author
Member

Decision: split the hook, and auto-regenerate on drift

Direction from Kai, 2026-08-12 session.

Option three from the issue body: split the hook. Hermetic structure check locally, real byte-count check in CI after the compose stage.

The committed-catalogue-fixture option is rejected for the reason the issue already gives — it is a second copy of upstream bodies, and a second copy drifts.

This satisfies all three Complete when criteria: each baked role gets a tracked snapshot reflecting its real bundle, drift fails a gate, and pre-commit run --all-files still passes on a machine with no catalogue checkout and no bundles.

One amendment, forced by #126

#126 was decided the same session: all three declared providers are materialized and track main unpinned.

That interacts badly with a pure drift gate. An edit to a skill in coilyco-flight-deck/agent-compose changes Deep's rendered prompt with no commit in this repository, so a strict gate would fail builds here containing no relevant change. The gate would be working exactly as designed and would still be wrong to leave that way.

So the CI half regenerates and commits rather than failing. On detecting drift, CI regenerates the snapshot and pushes it as a bot commit. The reviewable diff of exactly what a persona tells the model — the thing #98 asked for — is preserved, and the byte count still moves visibly when a role bundle grows. What is lost is the build-blocking property, deliberately.

The local half is unchanged: hermetic structure check against the placeholder, no catalogue checkout required.

Build #125 and #126 together. Separately they conflict; the regenerate-and-commit behavior is what makes unpinned providers safe.

Priority

Deferred past August 19. It is a review-quality gate, not demo-facing — but it should not slip much past #98's wiring, since the snapshot is how anyone reviews what flipping SIRENS_DEEP_ROLE actually does.

## Decision: split the hook, and auto-regenerate on drift Direction from Kai, 2026-08-12 session. **Option three from the issue body: split the hook.** Hermetic structure check locally, real byte-count check in CI after the compose stage. The committed-catalogue-fixture option is rejected for the reason the issue already gives — it is a second copy of upstream bodies, and a second copy drifts. This satisfies all three **Complete when** criteria: each baked role gets a tracked snapshot reflecting its real bundle, drift fails a gate, and `pre-commit run --all-files` still passes on a machine with no catalogue checkout and no bundles. ## One amendment, forced by #126 #126 was decided the same session: all three declared providers are materialized and **track `main` unpinned**. That interacts badly with a pure drift gate. An edit to a skill in `coilyco-flight-deck/agent-compose` changes Deep's rendered prompt with no commit in this repository, so a strict gate would fail builds here containing no relevant change. The gate would be working exactly as designed and would still be wrong to leave that way. **So the CI half regenerates and commits rather than failing.** On detecting drift, CI regenerates the snapshot and pushes it as a bot commit. The reviewable diff of exactly what a persona tells the model — the thing #98 asked for — is preserved, and the byte count still moves visibly when a role bundle grows. What is lost is the build-blocking property, deliberately. The local half is unchanged: hermetic structure check against the placeholder, no catalogue checkout required. **Build #125 and #126 together.** Separately they conflict; the regenerate-and-commit behavior is what makes unpinned providers safe. ## Priority Deferred past August 19. It is a review-quality gate, not demo-facing — but it should not slip much past #98's wiring, since the snapshot is how anyone reviews what flipping `SIRENS_DEEP_ROLE` actually does.
Author
Member

One unverified assumption in the decision above

The decision says CI "regenerates the snapshot and pushes it as a bot commit" on drift. That assumes CI can push to main in this repository, and I have not verified it.

The reason for doubt: coilyco-bridge/deploy/AGENTS.md describes a pull-request-and-merge workflow declared as agent.workflow, byte-identical across four PR-lane repos — agentic-os, deploy, infrastructure, and ward — where nothing lands straight on main and the merge stays director-gated. coilyco-gaming/sirens-echo is not among those four, which suggests it may permit direct pushes, but absence from a list in another repository is weak evidence.

Check .ward/ward.yaml in this repository for agent.workflow before building the CI half. If this repo is also PR-gated, the auto-commit approach does not work as described and needs one of:

  • CI opens a PR instead of pushing. Same reviewable diff, same non-blocking property, one more artifact per upstream skill edit. Probably the right answer if pushes are gated.
  • Fail the build after all, and accept that an upstream skill edit reds a build here — reverting to the pure drift gate, which was rejected above for good reason.
  • Pin the providers, which was rejected in #126 and would remove the problem at the source.

The decision above stands either way; only the mechanism changes. Flagging it because discovering it mid-implementation would mean rework on both this issue and #126.

## One unverified assumption in the decision above The decision says CI "regenerates the snapshot and pushes it as a bot commit" on drift. **That assumes CI can push to `main` in this repository, and I have not verified it.** The reason for doubt: `coilyco-bridge/deploy/AGENTS.md` describes a `pull-request-and-merge` workflow declared as `agent.workflow`, byte-identical across **four PR-lane repos** — agentic-os, deploy, infrastructure, and ward — where nothing lands straight on `main` and the merge stays director-gated. `coilyco-gaming/sirens-echo` is not among those four, which suggests it may permit direct pushes, but absence from a list in another repository is weak evidence. **Check `.ward/ward.yaml` in this repository for `agent.workflow` before building the CI half.** If this repo is also PR-gated, the auto-commit approach does not work as described and needs one of: * **CI opens a PR instead of pushing.** Same reviewable diff, same non-blocking property, one more artifact per upstream skill edit. Probably the right answer if pushes are gated. * **Fail the build after all**, and accept that an upstream skill edit reds a build here — reverting to the pure drift gate, which was rejected above for good reason. * **Pin the providers**, which was rejected in #126 and would remove the problem at the source. The decision above stands either way; only the mechanism changes. Flagging it because discovering it mid-implementation would mean rework on both this issue and #126.
Author
Member

Decision: reopen, state what landed, then build the gate

Direction from Kai, 2026-08-12 session.

Why this needs picking back up

This issue closed at 11:45:58Z. The decision recorded on it — split the hook, regenerate-and-commit on drift — was posted at 11:55:33Z, roughly ten minutes later, and there is no comment from the implementer saying what was built. So the close predates the direction and nothing on the ticket explains what state it was left in.

It also sits downstream of a decision that has now been reversed. #126's provider block was dropped in c0bcae8; Kai has restored the original "materialize all three, track main unpinned" call. Unpinned providers are exactly what makes a plain drift gate misbehave, so this issue's amendment is live again rather than moot.

Three steps, in order

1. State what actually landed at close time. Not archaeology for its own sake — the gate cannot be built correctly without knowing whether a placeholder snapshot, a real one, or nothing at all is currently tracked, and whether prompt-check still runs hermetically.

2. Answer the open mechanism question. From the comment above, still unverified:

The decision says CI "regenerates the snapshot and pushes it as a bot commit" on drift. That assumes CI can push to main in this repository, and I have not verified it.

Check .ward/ward.yaml here for agent.workflow. If this repo is PR-gated like agentic-os, deploy, infrastructure, and ward, then CI opens a PR instead of pushing — same reviewable diff, same non-blocking property, one extra artifact per upstream edit. If direct pushes are allowed, the bot commit stands as decided.

3. Build it against the restored providers. Split hook: hermetic structure check locally against the placeholder, real byte-count check in CI after the compose stage, regenerate-and-commit (or PR) on drift.

Unchanged acceptance

  • Each baked role has a tracked snapshot reflecting its real bundle.
  • Drift is caught by a gate.
  • pre-commit run --all-files still passes on a machine with no catalogue checkout and no bundles.

Reopening

Needs Kai or ops. This session's MCP surface has no reopen grant — it is denied by absence, alongside edits and deletes.

## Decision: reopen, state what landed, then build the gate Direction from Kai, 2026-08-12 session. ## Why this needs picking back up This issue closed at **11:45:58Z**. The decision recorded on it — split the hook, regenerate-and-commit on drift — was posted at **11:55:33Z**, roughly ten minutes *later*, and there is no comment from the implementer saying what was built. So the close predates the direction and nothing on the ticket explains what state it was left in. It also sits downstream of a decision that has now been reversed. #126's provider block was dropped in `c0bcae8`; Kai has restored the original "materialize all three, track `main` unpinned" call. Unpinned providers are exactly what makes a plain drift gate misbehave, so this issue's amendment is live again rather than moot. ## Three steps, in order **1. State what actually landed at close time.** Not archaeology for its own sake — the gate cannot be built correctly without knowing whether a placeholder snapshot, a real one, or nothing at all is currently tracked, and whether `prompt-check` still runs hermetically. **2. Answer the open mechanism question.** From the comment above, still unverified: > The decision says CI "regenerates the snapshot and pushes it as a bot commit" on drift. **That assumes CI can push to `main` in this repository, and I have not verified it.** Check `.ward/ward.yaml` here for `agent.workflow`. If this repo is PR-gated like agentic-os, deploy, infrastructure, and ward, then **CI opens a PR instead of pushing** — same reviewable diff, same non-blocking property, one extra artifact per upstream edit. If direct pushes are allowed, the bot commit stands as decided. **3. Build it against the restored providers.** Split hook: hermetic structure check locally against the placeholder, real byte-count check in CI after the compose stage, regenerate-and-commit (or PR) on drift. ## Unchanged acceptance * Each baked role has a tracked snapshot reflecting its real bundle. * Drift is caught by a gate. * `pre-commit run --all-files` still passes on a machine with no catalogue checkout and no bundles. ## Reopening Needs Kai or ops. This session's MCP surface has no reopen grant — it is denied by absence, alongside edits and deletes.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#125
No description provided.