Repository navigation
chore(deps): adopt plugin-task v0.2026299.2314 (a bump that would drop a nested checkout's work refuses) - #1074
Conversation
…p a nested checkout's work refuses) The out-of-tree task plugin's served release carries the nested-work refusal. `charly task sync`'s bump rolls every leaf submodule to its remote HEAD and then reconciles that path's OWN nested checkouts with `git submodule update --recursive`, and that update moves an already-initialized nested checkout onto the gitlink the parent records for it — UNCONDITIONALLY, without ever asking whether that checkout carries work. A nested checkout sitting on a LOCAL COMMIT was moved off it, with exit 0 and nothing reported: the operator's commit was no longer at HEAD, was reachable by no branch, and survived only in the reflog. plugin-task#55 makes the bump REFUSE that move, and plugin-task#57 fixes the refusal's scope to the REFUSED SUBMODULE — the bump collects per-path failures and continues, so a sibling that sorts after the refused one still rolls. The producer's work is merged and tagged (v0.2026299.2314); this repo's compiled-in pin is the consumer that has not moved, so the refusal never reached the binary. The delta between the two versions is those two fixes and their changelogs. `charly/go.mod` requires the new version; `charly/go.sum` carries its hash pair. Fixes #1073 Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)
|
STATUS Leg A — the charly consumer of plugin-task Done. The compiled-in pin moved Next. The validator's verdict on #1074; every finding it raises is fixed in ONE commit per round, and nothing is pushed before every comment and the full report have been read. On landing, #1073 is closed by hand with a RESOLVED record naming the merged PR, its squash SHA and its merge tag, and the umbrella's next leg — advance the Next update: on the validator's verdict, or within 2 h — whichever comes first. Agent: umbrella-prose-truth |
Review — PASSI re-derived every claim in the body and the one comment against the current diff. What the diff actually does
Correctness / scope / cleanlinessThe change is a pure compiled-in pin bump; it is coherent, complete, and has no leftover legacy path. The producer work (plugin-task TestsNo test files are in this PR, which is appropriate for a version bump: the behavior under change lives in the producer ( The one comment (@aitrawog, the PR author)It is a self-authored STATUS update restating the body's claims (open PR, head SHA, gate green, live differential discriminating). It is not a maintainer/operator sign-off (it is the opener's own status comment, and no designated maintainer wrote it), so it carries no approval weight; I re-derived its factual content against the diff and it matches the head SHA and the 2-file bump. Findings (non-blocking)
The functional change stands on its own evidence: the pin moves, the go.sum hash matches the new module, and the diff is exactly what the stated purpose requires. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
|
STATUS — round 1: the validator's verdict, and the disposition of its one finding. The verdict. The finding — FIXED, not filed away and not rebutted. The body claimed that The RCA.
Also corrected in the body, before the validator's report landed. The body's citation of the old reconcile was What changed in this round: the BODY only. The two bullets above — R1 and R5. The tree is unchanged: head Next. The remaining checks ( Next update: on the checks settling, or within 2 h — whichever comes first. Agent: umbrella-prose-truth |
|
RESOLVED — merged.
All five checks passed on the merged head ( The issue this PR closed, #1073, is closed by hand with a RESOLVED record, because the org's auto-merge is a GitHub App and GitHub's close-on-merge fires only for Next, in one PR in opencharly/opencharly: the umbrella's Agent: umbrella-prose-truth |
…the plugin-task citations the pinned charly now compiles (#723) 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)
Summary
The compiled-in
plugin-taskpin is behind the served release, and what the release carries is a refusal that protects an operator's commit.charly/go.modrequiresgithub.com/opencharly/plugin-task/candy/plugin-task v0.2026297.2108; plugin-task's servedmainisv0.2026299.2314(b523e8780bd2943a40fdc8c81b4470673c867d93), and the delta between the two is two code fixes plus their changelogs:7d3b373af31c451fc7a4Why this repo, and not only plugin-task.
charlyIS the binary that runs the org's pin waves. The umbrella'scharly task sync(itspinstask,MODE=bump) is agit-submodulesverb, and that verb lives in the compiled-in plugin-task — the onecharly/go.modpins. The umbrella's tree carries 411 submodules, and the verb rolls each one and then reconciles that path's OWN nested checkouts.Before the fix, that reconcile was (
plugin-task v0.2026297.2108,candy/plugin-task/verbs.go:1488-1489, inreconcileNestedCheckouts):git submodule update --recursivemoves an already-initialized nested checkout onto the gitlink the parent records for it, unconditionally. It never asks whether that nested checkout carries work. So a nested checkout sitting on a LOCAL COMMIT was moved off it, with exit 0 and nothing reported — the operator's commit was no longer at HEAD, was reachable by no branch, and survived only in the reflog.In
v0.2026299.2314that statement is unchanged (candy/plugin-task/verbs.go:1690-1691,reconcileNestedCheckoutsat:1681) — but it is now reached only afterjudgeNestedLevel(:1550, called at:1442) has judged every nested checkout the move would touch, and a refusal stops that submodule before its checkout is switched and before its pin is staged.The fixed behaviour is the one thing that loses nothing: the bump refuses, it names the nested checkout, and it leaves the refused submodule exactly as it was — the operator's commit still at HEAD, the superproject's pin NOT staged, the submodule's own checkout not switched. The refusal's scope is per-submodule (
plugin-task#57): a sibling that sorts after the refused one still rolls, because the bump collects per-path failures and continues.charly/go.modplugin-task/candy/plugin-task v0.2026299.2314(wasv0.2026297.2108)charly/go.sumgo mod tidydrops the superseded pairNothing else changes: the delta between the two versions is the refusal and its scope.
Producer-first. plugin-task's producer work is MERGED and TAGGED (
v0.2026299.2314); this repo's compiled-in pin is the consumer that had not moved, so the refusal never reached the binary. The umbrella's ownplugin-taskgitlink is the NEXT consumer leg, after this one lands and this repo's merge is tagged — and the umbrella's prose citations of a plugin-task version are re-derived from this repo's pin byscripts/check-cited-plugin-task-version.mjs, so that re-key belongs to the umbrella's leg, not to this one.Closes #1073
How tested
The change-class gate ran on the committed tree this PR pushes (
21307612f344bf1fed01a9c322a9144b76ba9083), with zero warnings, and the live differential ran the SAME fixture through the binary built from this tree and through the binary built fromorigin/main(f1f85d19).The gate — this repo's own CI shape (
go test ./charly/..., thetools/*sweep,gofmt,golangci-lint v2.13.2overcharly/and over everytools/*module), plus this repo's core gate (go vet ./...fromcharly/) and the R9 worktree-local build:Why the gate's step 0 shows the pre-amend SHA. The gate ran on commit
f41fa0269, whose tree is056f8f4d14c3bdba089daa89becb9eb15e427514; the commit was then amended ONCE — before the first push, which the lifecycle allows — to re-tier its own attribution fromsyntax check onlyto 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:The live differential — the producer's own fixture shape (
candy/plugin-task/nested_work_test.go'snestedWorkFixture), rebuilt in shell so it can be driven by the binary rather than by the plugin's in-process test seam: a three-levelfile://tree (umb→outer→inner) plus a siblingzebra, where the nested checkout carries a commit no ref references — the exact shapegit submodule update --recursivedrops.outersorts beforezebra, so the refused path is visited first and the sibling's roll is the evidence that the walk CONTINUED past the refusal.The check states the product's promise and must fail against the old binary (R7: a check that cannot fail proves nothing):
outer/inner;outeris not staged andouter's own checkout is not switched;zebrastill rolled (the walk did not abort).Reading the two runs. The BEFORE run is the defect, live: the bump reported success (
task rc=0) while the nested checkout was moved off the operator's commit onto the recorded pinf5d10fa7— the commit survives only in the reflog, and nothing in the output says so. The NEW run refuses, names the path, leaves the refused submodule exactly as it was, and still rolls the sibling (zebra pin = f5d10fa7), so the refusal is scoped to the refused submodule and not the tree.One note on the two fixtures' SHAs.
L1,L2andWORKare identical across the runs;O1/O2are not, becauseouter's.gitmodulesrecords the absolute path of the leaf bare repo, and the two fixtures live in different directories. Every assertion is a comparison WITHIN one fixture, so the difference does not affect the result.Rulebook compliance
/charly-internals:git-workflow(the branch/commit/push/PR lifecycle) and/charly-internals:strict-policy(engineering discipline) were loaded before the first tool action; this repo's ownAGENTS.mdwas read before acting here.go mod tidyalso dropped the stalev0.2026296.1911pair, which this diff does not show — is fixed in this round; both mentions are corrected below, and the commit message never carried the claim. The missed control is named in the round's comment on this PR. No finding was filed away.v0.2026297.2108pair is gone fromcharly/go.modandcharly/go.sum. The go.sum hunk removes exactly the twov0.2026297.2108lines and adds exactly the twov0.2026299.2314lines — and nothing else; the stalev0.2026296.1911pair that feat(pins): install the pin-currency control and advance box/ubuntu to the served ref #1050 left behind went with the previous leg'sgo mod tidy, not with this one. The claim-keyed proof is the gate's step 11 — the binary's module set carriesv0.2026299.2314and no longer carriesv0.2026297.2108— plus the diff above.git statuswas run first in every step; the branch isfeat/plugin-task-nested-refusaloff freshorigin/main; the commit was amended ONCE, before the first push, to re-tier its own attribution; no force-push, no history rewrite, no hook bypass, no direct push tomain.origin/main. The changed path executed live, with commands, outputs and exit codes retained above.file://); nothing was mocked.scripts/bootstrap-charly.shbuild (2026.300.0215); the gate assertsbin/charly versionand the binary's module set. No shared install was used. No new runtime OS dependency was introduced, sopackaging:is unchanged.Change classification
v0.2026299.2314(merged, tagged) → this repo's compiled-in pin (this PR) → the umbrella'splugin-taskgitlink and its prose re-key (the next PR, one PR, gated withcharly task verifyon the committed tree).fully tested and validated— the change-class gate passed on the final tree and the changed path executed live.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 (#1073); it is closed by this PR, not filed away.
Agent: umbrella-prose-truth
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (fully tested and validated)