Repository navigation
docs(refs)!: the container-nesting recipe drops the retired builder selector - #205
Conversation
…elector The site's recipe page is a projection of the corpus: the page's `Env` row carried the retired `CHARLY_BUILD_ENGINE=podman`, the builder selector the contract retired (`EngineConfig.Build`, `ResolvedRuntime.BuildEngine` and the `CHARLY_BUILD_ENGINE` key are gone from `spec/hostenv`). The producer cut the name out of the candy, the skill body and the README in one cutover (opencharly/layer-container-nesting#16, tag v2026.302.0925); the corpus republished the owner's corrected body (opencharly/marketplace#601, squash b53310d, tag v2026.302.0951). This change advances the corpus gitlink to the corpus's default-branch tip 3cf744b and regenerates the site with the deploy workflow's own recorded inputs, so the recipe page loses the retired selector and keeps the three live contracts. The regeneration is a byte-for-byte no-op on every other page: the corpus changed exactly one projected body, and the site's diff is exactly one line. Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
Review — PASSWhat the diff actually doesTwo files, matching the body's stated counts exactly (2 files, +2/−2):
Consistency and honesty checks
Residual (non-blocking) noteThe central justification — that The change does what the body says, the evidence is internally consistent, and the diff is clean and in scope. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
…cutover (#801) Three leaf pins advance to the commits their owning repos' merged mains already serve. The scope is derived, not written: the product's own currency report names the pins that are not current, and the wave advances exactly those. No pin was hand-picked, and no pin was hand-pinned. | pin | recorded | served | producer | |---|---|---|---| | layer-container-nesting | 7d31a504a8 | 3946ee1923 | opencharly/layer-container-nesting#17 (squash 50da7774, tag v2026.302.0925) | | marketplace | 197f42a57a | 3cf744b9ef | opencharly/marketplace#601 (squash b53310d, tag v2026.302.0951) | | docs | 84595508dd | a99557f1e6 | opencharly/docs#205 (squash a4675b56, tag v2026.302.1030) | The retired CHARLY_BUILD_ENGINE builder selector is gone from the spec's hostenv contract; each of these three repos still named the commits from before its producer leg landed, so each carried the retired selector one step further than the repo that had already fixed it. RCA Mechanism — the umbrella records every org repo as a gitlink; the pin is the INDEX entry and the checkout follows it. Nothing advanced these three pins after their producer legs landed, so the umbrella's view of those repos stayed on the pre-cutover commits while the repos themselves had moved on. Missed control — the currency audit (charly task pins --param MODE=currency) REPORTS a behind pin and does not fail, because "behind" is an advance available NOW rather than a violation: the remedy is a pin-wave PR, not a gate. So nothing turned red, and the pins stayed behind until a wave ran. Blast radius — every consumer of the umbrella's view: the harness skill bindings in .dsh/skills (symlinks into the corpus checkout), the org map, and every repo that reads the umbrella as its source of pins. Root fix — advance the leaf pins in the index with the sanctioned wave (charly task sync), materialize the checkouts at the new pins (charly task init), and judge the committed tree (charly task verify). No hand-pin, no branch checkout. The wave's order: sync (the pins move in the index; the checkouts that exist are rolled) -> init (those checkouts are refreshed to the pins the index records) -> verify (every pin judged from the index, on the committed tree). The wave's scope was exactly these three leaves. The verb's own report is the scope control: it rolled 7 leaf submodule(s) to their default-branch HEAD and advanced 396 leaf pin(s) in the index, and the 6 pin_map edges moved 0, because the edge half follows charly's own box/* gitlinks and the charly leaf is already current. A caveat this commit states rather than hides: for each producer the newest tag points at the MERGE commit, and the served head the umbrella pins is exactly ONE commit above that tag, and that one commit adds only CHANGELOG/<version>.md. So these pins are MERGED and their tags exist, but the served head is not itself a tagged commit. The measurement is on #793. Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
Closes #204
Summary
Head
d42a49a2434f0dd6a2ab67bf1b75a6f9ee7b2d2e— 2 files changed, 2 insertions(+), 2 deletions(-).The defect. This repo's recipe page for the
container-nestingcandy is a projection of the corpus: itsEnvrow carriedCHARLY_BUILD_ENGINE=podman— the retired builder selector. The contract retired it:EngineConfig.Build,ResolvedRuntime.BuildEngineand theCHARLY_BUILD_ENGINEkey are gone fromspec/hostenv, and a leftoverengine.build: dockeris INERT (spec/hostenv/retired_build_selector_test.go). The site therefore taught every reader a knob that cannot be turned.The RCA.
marketplacegitlink), the charly source commit, and the umbrella commit — and the recipe pages are projected from the corpus. The owner had already cut the name out of the candy, the skill body and the README in one cutover (the retired CHARLY_BUILD_ENGINE builder selector is still set and still published layer-container-nesting#16, tagv2026.302.0925), and the corpus republished the owner's corrected body (chore(refs)!: the container-nesting body is published without the retired builder selector marketplace#601, squashb53310d, tagv2026.302.0951) — but this repo'smarketplacegitlink still pointed at the corpus commit from before that republication, so every regeneration republished the old row.check_pin_currency.shstep, "Reported, never failed"), because a pin that is behind is an advance available NOW and the remedy is a regeneration PR, not a gate.What lands.
marketplace197f42a57ab88fcaed6a044bf312d753a72062b2→3cf744b9ef3dcaf5e3dadff01648db087385ef19, the corpus's default-branch tip after opencharly/marketplace#601src/content/docs/recipes/distros/container-nesting.mdEnvrow loses the retiredCHARLY_BUILD_ENGINE=podmanand keeps the three live contractsThe claim. The retired name is gone from this repo's tree — the claim-keyed grep over the published tree returns nothing on this commit and exactly one hit before it. The evidence is below.
How tested
Everything below ran on the committed tree this PR pushes.
1. The tree.
git status --porcelainprinted nothing — the tree is clean, so the evidence below belongs to this head.2. R10 — the regeneration is a no-op on the committed tree. This repo's deploy workflow FAILS on any drift between the committed content and what its pinned inputs generate, so the committed tree reproducing itself byte-for-byte is the gate. The generation ran exactly as the workflow runs it — the workflow's own recorded pins (
CHARLY_PIN=be7a505f476c1a5b0302d878e0b5686a2cde3e07,UMBRELLA_PIN=1c88fcf15f8fb9dd8b2814210472a63d3a79d0e2), the pinned plugin-docs CLI atv2026.289.0814, the wiring candy built from.github/docs-corpus/pins.tsvby the workflow's ownbuild_wiring.py, and the corpus checkout at this repo's recorded gitlink.The generator rewrote all 1726 generated pages and the tree came back byte-for-byte identical — the gate that fails this repo's deploy on any difference is green on this commit.
3. The pre-flight — the recipe is faithful BEFORE the pin moved. The same generation, run against the corpus at the PREVIOUS gitlink (
197f42a), was a byte-for-byte no-op on the then-committed tree, and the bump to3cf744bchanged exactly one page. So the diff is attributable to the pin advance alone, and the inputs are the workflow's own.The corpus changed one projected body between those two commits, and the site changed exactly one page by exactly one line:
4. The repo's own checks — the checks this repo's deploy workflow runs, each suite's own final line and its own exit status:
5. The site builds from the committed tree — the workflow's own build steps, on the node this repo pins (
.node-version= 22.23.4):6. R5 — the retired vocabulary, before and after. The sweep, over this repo's tree, and every remaining hit classified rather than left to a reader:
The tree's single hit before this commit was the live claim this PR removes — the recipe page's
Envrow. This repo'sCHANGELOG/carries none of its own: the site's history never published the retired name in a changelog entry.Rulebook compliance
/charly-internals:git-workflow,/charly-internals:strict-policy,/charly-internals:root-cause-analyzer,/charly-internals:cutover-policy,/charly-internals:skills,/charly-internals:marketplaceand/charly-check:checkwere loaded before the first source read and before the first git action, and this repo's ownAGENTS.mdwas read before acting in it.DRIFT_RC=1, ~130 changed pages) before this commit existed: the mechanism was that pre-flight's own charly and umbrella pins — carried over from an earlier read — had been overtaken by the pins this repo's workflow records (CHARLY_PIN=be7a505,UMBRELLA_PIN=1c88fcf), so the regeneration resolved older sources than the committed pages; the missed control was reading the pins from a remembered copy instead of from the workflow'senv:block at run time; the blast radius was local and left no committed trace — nothing was committed from that run; the root fix was to run the pre-flight against the workflow's recorded pins, which is what block 2 above does, and it is a no-op. No repo defect was found behind it: the workflow records its pins once and consumes them in one place, so there is no stale copy in the tree to fix. No new finding was raised in this leg: the regeneration's diff was exactly the two files this PR names, with no untracked page and no other recipe moved. Every gate above ran with zero warnings.CHANGELOG/carries no occurrence of it, so nothing survives there either.git statuswas stated before every action; this PR is one commit onfeat/lcn-projection-204off freshorigin/main; no force-push, no amend after the push, no direct push tomain, no hook bypass, and no file outside this repo touched.v2026.289.0814(the same build the workflow performs), and the site is built with the node this repo pins. No new runtime OS dependency is introduced: this change is a gitlink plus a generated page, sopackaging/is untouched.disposable: truedeployment of its own, so there is no disposable target to realize.Cutover. One cutover, one PR: the site's corpus pin, from the commit before the corpus republished the owner's corrected body to the commit that carries it, with the regenerated page in the same change. The upstream legs — the owner's own cutover (opencharly/layer-container-nesting#17) and the corpus republication (opencharly/marketplace#601) — have both landed; this repo's pin is the last step of that chain.
Landing. PR-only; the org's
charly/pr-validatoris the merge gate and arms native auto-merge on PASS. No agent merges this PR.Change classification
fully tested and validated— the change-class gate passed on the final tree (the regeneration reproducing the committed tree byte-for-byte, the drift gate, the repo's own check suites, and the site build), with the output retained above.v2026.302.0925, validator PASS) and whose corpus leg is chore(refs)!: the container-nesting body is published without the retired builder selector marketplace#601 (landed, squashb53310d, tagv2026.302.0951, validator PASS).Filed issues
env:map, its skill body and its README. Landed in the producer leg (fix(nesting)!: drop the retired builder-selector env var from the candy layer-container-nesting#17, tagv2026.302.0925); this PR is the site's leg, one step downstream of the corpus republication.check_pin_currency.sh) states the class: a pin that is behind is an advance available NOW, and the remedy is a regeneration PR, not a gate — the drift gate is blind to a stale pin by construction, because the pinned sources regenerate their own old pages perfectly.v2026.289.0814, the wiring candy built from.github/docs-corpus/pins.tsv, and the corpus at this repo's recorded gitlink — is a byte-for-byte no-op on the committed tree, so the committed site matches its pinned inputs exactly.Agent:
charly· sessionses_8efb271d-f2c0-47d3-85e3-2a1e00b11ae0Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)