Skip to content

chore(pins): advance the umbrella's 55 gitlinks to their producers' merged mains - #640

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/pin-wave-2
Oct 23, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
feat/pin-wave-2

Conversation

@aitrawog

Copy link
Copy Markdown
Contributor

Closes #637

Summary

The wave. Fifty-five pins move and one derived binding is added, every one of them
by the pin contract's own bump (charly task sync) and never by hand.
Head 99cfe4b5d4629c34abd01c29257420b2754e6804 — 56 files changed, 56 insertions(+), 55 deletions(-).

file was now producer leg
charly 75c38eb8 720698d6 opencharly/charly#1043 — docs(test): put each deploy-connect test helper doc on its own function (#1042)
distro-arch 9b84c67c 59792cab opencharly/charly#1039 — chore(pins): advance the four box/* twins to the refs their intent names
distro-cachyos 541398c0 42a3f078 opencharly/charly#1039 — chore(pins): advance the four box/* twins to the refs their intent names
distro-debian a586c1f4 fad84d29 opencharly/charly#1039 — chore(pins): advance the four box/* twins to the refs their intent names
distro-ubuntu 9731ef8e f23f751d opencharly/charly#1039 — chore(pins): advance the four box/* twins to the refs their intent names
docs c5568310 00b417d1 opencharly/docs#176 — chore(corpus): advance the vendored corpus pin to the corpus's merged main
dotgithub f38f312b 9f3df6d8 opencharly/.github#242 — fix(ci): arm against the mutation, not against a proxy merge state
layer-charly-internals eb51da54 07ea8b9b opencharly/layer-charly-internals#139 — feat(skills)!: drain the nine skills whose destination repos can publish them
layer-docs-site 199fb451 e505b26e opencharly/layer-docs-site#11 — fix(docs-site): re-pin DOCS_REF to the docs main head, and resolve the two corpus pages by name
layer-hermes-playwright 15509661 d628581f opencharly/layer-hermes-playwright#9 — feat(skills)!: the hermes-playwright-layer skill lives beside the hermes-playwright candy it documents
layer-k3s 46ce442d 0c5c54cb opencharly/layer-k3s#9 — fix(skills): the k3s skill node's description is the FILE's, not a second copy
layer-kind 9f0ae70a 1d473290 opencharly/layer-kind#10 — fix(kind)!: the engine-prepare script dispatches on the containerd engine word
layer-kubernetes ac13afe6 6a4ce2c0 opencharly/layer-kubernetes#4 — feat(skills)!: the kubernetes-layer skill lives beside the kubernetes candy it documents
layer-nerdctl 647c9248 74814843 opencharly/layer-nerdctl#16 — docs: the layer-nerdctl prose names the containerd engine word, not the retired nerdctl
layer-nvidia 28e7bfb2 99408c79 opencharly/layer-nvidia#19 — feat(skills)!: the nvidia-layer skill lives beside the nvidia candy it documents
layer-openclaw 3c1007a4 a99b1437 opencharly/layer-openclaw#9 — feat(skills)!: the openclaw-deploy skill lives beside the openclaw candy it documents
layer-playwright 8557a904 25e7b49f opencharly/layer-playwright#5 — feat(skills)!: the playwright-layer skill lives beside the playwright candy it documents
layer-python-ml 84305cdd 3c218547 opencharly/layer-python-ml#11 — feat(skills)!: the python-ml-layer skill lives beside the python-ml candy it documents
layer-tmux 2560e7dd f49e150d opencharly/layer-tmux#3 — feat(skills)!: the tmux-layer skill lives beside the tmux candy it documents
layer-wl-overlay b21dcb9c 895de424 opencharly/layer-wl-overlay#7 — feat(skills)!: the wl-overlay-layer skill lives beside the wl-overlay candy it documents
marketplace b879d711 1c156511 opencharly/marketplace#559 — fix(refresh): stage the run's work before the report snapshots it
pkg-arch 6e288e27 b5ac552a opencharly/pkg-arch#31 — docs: the engine stack is containerd's, driven through the nerdctl CLI
plugin-agent d5195ae7 955e89f5 opencharly/plugin-agent#13 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-alias 1e7f4841 3515147e opencharly/plugin-alias#7 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-box 6f59dc9b b9ed1216 opencharly/plugin-box#63 — docs(build): the build skill documents the charly image store, not the retired tag step (#62)
plugin-build 1f3c659d 91bdb344 opencharly/plugin-build#38 — fix(build): stream blobs into the store, and prove where the annotation control fails (#36)
plugin-clean 79065551 b4f9f019 opencharly/plugin-clean#20 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-cmd e43f9c59 8732a8ee opencharly/plugin-cmd#8 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-deploy-local 117648e8 21446688 opencharly/plugin-deploy-local#17 — feat(skills)!: the skill lives beside the deploy substrate it documents
plugin-deploy-vm 544e17fd 54fe61b8 opencharly/plugin-deploy-vm#43 — feat(skill): author the vm-deploy-target skill where its code lives
plugin-doctor 89e820b9 f54e85e0 opencharly/plugin-doctor#16 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-egress 5484c1f1 c71add34 opencharly/plugin-egress#20 — feat(skill): author the egress skill where its code lives
plugin-enc 9514a0e0 03f491e7 opencharly/plugin-enc#7 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-helm 86065082 d6379ddc opencharly/plugin-helm#6 — feat(skills)!: the helm skill lives beside the plugin that serves it
plugin-herdr 0d0d923b b1d2dfd7 opencharly/plugin-herdr#14 — chore(pin): advance the vendored charly past the engine-word cutover
plugin-kube ec4ba1f4 e1b4fda7 opencharly/plugin-kube#30 — docs: the check-k8s engine list names containerd, not the retired nerdctl
plugin-marketplace e5997015 1230071c opencharly/plugin-marketplace#45 — feat(skill): author the marketplace skill where its code lives
plugin-ssh b66d66ee 076dae3a opencharly/plugin-ssh#8 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-status e14d89fa c9d444d4 opencharly/plugin-status#11 — feat(skills)!: the skill lives beside the plugin that serves it
plugin-task 38c54817 a802474a opencharly/plugin-task#36 — the task: hop carries the nested run's own report; the tip a802474a is the tag-on-merge bot's own commit (opencharly/.github#192)
plugin-tmux fa897d67 77a6644b opencharly/plugin-tmux#6 — feat(skills)!: the skill lives beside the typed terminal provider it documents
plugin-udev 01cfda19 6ac20557 opencharly/plugin-udev#8 — feat(skills)!: the skill lives beside the plugin that serves it
pod-comfyui 8b21d135 8731930f opencharly/pod-comfyui#8 — feat(skills)!: the comfyui-layer skill lives beside the comfyui candy it documents
pod-dbus 77dd69b1 2bb9be82 opencharly/pod-dbus#7 — feat(skills)!: the dbus-layer skill lives beside the dbus candy it documents
pod-filebrowser 077b5d42 d0817857 opencharly/pod-filebrowser#7 — feat(skills)!: the filebrowser-layer skill lives beside the filebrowser candy it documents
pod-herdr 7e62b0a3 ca1d8079 opencharly/pod-herdr#12 — chore(pin): advance the vendored charly past the engine-word cutover, and fix the herdr-box skill owner
pod-hermes 51199e90 f9a3c1eb opencharly/pod-hermes#13 — feat(skills)!: the hermes-layer skill lives beside the hermes candy it documents
pod-hermes-full 800f0b0c 872598bb opencharly/pod-hermes-full#6 — feat(skills)!: the hermes-full-layer skill lives beside the hermes-full candy it documents
pod-immich e3ff38d6 ab245c8c opencharly/pod-immich#11 — feat(skills)!: the immich-layer skill lives beside the immich candy it documents
pod-immich-ml 4e3687d1 4bf2a002 opencharly/pod-immich-ml#10 — feat(skills)!: the immich-ml-layer skill lives beside the immich-ml candy it documents
pod-jupyter bd7ca75a ff91d9a7 opencharly/pod-jupyter#7 — feat(skills)!: the jupyter-layer skill lives beside the jupyter candy it documents
pod-jupyter-ml e4dc1d1a 4995cd55 opencharly/pod-jupyter-ml#13 — feat(skills)!: the jupyter-ml-layer skill lives beside the jupyter-ml candy it documents
pod-openwebui dd266822 0c8cb734 opencharly/pod-openwebui#16 — feat(skills)!: the openwebui-layer skill lives beside the openwebui candy it documents
pod-selkies-desktop ba53d98b beea508d opencharly/pod-selkies-desktop#21 — feat(skills)!: the selkies-desktop-layer skill lives beside the selkies-desktop candy it documents
pod-unsloth-studio 17f51ea4 f3144ada opencharly/pod-unsloth-studio#11 — feat(skills)!: the unsloth-studio-layer skill lives beside the unsloth-studio candy it documents
.dsh/skills/clawsweeper-review — — the corpus's new check skill (clawsweeper-review), bound by the re-derivation the bump runs

