Skip to content

chore(pins): advance the charly and plugin-task gitlinks, and re-key the plugin-task citations the pinned charly now compiles - #723

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

github-actions[bot] merged 1 commit into
mainfrom
feat/plugin-task-pin-leg

Conversation

@aitrawog

Copy link
Copy Markdown
Contributor

Closes #722

Summary

Head 44b79d6b875cec703750918dfd70fce64b75a907 — the commit this PR pushes: 6 files changed, 7 insertions(+), 7 deletions(-).

The umbrella's consumer leg of the plugin-task producer work, and the pin that makes the producer's refusal reachable. opencharly/charly#1074 landed — the charly binary now compiles plugin-task v0.2026299.2314, the release whose git-submodules bump REFUSES a move that would drop a nested checkout's work. The umbrella's own charly gitlink still recorded the release before it, so the refusal never reached the umbrella's pin wave. Alongside that gitlink, the umbrella's prose cited the version its PINNED charly compiled — v0.2026297.2108 — and cited plugin-task's source by LINE NUMBER as well, and those line numbers moved with the version.

The pin. The advance is made by the sanctioned verb, never by a hand-pin: charly task sync rolled the submodules to their default-branch HEAD and advanced the pins in the index, charly task init materialized the checkouts at those pins, and charly task verify judged the tree. The currency report named exactly two pins not current, so the wave's diff is exactly two gitlinks — and it is:

path recorded served
charly f1f85d19e8 5a83e03875
plugin-task 30c57809b2 b523e8780b

The re-key, and why it is not only a version. The umbrella's prose cites plugin-task's source by line number as well as by version, and two of those citations moved with the release: the step's PASS message was verbs.go:736 and is verbs.go:739 in v0.2026299.2314, and ancestryClass was verbs.go:916 and is verbs.go:919. The two cli.go citations (:210 and :261) did not move. The version gate (scripts/check-cited-plugin-task-version.mjs) judges version LITERALS only — it cannot see a line number — so a version-only re-key would have left three citations pointing at the wrong line with the gate green. That is the same defect class the validator caught on the previous leg's body, and the version gate cannot see it. Every cited line was re-read in BOTH module versions in the module cache before being cited, and the proof is pasted under How tested.

file what it changes
charly the gitlink: f1f85d19e8 → 5a83e03875
plugin-task the gitlink: 30c57809b2 → b523e8780b
charly.yml the step's Result.Message citation: the version the pinned charly compiles
scripts/check-retired-claims.mjs the ancestryClass citation: the version, and the line number it moved to
scripts/sync-pr-body.sh the step-message citation: the line number it moved to, and the version
scripts/check-cited-plugin-task-version.mjs the gate's own example citation: the line number it moved to

How tested

The head this body describes

$ git rev-parse HEAD
44b79d6b875cec703750918dfd70fce64b75a907
$ git diff --shortstat origin/main HEAD
 6 files changed, 7 insertions(+), 7 deletions(-)
$ git status --short --untracked-files=no; echo "exit=$?"
exit=0

The change-class gate, on the committed tree this body describes — the diff moves gitlinks, so the gate is the umbrella's own verify task, run on the committed tree with the worktree-local, CalVer-stamped build (R9):

$ ./charly/bin/charly version
2026.300.0236
$ ./charly/bin/charly task verify > /tmp/pt299/verify.log 2>&1; echo "VERIFY_RC=$?"
VERIFY_RC=0
$ grep -E "^task verify:" /tmp/pt299/verify.log
task verify: 40 step(s), 0 failed, 0 skipped
$ grep -cE "^\s*\[fail\]" /tmp/pt299/verify.log
0
$ grep -ciE "warn" /tmp/pt299/verify.log
0

The gate's own commit-carried citation check ran inside it, and it judges the INDEX — the tree a commit ships — which is why the re-key was staged before the gate was read:

$ grep -m 1 -o "check-cited-plugin-task-version: OK.*" /tmp/pt299/verify.log
check-cited-plugin-task-version: OK — 3 plugin-task version citation(s) in this repo's own prose, all naming the version the pinned charly compiles (v0.2026299.2314) — judged on the INDEX, the tree a commit ships

The wave itself — sync → init → verify, the order the pin contract names. The sync advanced the pins in the index, the init materialized the checkouts at those pins, and the verify judged them. The binary was rebuilt from the leg's own pinned charly between the wave and the init, so the refusal the producer shipped is the one that ran.

