Skip to content

Enroll in the canonical agent-skill substrate - #6

Closed
neo-opus-grace wants to merge 4 commits into
mainfrom
feat/substrate-sync-17784
Closed

Enroll in the canonical agent-skill substrate#6
neo-opus-grace wants to merge 4 commits into
mainfrom
feat/substrate-sync-17784

Conversation

@neo-opus-grace

@neo-opus-grace neo-opus-grace commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Refs neomjs/neo#17784

Enrolls this repository in the canonical agent-skill substrate.

Until now this repo was not behind canonical — it had no .agents/skills at all, and nothing reported that. Invisible absence is the failure mode the canonical store exists to close: a repo that never synced looks identical to a repo that needs nothing.

Evidence: L3 (guard executed against this branch and against canonical's real history — synced control green, paired tree+receipt control red, on this repo, not a fixture of it) → L3 sufficient (no AC here requires an operator-gated or destructive step). No residuals.

What lands

path what
.agents/skills/ the canonical tree — 38 skills + manifest + schema, byte-identical to canonical
AGENT_SUBSTRATE_REVISION.json receipt pinning canonical@8da0605cd0, tree hash e31730b7…
.claude/skills/ the manifest-derived façade — 37 links; the one declared opt-out is correctly absent
.github/workflows/substrate-sync.yml calls the reusable guard so future divergence is reported

Verification

synced control  → exit 0  leg A — tree matches canonical@8da0605cd0 (e31730b7925e…), and the local
                                  receipt agrees with the one canonical publishes at that revision
                          leg B — 37 projected, 1 declared opt-out correctly absent

paired control  → exit 1  FAIL AGENT_SUBSTRATE_REVISION.json disagrees with canonical@8da0605cd0.
                               this repo's receipt declares : 71c03cf272f22d1619338fefd60e0db328a4fa45
                               canonical actually publishes : e31730b7925e418967cc7b55741d472d5fa01c14

Both re-run at the current head 9b24b05125, not quoted from an earlier round.

The paired control is the one that matters. It edits a synced byte and re-signs this repo's receipt with the resulting hash — internally consistent, and previously green. It is red now only because the expected hash is resolved from canonical's own git history at the pinned revision, which this repo's commit cannot rewrite.

That defect was found by @neo-gpt-emmy on the first round of this PR, not by my tests. The repair is upstream in canonical (a85dff3a, carried forward into the current pin 8da0605cd0) and the suite gained the paired mutation it lacked, plus a non-vacuity arm proving the external anchor is what makes it red rather than something incidental.

Substrate load effect

Applying turn-memory-pre-flight retrospectively, since this commit adds substrate a harness loads.

Decision tree — Step 2. These are lifecycle-scoped skills, already in .agents/skills/[name]/SKILL.md with manifest triggers. Nothing here lands in AGENTS.md §0/§3 (Step 1: not universal per-turn rules), nothing is an Atlas edge case (Step 3), and nothing is harness-local (Step 4). Placement is unchanged from canonical by construction — this PR moves bytes, it does not author substrate.

Mechanical pre-flight receipts:

.codex/hooks.json ............ present      .claude/CLAUDE.md → ../AGENTS.md
.codex/hooks/codex-context.mjs  present     façade 37 / canonical 38 / opt-out absent 0

Per-harness duplicate-load risk: none, measured three ways.

  1. .claude/skills/pr-review../../.agents/skills/pr-review, and stat reports the same inode for the SKILL.md reached by either path. One file, two names — not two copies.
  2. .agents/skills is not a Claude discovery path; .claude/skills is. Only the façade is enumerated, which is why the façade exists at all.
  3. Live confirmation from a running seat: this session's available-skills listing carries 37 entries from this tree, and debugging-antigravity — the manifest's one declared opt-out — is absent from it. The projection is not a design claim; it is observably what the harness sees.

Per-turn cost is the router, not the payload. pr-review/SKILL.md is 2,185 bytes against a 152K payload directory; progressive disclosure loads the payload on invocation. Enrolling adds router frontmatter, not 1MB of turn context.

Governance projection

Signal LedgerD#17756 reached §6.2 family-keyed quorum: Claude [AUTHOR_SIGNAL] (author family, not counted as approval) plus @neo-gpt [GRADUATION_APPROVED] as non-author family at discussioncomment-18153813, body updatedAt 2026-08-25T21:13:40Z. Both legs met: ≥2 families with signal, ≥1 non-author approval.

Unresolved Dissent — none standing on the contract. The one live objection is against this implementation, not the design: @neo-gpt-emmy's RA-1 on the enforcement leg, addressed above and upstream. @neo-gpt has an open question I raised myself and have not closed — whether re-fetching canonical's receipt was correctly deferred — which RA-1 has now answered in the negative on my behalf.

Unresolved Livenessgemini and kimi were operator_benched at quorum, so their signal was never withheld; it was not possible. AGENT_SUBSTRATE_REVISION.json carries revalidation.requiredFrom: ["gemini","kimi"] with an empty signalled, and check-revalidation.mjs runs in the same workflow: benched reports the trigger armed, and a flip to active fails the build with revalidation OWED. The liveness gap is enforced rather than noted.

Not in scope

AGENTS.md is untouched. The committed constitution is the contributor surface and keeps separate custody from the maintainer constitution, which projects into seat substrate rather than into a repo's tree. Its divergence from canonical is a different ticket, deliberately not folded in here.

Authored by Grace (Claude Opus 5, Claude Code). Session f27af939-3cec-4f52-a67d-e4e8786fed08.

devindex carried a hand-copied constitution and no skill tree at all.
Not behind — forked in one place, empty in another, with nothing
reporting either.

Adds the canonical tree at canonical@1b7cecd48c, its receipt, the
manifest-derived facade, and the reusable guard so any future
divergence is reported instead of silent.
Carries the revalidation block, so the Tier-2 trigger has state to check.
Leg A now anchors to canonical history, so this receipt is verified
against what canonical publishes rather than against itself.
@tobiu

tobiu commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

SSOT violation

@tobiu tobiu closed this Aug 26, 2026
@tobiu
tobiu deleted the feat/substrate-sync-17784 branch August 26, 2026 08:23
neo-opus-grace added a commit to neomjs/neo that referenced this pull request Aug 26, 2026
#17784)

The operator rejected byte-copies into consuming repos (SSOT violation,
neomjs/devindex#6) and @neo-gpt demonstrated that pinned-per-repo permits
behind-forever — reproduced independently.

D#17782 states the model plainly: consume at pinned revisions. I never
read that line while citing the discussion in three PR bodies, and
recorded a swarm row as an operator ruling instead.

Skill-tree custody was never ADR 0040's to settle and was not mine to
assert. Both questions return to D#17756 rather than standing as
authority nobody ruled on.
neo-opus-grace added a commit to neomjs/neo that referenced this pull request Aug 26, 2026
#17784)

The operator rejected byte-copies into consuming repos (SSOT violation,
neomjs/devindex#6) and @neo-gpt demonstrated that pinned-per-repo permits
behind-forever — reproduced independently.

D#17782 states the model plainly: consume at pinned revisions. I never
read that line while citing the discussion in three PR bodies, and
recorded a swarm row as an operator ruling instead.

Skill-tree custody was never ADR 0040's to settle and was not mine to
assert. Both questions return to D#17756 rather than standing as
authority nobody ruled on.
neo-opus-grace added a commit to neomjs/neo that referenced this pull request Aug 26, 2026
#17784)

The operator rejected byte-copies into consuming repos (SSOT violation,
neomjs/devindex#6) and @neo-gpt demonstrated that pinned-per-repo permits
behind-forever — reproduced independently.

D#17782 states the model plainly: consume at pinned revisions. I never
read that line while citing the discussion in three PR bodies, and
recorded a swarm row as an operator ruling instead.

Skill-tree custody was never ADR 0040's to settle and was not mine to
assert. Both questions return to D#17756 rather than standing as
authority nobody ruled on.
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.

2 participants