The accounting of this wave's scope. The pre-wave measurement, taken on the tree the
wave starts from, was 54 of 412 pins NOT current — fifty behind leaves plus the
four blocked-by edges. docs was cur at that moment and went behind the moment
opencharly/docs#176 merged, so the wave's scope is 55 pins. Fifty-five in,
fifty-five moved.
Two pins the currency report did not name also resolved without a
change — crabbox and plugin-pod, whose checkouts were behind the refs their index
already recorded, so the bump brought them forward and the gitlink did not move.
distro-fedora and distro-omarchy did not move because their twins did not move.

Three of the four blocked edges resolve this time. An edge pin's value is its
source's recorded gitlink, and charly's own box/* twins moved (opencharly/charly#1039).
Four of the six twins moved and two did not:

$ git -C charly ls-tree 75c38eb8 box/arch box/cachyos box/debian box/fedora box/omarchy box/ubuntu
160000 commit 9b84c67cda2a9f87b44621be445111307cc3a104	box/arch
160000 commit 541398c061dc8c604cdc208f8518462020efed44	box/cachyos
160000 commit a586c1f45252276707d9f0f01bea107596346b7b	box/debian
160000 commit b3c35d4de6886b1534bda386fdde0cfc59e0885a	box/fedora
160000 commit 44ca9e37e0f50272c861ec82cfa4ea9b0b4673f8	box/omarchy
160000 commit 9731ef8efd2273cd80d66d4e72a16a29b00402c9	box/ubuntu
$ git -C charly ls-tree 720698d6 box/arch box/cachyos box/debian box/fedora box/omarchy box/ubuntu
160000 commit 59792cabc8f1dc5bdda2a52c756da0a3f805fcf4	box/arch
160000 commit 42a3f078acee36eb0517b8cb97944ce26ec970e3	box/cachyos
160000 commit fad84d294640b3bf1a2750ccdbecd27e8bef1ad1	box/debian
160000 commit b3c35d4de6886b1534bda386fdde0cfc59e0885a	box/fedora
160000 commit 44ca9e37e0f50272c861ec82cfa4ea9b0b4673f8	box/omarchy
160000 commit f23f751dd98fe466b5c432dedbc3054a414b4b00	box/ubuntu

After the wave, distro-arch (59792cab), distro-cachyos (42a3f078) and
distro-debian (fad84d29) sit exactly on their repos' served mains, so those three
edges are cur. distro-fedora and distro-omarchy keep the twins they already held,
and both twins are still exactly their repos' served mains.

distro-ubuntu advances, and is still behind — the report says so. Its twin moved
9731ef8e -> f23f751d with charly#1039, so the umbrella's edge advanced by one
distro-ubuntu cycle. But distro-ubuntu merged its own PR #59 — the changelog commit
2026.296.1519, 15:19Z — after charly#1039 set that twin at 13:39Z, so the served main
is 7073f4c8 and the twin is one cycle behind it again:

$ git ls-remote https://github.com/opencharly/distro-ubuntu.git refs/heads/main
7073f4c80edb25bb577b38c8cf50a402fed167ee	refs/heads/main
$ git -C charly ls-tree 720698d6 box/ubuntu
160000 commit f23f751dd98fe466b5c432dedbc3054a414b4b00	box/ubuntu
$ git -C distro-ubuntu merge-base --is-ancestor f23f751dd98f 7073f4c80edb ; echo $?
0

The umbrella cannot advance that edge further: an edge's value is its source's
recorded gitlink. The leg is charly's own pin operation — charly task sync, which
advances the box/* gitlinks to each distro's default-branch HEAD — and then the next
umbrella wave. The currency report names it as a blocked-by that names its producer,
and the pin contract PASSES that state: a pin behind is an advance available now, in its
producer's repo. opencharly/charly#1035 — charly's stale nested box/ubuntu twin — was
closed by charly#1039's merge, which this wave carries; the twin has gone stale again
since, for the reason above.

The currency report on this very tree. The report is not decoration: it is the
question verify asks about every pin — is the pin at the ref its intent names? — and
on this tree it answers:

task pins: 1 step(s), 0 failed
  [pass] run — run git-submodules in the selected mode
      currency: 2 of 412 pin(s) NOT current [1 behind, 1 blocked-by charly:box/ubuntu (behind), 410 cur]; intents: 406 upstream leaf/leaves (406 implicit), 6 derived-from edge(s); NOT CURRENT: distro-ubuntu: blocked-by charly:box/ubuntu (behind); intent derived-from:charly; recorded f23f751dd9; served 7073f4c80e (charly:box/ubuntu branch); marketplace: behind; intent upstream:main (implicit: .gitmodules branch=); recorded 1c1565112c; served 74be5fb914 (branch); producer-first legs: marketplace (1c1565112c -> 74be5fb914) -> distro-ubuntu (blocked-by charly:box/ubuntu (behind))

The two pins the report names, and the legs that make them current. The report names
two of 412 pins as not current, and both are REPORTED and PASSING by the pin contract
— each names its producer, and each is an advance available now in that producer's repo:

Why the wave did not chase the first one. A wave's scope is the set its bump
measured, and the org's remotes move while the gate runs — #561 landed eleven minutes
after this wave's commit. The pin contract gives that state a name and a meaning:
behind is an advance available NOW in its producer's repo, it is REPORTED, and it
PASSES. The umbrella's own currency report is the control that names it, and the next
wave takes it. Chasing it here would also cost the agreement the next paragraph
proves.

The corpus and the docs leg agree. The umbrella's marketplace gitlink and the
corpus pin opencharly/docs#176 took are the same commit, 1c156511, so no two sides of
this wave disagree about what the corpus's main is — and they still agree precisely
because the wave took the corpus's main as it stood when the bump ran, and left
marketplace#561 to the next wave.

The corpus's consumer legs. opencharly/marketplace#543 — the corpus's refresh
defect — has two consumer legs: opencharly/docs#176 (merged) and this wave, which
carries the umbrella's marketplace gitlink to the corpus's merged main. This PR is the
second leg.

One new derived binding. The bump's second step re-derives the harness skill
bindings from the corpus the bump just advanced, and the advanced corpus carries one new
skill — check/clawsweeper-review. The binding .dsh/skills/clawsweeper-review is
added, pointing at ../../marketplace/check/skills/clawsweeper-review. It is derived,
not hand-written: the script that writes it reads the pinned corpus.

How tested

The change class here is a pin wave, so the R10 gate is the umbrella's own
./charly/bin/charly task verify, run on the committed tree this PR pushes, with
charly task pins --param MODE=currency as the currency evidence. Every command, output
and exit code is retained below.

$ git log --oneline -1
99cfe4b chore(pins): advance the umbrella's 55 gitlinks to their producers' merged mains
$ git status --short
$ git rev-parse HEAD
99cfe4b5d4629c34abd01c29257420b2754e6804
$ git rev-parse HEAD^{tree}
7cfe5ed698c8c7313d86cb88e799dd4de87d3da1
$ git diff --shortstat origin/main...HEAD
56 files changed, 56 insertions(+), 55 deletions(-)
$ bash ./charly/scripts/bootstrap-charly.sh
regenerating compiled-in plugin wiring
bootstrap-charly: building bin/charly
bootstrap-charly: built ./bin/charly (2026.296.1656)
BOOTSTRAP_RC=0
$ ./charly/bin/charly version
2026.296.1656

The gate, on the committed tree:

task verify: 30 step(s), 0 failed
  [pass] check — the pin contract holds — every distro-* gitlink equals charly's own box/* gitlink (the EDGE), and every submodule is clean and checked out at its recorded gitlink (the CHECKOUT AUDIT), composed ONCE through `pins`
      verify: 6 policy pin(s) hold across 412 submodule(s); 412 checkout(s) clean at their gitlink
  [pass] check — each pin's CURRENCY — the pin is at the ref its intent names (the question the consistency half above does not answer)
      currency: 2 of 412 pin(s) NOT current [1 behind, 1 blocked-by charly:box/ubuntu (behind), 410 cur]; intents: 406 upstream leaf/leaves (406 implicit), 6 derived-from edge(s); NOT CURRENT: distro-ubuntu: blocked-by charly:box/ubuntu (behind); intent derived-from:charly; recorded f23f751dd9; served 7073f4c80e (charly:box/ubuntu branch); marketplace: behind; intent upstream:main (implicit: .gitmodules branch=); recorded 1c1565112c; served 74be5fb914 (branch); producer-first legs: marketplace (1c1565112c -> 74be5fb914) -> distro-ubuntu (blocked-by charly:box/ubuntu (behind))
  [pass] check — every submodule's branch equals its remote default — KEPT INLINE, deliberately, because no verb owns this clause, and it is the expensive half (one git ls-remote per submodule, hence the timeout below)
      exit=0
  [pass] check — charly's own nested submodules are at their gitlinks — KEPT INLINE, because the verb has no recursive-nested clause
      exit=0
  [pass] check — the nested-submodule step above — an uninitialized nested path is a NOTICE, a `+`/`U` drift still FAILS (fixtures)
      exit=0
  [pass] check — the branch-audit step above — every branch= is compared against the remote default, and EVERY mismatch is named (fixtures)
      exit=0
  [pass] check — the branch-audit gate discriminates — each mutation turns it RED (fixtures)
      exit=0
  [pass] check — no `command:` step in this file carries a braced reference in its text — the plan runner CLAIMS one, and an unresolvable one SKIPS the step instead of failing it, so the gate would read green over a check that never ran (fixtures)
      exit=0
  [pass] check — the command-text gate discriminates — each mutation turns it RED (fixtures)
      exit=0
  [pass] check — the README's MEASURED figures agree with each other — the table, the prose that quotes it, and the date every dated figure carries — and every count of a collection that GROWS is derived from that collection or dated (fixtures)
      exit=0
  [pass] check — the measurement gate discriminates — each mutation turns it RED, the figures and the shape counts alike (fixtures)
      exit=0
  [pass] check — the body/diff reconciliation gate discriminates — a file table that omits a changed file, one that lists an unchanged file, and a pasted `git rev-parse HEAD` that is not the head, each turn it RED (fixtures)
      exit=0
  [pass] check — every step of every task in this file declares a `context:` the plan runner activates — a set disjoint from [build, runtime] (the `[deploy]` this file used to carry) is a no-op in EVERY mode (fixtures)
      exit=0
  [pass] check — the opencode gate plugin contract (the check-opencode-plugin gate the former verify-pins.sh ran)
      exit=0
  [pass] check — the PR-watch plugin's pure logic + its shipped (uncommented) SDK delivery primitives
      exit=0
  [pass] check — the agent-progress monitor+control plugin — static (no .sh), the classifier (RCA regression), and a read-only store
      exit=0
  [pass] check — the session tracker plugin — the durable ledger (rule 9 invariant), the three tools, and the real-binary load
      exit=0
  [pass] check — every harness-config surface parses and is wired (rule 5)
      exit=0
  [pass] check — the harness-config gate discriminates — each mutation turns it RED (fixtures)
      exit=0
  [pass] check — the pi gate extension fails CLOSED, uses the rule-2 worktree path, and wires both gate scripts
      exit=0
  [pass] check — the validator enforces only what the rulebook states — rulebook check ids == the AGENTS.md "What the validator checks" table, every cited skill resolves, and the committed rulebook == the live AI_REVIEW_PROMPT (opencharly/opencharly#446)
      exit=0
  [pass] check — the validator rule-map gate discriminates — each mismatch fixture turns it RED
      exit=0
  [pass] check — the coordination closed set is the SAME nine labels on every surface that enumerates it (opencharly/opencharly#567)
      exit=0
  [pass] check — the coordination closed-set gate discriminates — each mutation turns it RED (fixtures)
      exit=0
  [pass] check — the pi wake binding delegates to the neutral watchers, wakes, re-arms, cleans up, and ships inert + wired
      exit=0
  [pass] check — the pi PR-status tool parses, normalises the state, finds the run by head SHA, reads jobs via REST, and classifies INCONCLUSIVE
      exit=0
  [pass] check — the pi `question` tool is dependency-free, headless-safe, serialized, and wired into .pi/settings.json
      exit=0
  [pass] check — the harness-neutral R10 bed watcher classifies exit codes and parses summary.yml (self-test)
      exit=0
  [pass] check — every canonical root narrative exists and every root-file reference in the agent surfaces resolves (the #356 content-loss gate)
      exit=0
  [pass] check — the root-ref gate discriminates — each mutation turns it RED (fixtures)
      exit=0
VERIFY_RC=0

The currency evidence, same tree:

task pins: 1 step(s), 0 failed
  [pass] run — run git-submodules in the selected mode
      currency: 2 of 412 pin(s) NOT current [1 behind, 1 blocked-by charly:box/ubuntu (behind), 410 cur]; intents: 406 upstream leaf/leaves (406 implicit), 6 derived-from edge(s); NOT CURRENT: distro-ubuntu: blocked-by charly:box/ubuntu (behind); intent derived-from:charly; recorded f23f751dd9; served 7073f4c80e (charly:box/ubuntu branch); marketplace: behind; intent upstream:main (implicit: .gitmodules branch=); recorded 1c1565112c; served 74be5fb914 (branch); producer-first legs: marketplace (1c1565112c -> 74be5fb914) -> distro-ubuntu (blocked-by charly:box/ubuntu (behind))
CURRENCY_RC=0

The claim-keyed sweep (R5). The claim is "no superseded pin survives as live
state"
. The keys are the fifty-five values this wave replaced, one per line; the
sweep asks the index and the working tree whether any of them still serves a path:

--- the keys: the 55 superseded pin values, one per line ---
55

--- the index: does any superseded value still serve a path? ---
index sweep exit=1 (1 = no hit)
index hits: 0

--- the live tree: does any superseded value survive outside CHANGELOG/? ---
live sweep exit=1 (1 = no hit)
live hits: 0

--- the history: CHANGELOG/ quotes the pins as they stood; counted, not swept ---
changelog hits: 42
CHANGELOG/2026.294.1711.md
CHANGELOG/2026.294.2346.md
CHANGELOG/2026.295.0457.md
CHANGELOG/2026.295.0643.md
CHANGELOG/2026.295.1454.md
CHANGELOG/2026.295.1818.md
CHANGELOG/2026.295.2044.md
CHANGELOG/2026.296.0915.md
CHANGELOG/2026.296.1445.md

--- the control: the same instrument, keyed on a value the tree DOES serve ---
control sweep exit=0 (0 = the instrument fires)
160000 commit 1f730f527e815cc98d3dde160564f0e18940cf4f	action-review

The surviving hits, classified. The only hits are in CHANGELOG/ — nine files, and
every one of them quotes the pin values as they stood at the time (a past wave's
160000 <sha> 0 <path> line, or a quoted sha in prose). The rulebook puts history in
CHANGELOG/ and nowhere else, so a changelog entry that names the sha a wave pinned
that day is history, not a live path; the live sweep, which excludes CHANGELOG/,
returns nothing.

The control, so that the green means something. The same instrument, keyed on a pin
the tree still serves, finds it and exits 0 — the sweep discriminates, so its silence on
the live tree is evidence and not a broken instrument.

Rulebook compliance

  • R0 — /charly-internals:git-workflow and /charly-internals:strict-policy were
    loaded before the first edit; the umbrella's own AGENTS.md was read first.
  • R1 — the wave ran once, green, with no concurrent git command in its worktree (the
    contention that cost three pins in chore(pins): the pin wave — 18 gitlinks to their producers' merged mains, and a currency report in verify #623 is avoided by construction
    here). The currency report names two pins of 412 that are not current, and both are
    REPORTED and PASSING by the pin contract rather than defects: marketplace is one
    merge behind, because chore(corpus): pin layer-nerdctl v2026.296.1649, regenerate, and retire the engine-word comment marketplace#561 merged after the wave's bump read the
    repo (an advance available now in its own repo, which the next wave takes), and
    distro-ubuntu's derived-from edge is one distro-ubuntu cycle behind its served main
    (named above, with its leg). Neither is a failure, a warning, or a rule violation, so
    neither was remediated here; both are named in the report above, with their legs. The
    docs pin, which went behind between the measurement and the wave, was advanced by
    this wave.
  • R2 — one implementation: the pins advance only through charly task sync, and the
    harness bindings are re-derived by the one script that owns them, never hand-written.
  • R3 — no workaround: no sleep, no retry, no hand-pinned sha, no branch checkout;
    every pin moved through the sanctioned verb.
  • R4 — the product first: the diff is the pin advance itself; no prose in this repo
    describes the pins, so no prose had to change with them.
  • R5 — no superseded pin survives as live state: the claim-keyed sweep above is
    keyed on the fifty-five replaced values, the live tree returns nothing, and the only
    hits are in CHANGELOG/, which the rulebook holds history in.
  • R6 — git status was read before every write; the change is confined to this
    repo's own worktree; no submodule was edited in place, no force-push, no bypass.
  • R7 — the coverage discriminates: the sweep fires on a pin the tree still serves,
    and the currency report names pins that are behind, so its silence on a clean tree is
    a measurement rather than a gap.
  • R8 — the gate asks the remotes what they serve; nothing is mocked.
  • R9 — the binary that ran the gate is the worktree-local build from the advanced
    charly source — the build below, and charly version agrees with it.
  • R10 — the gate ran on the committed tree of this PR's head, on a fresh build, with
    zero warnings.

Change classification

A pin wave. The diff advances 55 gitlinks and adds one derived harness binding, so
the R10 gate for this change class is the umbrella's own
./charly/bin/charly task verify — run on the committed tree, with
charly task pins --param MODE=currency as the currency evidence. This repo is the
umbrella itself: it pins other repos and is pinned by nothing, so this PR lands on its
own and no consumer follows it.

Filed issues

None — this wave filed no new issue. Every pin it advanced is at a MERGED ref of its
own repo. The two states the currency report names — marketplace one merge behind, and
distro-ubuntu's derived-from edge one cycle behind — are REPORTED and PASSING by the pin
contract: each names its producer, and each is an advance available now in that
producer's repo, which is what the next wave takes. Neither is a failure, a warning, or a
rule violation, so neither carries an issue. The docs pin, which went behind between
the measurement and the wave, was advanced by this wave, so it carries nothing to file
either.

Agent: charly

Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)

…erged mains

The wave advances 55 gitlinks, every one of them to a MERGED ref of its own
repo, and by the sanctioned path only: `charly task sync` (Part II #3).

50 leaves were behind their repos' merged mains; the 4 derived-from edges were
blocked by `charly`, whose `box/*` twins moved with opencharly/charly#1039 — so
3 of the 4 edges re-pin to `cur`, and the 4th, `distro-ubuntu`, advances with
its twin but stays `blocked-by charly:box/ubuntu (behind)`, a state the currency
report names and the pin contract passes; and `docs` advanced because
opencharly/docs#176 merged and carried the corpus pin with it.

`crabbox` and `plugin-pod` were not behind and did not move. `distro-fedora`
and `distro-omarchy` did not move because their twins did not move. The
umbrella's own `marketplace` pin and the corpus pin the docs leg took agree:
both are `1c156511`.

The skill bindings are re-derived from the pinned corpus, which adds exactly
one binding: `.dsh/skills/clawsweeper-review`.

Closes #637

Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
@github-actions

Copy link
Copy Markdown
Contributor

Review — PASS

What the diff actually contains

56 files, exactly matching the body's accounting:

  • 55 modified gitlink files (each +1/-1), all under the umbrella root: charly, the four distro twins that moved (distro-arch, distro-cachyos, distro-debian, distro-ubuntu), docs, dotgithub, the layer-* set, marketplace, pkg-arch, the plugin-* set, and the pod-* set.
  • 1 added binding .dsh/skills/clawsweeper-review, a single line ../../marketplace/check/skills/clawsweeper-review.

Insertion/deletion math checks out: 55×(+1/−1) + 1×(+1/−0) = 56 insertions, 55 deletions, matching the body's git diff --shortstat.

Body/diff reconciliation (line by line)

I compared every "was → now" row in the body's table against the diff. All 55 SHAs match the diff exactly (e.g. charly 75c38eb8→720698d6, marketplace b879d711→1c156511, distro-ubuntu 9731ef8e→f23f751d, …). No table row omits a changed file, and no changed file is missing from the table. The added binding row (— → —) matches the added file.

Honesty of the body

The body is notably candid rather than overclaiming:

  • It states the currency report shows 2 of 412 pins not current (marketplace behind, distro-ubuntu blocked-by) and explains both legs, rather than claiming a fully-current tree.
  • It explicitly says marketplace was current when the bump ran and moved underneath it (marketplace#561 at 18:09Z), and that it left that to the next wave.
  • It explains the distro-ubuntu edge cannot advance further from the umbrella because an edge's value is its source's recorded gitlink (charly's box/ubuntu twin).
  • The cross-repo agreement claim (umbrella marketplace gitlink == docs#176's corpus pin == 1c156511) is consistent with the docs pin advancing to 00b417d1 and is not contradicted by any diff line.

These are cross-repo facts that cannot be independently re-derived from the gitlink diff alone, but they are internally consistent and are the class of evidence expected for a pin wave.

Tests / gate

This is a pin wave; there is no new code, so there is no new unit test to add. The R10 gate is the umbrella's own charly task verify plus charly task pins --param MODE=currency, and the body retains full output showing 0 failed / VERIFY_RC=0 and CURRENCY_RC=0. The claim-keyed sweep is well-designed: it is keyed on the 55 replaced SHAs, returns nothing on the live tree (excluding CHANGELOG/), and includes a positive control keyed on a still-served pin (action-review) that fires — so the silence is a measurement, not a broken instrument. The residual CHANGELOG/ hits are correctly classified as history.

Security / scope

  • No secrets, no injection surface; the new binding is a relative path to a trusted org repo's skill.
  • No hand-pinned SHAs, no branch checkouts, no in-place submodule edits; the change is confined to gitlink advances and one generated binding.
  • Coherent and complete: 55 in / 55 moved, plus the one derived binding; no leftover legacy path or duplication.

Comments

There are 0 comments, so no maintainer/operator sign-off exists and none is imported. The change stands on its own evidence, which is present and internally consistent.

Minor (non-blocking) observations

  • .dsh/skills/clawsweeper-review has no trailing newline; harmless for a path-style binding, but a trailing newline is tidier.
  • The marketplace pin is one merge behind at merge time; the body discloses this and the pin contract's currency check passes it ([pass] in the supplied output), so it is not a defect of this PR.

Everything asserted in the body is reproduced by the diff and the supplied gate evidence. No contradiction, no missing coverage, no security concern rises to a block.

Verdict: PASS


ollama-cloud/deepseek-v4.1-flash — action-review.

View action run

@github-actions
github-actions Bot enabled auto-merge (squash) October 23, 2026 18:22
@aitrawog

Copy link
Copy Markdown
Contributor Author

STATUS

STATUS

The validator's verdict is PASS, and its one minor observation is rebutted with evidence rather than filed away.

The observation: ".dsh/skills/clawsweeper-review has no trailing newline; harmless for a path-style binding, but a trailing newline is tidier."

The binding is a symlink, not a file with a body — and that is the form of all 361 bindings in the tree, without exception:

$ git ls-tree HEAD .dsh/skills/ | awk '{print $1}' | sort | uniq -c
    361 120000

A symlink's content is its target path, so "a trailing newline" is not a tidiness knob on this file: a newline byte in the blob would become part of the target's name, and the binding would point at a path that does not exist. The new binding is byte-identical in form to its siblings — the blob ends at the last character of the path, with no 0x0a:

$ git cat-file blob f83a7603 | xxd | tail -2
00000020: 6c61 7773 7765 6570 6572 2d72 6576 6965  lawsweeper-revie
00000030: 77                                       w
$ git cat-file blob 169e5b2e | xxd | tail -2      # a sibling, for comparison
00000010: 652f 7365 6c6b 6965 732f 736b 696c 6c73  e/selkies/skills
00000020: 2f61 3131 792d 746f 6f6f 7473              /a11y-tools
$ readlink .dsh/skills/clawsweeper-review
../../marketplace/check/skills/clawsweeper-review
$ test -e .dsh/skills/clawsweeper-review && echo "target EXISTS"
target EXISTS

So the observation describes the mechanism, not a defect in this change: there is no form of this binding that carries a trailing newline without breaking the binding. The alternative — hand-writing this one binding as a regular file, or trimming a newline from the other 360 — would be a hand-edit of a derived artifact (the binding is re-derived from the pinned corpus by the one script that owns it), which the rulebook forbids, and it would make one binding differ in kind from the other 360.

The validator's second observation — the marketplace pin one merge behind at merge time — is disclosed in the body with its leg (opencharly/marketplace#561 merged at 18:09Z, after the wave's bump read the repo; the pin contract reports a behind pin as an advance available now, and the next wave takes it), and the validator's own reading is that it is not a defect of this PR. Nothing to fix or rebut there.

State. Head 99cfe4b — the gate on the committed tree is green (VERIFY_RC=0, 30 steps 0 failed; CURRENCY_RC=0; BOOTSTRAP_RC=0), the body's 56-file table reconciles against the diff, and the validator's full report finds no block and no contradiction. Auto-merge is armed on the PASS.

Next. The merge and its merge-time tag, then RESOLVED on #637 and its close, and the close of opencharly/marketplace#543, whose second consumer leg is this PR.

Agent: charly · session light-init
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

the pin wave, again — 50 of 412 pins are not current, and the corpus's refresh moves the umbrella's marketplace leg again

1 participant