Skip to content

fix(agent-context): bring shipped skills inside skill-authoring limits - #434

Merged
dmealing merged 13 commits into
mainfrom
fm/mo-skills-audit-small
Oct 12, 2026
Merged

dmealing merged 13 commits into
mainfrom
fm/mo-skills-audit-small

Conversation

@dmealing

@dmealing dmealing commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

What Changed

  • Moves sections out of metaobjects-audit, metaobjects-authoring and metaobjects-fit-assessment into references/ files, bringing each SKILL.md under 500 lines. Adds a reference table at the top of metaobjects-audit, metaobjects-prompts and metaobjects-runtime-ui. Adds a ## Contents list to every reference file over 100 lines, and links the metaobjects-codegen TypeScript and language reference files directly from its SKILL.md.
  • Adds scripts/build-assess-prompt.mjs, which builds the hosted fit-assessment prompt as one file by inlining the skill's references. scripts/ci-local.sh gains a hosted assess prompt builds gate. The maintainer notes move to docs/superpowers/specs/2026-07-12-metaobjects-fit-assessment-maintainer-notes.md, and scaffold: false moves under metadata:.
  • The releasing skill sets disable-model-invocation: true, folds the Phase 0 addendum into the credentials check, and moves the dated npm token and Trusted Publishing notes into docs/RELEASING.md. README.md now points at the build script. A new SDK test, skill-structure.test.ts, enforces the 500-line limit, the ## Contents rule and one-hop reference links.

Run count and size

  • no-mistakes runs: 2. Run 1 passed (4 review fix rounds). PR 433 then merged to main and conflicted with this branch in agent-context/skills/metaobjects-authoring/SKILL.md (only that file: PR 433 edited the Reporting section this PR moved out). I kept the section moved, applied PR 433's any/all wording to references/declaring-reports.md, regenerated the agent-context fixtures, then ran run 2 on the rebased branch. A first attempt at run 2 was aborted because its intent file had been overwritten by another worker; it was restarted with the right intent, so run 2 is one completed run. The CI step was skipped by nm-triage: the PR has no forge checks and the local gate is the validation.
  • Run 2's test gate first reported live validation as inconclusive (the stryker step of ci-local --quick was killed by a wrapper timeout on a loaded machine). A fix round inside the same run re-drove the two untested scenarios (front-matter / maintainer notes / disable-model-invocation, and ci-local --quick to completion) and ended with LOCAL CI PASSED. Before run 2 I also ran scripts/ci-local.sh --quick to completion on the rebased branch; its final line was LOCAL CI PASSED (with 4 skipped — see ⊘ above). Both scenarios were also driven live in run 1 on the same content.
  • After the rebase, skill-structure.test.ts requires a real link to each reference file (the backticked references/<file> path, or the bare file name in a reference-table row), not a substring anywhere in the body. The branch carries one tree-unchanged merge commit recording the pre-rebase pipeline head, which the pipeline's private mirror required.
  • Net hand-written line change: +1662 / -974 (net +688) excluding fixtures. Moved lines count on both sides and about 170 are new ## Contents lines. Code, tests and scripts only: +285 / -38.
  • Regenerated fixtures (bun scripts/regen-agent-context-conformance.ts, not hand-edited): +4801 / -3652, counted separately.

Required pre-release step (outside this repo)

The hosted https://metaobjects.dev/assess.md is built in the site repo's .github/workflows/deploy.yml by a sed copy of the skill's SKILL.md at the pinned release tag. With the split, that copy lacks the capability sheet and JSON contract. Before the first release tag carrying this change becomes the pinned one, replace that step with the block recorded in docs/RELEASING-docs-checklist.md: call node scripts/build-assess-prompt.mjs --out /tmp/assess.md when the tag has the script, keep the old sed copy only for older tags, and never fall back to sed when the script exists but fails. The pin is 1.0.13 today, so nothing changes until a tag with this change is cut.

Validation

Risk Assessment

✅ Low: Docs-only reshuffle of skill text plus a small offline build script and a structure test; SKILL.md line counts (263/479/481) meet the intent, and the hosted prompt builds as the old prompt with one phrase dropped.

Testing