$ grep -E "^task sync:" /tmp/pt299/wave.log
task sync: 2 step(s), 0 failed, 0 skipped
$ grep -m 1 -o 'pinned .* in the index' /tmp/pt299/wave.log
pinned 6 pin_map entr(y|ies) (distro-arch, distro-cachyos, distro-debian, distro-fedora, distro-omarchy, distro-ubuntu) after rolling 6 submodule(s) to their default-branch HEAD and advancing 399 pin(s) in the index
$ grep -E "^WAVE_RC=" /tmp/pt299/wave.log
WAVE_RC=0
$ grep -E "^task init:" /tmp/pt299/init2.log
task init: 1 step(s), 0 failed, 0 skipped
$ grep -E "^BOOTSTRAP2_RC=|built ./bin/charly" /tmp/pt299/bootstrap2.log
bootstrap-charly: built ./bin/charly (2026.300.0236)
BOOTSTRAP2_RC=0

The currency question, before and after the wave — the question this change is about, asked with the one verb that answers it. Before: two pins not current — charly behind, and plugin-task with no checkout to judge ancestry. After: none.

$ grep -m 1 -o 'currency: [^;]*; intents: [^;]*' /tmp/pt299/currency.log
currency: 2 of 411 pin(s) NOT current [1 behind, 409 cur, 1 differs (no checkout to judge ancestry)]; intents: 405 upstream leaf/leaves (405 implicit), 6 derived-from edge(s)
$ grep -m 1 -o 'currency: [^;]*; intents: [^;]*' /tmp/pt299/verify.log
currency: 0 of 411 pin(s) NOT current [411 cur]; intents: 405 upstream leaf/leaves (405 implicit), 6 derived-from edge(s)

Every advance is a fast-forward against its own remote — the compare is the recorded pin against the new one, on the pin's own repo.

$ for p in charly plugin-task; do old=$(git ls-tree origin/main "$p" | awk '{print $3}'); new=$(git ls-tree HEAD "$p" | awk '{print $3}'); printf '%-14s ' "$p"; gh api "repos/opencharly/$p/compare/$old...$new" --jq '"status=\(.status) ahead=\(.ahead_by) behind=\(.behind_by)"'; done
charly         status=ahead ahead=2 behind=0
plugin-task    status=ahead ahead=4 behind=0

