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.
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
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 DIRsplit, 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.
Verification sweep — one more thing to correct while in there
Still valid, unclaimed, unblocked. Two additions:
Resolved: both platform issues corrected; platform keeps one NWSync role, and it is passthrough
Corrections posted
sow-modulerelease 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, notartifacts/haks/...),--group-idper 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 failedemitfailing its producing release replaced it (#60). The byte-level format spec in that resolution stands and is now conformance-proven (#59).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-52declaressow-nwserver-<t>and already setsNWN_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-globallatestpointer 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
emitfails its producing release (#60) andassemble'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 duplicateemitandassemblefor 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.