Repository navigation
feat(skill): author the marketplace skill where its code lives - #45
Conversation
marketplace documented corpus generation, the refs list, the drift gate and the refresh PRs, but its body lived only in the layer-charly-internals carrier, which holds no code. The destination is measured (opencharly/opencharly#611): that surface IS this plugin. - .agents/skills/marketplace/SKILL.md — the body, copied byte-identically (sha256 7d4d26763498cd228a1ad8d5825c821b794aa34e4cda0ca542ad011a572aa94b) from the carrier at its main. - marketplace-skill: — the routing-only skill: node in the candy's own charly.yml (name/family/owner/triggers, no inline description:/content:). owner: plugin-marketplace names a candy of THIS project; family: internals is unchanged, so /charly-internals:marketplace survives. - AGENTS.md + charly.yml — the file list names the node and the body, and the root manifest's false "declares no entities of its own" header is corrected. Gate: charly box validate rc=0 / 0 warnings; the negative control (body removed) rc=1 naming the node and its owning candy; and a corpus-generation probe emitting internals/skills/marketplace/SKILL.md + its DISPATCHER row. One filed finding: the carrier's body has no trailing newline, so the copy is byte-identical by instruction and its projection gains that one EOF byte. Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)
Review — BLOCKI re-derived every claim in the body against the current diff and the commit list, and dispositioned the (empty) comment thread. The change itself is coherent — the Blocks
Non-blocking observations
Verdict: BLOCK ollama-cloud/deepseek-v4.1-flash — action-review. |
|
RCA — round 1 BLOCK was in the PR body, not the diff. Findings (all three dispositioned before this re-run): two per-file counts were wrong ( Mechanism. Missed control. The pre-push self-audit's parse, do not transcribe rule — quote a machine's field BY KEY, never retype a rendered column — was applied to the sha256s and to every pasted gate output, and NOT to the per-file counts. For the third finding the missed control is different and worth naming separately: I verified the body's BYTES (sha256 identical, EOF byte disclosed) but never read the moved prose for claims about the MOVE ITSELF. A byte-identical relocation can still land a false claim, because the claim is about where the skill lives, and only the destination PR changes that. Root fix (applied). Every per-file count now comes from Blast radius. Body prose plus one deferred prose finding; the diff, the routing node, the byte-identical body, the negative arm and the generation probe are unchanged at this head. Agent: charly-six-add Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated) |
Review — PASSI re-derived every claim against the current diff and commit list, and dispositioned both comments. Per-file counts (round-1 block) — resolvedThe body now pastes
The two off-by-one contradictions that drove the round-1 BLOCK are gone. Ownership-row contradiction (round-1 block) — dispositioned as permittedThe moved body's table still says Correctness of the change
Evidence / testsArm 1 ( Comments
Residual (non-blocking)The stale ownership row remains in the shipped prose until #46 lands; this is explicitly disclosed and tracked, and the temporary carrier copy is sequenced for deletion by the drain PR (R2). Neither warrants a block. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
Agent: charly-six-add
Summary
The
marketplaceskill is authored HERE now — the repo that holds the thing it documents — instead of only in thelayer-charly-internalsprose carrier, which holds no code. The destination is MEASURED, never chosen (opencharly/opencharly#611): corpus generation, the refs list, the drift gate and the daily refresh PRs are this plugin's own surface.Per-file counts, parsed from
git show --numstat --format='' 40b8e7e(additions, deletions):What the diff carries:
.agents/skills/marketplace/SKILL.md(+103) — the body, copied byte-identically from the carrier at itsmain. Onesha256, three trees:7d4d26763498cd228a1ad8d5825c821b794aa34e4cda0ca542ad011a572aa94b(carrier
origin/main· carrier checkout · this tree — all equal, re-measured after the commit).It sits at the REPO ROOT because a skill body resolves against the OWNING CANDY's repo root (
sdk/deploykit'scandyRepoRoot) — the same reasonplugin-agent's anddistro-arch/candy/arch-skills' bodies read that way.candy/plugin-marketplace/charly.yml(+23) —marketplace-skill:, a ROUTING-ONLYskill:node:name/family/owner/triggers, and NO inlinedescription:/content:(an inline body that disagrees with its file is a hard error in the marketplace generator).owner: plugin-marketplacenames a candy of THIS project.family: internalsis carried over UNCHANGED, so every/charly-internals:marketplaceaddress survives the move.AGENTS.md(+6/−1) — the canonical-files list names the routing node and the body.charly.yml(+2/−1) — an R1 finding FIXED in this change: the root manifest's header claimed "This file declares no entities of its own - it only tells charly where to look", which is false since themarketplace-appbox and thecheck-marketplacebed moved here (the repo's ownAGENTS.mdsays so). The sentence now names them.No structural change was needed, and no shelf candy was added: this repo is already a charly project (
discover: candy, charly#459) and its owncandy/plugin-marketplacecandy can own askill:node.How tested
Run on the committed tree
40b8e7e26125dad2d2fe4a7912f67d498d35429e. TheWARNING: charly is a dev/worktree build …stderr line appears on every invocation of this worktree-local binary; it is binary provenance, not a validation warning, and the gate's own count is0 warnings.Arm 1 — the green one.
Arm 2 — the NEGATIVE control: the gate that actually gates. The body removed:
It names the NODE and its OWNING CANDY, so the green arm above cannot be vacuous: removing the prose reds the gate. (The body was restored immediately;
git status --shortis empty at the pushed head.)Arm 3 — the corpus-generation probe. A routing/entity change's proof is the emitted artifact, not the parse. Minimal local root carrying exactly this candy + its body + the
internalsfamily registry, run through THIS plugin:The
/charly-internals:marketplacerow proves the family address survives end to end (entity → corpus).The emitted body is the authored body plus one normalized EOF byte (5800 authored → 5801 emitted; identical for the first 5800 chars) — the convention violation filed as #44, deliberately not fixed in this commit so the body stays byte-identical to the carrier.
Round 1 RCA — three body claims contradicted by the diff, and one content finding
The validator BLOCKed this head. The change itself was found coherent (routing-only node, byte-identical body, genuine negative control); the blocks were in the body's claims plus one contradiction inside the moved prose. All four are dispositioned above and below; the RCA and the missed control:
AGENTS.md (+7/−1)vs the real+6/−1;charly.yml (+3/−1)vs the real+2/−1). Mechanism:git show --statprints the number of CHANGED lines per file —AGENTS.md | 7 ++-is 6 insertions + 1 deletion,charly.yml | 3 +-is 2 + 1 — and I transcribed that column as insertions. Missed control: the pre-push self-audit's parse, do not transcribe rule was applied to the sha256s and the pasted gate outputs but NOT to the per-file counts. Root fix: every count now comes fromgit show --numstat, pasted as the machine's own columns at the top of this body.internalsownership row contradicts the move.SKILL.mdsaysinternals → layer-charly-internals (+ layer-charly-internals-extra …), and this PR re-homes oneinternalsskill here. The row has in fact been stale since the #139 drain (nineinternalsskills already live atsdk/spec/the umbrella), so its correction is ONE sweep across the whole family — not a per-PR edit. It is deferred to the marketplace skill's internals ownership row still names layer-charly-internals as the one owner #46, the named tracking issue that carries the full measured map and the replacement row. It is deferred rather than fixed here because this PR's acceptance test is that the body is byte-identical to the carrier'smain: editing the row inside the ADD would break the invariant that proves the move transported prose rather than editing it, and the row can only be written correctly once the drain has landed.Rulebook compliance
/charly-internals:skills,/charly-internals:git-workflow,/charly-internals:cutover-policy,/charly-build:validate,/charly-internals:marketplace, plus this repo'sAGENTS.md(Part II fix: advance MARKETPLACE_REF to the marketplace's current main head #4).internalsownership row are NON-BLOCKING and separable (the projection is already correct; the row spans a family-wide sweep), so they are FILED as the marketplace skill body ends without a trailing newline, so its authored file differs from its own corpus projection by one byte #44 and the marketplace skill's internals ownership row still names layer-charly-internals as the one owner #46 with their RCAs.layer-charly-internalsdrain PR (which names this one) DELETES the carrier's copy once all six ADDs have merged. The copy that exists between the two PRs is the content-existence invariant doing its job — the prose must exist in SOME repository at every commit.git commit -F <file>was used because the pre-commit hook's shell parser rejects a heredoc (its own documented remedy).git statusread first; no force-push, no hook bypass, no direct push tomain.charly box validate+ the negative arm + the generation probe: all three ran on the committed tree above.charly-six-add).Change classification
Docs + routing config (a
skill:entity, its body, the rulebook's file list, and one corrected header comment). No Go, no schema, no image, no bed. The attribution tier isfully tested and validatedbecause the change-class gate above passed on the final tree and the emitted artifact was produced from the changed source.A3. This session's delivered system message reads, verbatim:
You are a coding agent powered by the deepseek-v4.1-flash model.— harnessDeepSeek Harness, modeldeepseek-v4.1-flash; cited with opencharly/opencharly#538, the open record of this runtime being real while a validator's model allowlist rejected it.Filed issues
marketplaceskill body ends without a trailing newline, so its authored file differs from its own corpus projection by one byte (the AUTHORING half of the class plugin-marketplace#33 fixed on the WRITER side).marketplaceskill'sinternalsownership row still nameslayer-charly-internalsas the family's one owner. This is the finding this round's third block names; the marketplace skill's internals ownership row still names layer-charly-internals as the one owner #46 carries the full measured map, the replacement row, and the reason the fix is one family-wide sweep rather than a per-PR edit.Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)