Skip to content

chore(deps): adopt plugin-task v0.2026300.951 (the bump report counts the pins that MOVED) - #1076

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/adopt-plugin-task-951
Oct 27, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
feat/adopt-plugin-task-951

Conversation

@aitrawog

Copy link
Copy Markdown
Contributor

Summary

The compiled-in plugin-task pin is behind the served release, and what the release carries is the moved-pin report: the bump summary's counters change from INDEX WRITES to the pins that actually MOVED.

charly/go.mod requires github.com/opencharly/plugin-task/candy/plugin-task v0.2026299.2314. The served release is v0.2026300.951 (tag v2026.300.0951, commit 669a5ee5eb68181121e6f2af36872b4491204d8d), which carries opencharly/plugin-task#58 — "the bump report counts the pins that MOVED, not the index WRITES" — and opencharly/plugin-task#60, the coverage that holds each of the three counters.

The two shapes, read from the module each version compiles. The report is printed by the compiled-in plugin-task, so its shape is a property of the version charly/go.mod requires:

$ grep -n 'StatusPass, fmt.Sprintf("pinned\|StatusFail, fmt.Sprintf("%d pin(s) FAILED' \
    $(go env GOMODCACHE)/github.com/opencharly/plugin-task/candy/plugin-task@v0.2026299.2314/verbs.go
