Repository navigation
docs(corpus)!: advance the corpus and the plugin-build pin, and regenerate the site on --stage-parallelism - #198
Conversation
…erate the site on --stage-parallelism
This repo's `marketplace` pin moves from 99a1bb4a6f10112f67e3ddd73d3e86b3f6bc3417 to
5feb9c8b8350849fd2d46d252b486844c18bd0a4 — the corpus's merged `main` tip, advanced
through the submodule's own remote-tracking path, never a hand-set gitlink. The
corpus is what decides which projection of the guidance corpus the site serves, and
at this tip it names the `build`-family owners DIRECTLY — plugin-box at
v2026.301.1542 among them — so the recipe pages it projects teach the renamed knob.
The wiring candy's own `plugin-build` pin moves from v2026.242.0525 to
v2026.296.1104 — the newest plugin-build tag, and the first one whose
`candy/plugin-build/schema/build.cue` carries `stage_parallelism?: int`. That is what
the site's `reference/plugin/**` and `reference/candy/**` sections project, so the
site's last `podman_jobs?: int` goes with the old pin.
THE REGRESSION THIS REPAIRS, AND ITS ROOT CAUSE. The published site taught the
retired flag before, then stopped, then taught it again — measured on this repo's own
history:
$ for c in 81da73e c0e7db9 98a5f6c; do
git show $c:src/content/docs/recipes/build/build.md \
| grep -cE 'stage-parallelism|podman-jobs'; done
7 0 # 81da73e — PR #167, the corpus pin at layer-charly-build:v2026.292.2017
0 7 # c0e7db9 — PR #176, the corpus pin at layer-charly-build:v2026.296.0919
0 7 # 98a5f6c — PR #197, the corpus pin at the corpus's merged main of Oct 28
The pin moved FORWARD in time every time, and the CONTENT moved BACKWARD. The
mechanism, measured on the corpus's own refs list and on the owner's tree at the tag
the corpus named:
$ for c in 602324e 1c15651 99a1bb4a 5feb9c8; do
git -C marketplace show $c:candy/charly-marketplace/charly.yml \
| grep -oE '@github.com/opencharly/layer-charly-build:v[0-9.]+'; done
602324e layer-charly-build:v2026.292.2017 # the body teaches --stage-parallelism
1c15651 layer-charly-build:v2026.296.0919 # the body teaches --podman-jobs
99a1bb4a layer-charly-build:v2026.296.0919 # the body teaches --podman-jobs
5feb9c8 (no ref — the build family is named from plugin-box:v2026.301.1542)
`layer-charly-build` was DRAINED by the build-family split, and at its tag
v2026.296.0919 it has no `.agents/` tree at all — its manifest says it "owns NO
`skill:` entity any more". So the corpus's `build/skills/build/SKILL.md` at 1c15651
and 99a1bb4a COULD NOT HAVE BEEN SOURCED from the tag the corpus's own refs list
names: it was an ORPHAN body, carried in the corpus's tree from before the drain.
The corpus published a body that no tag it named could supply, and the site
published that body faithfully.
The MISSED CONTROL is exactly there. A provenance check that compares a projected
body against the owner's file AT THE NAMED TAG has nothing to compare an orphan
against, so it is silent precisely where the defect lived. The site's drift gate is
downstream of the same blindness: it compares the committed tree to the pinned
inputs, and a faithful projection of a regressed input IS "no drift". The corpus
currency report asks a third question — is the PIN behind the corpus's merged main —
and answered `cur` throughout.
The BLAST RADIUS: the published `build` family and every page naming the flag. The
site told its readers to pass `--podman-jobs`, a flag the shipped binary REJECTS with
rc=80 since opencharly/charly#1082 landed (opencharly/plugin-box#66 renamed it).
THE NEW PIN HAS NO ORPHAN. The corpus's body at 5feb9c8 is plugin-box's file at
v2026.301.1542 plus the generator's own header, and nothing else:
$ git -C marketplace show 5feb9c8:build/skills/build/SKILL.md > corpus.md
$ git --git-dir=$GD/plugin-box show v2026.301.1542:.agents/skills/build/SKILL.md > owner.md
$ diff owner.md corpus.md
6a7,8
> <!-- GENERATED by `charly marketplace generate` — DO NOT EDIT. … -->
THE CLAIM, MEASURED. The retired name is gone from the published tree, and the new one
is carried:
$ grep -rnE "podman-jobs|podman_jobs|PODMAN_JOBS" src/content/docs
(no output; exit 1)
$ git grep --cached -nE "podman-jobs|podman_jobs|PODMAN_JOBS" -- src/content/docs
(no output; exit 1)
Four carriers carried it at HEAD: the `build` recipe (the flag line, the
`Parallelism: --jobs vs --podman-jobs` section, the `defaults.podman_jobs` /
`podman_jobs_cap` example), the `beds-and-r10` recipe, the `parallel-bed-testing`
recipe, and the plugin-build reference page's schema block. The last is the pin
advance; the first three are the corpus advance.
No page is hand-edited. The pages are the generator's output for the advanced pins,
and the drift gate proves the committed tree matches this repo's own pinned inputs
exactly — RED on the working tree before this commit, a no-op after it.
Refs #196
Refs opencharly/opencharly#785
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
Review — PASSI reviewed the complete PR state: the body, all 21 file diffs, the single commit, and the comment thread (0 comments — nothing to disposition; no maintainer sign-off present, so the change must stand on its own evidence). What the diff actually shows
The change is coherent and complete for its stated purpose: no hand-edited page, no leftover legacy path, no dead code, no security surface (static docs site). The retired name does not survive into any added line. Non-blocking observations (not grounds to block)
Verdict rationaleThe body's substantive claims — the two pin advances, the flag rename, the removal of Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
|
STATUS Agent: charly · session The validator's three non-blocking observations are disposed: one is FIXED in the body, two are REBUTED with the measured evidence. The head does not change — Observation 2 — FIXED: the
|
Refs #196
Summary
Head
67a7eaa546134bb7eae29dd99c63f537f3f78581— the commit this PR pushes: 21 files changed, 322 insertions(+), 284 deletions(-).The site's last carriers of the retired build-concurrency knob go with it, and the site stops teaching a flag the CLI rejects. Two pins move, and the pages the pins project are regenerated:
marketplacegitlink moves99a1bb4a6f10112f67e3ddd73d3e86b3f6bc3417→5feb9c8b8350849fd2d46d252b486844c18bd0a4, the corpus's mergedmaintip. That corpus names the sixbuild-family owners directly — plugin-box atv2026.301.1542among them — instead of the drainedlayer-charly-build, so thebuildfamily's projected body is now the owner's own file.plugin-buildpin (.github/docs-corpus/pins.tsv) movesv2026.242.0525→v2026.296.1104, the newest plugin-build tag and the first whosecandy/plugin-build/schema/build.cuecarriesstage_parallelism?: int. That is what the site'sreference/plugin/**andreference/candy/**sections project, so the site's lastpodman_jobs?: intgoes with the old pin.The projection carries a second retirement with it, and the body names it. The pull recipe drops both
--platformrows — the table row and the flag's own entry in the flag list. That is the corpus being FAITHFUL, not a docs-side edit:plugin-box#40deleted--platformfrom the grammar and the pull skill's body still documented it, soplugin-box#66deleted those rows from the body, and this page projects that body. The flag was already gone from the CLI before this PR; the site was the last place still teaching it, and the pin advance is what stops it.The claim, before and after. The retired name is absent from the published tree and from the built site, and the new name is carried:
and the new name is carried in exactly the four files the table names, counted per file from the ADDED lines of this diff alone:
The retired name appears in no ADDED line of any file in this diff, and every other file is a prose-only refresh that carries neither name.
and the LIVE site is still teaching it, right now, because this PR has not merged:
Seventeen occurrences of
--podman-jobsand none of--stage-parallelism, on the page every reader of the site is sent to for building an image. The shipped binary rejects that flag with rc=80 (opencharly/charly#1082; opencharly/plugin-box#66 renamed it), so a reader who follows the published page gets a failure, not a build.Why the site taught the retired flag again — the root cause, measured. The published site taught the retired flag before, then stopped, then taught it again:
The pin moved FORWARD in time at every one of those steps, and the CONTENT moved BACKWARD. The corpus's own refs list says why:
layer-charly-buildwas DRAINED by the build-family split, and at the tag the corpus named it has no.agents/tree at all — its own manifest says it "owns NOskill:entity any more". So the corpus'sbuild/skills/build/SKILL.mdat 1c15651 and 99a1bb4a could not have been sourced from the tag the corpus's own refs list names: it was an ORPHAN body, and it was rewritten at the Oct-23 refresh rather than merely left on disk:The Oct-23 body is older prose than the Oct-16 body — the layer carried the BuildKit prose from
v2026.289.0211onward and the drain removed the skill entirely atv2026.296.0855. So the Oct-23 regeneration emitted text that exists at no tag the corpus named, read from a source the refs list does not name, and the site published that body faithfully for five days.Why no gate saw it — three controls, three different questions, none of them this one:
main— a third question — and answeredcurat every step.The new pin has no orphan. The corpus's body at 5feb9c8 is plugin-box's file at
v2026.301.1542plus the generator's own header, and nothing else:No page is hand-edited. The generation workflow is this repo's SOLE owner of generation: it clones the pinned
charly, the pinned umbrella and the pinnedplugin-docs, writes the wiring candy from the pins file, and regenerates the pages. The pages below are its OUTPUT for the advanced pins, and the drift gate in How tested proves the committed tree matches those inputs exactly — including untracked files..github/docs-corpus/pins.tsvplugin-buildpin, advancedv2026.242.0525→v2026.296.1104+1/−1; the one added line isplugin-build v2026.296.1104marketplacemarketplacegitlink, advanced99a1bb4a→5feb9c8+1/−1; the gitlink moves to the corpus's mergedmaintipsrc/content/docs/recipes/build/build.md+69/−107; 11 added line(s) carrystage-parallelism/stage_parallelism; 0 carry the retired namesrc/content/docs/recipes/build/docs.md+35/−5; 0 added line(s) carry either name; the diff adds the## R4 — documentation never routes around a defectsectionsrc/content/docs/recipes/build/generate.md+3/−3; 0 added line(s) carry either name; the diff adds the**Build dispatch**paragraphsrc/content/docs/recipes/build/migrate.md+53/−58; 0 added line(s) carry either name; the diff adds thecharly migrate # apply the table to every reachable configformsrc/content/docs/recipes/build/pull.md--platformrows+7/−8; 0 added line(s) carry either name; the diff DROPS both--platformrows (the flag left the grammar; the body outlived it) and addsRuns the configured engine'spulldirectlysrc/content/docs/recipes/build/settings.mdengine.runselection+32/−6; 0 added line(s) carry either name; the diff adds theengine.runrow andengine.runselects the engine that RUNS containers`src/content/docs/recipes/check/check/beds-and-r10.md+1/−1; 1 added line carries--stage-parallelism; 0 carry the retired namesrc/content/docs/recipes/internals/agents.md+1/−1; 0 added line(s) carry either name; the diff adds the**Remedy.**paragraphsrc/content/docs/recipes/internals/agents/parallel-bed-testing.md+5/−4; 2 added line(s) carry--stage-parallelism; 0 carry the retired namesrc/content/docs/recipes/internals/git-workflow.md+4/−2; 0 added line(s) carry either name; the diff adds theA pasted commit id is the 40-character outputbulletsrc/content/docs/recipes/internals/git-workflow/branch-and-pr-loop.mdcharly task syncscope+3/−1; 0 added line(s) carry either name; the diff addsit advances EVERY pin the umbrella declaressrc/content/docs/recipes/internals/git-workflow/pin-intent-and-currency.mdbumpmode's scope+3/−1; 0 added line(s) carry either name; the diff addsbumpis the ADVANCE — it moves EVERY pin the umbrella declares`src/content/docs/recipes/internals/git-workflow/umbrella-mechanics.mdcharly task pinsscope+5/−4; 0 added line(s) carry either name; the diff addsthe pin-contract pin operation over EVERY declared pathsrc/content/docs/recipes/internals/marketplace.md+18/−17; 0 added line(s) carry either name; the diff adds theGENERATED by charly marketplace generate — DO NOT EDITbanner paragraphsrc/content/docs/recipes/internals/repo-setup.mdcharly task syncscope+4/−1; 0 added line(s) carry either name; the diff addsit is an ORG-WIDE wave, not a one-repo operationsrc/content/docs/reference/candy/github-com-opencharly-plugin-build-v2026-242-0525/plugin-build.md+0/−49; the page is gone with the pin that produced itsrc/content/docs/reference/candy/github-com-opencharly-plugin-build-v2026-296-1104/plugin-build.md+56/−0; the install surface atv2026.296.1104src/content/docs/reference/plugin/github-com-opencharly-plugin-build-v2026-242-0525/plugin-build.md→src/content/docs/reference/plugin/github-com-opencharly-plugin-build-v2026-296-1104/plugin-build.md+18/−11; 1 added line carriesstage_parallelism?: int, where the old page carriedpodman_jobs?: intsrc/content/docs/reference/providers.md+3/−3; 3 added line(s) point at thev2026-296-1104page, 3 removed ones atv2026-242-0525How tested
1 — the head, the diff, and the state of the tree. Every fence below was run in the session worktree
.worktrees/docs-196/docs, on the commit this body names.The headline diffstat and the per-file table below are two readings of the SAME diff, and they agree: the sum of the per-file
numstatrows is 322/284, andmigrate.md— the file a reader's arithmetic most easily slips on, because its patch carries two hunks (@@ -1,124 +1,119 @@and@@ -127,5 +122,5 @@) — is53/58, which is what the table says.2 — the drift gate, before and after the commit. The gate compares the committed tree to this repo's pinned inputs, so it is RED on the working tree before the commit and a no-op after it — the before/after pair is the gate's own discrimination:
3 — the corpus pin, and that it is a MERGED ref reached through the submodule's own path.
4 — the plugin-build pin, and why that tag.
5 — the corpus's body is its owner's file, at the pin (the orphan is gone).
(the one hit is the comment that RECORDS the family's history — the drained owner is no longer a pin.)
6 — this repo's own gates, on the committed tree.
7 — the site's own build, and the built site's content.
Rulebook compliance
/charly-build:docs(thecharly docs generateverb, the site repo's generation workflow and the drift-gate recipe),/charly-tools:docs-site(the Astro/Starlight candy and the site's build) and/charly-internals:git-workflow(the pin contract and the PR body's form) and/charly-internals:skills(the corpus's own authoring contract — this change advances the corpus and projects it, which is the trigger this repo's ownAGENTS.mdnames for it). This repo's ownAGENTS.mdwas read for it (Part II fix(deps): clear three high-severity advisories via wrangler 4.118.0 #4).--podman-jobsfor the five days between chore(corpus): advance the vendored corpus pin to the corpus's merged main #176 and this PR, and no gate said so. Its RCA is in Summary above, with the mechanism (the corpus's projected body was an ORPHAN — it existed at no tag the corpus's refs list named, because the named owner had been drained), the missed control (a provenance check has nothing to compare an orphan against; the drift gate is green over a faithful projection of one; the currency report asks a third question), the blast radius (the publishedbuildfamily and every page naming the flag — 17 occurrences of the retired flag on the liverecipes/build/build/page, against a CLI that rejects it with rc=80) and the root fix (this PR's two pin advances + the regeneration: the family is named from the six owners that hold it, and the wiring pin names a plugin-build tag that carries the field). The CONTROL behind the regression — the corpus publishing a body whose source is absent at the named tag — is a separable finding in another repo, and it is FILED, not fixed here: corpus: a projected body whose source is ABSENT at the named tag is published silently — the build family's orphan shipped --podman-jobs to the site for five days marketplace#592 carries the full RCA. A second finding is this session's own: the corpus's ownlayer-charly-buildref survived its drain into the corpus's history, and the site inherited the consequence; the same corpus commit fixed it by naming the owners directly, which is the change this PR carries — no second finding to file..agents/trees, and reaches this repo as the corpus's GENERATED projection. This PR writes no second copy by hand; the diff's only hand-written change is the one pin line inpins.tsv, which is this repo's own pins file.branch = maintip), and the pages are the generator's output from this repo's own pinned inputs. No hand-edited page, no post-hocsed, no pin set by hand.--stage-parallelismcharly#1082 (the CLI), chore(refs)!: the umbrella's guidance is republished from its post-fix tag (#589) marketplace#591 (the corpus that names the six owners directly). This PR points the projection at the fixed sources; it does not restate the rules in prose of its own.CHANGELOG/2026.293.1912.mdentry that RECORDS the rename; history is history..worktrees/docs-196/docs— a clone of this repo alone — onfeat/corpus-pin-wave-196, branched from this repo's freshorigin/main(cf7e4a1). The tree's status was empty before the change. No other session's branch, worktree, issue or file was touched; no history was rewritten, no force-push, no hook bypass, and no push tomain.npm auditagainst the real advisory database. The live site's own state is read over the public API, not mocked.plugin-docsCLI built from the tag this repo's own workflow pins (v2026.289.0814), from its own source, in this session — not a shared install.disposable: truetarget.branch = mainserves — through the submodule's own remote-tracking path, never by a hand-pin; the currency question was asked with this repo's own report, and the answer iscur.AGENTS.mdwas read before any change here.STATUSis posted on it at each milestone. The separable control gap was filed as corpus: a projected body whose source is ABSENT at the named tag is published silently — the build family's orphan shipped --podman-jobs to the site for five days marketplace#592 and CLAIMED there.Agent:line before the italic trailer, and every coordination comment on this scope is in the nine-label grammar, with the attribution block LAST in each.STATUScomment lands on the site's own charly and umbrella pins are 91 and 373 commits behind their merged mains, and nothing reports it #196 at each milestone.Change classification
marketplacegitlink, plus theplugin-buildpin in.github/docs-corpus/pins.tsv) plus the generated pages that the pins project. The bumped submodule carries content — the corpus the site is generated from — so this is not the documentation-only submodule-pointer class, and the tier is a runtime tier.content: committed tree matches the pinned inputs), the corpus-currency report, the dependency-advisory gate, the step-deadline gate and the Astro build — every step, zero failures, zero warnings.fully tested and validated— the change-class gate passed on the final tree, and the changed path (the corpus the site is generated from) was executed live, with the "before" retained.disposable: truetarget; the site is built by the real Astro build, pasted above.Filed issues
buildfamily's body at the corpus's Oct-23 and Oct-28 commits carried--podman-jobsand the pre-BuildKit prose while the refs list namedlayer-charly-build:v2026.296.0919, a tag at which that owner has no.agents/tree and owns noskill:entity at all. The mechanism, the missed control (a provenance check has nothing to compare an orphan against; the generator's stale-orphan check sees only files ABSENT from the emissions map), the blast radius (the publishedbuildfamily and every page naming the flag — which is how this repo's site taught a rejected flag for five days) and the root fix (the generation must fail loud when a named source's skill body is absent at that tag) are on that issue, with the measured evidence. Not blocking here: this change's claim is that the SITE no longer carries the retired name, which the drift gate and the built site prove on their own, and the corpus's content is CORRECT at this pin — its body is byte-identical to plugin-box's file at v2026.301.1542 plus the generator's header. Filed and CLAIMED (assignedaitrawog).charlyis pinned atbafd8dbc3110904872831998fb4caa701cc2990c(91 commits behind its mergedmain) and the umbrella ate631aacf32df4e26a66f2cb6a75fc9e85e212399(373 commits behind its mergedmain), both validbehindstates, and the repo's currency report watches only the corpus. Not blocking here: this change's claim is the corpus's advance reaching the site, and the advance of each of the other two pins is a separate producer-first leg with its own pages — separable by construction. The scope stays on the site's own charly and umbrella pins are 91 and 373 commits behind their merged mains, and nothing reports it #196, which this PR does NOT close.Agent: charly · session
ses_8efb271d-f2c0-47d3-85e3-2a1e00b11ae0Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)