Drove the real CLI (dist/bin/meta.js init, init --refresh-docs) in two disposable projects under /tmp and ran a pointer/size/TOC checker over the emitted skills. Built the hosted assess prompt with scripts/build-assess-prompt.mjs to the evidence dir and passed its test. Re-ran ci-local --quick to EXIT=0 (4 lanes skipped by --quick design). Ran the verification-plan targeted suites (75 agent-context pass, 34 CLI skill-reading pass, positioning, doc-examples, test-references) and regen with zero fixture drift. Static reads covered the maintainer-notes move and the releasing skill; those two scenarios are untested because no live surface was reachable for them. The full local suite was not run, per the verification plan; the quick gate is the configured scope.

  • Live validation: ✅ go - 9 of 11 scenarios driven live against the product
Scenario Result Live Evidence
Fresh meta init in a bare project emits the three long skills (audit, authoring, codegen) plus the others, each SKILL.md under 500 lines ✅ pass live meta init output in /tmp/mo-live/proj; checker size lines: audit 264, authoring 480, codegen 399
Every references/ pointer in an emitted SKILL.md resolves to a file the project actually receives; stack-gated pointers (per-port references, requirements.md) are documented as conditional in the skil… ✅ pass live checker over /tmp/mo-live/proj and proj2; stack-gated files not emitted in a bare TS project (skill text states this); the Java/Kotlin/C#/Python stack emission was not driven live
Reference files over 100 lines all carry a ## Contents block in emitted output ✅ pass live checker: 0 long reference files without Contents
metaobjects-codegen SKILL.md links its five two-hop reference files directly ✅ pass live checker: any-stack, choosing-layers, dependencies-and-shared-models, owning-generators, physical-names, template-or-code all linked from emitted SKILL.md
Reference table appears near the top of metaobjects-prompts, metaobjects-runtime-ui and metaobjects-audit SKILL.md ✅ pass live checker: table at lines 25, 21, 43
Hosted /assess.md is a self-contained single file: includes JSON contract and capability sheet, no dangling references/ instruction ✅ pass live scripts/build-assess-prompt.mjs run to evidence assess.md (601 lines; JSON contract at 439, capability sheet at 503; zero references/ hits); test-build-assess-prompt.mjs all passed
fit-assessment scaffold sits under metadata and the skill is not emitted into a user project by meta init ✅ pass live frontmatter metadata.scaffold false; meta init emitted no metaobjects-fit-assessment directory in either project
Maintainer notes moved out of the fit-assessment skill to docs/superpowers/specs, with no maintainer block left in SKILL.md ⏸️ untested no Only a static file check was done: docs/superpowers/specs/2026-07-12-fit-assessment-maintainer-notes.md exists and no maintainer-notes block is in SKILL.md. The consumer is a documentation reader with…
releasing skill has disable-model-invocation: true, the Phase 0 addendum is folded into Phase 0, and dated outage notes live in docs/RELEASING.md ⏸️ untested no Only static reads were done: .claude/skills/releasing/SKILL.md frontmatter and Phase 0, and docs/RELEASING.md dated notes. The disable-model-invocation flag is enforced by the Claude Code harness, whi…
Adversarial: stale pointers after the section moves are repointed (capability-checklist lines, README, typescript.md), and the fixtures are current with the sources ✅ pass live regen-agent-context-conformance.ts produced zero git diff; sdk agent-context tests 75 pass; grep of shipped text confirms repointed lines
Full quick gate (scripts/ci-local.sh --quick) runs to completion and passes ✅ pass live ~/.no-mistakes/evidence/01M4Q0R3B8ZNTDHTR1WAQ45SN3/ci-quick-rerun.log, EXIT=0, 'LOCAL CI PASSED (with 4 skipped)'
Evidence: Hosted assess prompt built from the worktree (601 lines)
# MetaObjects Fit & Migration Assessment

_Assessment prompt v2. The § Capability sheet was last checked against the MetaObjects source
on 2026-09-26 (the 1.0.8 / 1.0.9 line). A later release may add capabilities the sheet does not
list yet: check anything load-bearing against the published sources named in M3._

**What this costs you.** It runs in your coding agent, on your tokens.

- **Quick pass** (the default, next section): roughly 5–30 minutes of agent time, depending on
  the agent and the repository, longer on a large monorepo. It prints a first verdict in the
  conversation and writes nothing.
- **Full assessment** (optional depth, after the quick pass): an hour or more of agent time,
  and a large repository makes for a large token bill. It produces the evidence-cited report
  and its JSON twin.

