Correct the platform record: assemble runs in sow-module release CI #72

Closed
opened 2026-07-30 11:24:47 +00:00 by archvillainette · 2 comments
Owner

Question

Part of #54.

sow-platform#94 and sow-platform#79 both record that platform's resolve step assembles the NWSync manifest. That is wrong: module release is the only point downstream of both the topdata and the assets releases, and platform has no control over when those cut.

The sow-module design is now firm enough to correct the record — #63 settled the catalogs and the tag pinning, #65 settled the workflow step, the invocation, the secrets and the failure modes, and it exists as sow-module#51.

Post correction comments on both platform issues: what changed, why (release timing, not preference), and where the work now lives. Check while there whether either issue states anything else that the map has since overtaken — the --target local/--out DIR split, the sibling NSYM path, or the "only the resolver knows the artifact set" claim #58 found stale.

Settle whether platform's resolve step keeps any NWSync role — for example failing closed when a pinned module release has no manifest — or none at all.

## Question Part of #54. [sow-platform#94](https://git.westgate.pw/ShadowsOverWestgate/sow-platform/issues/94) and [sow-platform#79](https://git.westgate.pw/ShadowsOverWestgate/sow-platform/issues/79) both record that platform's resolve step assembles the NWSync manifest. That is wrong: module release is the only point downstream of both the topdata and the assets releases, and platform has no control over when those cut. The sow-module design is now firm enough to correct the record — #63 settled the catalogs and the tag pinning, #65 settled the workflow step, the invocation, the secrets and the failure modes, and it exists as [sow-module#51](https://git.westgate.pw/ShadowsOverWestgate/sow-module/issues/51). Post correction comments on both platform issues: what changed, why (release timing, not preference), and where the work now lives. Check while there whether either issue states anything else that the map has since overtaken — the `--target local`/`--out DIR` split, the sibling NSYM path, or the "only the resolver knows the artifact set" claim #58 found stale. Settle whether platform's resolve step keeps *any* NWSync role — for example failing closed when a pinned module release has no manifest — or none at all.
archvillainette added the wayfinder:task label 2026-07-30 11:24:47 +00:00
Author
Owner

Verification sweep — one more thing to correct while in there

Still valid, unclaimed, unblocked. Two additions:

  • The correction list should include sow-tools#53 itself, not only the two platform issues. Its CLI surface predates #56/#62/#65 and PR #71 built #53 rather than the settled interface — sweep comment on #53 has the table. #53's opening line also repeats #94's resolver framing.
  • When settling whether platform's resolve step keeps any NWSync role, note the state PR #71 leaves: manifests are written locally only, so no resolve-time fail-closed check has anything to read yet.
## Verification sweep — one more thing to correct while in there Still valid, unclaimed, unblocked. Two additions: - The correction list should include **sow-tools#53** itself, not only the two platform issues. Its CLI surface predates #56/#62/#65 and PR #71 built #53 rather than the settled interface — sweep comment on #53 has the table. #53's opening line also repeats #94's resolver framing. - When settling whether platform's resolve step keeps any NWSync role, note the state PR #71 leaves: manifests are written locally only, so no resolve-time fail-closed check has anything to read yet.
archvillainette self-assigned this 2026-07-30 19:45:53 +00:00
Author
Owner

Resolved: both platform issues corrected; platform keeps one NWSync role, and it is passthrough

Corrections posted

  • sow-platform#94 (closed, so the comment is the marker): assemble moved from platform's resolve step to sow-module release CI, for release timing — module release is the only point downstream of both the assets and the topdata releases. Also corrected there: the "only the resolver knows the four-tuple" claim (#58), "list the zone once, diff by name" (#55), the NSYM path (#62, per-stream sibling, not artifacts/haks/...), --group-id per channel decided by the host (now tag-shaped, set by module CI), "the resolve step records the manifest hash", and the CLI surface (#56). The emitter-version-skew mitigation was flagged as dead — no version field exists in what got built; a failed emit failing its producing release replaced it (#60). The byte-level format spec in that resolution stands and is now conformance-proven (#59).
  • sow-platform#79 (open, and the stale text was load-bearing): no NWSync generation unit exists on the host at all. Corrected six claims — tooling in the server image (there is none; #94 listed the layers), hash generated on the host at activation, the generation one-shot ordered before server start, "runs only when content changed" (story 38), the writer skipping existing blobs itself, and per-target group id chosen by the host (story 21 — right outcome, wrong owner). Noted that the NWSync zone is a separate Bunny zone from the depot (#56). Stories 11, 13, 14, 15, 16, 19, 39 and 56 are unaffected, and the storage argument gets stronger: no host holds blobs even transiently.

Neither issue mentioned --target local/--out DIR, so nothing to correct there; #66 already owns that wart.

Platform's remaining NWSync role: one field, fail closed