736:			return spec.StatusFail, fmt.Sprintf("%d pin(s) FAILED: %s; rolled %d submodule(s) to their default-branch HEAD; advanced %d pin(s) in the index; pinned %d pin_map entr(y|ies): %s",
739:		return spec.StatusPass, fmt.Sprintf("pinned %d pin_map entr(y|ies) (%s) after rolling %d submodule(s) to their default-branch HEAD and advancing %d pin(s) in the index",

That is the two-bucket shape, and its counts are INDEX WRITES — opencharly/plugin-task#53 measured 406 written against 4 moved on the live umbrella, so a reader could not tell a pin that MOVED from a pin that was merely rewritten. The served release prints the three-bucket shape instead:

$ grep -n 'StatusPass, fmt.Sprintf("pinned\|StatusFail, fmt.Sprintf("%d pin(s) FAILED' \
    $(go env GOMODCACHE)/github.com/opencharly/plugin-task/candy/plugin-task@v0.2026300.951/verbs.go
797:			return spec.StatusFail, fmt.Sprintf("%d pin(s) FAILED: %s; rolled %d leaf submodule(s) to their default-branch HEAD (%d moved); advanced %d leaf pin(s) in the index (%d moved); pinned %d pin_map entr(y|ies) (%d moved): %s; %d pin(s) moved",
801:		return spec.StatusPass, fmt.Sprintf("pinned %d pin_map entr(y|ies) (%s; %d moved) after rolling %d leaf submodule(s) to their default-branch HEAD (%d moved) and advancing %d leaf pin(s) in the index (%d moved); %d pin(s) moved",

Every published version between them still prints the two-bucket shape — the report changed at v0.2026300.903 (a3a80eb, opencharly/plugin-task#58's merge):

$ for v in v0.2026296.2153 v0.2026297.1542 v0.2026297.2108 v0.2026299.2314 v0.2026300.903 v0.2026300.951; do
    printf '%s ' "$v"
    grep -c 'pin(s) moved' $(go env GOMODCACHE)/github.com/opencharly/plugin-task/candy/plugin-task@$v/verbs.go
  done
v0.2026296.2153 0
v0.2026297.1542 0
v0.2026297.2108 0
v0.2026299.2314 0
v0.2026300.903 2
v0.2026300.951 2

Why this repo is the leg that has to move. charly IS the binary that runs the org's pin waves. The umbrella's charly task sync is a git-submodules verb, and that verb lives in the compiled-in plugin-task — the one charly/go.mod pins, not the umbrella's plugin-task gitlink (opencharly/opencharly#678, Finding 2). So the report the umbrella's wave PRs quote is the report this binary prints, and it is the two-bucket one until this pin advances.

The umbrella's own consumer leg (opencharly/opencharly#735) is blocked on exactly this: its scripts/sync-pr-body.sh fixture renders the producer's summary line, and it must render what the binary the umbrella BUILDS prints. Writing the new shape into that fixture before this pin advances would make the fixture describe a shape the running binary does not print — a false fix in the opposite direction.

file what the diff does to it
charly/go.mod requires plugin-task/candy/plugin-task v0.2026300.951 (was v0.2026299.2314)
charly/go.sum carries the new version's hash pair; the superseded pair leaves the lock

Nothing else changes: the delta between the two versions is the report change and its tests.

Producer-first. opencharly/plugin-task#58 and #60 have merged and the release is tagged; this repo's compiled-in pin is the consumer that had not moved, so the report never reached the binary. The umbrella's leg (opencharly/opencharly#735) follows this one.

Closes #1075

How tested

The change-class gate ran on the committed tree this PR pushes (cb15ab7e2c79e93cfb463496cb4fbaeffc7a175d, tree b1222b846df106b4c7317634ff1eb84015dab160), with zero warnings, and the live differential ran the SAME fixture through the binary built from this tree and through the binary built from origin/main (5a83e0387516abbd307855a03b9e3d74c00781fe).

The gate — this repo's own CI shape (.github/workflows/ci.yml: go test ./charly/..., the tools/* sweep, gofmt, golangci-lint v2.13.2 over charly/ and over every tools/* module), plus this repo's core gate (charly/AGENTS.md: go vet ./... from charly/) and the R9 worktree-local build:

=== go version ===
go version go1.26.8 linux/amd64
GOROOT=/home/atrawog/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.8.linux-amd64
golangci-lint: golangci-lint has version 2.13.2 built with go1.27.3-X:nodwarf5 from (unknown, modified: ?, mod sum: "h1:bCyq3E4vo9qwzifjpzJqYndEt7Ncva80qkk8G2B4TXU=") on (unknown)

=== 0. the tree is the committed one (R7/R10: the gate runs on what is pushed) ===
856ea1f51366e27e948f59e8901968298a04b749
TREE=b1222b846df106b4c7317634ff1eb84015dab160
HEAD_RC=0

=== 1. build (R9): scripts/bootstrap-charly.sh ===
--- /tmp/charly-pt951-gate-logs/01-build.log (last 15 lines) ---
bootstrap-charly: regenerating compiled-in plugin wiring
bootstrap-charly: building bin/charly
bootstrap-charly: built ./bin/charly (2026.300.0956)
--- end /tmp/charly-pt951-gate-logs/01-build.log ---
BUILD_RC=0
OK   build

=== 2. the generated wiring is clean (scripts/check-generated-clean.sh) ===
--- /tmp/charly-pt951-gate-logs/02-generated.log (last 10 lines) ---
--- end /tmp/charly-pt951-gate-logs/02-generated.log ---
GENERATED_RC=0
OK   generated-clean

=== 3. the binary is the worktree-local build ===
--- /tmp/charly-pt951-gate-logs/03-version.log (last 3 lines) ---
2026.300.0956
--- end /tmp/charly-pt951-gate-logs/03-version.log ---
VERSION_RC=0
OK   version

=== 4. go vet ./... (from charly/) ===
--- /tmp/charly-pt951-gate-logs/04-vet.log (last 20 lines) ---
--- end /tmp/charly-pt951-gate-logs/04-vet.log ---
VET_RC=0
OK   go vet

=== 5. go test ./charly/... (CI shape, from the repo root) ===
--- /tmp/charly-pt951-gate-logs/05-test.log (last 30 lines) ---
ok  	github.com/opencharly/charly/charly	286.551s
ok  	github.com/opencharly/charly/charly/internal/pluginsgen	138.663s
--- end /tmp/charly-pt951-gate-logs/05-test.log ---
TEST_RC=0
OK   go test

=== 6. the tools/* sweep (GOWORK=off, -count=1) ===
== tools/generate-packages/ ==
?   	github.com/opencharly/charly/candy/generate-packages/cmd/serve	[no test files]
== tools/golden-cloudinit/ ==
?   	github.com/opencharly/charly/tools/golden-cloudinit	[no test files]
== tools/golden-compile/ ==
?   	github.com/opencharly/charly/tools/golden-compile	[no test files]
== tools/gomod-canonical/ ==
ok  	github.com/opencharly/charly/tools/gomod-canonical	0.001s
== tools/ledger-validate/ ==
ok  	github.com/opencharly/charly/tools/ledger-validate	0.002s
TOOLS_RC=0
OK   tools sweep

=== 7. gofmt (gofmt -l charly tools) ===
gofmt: no files to rewrite
GOFMT_RC=0
OK   gofmt

=== 8. golangci-lint fmt --diff (charly/) — must print nothing ===
--- /tmp/charly-pt951-gate-logs/08-fmt.log (last 20 lines) ---
--- end /tmp/charly-pt951-gate-logs/08-fmt.log ---
FMT_RC=0
OK   lint fmt

=== 9. golangci-lint v2.13.2 (charly/) ===
--- /tmp/charly-pt951-gate-logs/09-lint.log (last 30 lines) ---
0 issues.
--- end /tmp/charly-pt951-gate-logs/09-lint.log ---
LINT_RC=0
OK   lint charly

=== 10. golangci-lint v2.13.2 (each tools module) ===
== lint tools/generate-packages/ ==
0 issues.
== lint tools/golden-cloudinit/ ==
0 issues.
== lint tools/golden-compile/ ==
0 issues.
== lint tools/gomod-canonical/ ==
0 issues.
== lint tools/ledger-validate/ ==
0 issues.
TOOLSLINT_RC=0
OK   lint tools

=== 11. the binary's module set carries the NEW plugin-task (and not the old one) ===
	dep	github.com/opencharly/plugin-task/candy/plugin-task	v0.2026300.951	h1:O8pUctS0ya/vIJ4Go4987ybqu0it0aB6fy/Q0RASwJU=
MODS_NEW: the binary compiles plugin-task v0.2026300.951
MODS_OLD: the old pin is gone from the binary's module set
MODS_RC=0
OK   module set

=== 12. the tree is still clean (the generated files are committed state) ===
STATUS_RC=0
OK   tree clean

GATE_DONE: all steps passed
GATE_EXIT=0

Why the gate's step 0 shows the pre-amend SHA. The gate ran on commit 856ea1f51366e27e948f59e8901968298a04b749, whose tree is b1222b846df106b4c7317634ff1eb84015dab160; the commit was then amended ONCE — before the first push, which the lifecycle allows — to re-tier its own attribution from syntax check only to the tier it had earned. The amend touched the MESSAGE only, so the tree is byte-identical and the gate's result is the gate's result for this head:

gated tree : b1222b846df106b4c7317634ff1eb84015dab160
head  tree : b1222b846df106b4c7317634ff1eb84015dab160

The toolchain is the one the repo pins, and the one CI installs. charly/go.mod says go 1.26.8; CI installs exactly that (actions/setup-go with go-version-file: charly/go.mod) and builds golangci-lint v2.13.2 with it. The host's default Go here is go1.27.3-X:nodwarf5 (GOROOT=/usr/lib/go), whose compiled standard library carries export data version 5 — and the CI-pinned linter's importer reads at most version 4, so against that standard library every typecheck fails on the standard library itself (could not import strings, could not import sort, undefined: yaml as a knock-on of the failed import chain), not on this repo's code. The gate therefore runs the lint against the pinned toolchain, which is what CI does; under it the lint reports 0 issues.

Every step's exit code is its own command's. The first run of this gate read the exit code of a pipeline (cmd | tail -N) and therefore recorded tail's status, not the command's: it reported OK lint charly while the linter had printed 12 issues. That is the rulebook's own command-hygiene law ("a piped exit code is not the command's exit code"), it was in the gate harness rather than in the tree, and it is fixed here — every step redirects into its own log file and reads $? from the command. The run pasted above is the corrected gate, on the same committed tree.

The live differential — a real bump, driven through the binary rather than through the plugin's in-process test seam: a fixture superproject with two declared paths, both with a branch=, one materialised and recorded one commit behind the remote (so the bump ROLLS it and the pin MOVES) and one unmaterialised whose recorded pin already equals the remote's tip (so the bump advances it IN THE INDEX and nothing moves there). The check states the product's promise and must fail against the old binary (R7: a check that cannot fail proves nothing):

  • the report carries the three-bucket shape — rolling 1 leaf submodule(s) to their default-branch HEAD (1 moved), advancing 1 leaf pin(s) in the index (0 moved), and the total 1 pin(s) moved;
  • the two-bucket literal advancing N pin(s) in the index is gone;
  • the fixture's own truth is read back from the tree the bump left behind: target moved to the remote's tip, stale did not move and was not materialized.
=== the two binaries ===
2026.300.0956
2026.300.0236
NEW modules:
   	dep	github.com/opencharly/plugin-task/candy/plugin-task	v0.2026300.951	h1:O8pUctS0ya/vIJ4Go4987ybqu0it0aB6fy/Q0RASwJU=
OLD modules:
   	dep	github.com/opencharly/plugin-task/candy/plugin-task	v0.2026299.2314	h1:PelS5kDgk8zq4DAwF3c+/Giljs/PBqNcQrKGqfa3ECw=

=== arm: new (/home/atrawog/Sync/Atrapub/a/claude/opencharly/.worktrees/pt951/charly/bin/charly) ===
   | task bump-all: 1 step(s), 0 failed, 0 skipped
   |   [pass] run — bump
   |       pinned 0 pin_map entr(y|ies) (none; 0 moved) after rolling 1 leaf submodule(s) to their default-branch HEAD (1 moved) and advancing 1 leaf pin(s) in the index (0 moved); 1 pin(s) moved
   task exit: 0
   target pin: b1825976feefcb163681a68a8bf389df8fd6fece -> a9be01d6220fecbf2f4c1cfba50c0ca472532a96 (the remote serves a9be01d6220fecbf2f4c1cfba50c0ca472532a96)
   stale  pin: a9be01d6220fecbf2f4c1cfba50c0ca472532a96 -> a9be01d6220fecbf2f4c1cfba50c0ca472532a96 (the remote serves a9be01d6220fecbf2f4c1cfba50c0ca472532a96)

=== arm: old (/home/atrawog/Sync/Atrapub/a/claude/opencharly/.worktrees/pt951/charly-before/bin/charly) ===
   | task bump-all: 1 step(s), 0 failed, 0 skipped
   |   [pass] run — bump
   |       pinned 0 pin_map entr(y|ies) () after rolling 1 submodule(s) to their default-branch HEAD and advancing 1 pin(s) in the index
   task exit: 0
   target pin: ed9be5a353d3dde48d20ecee2e09c44d80cffeb8 -> e52307aae0ba409791d2d65598371c10759e69b4 (the remote serves e52307aae0ba409791d2d65598371c10759e69b4)
   stale  pin: e52307aae0ba409791d2d65598371c10759e69b4 -> e52307aae0ba409791d2d65598371c10759e69b4 (the remote serves e52307aae0ba409791d2d65598371c10759e69b4)

=== the check against the NEW binary (must PASS) ===
   PASS: the three-bucket shape, with the fixture's real counters

=== the same check against the OLD binary (must FAIL) ===
   MISSING: rolling 1 leaf submodule\(s\) to their default-branch HEAD \(1 moved\)
   MISSING: advancing 1 leaf pin\(s\) in the index \(0 moved\)
   MISSING: ; 1 pin\(s\) moved
   PRESENT (must be gone): advancing N pin(s) in the index
   PASS: the check FAILS against the old binary, as it must

=== the old shape, confirmed on the old binary (must PASS) ===
   PASS: the old binary prints the two-bucket shape, with the write counted as an advance

DIFF_DONE: the differential is a real discriminator
DIFF_EXIT=0

Reading the two runs. The BEFORE run is the defect, live: the old report says "advancing 1 pin(s) in the index" for a pin that did not move — the write is presented as an advance, and there is no total at all, so a reader cannot tell a moved pin from a rewritten one. The NEW run separates the two numbers (1 leaf pin(s) advanced in the index, 0 moved) and prints the total the three groups sum to (1 pin(s) moved).

Rulebook compliance

  • R0 — skills first. /charly-internals:git-workflow (the branch/commit/push/PR lifecycle), /charly-internals:go (build/test/vet/format) and /charly-internals:strict-policy (engineering discipline) were loaded before the first tool action; this repo's own AGENTS.md was read before acting here.
  • R1 — every anomaly got an RCA. Two findings arose, and neither is filed away:
    • The gate harness masked exit codes (it read a pipeline's status, so a 12-issue lint was reported as OK). The missed control is named: the step's own exit code was never captured. It is fixed in the harness and the corrected gate is pasted above — the tree itself is clean, so there is no product defect to file.
    • The lint's typecheck failure under the host's Go 1.27.3. Mechanism: the linter's importer reads export data up to version 4 and the host's standard library is version 5, so the failures are on the standard library, not on this repo's code. The repo's own go.mod and CI agree on the pinned toolchain, so the tree carries no defect here either; the gate runs the lint the way CI does. The claim is proved by the paste: 0 issues under the pinned toolchain.
    • The finding this change raised — the compiled-in pin being behind the served release — is blocking for this change and is fixed by it: filed as the compiled-in plugin-task pin is behind the served release v0.2026300.951 — the binary's bump report still counts INDEX WRITES, not pins that MOVED #1075, claimed, and closed by this PR rather than filed away.
  • R2 — no duplication. Nothing is implemented here: the report change is the producer's, and this repo's diff is the pin that carries it.
  • R3 — no workaround. No sleep, retry, suppression or fallback. The report is the product's own behaviour, reached through the sanctioned verb (charly task → the git-submodules bump).
  • R4 — product before prose. The product side is the producer's, already merged and tagged; this change moves the consumer so the behaviour actually reaches the binary. No prose changes here.
  • R5 — legacy deleted. The superseded v0.2026299.2314 pair is gone from charly/go.mod and charly/go.sum. The claim-keyed proof is the gate's step 11 — the binary's module set carries v0.2026300.951 and no longer carries v0.2026299.2314 — plus the diff above, whose go.sum hunk removes exactly the two v0.2026299.2314 lines and adds exactly the two v0.2026300.951 lines, and nothing else.
  • R6 — git safety. git status was run first; the branch is feat/adopt-plugin-task-951 off fresh origin/main; the commit is amended ONCE, before the first push, to re-tier its own attribution; no force-push, no history rewrite, no hook bypass, no direct push to main.
  • R7 — behavior proven, not compilation. The differential is DISCRIMINATING: it passes against the binary built from this tree and fails against the binary built from origin/main. The changed path executed live, with commands, outputs and exit codes retained above.
  • R8 — live or skip. The bump ran against real local git remotes; nothing was mocked.
  • R9 — binary equals source. The binary under test is this worktree's scripts/bootstrap-charly.sh build (2026.300.0956); the gate asserts bin/charly version and the binary's module set. No shared install was used. No new runtime OS dependency was introduced, so packaging: is unchanged.
  • R10 — fresh disposable proof. The change-class gate ran on the committed tree this PR pushes, with zero warnings, and the live differential ran on that same fresh build.

Change classification

 charly/go.mod | 2 +-
 charly/go.sum | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

Filed issues

None. The one finding this change raised — the compiled-in pin being behind the served release — is blocking for this change and is fixed by it (#1075); it is closed by this PR, not filed away. The two findings the gate raised are defects in the gate harness and in the host's toolchain, not in this repo's product; both are fixed in the harness and proved by the paste above.

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

… the pins that MOVED)

`charly task sync`'s bump prints a summary line, and the org's pin waves quote it.
The counts in that line were INDEX WRITES — opencharly/plugin-task#53 measured 406
written against 4 moved on the live umbrella — so a reader could not tell a pin that
MOVED from a pin that was merely rewritten. opencharly/plugin-task#58 replaces the
report with one that counts the pins that MOVED, in three clauses: the materialised
roll, the index advance, and the pin_map edge, plus the total they sum to.

The producer's work is merged and tagged: v0.2026300.951 (tag v2026.300.0951,
commit 669a5ee5) carries #58 and #60, the coverage that holds each of the three
counters. This repo's compiled-in pin is the consumer that has not moved, so the
binary still prints the two-bucket shape.

The delta between the two versions is that report change and its tests. `charly/go.mod`
requires the new version; `charly/go.sum` carries its hash pair. The tree's other
module locks are untouched.

Fixes #1075

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 does

  • charly/go.mod: single-line pin change plugin-task/candy/plugin-task v0.2026299.2314 → v0.2026300.951. No // indirect marker touched, no other requirements disturbed.
  • charly/go.sum: removes exactly the two v0.2026299.2314 lines (h1:PelS5k… and /go.mod h1:a8WkZC…) and adds exactly the two v0.2026300.951 lines (h1:O8pUct… and /go.mod h1:a8WkZC…). Neighbouring entries untouched.

Consistency with the body

  • Body claims "2 files changed, 3 insertions(+), 3 deletions(-)"; the hunks are 1+/1- in go.mod and 2+/2- in go.sum — exactly 3/3. Consistent.
  • R5 claim ("removes exactly the two old lines, adds exactly the two new lines, nothing else") is reproduced literally by the go.sum hunk. Consistent.
  • The /go.mod hash is unchanged across the two versions (a8WkZC…), which is expected when the dependency's own go.mod is byte-identical between releases — not a red flag.
  • Head SHA cb15ab7… matches the single commit listed; the "pre-amend gate SHA" explanation (856ea1f, same tree b1222b84) is internally coherent and not contradicted by the diff.

Correctness / scope / security

  • This is a pure compiled-in dependency bump; the behavioural change (two-bucket → three-bucket moved-pin report) lives in the producer module, so no in-repo code change is warranted and none is present. No duplication, no dead path, no leftover legacy pin (the superseded pair is gone from both files).
  • No secrets, no injection surface, no new dependency introduced — only a newer version of an already-pinned module, with hash pair carried in go.sum.
  • Tests: a version bump does not require new in-repo coverage; the producer (docs(submodules): bump plugins to the sdk-tag leading-zero doc fix #58/docs(submodules): bump plugins to the pr-validator bed-coverage strengthening #60) carries the counter tests, and the body's live differential (which it states fails against the old binary) is the appropriate discriminator for a pin-only change. Nothing in the diff contradicts the claimed gate/differential output.

Comments

  • Comment thread is empty (0 comments). No maintainer sign-off exists and none is required; the change stands on its own evidence, which the minimal, self-consistent diff supports.

No blocking findings: the diff is exactly the claimed pin movement, the diffstat matches, the legacy pair is fully removed, and the change is coherent and minimal.

Verdict: PASS


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

View action run

@github-actions
github-actions Bot enabled auto-merge (squash) October 27, 2026 10:20
@github-actions
github-actions Bot merged commit c49c132 into main Oct 27, 2026
5 checks passed
github-actions Bot pushed a commit to opencharly/opencharly that referenced this pull request Oct 27, 2026
… (#736)

opencharly/plugin-task#53 retired the bump report's two-bucket shape: its
counters were INDEX WRITES, so the live umbrella wave that wrote 398 pins
and moved 2 read as "advancing 398 pin(s) in the index". The current form
partitions the paths the bump touched into three groups and counts what MOVED
in each, with the total the product prints as their sum.

The umbrella's `scripts/sync-pr-body.sh` renders that report VERBATIM into
the PR body it builds, so it encoded the retired shape. This re-keys it to
the current one, with the expectations written as the current form's OWN
literals, so a definition that regressed to the two-bucket shape cannot pass
the arm.

The middle leg had to land first: the artifact the umbrella runs is built
from `charly`'s module pin, not from the umbrella's `plugin-task` gitlink.
opencharly/charly#1076 (squash c49c132) advanced that pin to
`plugin-task v0.2026300.951`, and this advances the umbrella's own `charly`
and `plugin-task` gitlinks to the served tips through the sanctioned verb —
`charly task sync` wrote the pins, `charly task init` materialized the
checkouts at them, `charly task verify` judged the tree.

Three live citations moved with the pin, and their LINE numbers were re-read
in the new module rather than transcribed: the version gate judges version
literals only, so a version-only re-key would have left them pointing at the
wrong line with the gate green (#734 records the same
defect class).

The version gate itself carried a latent defect this pin exposed: the org's
module version drops the time part's leading zeros (the tag `v2026.300.0951`
is the module `v0.2026300.951`), and the gate's shape was hard-coded to four
digits — so it stopped matching, found no citation at all, and went vacuous.
Its shape now accepts the widths the org publishes, and the self-test
asserts them.

Closes #735

Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
charly-auto-merge Bot added a commit that referenced this pull request Oct 27, 2026
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 compiled-in plugin-task pin is behind the served release v0.2026300.951 — the binary's bump report still counts INDEX WRITES, not pins that MOVED

1 participant