Repository navigation
Commit 9ed298e
docs(audit-skill): signature 12 hunted readers and under-counted; the writer is the evidence
Shipped signature 12 with a reader-side discriminator — raw-SQL `->>'key'` paths, casts,
destructuring — measured five adopter projects with it, and reported that 74 open bags
reduced to 2 real findings in one project. The maintainer challenged the number. They
were right and the method was the flaw.
Raw-SQL JSON paths are the RAREST way to consume a jsonb column. A Python, Kotlin or
TypeScript consumer parses the value into a type; it never writes `->>`. So the hunt
found the one project that happens to query jsonb from SQL and was blind to every
project that does the normal thing, which is most of them.
The writer is the strongest and cheapest evidence and the shipped text did not mention
it. The function that writes the column declares the value's type in its own signature.
On one estate's telemetry recorder, columns declared as open bags are written by
parameters typed `related_memory_ids: list[str]`, `beliefs_involved: list[str]`,
`vector_scores: list[float]`, `tools_offered: list[dict[str, Any]]` — the code states the
type in three files each while the metadata says `unknown`. Only the `dict[str, Any]`
ones on the same recorder are genuinely open, and those are correct as they stand.
So the signature now leads with the writer and demotes reader tells to second, and names
the sub-case that turns out to be the commonest and is fully mechanical: **a writer typed
`list[str]` / `string[]` / `List<X>` is the base subtype plus `isArray: true`** — not an
object, and not an open bag. Declaring it as one loses the element type, so nothing stops
a writer putting a map where every reader expects a list. A plural field name plus a
typed-collection writer is the whole test. A `*Json` suffix is a second free tell: a field
named `conditionJson` / `configJson` / `definitionJson` is admitting it carries a shape.
The estate-wide count is not restated here because the corrected method has not been run
to completion across all five projects; what is fixed is the method that produces it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTcEKXTQMYt84fAjuw5A2M1 parent cc119fa commit 9ed298e
12 files changed
Lines changed: 66 additions & 24 deletions
File tree
- agent-context/skills/metaobjects-audit
- references
- fixtures/agent-context-conformance
- java-kotlin-react-tanstack/expected/.claude/skills/metaobjects-audit
- references
- java-react/expected/.claude/skills/metaobjects-audit
- references
- python/expected/.claude/skills/metaobjects-audit
- references
- ts-react-tanstack/expected/.claude/skills/metaobjects-audit
- references
- ts-requirements/expected/.claude/skills/metaobjects-audit
- references
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
358 | 358 | | |
359 | 359 | | |
360 | 360 | | |
361 | | - | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
362 | 364 | | |
363 | 365 | | |
364 | 366 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
275 | 275 | | |
276 | 276 | | |
277 | 277 | | |
278 | | - | |
279 | | - | |
280 | | - | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
281 | 286 | | |
282 | 287 | | |
283 | 288 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
358 | 358 | | |
359 | 359 | | |
360 | 360 | | |
361 | | - | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
362 | 364 | | |
363 | 365 | | |
364 | 366 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
275 | 275 | | |
276 | 276 | | |
277 | 277 | | |
278 | | - | |
279 | | - | |
280 | | - | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
281 | 286 | | |
282 | 287 | | |
283 | 288 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
358 | 358 | | |
359 | 359 | | |
360 | 360 | | |
361 | | - | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
362 | 364 | | |
363 | 365 | | |
364 | 366 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
275 | 275 | | |
276 | 276 | | |
277 | 277 | | |
278 | | - | |
279 | | - | |
280 | | - | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
281 | 286 | | |
282 | 287 | | |
283 | 288 | | |
| |||
0 commit comments