It is not a two-minute check. Say so if anyone promised you one.

**Read-only, for real.** Nothing in the target repository is created, edited, installed or
committed, in either mode. The quick pass answers in the conversation. The full assessment
writes its two files **outside** the target repository, to a directory the human names; if
they name none, use a temporary directory (for example `$TMPDIR/metaobjects-fit-<repo>/`) and
say where it went. Never create `.metaobjects/` anywhere: that directory marks an adopted
project.

You are an AI assistant running a **pre-adoption fit assessment** for MetaObjects
(https://github.com/metaobjectsdev/metaobjects): a cross-language metadata standard in which
typed metadata is the durable spine and generated code is the disposable artifact. It is
assessed here on four pillars (codegen, runtime metadata, drift detection, prompt
construction) across five ports (TypeScript, C#, Java, Kotlin, Python). You are sitting in a
project that has **not** adopted it.

The question is not "fit or not fit". It is **how much of MetaObjects this project should
adopt, where, and whether any of it is worth the tooling**. Adoption is a spectrum:

| Scope | What MetaObjects owns | What stays exactly as it is |
|---|---|---|
| **NOT WORTH IT** | nothing | everything |
| **CONTRACT SPINE** | the shapes that cross a boundary between apps, services or languages (shared entity shapes, API payloads, event and message bodies, prompt payloads), declared once; each side generates only the types, DTOs and validators it compiles against; `verify --codegen` fails the build of any side whose copy is stale | the ORM, the migrations, the routes, all hand-written code |
| **PARTIAL** | one layer or one subsystem: e.g. the schema drift gate on a set of Postgres tables, the prompt layer, or the whole stack of one new service | everything outside that layer or subsystem |
| **FULL** | the model: DDL via `meta migrate`, generated entities/ORM wiring, routes, validators, UI tier where the port has one | business logic, auth, irreducible SQL |

**The size-and-shape rule** (a product ruling; apply it, do not relitigate it):

- **Greenfield or early projects** on a stack a reference generator targets → **FULL** is the
  natural scope. There is little code to reproduce and the spine starts as the source of truth.
- **Large existing projects, especially estates where several apps and services depend on each
  other** → the value is usually a **CONTRACT SPINE** on the seams between them, not replacing
  anyone's ORM. The payoff is proportional to how many consumers compile against one shape and
  how often that shape has drifted. PARTIAL adoption per service can follow later, one service
  at a time.
- **Small, finished, single-app projects** → **NOT WORTH IT**. Say so plainly. (Whether a small
  app is *finished* is not in the code: see M8.)
- A **single large app** on an ORM no reference generator targets sits between these: it has no
  inter-app seam for a contract spine to protect, and FULL means rewriting its data layer. It is
  usually NOT WORTH IT unless it has a real boundary (a public API with typed clients in another
  language or repository, an LLM prompt surface, a schema shared with another team) — then that
  boundary is the PARTIAL or CONTRACT-SPINE candidate, and you name it.

---

## Quick pass (default — do this first, and stop here unless asked for more)

Budget: read manifests, the schema, a sample of the code at each seam, and targeted `git log`
searches. Do not read the whole repository. The quick pass needs only this section, the scope
table above and § Capability sheet at the end; skip everything in between.

1. **Stack.** Languages, DB(s), ORM, migration tool, web framework, LLM SDKs. Look up the
   port's row in § Capability sheet.
2. **Shape.** Is this one app, or several apps/services/packages that exchange data? List every
   **seam**: a shape produced on one side and consumed on another (an API response a separate
   client or SDK consumes, a queue/event payload, a table two services read, a shared-types
   package, a prompt payload, an export format). Monorepo workspaces, `packages/*-types`,
   generated or hand-copied API clients, OpenAPI/JSON Schema files and message schemas are the
   tells.
3. **Existing gates.** What already keeps the seams in sync (OpenAPI generation and checks,
   protobuf/gRPC codegen from shared `.proto` files, a shared-types package, a schema registry,
   `prisma migrate diff`, contract tests)? A seam that
   is already gated is not a MetaObjects opportunity; say so.
4. **Drift evidence, cheaply.** `git log --oneline -i --grep` for `sync|mismatch|out of date|
   forgot|keep in sync|to match`, plus grep for comments like `keep in sync with` / `mirrors
   the`. Read the two or three best hits and confirm each is a real divergence between two
   copies of one shape. One confirmed incident beats ten grep hits.
5. **Trajectory.** Ask the human (Input 3). If there is nobody to ask, say what you assumed.
6. **Verdict**, in the conversation, in this shape:

`` `text
Recommended scope: NOT WORTH IT | CONTRACT SPINE | PARTIAL (<which layer/subsystem>) | FULL
Confidence: high | medium | low (and what would change it)
Why, in three facts: <fact, cited file:line or commit>, <fact>, <fact>
Seams where it would pay off: <seam — both sides, cited — the gate that would close it>
   (or "none found" — which is itself the finding for a single app)
Where it would not pay off: <e.g. "the ORM layer: Prisma, which no generator targets">
What you would not get: <the two or three § Capability sheet limits that bite here>
Next step: <"stop here" | "run the full assessment on <scope>" | the first-week wedge>
`` `

Every fact is cited or it is cut. The quick pass may say NOT WORTH IT; it must not say
"not a fit" about MetaObjects as a whole when a narrower scope was never considered. Work the
scope table top to bottom and say why each wider scope was rejected.

---

## Full assessment (optional depth)

Run the passes below only when the human asks for it, or when the quick pass verdict is
CONTRACT SPINE, PARTIAL or FULL and they want the plan. **Scope the full passes to the
recommended scope**: a CONTRACT SPINE assessment censuses the seams and the shapes that cross
them, not every table in the monolith.

\### Inputs — elicit if absent

1. Repo access. For monorepos: which services/packages are in scope.
2. Stack confirmation (detect, then confirm).
3. **Trajectory — you MUST ask; it is NOT in the code (see M8).** Will this system **grow**
   (more entities, a second language or service, an LLM surface, a team beyond one person), or
   is it feature-complete at its current size? Long-lived or disposable? If the human doesn't
   answer, do not guess: state the assumption and mark the verdict conditional on it.
4. Whether an LLM/prompt surface exists (scopes the prompt pillar).
5. Org constraints: who owns the schema (DBA-gated?); is generated code in the repo acceptable;
   which teams own which side of each seam.
6. Where to write output (outside the target repo; see the top of this file).

No secrets, no live-DB connection. You read code, schemas and git history only; `verify --db`
is *described* in the report, never executed.

\### Deliverables

- `fit-assessment.md` — the human report (

... [23691 bytes truncated] ...

trivial | small | medium | large",
      "confidence": "high | medium | low",
      "checkable": true,
      "horizon": "now | later",
      "metadata_sketch": "optional — read-only proposal",
      "parity_gate": "optional — the check proving behavior-equivalence"
    }
  ]
}
`` `

Every prose prediction gets a claim. Ceiling statements carry `horizon: "later"`. Drift rows
carry `checkable: true` with real locations. The quick pass emits no JSON unless asked.

---

## Capability sheet — what each port ships at 1.0.8 (never promise across these lines)

Paths are relative to the MetaObjects repository on GitHub.

**Contract-only generation (types, DTOs, validators; no ORM, no routes)** — the CONTRACT SPINE
building block. Every generator is a reference helper an adopter selects, ejects and owns
(`docs/features/own-your-codegen.md`); none is run unless wired.

| Port | Select | Emits for a contract | Source |
|---|---|---|---|
| TypeScript | the `entity` reference generator in a target with `runtime: false` | Zod schemas + inferred TS types; no `drizzle-orm`, no `runtime-ts` import, for entities, value objects and projections alike | `server/typescript/packages/codegen-ts/src/metaobjects-config.ts` (`TargetConfig.runtime`), `.../src/templates/entity-file.ts` |
| Java | `SpringDtoGenerator` (a record per concrete entity or projection, whatever its source, with jakarta validation annotations) and `SpringValueObjectGenerator` (a record per value object) | Java 21 records; your JPA/JDBC entity stays hand-written | `server/java/codegen-spring/src/main/java/com/metaobjects/generator/spring/` |
| Kotlin | `KotlinEntityGenerator` (+ `KotlinValidatorGenerator`) | plain Jackson-compatible data classes per entity and value object | `server/java/codegen-kotlin/src/main/kotlin/com/metaobjects/generator/kotlin/` |
| C# | `EntityGenerator`, with the contract declared **sourceless** | a POCO with DataAnnotations and no EF mapping (a sourced entity gets `[Table]`/`[Key]`/`[Column]`) | `server/csharp/MetaObjects.Codegen/Generators/EntityGenerator.cs` |
| Python | the `entity` generator | Pydantic models (no ORM of any kind) | `server/python/src/metaobjects/codegen/generator_registry.py` |

- **A sourceless object is shape only.** Declared without a `source.rdb`, an object generates its
  type and nothing else: no table, no migration, no routes (#248; `docs/features/libraries.md`).
  A TypeScript model of only value objects and sourceless projections needs no `dialect`
  (`server/typescript/packages/codegen-ts/src/db-emitting.ts`).
- **The drift gate per port** — regenerate into a temp tree and diff: `meta verify --codegen`
  (TS); `mvn metaobjects:verify` (Java/Kotlin; `codegen` is the default mode); `dotnet meta
  verify --codegen` (C#; bare `verify` means `--templates` there); `metaobjects verify` (Python;
  `--codegen` is the default). Source: `docs/features/cli.md`.
- **Generated code compiles**: a codegen-compile gate compiles every port's emitted model tier
  with its real compiler in CI (`docs/CONFORMANCE.md`, "Split coverage").
- **Sharing a model** (`docs/features/metadata-dependencies.md`): in one repository, every port
  reads the same metadata directory (`sources`), so a TS service and a Java, C# or Python
  service can generate from one declaration today. **Across repositories**, a published model
  with a hash-locked snapshot and `meta verify --deps` works for **TypeScript publishers and
  TypeScript/Python consumers only**; Java, Kotlin and C# neither publish nor consume one yet
  (Phase 2) and must share by monorepo or a vendored copy (`docs/features/metadata-sources.md`,
  "Vendoring"), which carries no upstream hash check.
- **Libraries** (`docs/features/libraries.md`): `iam` (preview) and `ai` (stable) ship as
  declared designs; the core layer is sourceless and adds no tables. Mention one only when the
  target is hand-building the same design.

**Out of the box, contract-only does not** (say so when it matters, and say the fix):
- ship a generator for a Prisma schema, TypeORM entities, SQLAlchemy/Django models or JPA
  entities — alongside those ORMs the shipped contract is Zod/TS types, records, POCOs or
  Pydantic models *next to* the ORM model;
- ship an OpenAPI, AsyncAPI or JSON Schema generator;
- reach a consumer outside the five ports (Go, Rust, Ruby, PHP, Swift…) directly.

**Each of those is a generator the project writes**, and that is the primary codegen path, not
a workaround: a generator is a function from the loaded model to files, a few dozen lines, and
`verify --codegen` gates its output like any other. `meta generator new <name>` scaffolds one in
TypeScript; `docs/recipes/write-your-own-generator.md` shows every port and ships JSON Schema and
OpenAPI 3.1 example generators to copy. An OpenAPI or JSON Schema generator also reaches the
languages outside the five ports through their own generators. Price it in the wedge (a day or
two for a first generator), and do not report it as impossible.

**Contract-only cannot** bind a shape to a queue, topic or transport as declared vocabulary
(`api.*`, `operation.*`, `binding.*` are not shipped); a generator can still emit per-transport
code from the shapes.
- promise byte-identical JSON from type-only output: field-name casing on the wire follows each
  consumer's serializer settings (the byte-identical REST wire is a property of the *generated
  routes*, gated by `fixtures/api-contract-conformance/`). Check it in the wedge.

**Full-stack caps per port:**
- **Schema pillar** (`meta migrate`, `verify --db`): Node `meta` CLI only; Postgres, SQLite, D1
  only. Any other database: out for that database; data access unaffected.
- **TS**: Drizzle/Zod + Fastify or Hono routes with the filter-operator grammar, TanStack/React UI
  codegen + runtime, migrations. The only port with UI codegen + runtime.
- **Java/Spring**: DTO records, controllers (full filter grammar via the generated allowlist +
  `FilterParser`), filter/sort allowlists, repository *interfaces* (the consumer implements them;
  the existing ORM sits behind unchanged), payload records, output parsers. Entities stay
  hand-written on this lane. `mvn metaobjects:generate` / `:verify` (no live-DB mode).
- **Kotlin/JVM**: entity + Exposed table + Spring controller + payload + relations + filter
  allowlist + validators + output parsers.
- **C#**: EF Core entities + `AppDbContext` + CRUD minimal-API routes + render/payload/verify via
  `dotnet meta`; no metadata-driven runtime tier; no migrate surface.
- **Python**: Pydantic + router + payload/parsers + `ObjectManager` runtime; the consumer wires the
  FastAPI router and repository; `metaobjects gen`/`verify` (no migrate).
- **Prompt pillar** (all five ports): render + payload codegen + `verify` templates + the reply
  parser for a responding `template.prompt` (`@responseRef`) + the output-format fragment and
  tolerant `extract`. `template.output` emits no parser. MCP exposure of declared prompts/tools
  is not shipped.
- **Not shipped, never promise**: the `api.*`/`operation.*`/`binding.*` declared-API surface;
  the cut `byte`/`short`/`class` field stubs; `index.fulltext`/`vector`/`spatial`; native PG enums
  and int-backed enums.

---

## Final self-check before answering

0. **Scope, not fit.** Did you work the scope table top to bottom and say why each wider scope
   was rejected? Is NOT WORTH IT backed by facts, not by "the ORM isn't supported"?
1. **Seams.** Did you look for boundaries between apps, services, packages and languages — and
   for gates that already cover them?
2. **Trajectory (M8).** Asked, or both branches shown? A NOT WORTH IT that rests on "small" needs
   the human's answer.
3. **Read-only.** Nothing written inside the target repository?
4. Every capability claim traceable to § Capability sheet or a published source (M3)?
5. Every drift row: real `file:line`, real commits, a named gate? (>15% false positives is fatal.)
6. *(Full only)* Disqualifier table worked row by row; reconciliation block present; P2-b run;
   ceiling paragraph labeled `horizon: "later"`; "What you will NOT get" complete; every prose
   prediction has a JSON twin.
  • Evidence: Quick gate re-run log (EXIT=0) (local file: ~/.no-mistakes/evidence/01M4Q0R3B8ZNTDHTR1WAQ45SN3/ci-quick-rerun.log)
  • Outcome: 🔧 1 issue found → no changes applied ✅ across 2 runs (48m34s)

Pipeline

Updates from git push no-mistakes

✅ **Intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

🔧 **Test** - 1 issue found → no changes applied ✅
  • ⚠️ live validation verdict: inconclusive (4 of 6 scenarios were driven live against the product); untested: Fit-assessment maintainer notes moved out, scaffold under metadata, releasing skill has disable-model-invocation, Full regression: ci-local --quick run to completion
  • Live validation: ⚠️ inconclusive - 4 of 6 scenarios driven live against the product
Scenario Result Live Evidence
Hosted /assess.md is one self-contained file with capability sheet and JSON contract inline, no references/ pointers ✅ pass live evidence assess.md (601 lines); grep for references/ empty
meta init in a disposable project installs the split skills and every reference is linked from its SKILL.md ✅ pass live bun server/typescript/packages/cli/bin/meta.ts init in temp project; 26 of 26 reference files linked
Shipped skill SKILL.md files are under 500 lines (audit 263, authoring 479, fit-assessment 481) ✅ pass live wc -l on installed and source skills
Agent-context conformance fixtures match regeneration output ✅ pass live bun scripts/regen-agent-context-conformance.ts; git status clean afterwards
Fit-assessment maintainer notes moved out, scaffold under metadata, releasing skill has disable-model-invocation ⏸️ untested no Prior run established only static file reads of the fit-assessment SKILL.md, the maintainer notes under docs/superpowers/specs, and the releasing SKILL.md frontmatter. No live run was driven, and the…
Full regression: ci-local --quick run to completion ⏸️ untested no Stryker stopped progressing and the wrapper timeout killed it. Rerun scripts/ci-local.sh --quick without the timeout cap and read its own exit code, or skip stryker by user decision. Full local suite…
  • scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains
  • cd server/typescript/packages/sdk && bun test test/agent-context test/agent-context-capability-grounding.test.ts test/agent-context-conformance.test.ts (75 pass, 0 fail)
  • cd server/typescript/packages/cli && bun test test/skill-catalog-grounding.test.ts test/unit/init-agent-context.test.ts test/unit/init-docs-only.test.ts test/unit/init-orphan-prune.test.ts test/unit/init-refresh-docs.test.ts test/agent-docs-alias.test.ts (34 pass, 0 fail)
  • node scripts/build-assess-prompt.mjs --out <evidence>/assess.md (exit 0, 601 lines, no references/ pointers)
  • node scripts/test-build-assess-prompt.mjs (all passed)
  • bun scripts/check-positioning-claims.ts, bun scripts/test-positioning-claims.ts, bun scripts/check-doc-examples.ts, scripts/check-test-references.sh (all exit 0)
  • cd server/typescript/packages/sdk && bun scripts/regen-agent-context-conformance.ts (exit 0; git status clean, fixtures match)
  • Live disposable project: bun server/typescript/packages/cli/bin/meta.ts init (exit 0); skill line counts and 26 of 26 reference links checked
  • scripts/ci-local.sh --quick logged to <evidence>/ci-quick.log; conformance, TS unit and gate lanes passed; completeness-gate (stryker) stalled from 23:13:34 and was killed by the 590s timeout (conformance:mutation exited 143)
  • Not run: full local suite, excluded by the verification plan's scope limit

🔧 No changes applied.
✅ Re-checked - no issues remain.

  • Live validation: ✅ go - 9 of 11 scenarios driven live against the product
Scenario Result Live Evidence
Fresh meta init in a bare project emits the three long skills (audit, authoring, codegen) plus the others, each SKILL.md under 500 lines ✅ pass live meta init output in /tmp/mo-live/proj; checker size lines: audit 264, authoring 480, codegen 399
Every references/ pointer in an emitted SKILL.md resolves to a file the project actually receives; stack-gated pointers (per-port references, requirements.md) are documented as conditional in the skil… ✅ pass live checker over /tmp/mo-live/proj and proj2; stack-gated files not emitted in a bare TS project (skill text states this); the Java/Kotlin/C#/Python stack emission was not driven live
Reference files over 100 lines all carry a ## Contents block in emitted output ✅ pass live checker: 0 long reference files without Contents
metaobjects-codegen SKILL.md links its five two-hop reference files directly ✅ pass live checker: any-stack, choosing-layers, dependencies-and-shared-models, owning-generators, physical-names, template-or-code all linked from emitted SKILL.md
Reference table appears near the top of metaobjects-prompts, metaobjects-runtime-ui and metaobjects-audit SKILL.md ✅ pass live checker: table at lines 25, 21, 43
Hosted /assess.md is a self-contained single file: includes JSON contract and capability sheet, no dangling references/ instruction ✅ pass live scripts/build-assess-prompt.mjs run to evidence assess.md (601 lines; JSON contract at 439, capability sheet at 503; zero references/ hits); test-build-assess-prompt.mjs all passed
fit-assessment scaffold sits under metadata and the skill is not emitted into a user project by meta init ✅ pass live frontmatter metadata.scaffold false; meta init emitted no metaobjects-fit-assessment directory in either project
Maintainer notes moved out of the fit-assessment skill to docs/superpowers/specs, with no maintainer block left in SKILL.md ⏸️ untested no Only a static file check was done: docs/superpowers/specs/2026-07-12-fit-assessment-maintainer-notes.md exists and no maintainer-notes block is in SKILL.md. The consumer is a documentation reader with…
releasing skill has disable-model-invocation: true, the Phase 0 addendum is folded into Phase 0, and dated outage notes live in docs/RELEASING.md ⏸️ untested no Only static reads were done: .claude/skills/releasing/SKILL.md frontmatter and Phase 0, and docs/RELEASING.md dated notes. The disable-model-invocation flag is enforced by the Claude Code harness, whi…
Adversarial: stale pointers after the section moves are repointed (capability-checklist lines, README, typescript.md), and the fixtures are current with the sources ✅ pass live regen-agent-context-conformance.ts produced zero git diff; sdk agent-context tests 75 pass; grep of shipped text confirms repointed lines
Full quick gate (scripts/ci-local.sh --quick) runs to completion and passes ✅ pass live ~/.no-mistakes/evidence/01M4Q0R3B8ZNTDHTR1WAQ45SN3/ci-quick-rerun.log, EXIT=0, 'LOCAL CI PASSED (with 4 skipped)'
  • scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains
  • cd /tmp/mo-live/proj && node <worktree>/server/typescript/packages/cli/dist/bin/meta.js init (live CLI, bare project)
  • cd /tmp/mo-live/proj2 (package.json type=module) && meta init && meta init --refresh-docs (live CLI, TS project)
  • node /tmp/mo-live/checker/check.mjs <emitted project> (size <500, reference pointer resolution, Contents on >100-line refs, codegen two-hop links, reference table position)
  • node scripts/build-assess-prompt.mjs --out ~/.no-mistakes/evidence/01M4Q0R3B8ZNTDHTR1WAQ45SN3/assess.md && node scripts/test-build-assess-prompt.mjs
  • scripts/ci-local.sh --quick (log: ~/.no-mistakes/evidence/01M4Q0R3B8ZNTDHTR1WAQ45SN3/ci-quick-rerun.log, EXIT=0)
  • cd server/typescript/packages/sdk && bun test test/agent-context test/agent-context-capability-grounding.test.ts test/agent-context-conformance.test.ts (75 pass, 0 fail)
  • cd server/typescript/packages/cli && bun test test/skill-catalog-grounding.test.ts test/unit/init-agent-context.test.ts test/unit/init-docs-only.test.ts test/unit/init-orphan-prune.test.ts test/unit/init-refresh-docs.test.ts test/agent-docs-alias.test.ts (34 pass, 0 fail)
  • bun server/typescript/packages/sdk/scripts/regen-agent-context-conformance.ts && git status --short (no diff)
  • bun scripts/check-positioning-claims.ts; bun scripts/test-positioning-claims.ts; bun scripts/check-doc-examples.ts; scripts/check-test-references.sh (all exit 0)
  • Static reads: .claude/skills/releasing/SKILL.md, docs/RELEASING.md, agent-context/skills/metaobjects-fit-assessment/SKILL.md, docs/superpowers/specs/2026-07-12-metaobjects-fit-assessment-maintainer-notes.md, README.md:96-102, capability-checklist.md pointers at lines 97/241/330
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…imits

Move sections of metaobjects-audit, metaobjects-authoring and
metaobjects-fit-assessment into reference files so each SKILL.md is under 500
lines, with a row and an open-when condition per file in a top-of-file
reference table. Add a contents list to every reference file over 100 lines,
link the five TypeScript topic files and all language files from
metaobjects-codegen, and put the reference table at the top of
metaobjects-prompts, metaobjects-runtime-ui and metaobjects-audit.

The hosted single-file assess prompt is now built by
scripts/build-assess-prompt.mjs, which inlines the new references; it is gated
in ci-local and equals the previous hosted text except for one dropped phrase.
Fit-assessment's scaffold marker moves under metadata (no code reads it) and
its maintainer notes move beside the design spec. The releasing skill gains
disable-model-invocation, folds the Phase 0 addendum into Phase 0 and points to
docs/RELEASING.md for the dated outage and credential notes.

An SDK test holds the 500-line, contents-list and one-hop rules. Agent-context
conformance fixtures are regenerated, not hand-edited.
…imits

Move sections of metaobjects-audit, metaobjects-authoring and
metaobjects-fit-assessment into reference files so each SKILL.md is under 500
lines, with a row and an open-when condition per file in a top-of-file
reference table. Add a contents list to every reference file over 100 lines,
link the five TypeScript topic files and all language files from
metaobjects-codegen, and put the reference table at the top of
metaobjects-prompts, metaobjects-runtime-ui and metaobjects-audit.

The hosted single-file assess prompt is now built by
scripts/build-assess-prompt.mjs, which inlines the new references; it is gated
in ci-local and equals the previous hosted text except for one dropped phrase.
Fit-assessment's scaffold marker moves under metadata (no code reads it) and
its maintainer notes move beside the design spec. The releasing skill gains
disable-model-invocation, folds the Phase 0 addendum into Phase 0 and points to
docs/RELEASING.md for the dated outage and credential notes.

An SDK test holds the 500-line, contents-list and one-hop rules. Agent-context
conformance fixtures are regenerated, not hand-edited.
Check for the backticked references/<file> path, or the bare file name in a
reference-table row, instead of a substring anywhere in the body. Apply the
any/all aggregate wording from main to the moved reporting section and
regenerate the agent-context fixtures.
@dmealing
dmealing merged commit 0293bcb into main Oct 12, 2026
1 check passed
@dmealing
dmealing deleted the fm/mo-skills-audit-small branch October 12, 2026 03:54
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.

1 participant