You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 6f11da4
Browse filesBrowse the repository at this point in the historyBrowse files
docs(agent-context): ten shipped-skill claims promised a default suite this branch deleted
`29f84b461` removed `cli._default_generators()` and `GenCommand.DefaultGeneratorNames`,
which made ADR-0034 Amendment 2 true on every port. Ten places in the shipped skills went
on describing the world before it — and these are not repo docs, they assemble into every
adopter's stack, so the wrong answer arrives wherever an agent is doing the work.
The sharpest was a table in `metaobjects-codegen/SKILL.md` naming both removed symbols as
"a real default" and answering "does an existing project upgrading get it?" with **Yes,
with no edit** for C# and Python. The same claim drove a COUNT in two other skills —
"on three of five ports an existing project emits none" — which is now five of five, so
the fix is arithmetic, not a word swap. Alongside it, `meta init` no longer scaffolds
`namesFile()`; it writes `generators: []` and an empty `codegen/generators/`, so the
paragraph that offered the scaffold as the port's exception had no exception left to
offer. The rest were `--template-spec` entries "appended to the default suite" (C# and
Python) and three "`names` is in the default suite" asides.
Every surviving mention of the phrase in `agent-context/` is now a negation.
The conformance corpus is regenerated in this commit rather than a later one: the
expected trees are byte-compared against `assemble()`, so prose and corpus moving apart
by even one commit is a red lane on a docs-only push.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011cQxyVuTkdPmAduLiedNEg
Copy file name to clipboardExpand all lines: agent-context/skills/metaobjects-audit/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -351,7 +351,7 @@ Per finding: `file:line` → what → generated-equivalent exists? → recommend
351
351
352
352
**Score only where a constant actually exists.** A fact declared in the project's CODEGEN CONFIG rather than in metadata — a bespoke route mount path, a hand-chosen JSON envelope key — is genuinely spelled twice when a client re-types it, but no generated constant holds it. That is a GENERATOR GAP, reported as one, never a literal-site finding: never invent a constant that the emitters do not emit.
353
353
354
-
**No verify subverb sees this** — `--codegen` diffs generated files, `--db` compares schema to metadata — so this audit is the only gate. Remedy: reference the constant — but **check the artifact is emitted at all before scoring the literals, because on THREE of five ports an existing project emits none**. C# and Python have a real default suite and get it by upgrading; TypeScript's `generators: [...]` and the JVM's `<generators>` are each the COMPLETE list, so`meta init`scaffolding `namesFile()` covers only a project initialized at 1.0 and upgrading the package never edits a config written earlier. Where no artifact exists, the un-wired generator is the FIRST finding and the first remedy (`namesFile()` on TS after `meta eject names`; `SpringNamesGenerator` / `KotlinNamesGenerator` in the pom) — score the literals under it rather than as N independent findings, since one config line fixes the cause and generated code stops embedding the names too.
354
+
**No verify subverb sees this** — `--codegen` diffs generated files, `--db` compares schema to metadata — so this audit is the only gate. Remedy: reference the constant — but **check the artifact is emitted at all before scoring the literals, because on ALL FIVE ports an existing project emits none until it asks**. ADR-0034 Amendment 2 made codegen opt-in everywhere: C# and Python require `--generators`, TypeScript's `generators: [...]` and the JVM's `<generators>` are each the COMPLETE list, and`meta init`scaffolds `generators: []` — so no port begins emitting this artifact merely because the package was upgraded. Where no artifact exists, the un-wired generator is the FIRST finding and the first remedy (`namesFile()` on TS after `meta eject names`; `SpringNamesGenerator` / `KotlinNamesGenerator` in the pom) — score the literals under it rather than as N independent findings, since one config line fixes the cause and generated code stops embedding the names too.
355
355
356
356
**Report TWO numbers for this signature, always, and never just the first: (a) is the artifact EMITTED, and (b) how many of the literal sites actually IMPORT it — the adoption ratio, as `<adopted>/<total> sites`.** Emission is the cheap half and it is the half that gets done: measured on an adopter whose audit proved the artifact emitted correctly, ran the generator to show it, and then adopted it at **0 of 53 sites** (37 table + 16 column). Wiring the generator changes the scorecard; it changes nothing a reader of the code experiences, because the second spelling is still the one every query uses. An audit that reports only (a) makes the estate look upgraded while every literal it found is still there — so a project that emits the artifact and imports it nowhere scores WORSE than one that has not started, not better, because it now carries a third spelling that claims to be the source of truth.
Copy file name to clipboardExpand all lines: agent-context/skills/metaobjects-audit/references/csharp.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -51,7 +51,7 @@ rejected (exit 2).
51
51
|`FromSqlInterpolated(` outside `.g.cs`| stored-proc call — candidate for the `callable` generator |
52
52
|`// keep in sync with` / `// mirrors the`| second-source-of-truth comment — always a finding |
53
53
|`HasPrecision(` hand-coded |`field.decimal` with `@precision`/`@scale` drives this from the `entity` generator |
54
-
| a table/column string in raw-SQL EF calls, or `nameof(Entity.Prop)` standing in for a column | second spelling of a declared physical name — reference `<Entity>Names.g.cs` (`AuthorNames.SourcePrimaryTable` / `<Field>Column`, default suite — `Names.Name` is the OBJECT's name, not the table); an EF property inside LINQ is the typed handle — correct |
54
+
| a table/column string in raw-SQL EF calls, or `nameof(Entity.Prop)` standing in for a column | second spelling of a declared physical name — reference `<Entity>Names.g.cs` (`AuthorNames.SourcePrimaryTable` / `<Field>Column`, emitted when `names` is named in `--generators` — `Names.Name` is the OBJECT's name, not the table); an EF property inside LINQ is the typed handle — correct |
55
55
56
56
---
57
57
@@ -66,7 +66,7 @@ selection uses stable names via `dotnet meta gen --generators <names>`, over a
66
66
**So do not score a C# project down for "not owning its generators", and do not
67
67
recommend writing one.** The customization path here is the **declarative template**:
68
68
`dotnet meta gen --template-spec <json> --template-root <dir>`, whose entries append to
69
-
the default suite. A finding of the form "the built-ins do not emit the shape this
69
+
your `--generators` selection. A finding of the form "the built-ins do not emit the shape this
70
70
project needs" resolves to a template-spec, not to generator code. Worked example with
Copy file name to clipboardExpand all lines: agent-context/skills/metaobjects-audit/references/python.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,7 +52,7 @@ regardless of server language — see the migration reference.
52
52
|`def get_all_` / `def create_` / `def update_` / `def delete_` in non-generated files | hand-rolled CRUD — compare to the generated router |
53
53
|`# keep in sync with` / `# mirrors the`| second-source-of-truth comment — always a finding |
54
54
|`try: ... except KeyError` / `?? ''` around format strings in prompt code | silent-degradation hack around a prompt payload — flag it |
55
-
| a table/column string in the repository implementation (SQLAlchemy Core, asyncpg/psycopg SQL) | second spelling of a declared physical name — reference `<entity>_names.py` (`AUTHOR_SOURCE_PRIMARY_TABLE` / `AUTHOR_<FIELD>_COLUMN`, default suite); no typed handle exists on this port, so that is never the reason to waive it |
55
+
| a table/column string in the repository implementation (SQLAlchemy Core, asyncpg/psycopg SQL) | second spelling of a declared physical name — reference `<entity>_names.py` (`AUTHOR_SOURCE_PRIMARY_TABLE` / `AUTHOR_<FIELD>_COLUMN`, emitted when `names` is named in `--generators`); no typed handle exists on this port, so that is never the reason to waive it |
56
56
57
57
---
58
58
@@ -66,8 +66,8 @@ seam to register a generator of your own. (`--provider module:symbol` registers
66
66
67
67
**So do not score a Python project down for "not owning its generators", and do not
68
68
recommend writing one.** The customization path here is the **declarative template**:
69
-
`metaobjects gen --template-spec <json> --templates <dir>`, whose entries append to the
70
-
default suite. A finding of the form "the built-ins do not emit the shape this project
69
+
`metaobjects gen --template-spec <json> --templates <dir>`, whose entries append to your
70
+
`--generators` selection. A finding of the form "the built-ins do not emit the shape this project
71
71
needs" resolves to a template-spec, not to generator code. Worked example with the full
Copy file name to clipboardExpand all lines: fixtures/agent-context-conformance/java-kotlin-react-tanstack/expected/.claude/skills/metaobjects-audit/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -351,7 +351,7 @@ Per finding: `file:line` → what → generated-equivalent exists? → recommend
351
351
352
352
**Score only where a constant actually exists.** A fact declared in the project's CODEGEN CONFIG rather than in metadata — a bespoke route mount path, a hand-chosen JSON envelope key — is genuinely spelled twice when a client re-types it, but no generated constant holds it. That is a GENERATOR GAP, reported as one, never a literal-site finding: never invent a constant that the emitters do not emit.
353
353
354
-
**No verify subverb sees this** — `--codegen` diffs generated files, `--db` compares schema to metadata — so this audit is the only gate. Remedy: reference the constant — but **check the artifact is emitted at all before scoring the literals, because on THREE of five ports an existing project emits none**. C# and Python have a real default suite and get it by upgrading; TypeScript's `generators: [...]` and the JVM's `<generators>` are each the COMPLETE list, so`meta init`scaffolding `namesFile()` covers only a project initialized at 1.0 and upgrading the package never edits a config written earlier. Where no artifact exists, the un-wired generator is the FIRST finding and the first remedy (`namesFile()` on TS after `meta eject names`; `SpringNamesGenerator` / `KotlinNamesGenerator` in the pom) — score the literals under it rather than as N independent findings, since one config line fixes the cause and generated code stops embedding the names too.
354
+
**No verify subverb sees this** — `--codegen` diffs generated files, `--db` compares schema to metadata — so this audit is the only gate. Remedy: reference the constant — but **check the artifact is emitted at all before scoring the literals, because on ALL FIVE ports an existing project emits none until it asks**. ADR-0034 Amendment 2 made codegen opt-in everywhere: C# and Python require `--generators`, TypeScript's `generators: [...]` and the JVM's `<generators>` are each the COMPLETE list, and`meta init`scaffolds `generators: []` — so no port begins emitting this artifact merely because the package was upgraded. Where no artifact exists, the un-wired generator is the FIRST finding and the first remedy (`namesFile()` on TS after `meta eject names`; `SpringNamesGenerator` / `KotlinNamesGenerator` in the pom) — score the literals under it rather than as N independent findings, since one config line fixes the cause and generated code stops embedding the names too.
355
355
356
356
**Report TWO numbers for this signature, always, and never just the first: (a) is the artifact EMITTED, and (b) how many of the literal sites actually IMPORT it — the adoption ratio, as `<adopted>/<total> sites`.** Emission is the cheap half and it is the half that gets done: measured on an adopter whose audit proved the artifact emitted correctly, ran the generator to show it, and then adopted it at **0 of 53 sites** (37 table + 16 column). Wiring the generator changes the scorecard; it changes nothing a reader of the code experiences, because the second spelling is still the one every query uses. An audit that reports only (a) makes the estate look upgraded while every literal it found is still there — so a project that emits the artifact and imports it nowhere scores WORSE than one that has not started, not better, because it now carries a third spelling that claims to be the source of truth.
Copy file name to clipboardExpand all lines: fixtures/agent-context-conformance/java-kotlin-react-tanstack/expected/.claude/skills/metaobjects-audit/references/capability-checklist.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -71,10 +71,10 @@ classify it (using the classification scheme in `SKILL.md`) and route the cutove
71
71
migration script, a body-to-column map (drift signature 11). Every port emits a per-object
72
72
names artifact from the declaration, so a literal is a second source of truth even when it
73
73
agrees with the naming strategy today. A typed ORM handle in its place is correct. **Check
74
-
the artifact is emitted at all before scoring the literals: on TypeScript and the JVM the
75
-
generator list in the config IS the complete list, so an existing project emits none and the
76
-
un-wired generator is the finding FIRST** (C# and Python have a real default suite and get it
77
-
by upgrading). **This entry is the physical-name INSTANCE of signature 11.** The rule that
74
+
the artifact is emitted at all before scoring the literals: on every port the selection IS
75
+
the complete list — the config's on TypeScript and the JVM, `--generators` on C# and Python —
76
+
so an existing project emits none and the un-wired generator is the finding FIRST** (no port
77
+
ships a default suite; ADR-0034 Amendment 2). **This entry is the physical-name INSTANCE of signature 11.** The rule that
78
78
generates the rest — and the reason an enum member compared as a bare string is NOT one — is
79
79
the Cross-cutting entry below.
80
80
-**`@kind` = `view` / `materializedView`** — hunt hand-written SQL views where an authored
0 commit comments