The line-number proof — every cited line, read in BOTH module versions, in the module cache. This is the part the version gate cannot see. The OLD module is v0.2026297.2108 (what the umbrella's pinned charly compiled before this PR); the NEW one is v0.2026299.2314 (what it compiles now). The two verbs.go citations MOVED; the two cli.go citations did not.

$ OLD=$(go env GOMODCACHE)/github.com/opencharly/plugin-task/candy/plugin-task@v0.2026297.2108
$ NEW=$(go env GOMODCACHE)/github.com/opencharly/plugin-task/candy/plugin-task@v0.2026299.2314
$ for v in "OLD $OLD" "NEW $NEW"; do lbl="${v%% *}"; m="${v#* }"; echo "== $lbl =="; printf '  verbs.go:739 -> '; sed -n '739p' "$m/verbs.go" | cut -c1-70; printf '  verbs.go:919 -> '; sed -n '919p' "$m/verbs.go" | cut -c1-70; printf '  cli.go:210   -> '; sed -n '210p' "$m/cli.go" | cut -c1-70; printf '  cli.go:261   -> '; sed -n '261p' "$m/cli.go" | cut -c1-70; done
== OLD ==
  verbs.go:739 -> 	case "verify":
  verbs.go:919 -> 				fmt.Sprintf("git %s merge-base --is-ancestor %s %s", gitArgs, recQ
  cli.go:210   -> 		fmt.Fprintf(w, "task %s: %d step(s), %d failed, %d skipped\n", r.Nam
  cli.go:261   -> func formatStepLine(s spec.StepResult) string {
== NEW ==
  verbs.go:739 -> 		return spec.StatusPass, fmt.Sprintf("pinned %d pin_map entr(y|ies) (
  verbs.go:919 -> 		ancestryClass := func(p, gitArgs, rec, served string) (state, fail s
  cli.go:210   -> 		fmt.Fprintf(w, "task %s: %d step(s), %d failed, %d skipped\n", r.Nam
  cli.go:261   -> func formatStepLine(s spec.StepResult) string {

Read against the OLD module, verbs.go:739 is a case "verify": arm and verbs.go:919 is an is-ancestor Sprintf — neither is what the umbrella's prose cites. Read against the NEW module, verbs.go:739 IS the PASS step message and verbs.go:919 IS ancestryClass — which are exactly the two claims the prose makes. The two cli.go lines are byte-identical in both.

The re-keyed citations, read in the tree being pushed — each line resolves at the number the prose now cites:

$ for ref in "charly.yml:198" "scripts/check-retired-claims.mjs:156" "scripts/sync-pr-body.sh:460" "scripts/sync-pr-body.sh:462" "scripts/sync-pr-body.sh:471" "scripts/sync-pr-body.sh:474" "scripts/check-cited-plugin-task-version.mjs:23"; do p="${ref%%:*}"; n="${ref##*:}"; printf '%-48s ' "$ref"; git show "HEAD:$p" | sed -n "${n}p"; done
charly.yml:198                                         # table the step's Result.Message, which plugin-task v0.2026299.2314 renders —
scripts/check-retired-claims.mjs:156                 // own `ancestryClass`, plugin-task v0.2026299.2314, candy/plugin-task/verbs.go:919)
scripts/sync-pr-body.sh:460                        # (`candy/plugin-task/verbs.go:739` in the module the binary is built from —
scripts/sync-pr-body.sh:462                        # `plugin-task v0.2026299.2314`, and that version is the SENTINEL for the source
scripts/sync-pr-body.sh:471                        # step's message (`candy/plugin-task/cli.go:261`, formatStepLine — the retired
scripts/sync-pr-body.sh:474                        # The HEADLINE is the task runner's own line (`candy/plugin-task/cli.go:210`),
scripts/check-cited-plugin-task-version.mjs:23   // module's SOURCE ("verbs.go:739", "cli.go:261"), and those line numbers are only

The claim-keyed sweep — the old version and the two moved line numbers are gone from every current-claim surface. CHANGELOG/ is excluded because history is immutable and belongs only there; the gate's own scan unit is the same set.

$ git grep -n -F 'v0.2026297.2108' -- . ':!CHANGELOG/'; echo "rc=$?"
rc=1
$ git grep -n -E 'verbs\.go:(736|916)\b' -- . ':!CHANGELOG/'; echo "rc=$?"
rc=1

And every plugin-task version literal and every source line citation that SURVIVES in the current-claim set, which is the complete inventory of what the prose now claims:

$ git grep -n -E 'plugin-task v0\.[0-9.]+' -- . ':!CHANGELOG/'
charly.yml:198:      # table the step's Result.Message, which plugin-task v0.2026299.2314 renders —
scripts/check-retired-claims.mjs:156:    // own `ancestryClass`, plugin-task v0.2026299.2314, candy/plugin-task/verbs.go:919)
scripts/sync-pr-body.sh:462:  # `plugin-task v0.2026299.2314`, and that version is the SENTINEL for the source
$ git grep -n -E '(verbs|cli)\.go:[0-9]+' -- . ':!CHANGELOG/'
scripts/check-cited-plugin-task-version.mjs:23:// module's SOURCE ("verbs.go:739", "cli.go:261"), and those line numbers are only
scripts/check-retired-claims.mjs:156:    // own `ancestryClass`, plugin-task v0.2026299.2314, candy/plugin-task/verbs.go:919)
scripts/sync-pr-body.sh:460:  # (`candy/plugin-task/verbs.go:739` in the module the binary is built from —
scripts/sync-pr-body.sh:471:  # step's message (`candy/plugin-task/cli.go:261`, formatStepLine — the retired
scripts/sync-pr-body.sh:474:  # The HEADLINE is the task runner's own line (`candy/plugin-task/cli.go:210`),

The retired-claim gate, on the tree this body describes

$ node scripts/check-retired-claims.mjs > /tmp/pt299/retired.log 2>&1; echo "RETIRED_RC=$?"
RETIRED_RC=0
$ grep -m 1 'PASS' /tmp/pt299/retired.log
  PASS  no retired claim form survives in the umbrella's own tracked tree (8 class(es))

The materialized checkouts sit at their recorded gitlinks, and charly's own nested level carries no drift — the wave's reconcile touches the charly checkout's box/* level, so that level was measured before and after:

$ git ls-tree HEAD charly
160000 commit 5a83e0387516abbd307855a03b9e3d74c00781fe	charly
$ git -C charly rev-parse HEAD
5a83e0387516abbd307855a03b9e3d74c00781fe
$ git -C charly submodule status
 59792cabc8f1dc5bdda2a52c756da0a3f805fcf4 box/arch (v2026.236.0159-62-g59792ca)
 6abe895225e6542e2aa6297326d8d650fe710bde box/cachyos (v2026.236.2135-205-g6abe895)
 fad84d294640b3bf1a2750ccdbecd27e8bef1ad1 box/debian (v2026.232.1837-46-gfad84d2)
 ee558d4d978d0e328f515a2cc56825955622b496 box/fedora (v2026.236.1714-96-gee558d4)
 44ca9e37e0f50272c861ec82cfa4ea9b0b4673f8 box/omarchy (v2026.294.1828-1-g44ca9e3)
 028fd26e7ccadef3774c98b6d7e2e744d1d60faa box/ubuntu (v2026.238.1348-63-g028fd26)

No +, U or - marker — no drift.

The gate's own builders' self-tests, and the pin check the commit gate runs on a gitlink diff — both green on this tree:

$ bash scripts/self-test.sh 2>&1 | grep -E 'self-test OK|PASS' | tail -5
sync-pr-body self-test: fleet-scale (411-pin) rendered body = 52947 bytes (< 65536)
sync-pr-body: self-test OK (fleet-scale BODY — the umbrella's live submodule count, read from .gitmodules — carries the COMPLETE compact evidence table — every path named, no elision — and stays under the 65536-byte cap; the caller's evidence file keeps a convenience copy; neither names a CI run artifact; small input names its paths with no elision; the producer excerpt is verbatim for BOTH the historical per-pin form and the CURRENT summary shape (pinned N pin_map entr(y|ies) … in the index); the body carries the four required sections, the Change classification's change class + verification gate + attribution tier, and rule 7's two-line footer — the Agent: line directly above the italic Assisted-by trailer as the FINAL line, and exactly ONE literal 'Assisted-by:' in the body so squash_body.py's prose contract holds; an unset SYNC_AGENT fails loud, and the Agent: line is shown to TRACK its variable rather than a literal; a trailer with no (tier) fails loud; over-cap trips the hard guard; a .gitmodules with no submodule entry counts as 0 and reaches the floor guard's own message instead of aborting on grep's exit status)
sync-dispatcher: self-test OK (splice writes, steady-state passes, stale fails)
  PASS  the working set is derived from the four committed sources
  PASS  every materialized path sits at its recorded gitlink

Rulebook compliance

  • R0 — the umbrella AGENTS.md dispatcher selected /charly-internals:git-workflow (the git/gh workflow, the pin contract, the wave's order, the PR body) and /charly-check:check (the R10 gate by change class). This harness resolves the /charly-check:check form only by path, so it was read from the corpus (marketplace/check/skills/check/SKILL.md) — the rulebook's named fallback for a harness that cannot resolve the addressed form. It was read after this leg's first tool actions, so its conclusions were re-derived against this tree before the push: the change class of a gitlink diff (the umbrella's own charly task verify), the wave's order (sync → init → verify), and the currency question answered by charly task pins --param MODE=currency rather than by hand.
  • R1 — the finding this change raises is the moved line numbers, and it is fixed here: the umbrella's prose claims plugin-task's source by line, and a version-only re-key would have left three claims pointing at the wrong line while the version gate stayed green. The RCA: mechanism — the umbrella's citations name a version AND a line number, and the release moved the line numbers while the gate that reads the citations (version literals only) could not see the move; missed control — no check compares a cited line number against the module it names, so the claim was unfalsifiable; blast radius — the three prose citations in charly.yml, scripts/sync-pr-body.sh and scripts/check-retired-claims.mjs, plus the gate's own example citation, all of which assert what plugin-task's source says at a named line; root fix — every cited line was re-read in BOTH module versions in the module cache and re-keyed to the line that actually carries the claim, and the proof is pasted under How tested. The second finding — the umbrella's charly gitlink behind the merged charly — is fixed in the same cut. The currency report named exactly two pins not current and BOTH were advanced, so no row was left behind.
  • R2 — no duplication: the version a citation names is derived from the pinned charly's own go.mod by ONE gate, and the line numbers are re-read from the module the binary is built from, not maintained as a second copy of the source. The one place a shape is rendered (the umbrella's PR-body builder) reads it from the product's own source, and the arms' expectations are independent literals.
  • R3 — no workaround: the pins moved through charly task sync, the materialization through charly task init, the judgement through charly task verify — no hand-pin, no branch checkout, no sleep, no retry, no suppressed finding, no ad-hoc container or service command. The version was not hand-written either: the gate derives it from the index gitlink.
  • R4 — the product was fixed before the prose: the pin advance brings the umbrella onto the release that carries the producer's refusal, and the prose is re-keyed to what that release's source actually says. No documented command is routed around a defect.
  • R5 — the retired version literal and the two moved line numbers are gone from every current-claim surface; the claim-keyed sweep and the complete surviving inventory are pasted under How tested. Every surviving hit of the old version is in CHANGELOG/, and history belongs only there.
  • R6 — the wave ran in its own session worktree (.worktrees/pt-299/opencharly) branched off fresh origin/main 92e7c1314; git status was empty before every commit; no git command ran in this worktree while the wave held the index lock; no history was rewritten, no force-push, no hook bypass, and nothing was pushed to main. The one local commit was amended before the first push, to re-tier the attribution trailer to the tier the gate earned.
  • R7 — the changed paths executed live: the wave ran the product's own verbs against the real tree, the citation gate judged the index the commit ships, the retired-claim gate ran on this tree, and every cited line was resolved in the module cache in BOTH versions and re-resolved in the tree being pushed. The re-key's own proof is a mutation of the cited line's content: read against the OLD module, verbs.go:739 is a case "verify": arm and NOT the step message, so a citation left at the old number would be false.
  • R8 — no service boundary is crossed and nothing is mocked: the gate, the wave, the currency report, the compares, the self-tests and the module-cache reads all ran against the real tree, the real remotes and the real product.
  • R9 — the binary is the worktree-local, CalVer-stamped build (2026.300.0236), produced by this worktree's own bootstrap from its own pinned charly; no shared host install was used. The version it compiles is the version the citations now name.
  • R10 — the change class is a gitlink diff plus a prose re-key, so the gate is the umbrella's own charly task verify — which carries the pin check, the currency report, the branch audit, the citation gate, the retired-claim gate and the committed builders' self-tests — run on the committed tree: 40 step(s), 0 failed, 0 skipped, exit 0, with zero warning lines in its output.

Change classification

A pin wave plus a prose re-key — no product-runtime change. The diff moves two gitlinks to their producers' served mains and re-keys five citation lines across four prose files. It changes no Go source and no schema.

  • Change class: a pin change (gitlinks) plus a prose change (the umbrella's own tracked citations). The bumped submodule carries code — charly's Go and plugin-task's Go — so this is not the documentation-only submodule-pointer class, and the tier is a runtime tier.
  • Diffstat: 6 files changed, 7 insertions(+), 7 deletions(-).
  • Gate run: charly task verify on the committed tree — 40 step(s), 0 failed, 0 skipped, exit 0, zero warning lines — plus the wave's sync → init → verify, the currency report that answers is this repo CURRENT?, the per-pin fast-forward compares against the remotes, the module-cache line-number proof in both versions, and the claim-keyed sweep above.
  • Attribution tier: fully tested and validated — the change-class gate passed on the final tree with zero warnings, and the changed paths executed live. The documentation reviewed tier is forbidden here: the diff moves pins.
  • No rebuild leg applies: the diff carries no source of the binary; the binary the umbrella builds comes from charly/charly/go.mod's module pin, which this diff does not touch. The umbrella's own binary was nevertheless rebuilt from the new pin before the init, so the producer's refusal is the one that ran.

Filed issues

No new issue is filed by this PR. Every finding this change raises is fixed in it.

The one issue this PR resolves is #722, filed by this session as the leg's coordination point and claimed on it before the branch was cut; it is closed by this PR's landing.

Agent: charly

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

…the plugin-task citations the pinned charly now compiles

The umbrella's consumer leg of the plugin-task producer work. opencharly/charly#1074
landed — the charly binary now compiles plugin-task v0.2026299.2314, the release whose
`git-submodules` bump REFUSES a move that would drop a nested checkout's work. The
umbrella's own `charly` gitlink still recorded the release before it, so the refusal
never reached the umbrella's pin wave — and the umbrella's prose cited the version the
umbrella's PINNED charly compiled, v0.2026297.2108, beside line numbers that moved
with the version.

The pins advance by the sanctioned verb only: `charly task sync` rolled the submodules
to their default-branch HEAD and advanced the pins in the index, `charly task init`
materialized the checkouts at those pins, and `charly task verify` judges the tree.

| path | recorded | served |
|---|---|---|
| `charly` | `f1f85d19e8` | `5a83e03875` |
| `plugin-task` | `30c57809b2` | `b523e8780b` |

The re-key is five lines across four files, and it is not only the version: the
umbrella's prose also cites LINE NUMBERS in plugin-task's source, and those moved with
the version. `verbs.go:736` (the step's PASS message) is `:739` in v0.2026299.2314, and
`ancestryClass` moved from `verbs.go:916` to `:919`. The two `cli.go` citations (`:210`
and `:261`) did not move. The version gate
(scripts/check-cited-plugin-task-version.mjs) judges version LITERALS only, so a
version-only re-key would have left three citations pointing at the wrong line with the
gate green — a defect the gate cannot see, and the same class the validator caught on
the previous leg's body.

- `charly` — the gitlink: `f1f85d19e8` → `5a83e03875`
- `plugin-task` — the gitlink: `30c57809b2` → `b523e8780b`
- `charly.yml` — the step's Result.Message citation: `v0.2026297.2108` → `v0.2026299.2314`
- `scripts/check-retired-claims.mjs` — the `ancestryClass` citation: the version, and `verbs.go:916` → `verbs.go:919`
- `scripts/sync-pr-body.sh` — the step-message citation: `verbs.go:736` → `verbs.go:739`, and the version
- `scripts/check-cited-plugin-task-version.mjs` — the gate's own example citation: `verbs.go:736` → `verbs.go:739`

Refs #722

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

Copy link
Copy Markdown
Contributor Author

STATUS — the PR is open; the validator is the next gate.

Head. 44b79d6b875cec703750918dfd70fce64b75a907 — 6 files changed, 7 insertions(+), 7 deletions(-).

Done. The two pins the currency report named are advanced (charly f1f85d19e8 → 5a83e03875, plugin-task 30c57809b2 → b523e8780b), both proved fast-forwards against their own remotes (behind=0). Five citation lines across four prose files are re-keyed — the version AND the two line numbers that moved with it, which the version-only gate cannot see. The change-class gate (charly task verify, the umbrella's own, on the committed tree) is green: 40 step(s), 0 failed, 0 skipped, exit 0, zero warnings.

Next. The fresh charly/pr-validator on #723. Every finding it raises is fixed in ONE commit per round; the issue is closed by hand on landing, because the org's auto-merge is a GitHub App and a closing keyword never auto-closes.

Due. The next update lands with the validator's verdict, or with the first round's fix commit.

@github-actions

Copy link
Copy Markdown
Contributor

Review — PASS

I re-derived every claim in the body against the current diff, the commit, and the single comment. The change is a pin advance plus a prose re-key, and the numbers hang together.

Per-file verification

  • charly — f1f85d19e8… → 5a83e03875…. Matches the body's table (recorded f1f85d19e8 / served 5a83e03875) and the git ls-tree HEAD charly evidence. The compare evidence (status=ahead ahead=2 behind=0) is a fast-forward.
  • plugin-task — 30c57809b2… → b523e8780b…. Matches the table; compare is ahead=4 behind=0, a fast-forward.
  • charly.yml:198 — version literal v0.2026297.2108 → v0.2026299.2314. This is one of the three version citations the gate counts, and the gate output ("3 plugin-task version citation(s) … all naming … v0.2026299.2314") is consistent with the version being derived from the pinned charly's go.mod rather than hand-written.
  • scripts/check-retired-claims.mjs:156 — version and line number updated together: v0.2026297.2108, …verbs.go:916 → v0.2026299.2314, …verbs.go:919. Consistent with the ancestryClass shift.
  • scripts/sync-pr-body.sh — two lines: verbs.go:736 → verbs.go:739 and v0.2026297.2108 → v0.2026299.2314. Consistent with the "line moved + version" claim; the adjacent cli.go:261/cli.go:210 citations are correctly left untouched.
  • scripts/check-cited-plugin-task-version.mjs:23 — example citation verbs.go:736 → verbs.go:739 only (no version in that line). Consistent.

Diffstat check: 2 gitlinks (1/1 each) + 1 + 1 + 2 + 1 = 6 files, 7 insertions, 7 deletions — exactly the claimed shortstat.

Line-number honesty

The decisive evidence is the module-cache proof, and it is internally coherent rather than merely asserted: in the OLD module verbs.go:739 is case "verify": and verbs.go:919 is the is-ancestor Sprintf, whereas in the NEW module those same lines are the PASS step message and the ancestryClass definition. That a 3-line insertion shifted 736→739 and 916→919 while the two cli.go lines stayed byte-identical is exactly what a real re-read would show; a fabricated re-key would not produce the "OLD:739 ≠ claim" detail. The version-only gate is correctly identified as blind to line numbers, and all three stale citations (verbs.go:736 ×2, verbs.go:916 ×1) are updated in the diff. The claim-keyed sweep (git grep rc=1 for the old version and the old line numbers) plus the complete surviving inventory are consistent with the diff.

Consistency of the supporting evidence

  • Currency before/after: 2 of 411 NOT current [1 behind, 409 cur, 1 differs] → 0 of 411 [411 cur], which is exactly the two gitlinks the diff moves.
  • The wave log's "rolling 6 submodule(s) … advancing 399 pin(s) in the index" refers to the pin-map re-derivation, not the committed gitlink delta; the committed delta is still the two gitlinks, so it does not contradict "the wave's diff is exactly two gitlinks." The nested box/* submodule status shows no +/U/- drift, matching the "no drift" claim.
  • Gate charly task verify = 40 step(s), 0 failed, 0 skipped, exit 0, zero warnings; the cited-version gate reports OK on the index; the retired-claim gate PASSes. These are internally consistent with a green change-class gate for a gitlink+prose diff.

Comment disposition

The single comment (#6432768945 by @aitrawog) is a status note, not a sign-off. No designated maintainers are configured for this run, so no comment carries approval weight; the change is judged on its own evidence. The comment's assertions — head 44b79d6b…, 6 files / 7+ / 7-, two pins advanced, five citation lines re-keyed, gate green — all match the current diff. Its note that the linked issue is closed by hand (auto-merge App won't auto-close on the keyword) is a process remark and does not contradict the body's "closed by this PR's landing."

Security / scope

No secrets, injection, or dependency-surface change; only gitlinks and comments/prose. No leftover legacy path: the old version literal and the two moved line numbers are swept from all current-claim surfaces (CHANGELOG/ excluded, correctly). No duplication introduced — the version is gate-derived and the lines are re-read from the module.

No blocking findings. The residual gap — that no automated check compares a cited line number against the module it names — is acknowledged, and the version-gate-as-sentinel forces re-reads whenever the pin moves, which is an adequate control for this change class.

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 03:10
@github-actions
github-actions Bot merged commit f71451c into main Oct 27, 2026
3 checks passed
charly-auto-merge Bot added a commit that referenced this pull request Oct 27, 2026
@aitrawog

Copy link
Copy Markdown
Contributor Author

RESOLVED — #723

Landed. Squash commit f71451ce4a2dee02a9ff84c17956bcb9a2d2da36, merge tag v2026.300.0311, merged 2026-10-27T03:11:31Z by github-actions[bot] — the org's auto-merge, armed by the fresh charly/pr-validator's PASS (no blocking findings).

The issue it resolves is #722, and it is CLOSED (closedAt 2026-10-27T03:12:12Z, reason COMPLETED) — closed by hand with the RESOLVED record naming the PR, its squash SHA and its merge tag, because the org's auto-merge is a GitHub App and the automatic close only fires for a User-type account.

What landed. The charly gitlink f1f85d19e8 → 5a83e03875 and the plugin-task gitlink 30c57809b2 → b523e8780b, both advanced through charly task sync and proved fast-forwards against their own remotes (behind=0); and five re-keyed citation lines across four prose files — the version AND the two line numbers that moved with it, which the version-only citation gate cannot see.

The currency question, answered by the sanctioned verb. Before the wave: 2 of 411 pin(s) NOT current. After: 0 of 411 pin(s) NOT current [411 cur].

No follow-up issue is filed. Every finding this change raised is fixed in it.

Agent: charly
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 umbrella's plugin-task gitlink and its plugin-task version citations are behind the merged charly that carries the nested-work refusal

1 participant