Platform's resolve step keeps exactly one NWSync responsibility, and it is configuration passthrough rather than NWSync work: read the manifest SHA-1 from the module catalog entry the game-tier channel already resolves, fail closed if the pinned release carries no manifest, render it into the server's environment layer.

Zero role is not reachable. Platform runs the game containers — infra/nixos/modules/runtime/nwn.nix:44-52 declares sow-nwserver-<t> and already sets NWN_NWSYNCURL; ADR-0025 puts two targets on netcup-game. nwserver advertises which manifest by hash, and platform is the only thing that writes the server's environment. The three alternatives are already closed: the repository-global latest pointer is banned twice over (two targets would overwrite each other, and our writer never emits the file), hand-editing the hash is what #79 story 52 exists to prevent, and the server cannot derive it because the image contains no writer.

Not redundant with the build-time checks, and deliberately narrower than them. A failed emit fails its producing release (#60) and assemble's missing-index check guards the module release — both at build time, on releases that went through the wired CI. The deploy-time check catches what neither can see: an operator pinning a module release cut before NWSync wiring existed, or a backfilled one. So it is a presence check on a field, inside the resolve-and-verify gate #79 already declares for game-tier artifacts. It must not re-fetch the manifest or probe the zone — that would duplicate emit and assemble for no gain, and would put zone access back on a host.

Consequence for #79's three-layer environment file: layer three keeps only the passwords as genuinely host-generated. The NWSync hash is resolved, not generated, even though it lands at activation time with the rest of the channel resolution.

## Resolved: both platform issues corrected; platform keeps one NWSync role, and it is passthrough ### Corrections posted - [sow-platform#94](https://git.westgate.pw/ShadowsOverWestgate/sow-platform/issues/94) (closed, so the comment is the marker): assemble moved from platform's resolve step to `sow-module` release CI, for release timing — module release is the only point downstream of both the assets and the topdata releases. Also corrected there: the "only the resolver knows the four-tuple" claim (#58), "list the zone once, diff by name" (#55), the NSYM path (#62, per-stream sibling, not `artifacts/haks/...`), `--group-id` per channel decided by the host (now tag-shaped, set by module CI), "the resolve step records the manifest hash", and the CLI surface (#56). The emitter-version-skew mitigation was flagged as dead — no version field exists in what got built; a failed `emit` failing its producing release replaced it (#60). The byte-level format spec in that resolution stands and is now conformance-proven (#59). - [sow-platform#79](https://git.westgate.pw/ShadowsOverWestgate/sow-platform/issues/79) (open, and the stale text was load-bearing): no NWSync generation unit exists on the host at all. Corrected six claims — tooling in the server image (there is none; #94 listed the layers), hash generated on the host at activation, the generation one-shot ordered before server start, "runs only when content changed" (story 38), the writer skipping existing blobs itself, and per-target group id chosen by the host (story 21 — right outcome, wrong owner). Noted that the NWSync zone is a separate Bunny zone from the depot (#56). Stories 11, 13, 14, 15, 16, 19, 39 and 56 are unaffected, and the storage argument gets stronger: no host holds blobs even transiently. Neither issue mentioned `--target local`/`--out DIR`, so nothing to correct there; #66 already owns that wart. ### Platform's remaining NWSync role: one field, fail closed Platform's resolve step keeps **exactly one** NWSync responsibility, and it is configuration passthrough rather than NWSync work: read the manifest SHA-1 from the module catalog entry the game-tier channel already resolves, fail closed if the pinned release carries no manifest, render it into the server's environment layer. Zero role is not reachable. Platform runs the game containers — `infra/nixos/modules/runtime/nwn.nix:44-52` declares `sow-nwserver-<t>` and already sets `NWN_NWSYNCURL`; ADR-0025 puts two targets on netcup-game. nwserver advertises *which* manifest by hash, and platform is the only thing that writes the server's environment. The three alternatives are already closed: the repository-global `latest` pointer is banned twice over (two targets would overwrite each other, and our writer never emits the file), hand-editing the hash is what #79 story 52 exists to prevent, and the server cannot derive it because the image contains no writer. **Not redundant with the build-time checks, and deliberately narrower than them.** A failed `emit` fails its producing release (#60) and `assemble`'s missing-index check guards the module release — both at build time, on releases that went through the wired CI. The deploy-time check catches what neither can see: an operator pinning a module release cut before NWSync wiring existed, or a backfilled one. So it is a **presence check on a field**, inside the resolve-and-verify gate #79 already declares for game-tier artifacts. It must not re-fetch the manifest or probe the zone — that would duplicate `emit` and `assemble` for no gain, and would put zone access back on a host. Consequence for #79's three-layer environment file: layer three keeps only the passwords as genuinely host-generated. The NWSync hash is *resolved*, not generated, even though it lands at activation time with the rest of the channel resolution.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ShadowsOverWestgate/sow-tools#72