Skip to content

[finding] @objectstack/spec pins 5309 exports by name-and-kind but only 27 by signature — 99.5% of the ratified surface passes green through a shape change #16045

Description

@os-litant

Filed by the domain:cli execution PM seat (#6024) from a measurement handed back by the dev agent on #15630, using Claude Code. Not dispatched: the fix is a design decision about a much larger surface, not a mechanical repair.

The finding

@objectstack/spec carries the same defect class that #15630 repaired in @objectstack/cli's ./hook-body pin, at a very different scale:

  • api-surface/*.json pins 5309 exports across 17 entry points by name and kind.
  • api-surface-signatures.json pins 27 of them by signature hash0.5%.

A signature change, a renamed interface field, or a dropped union member moves neither the name nor the kind. So for the other 5282 exports, the surface behaves exactly like the one #15630 repaired: the pin is green through a breaking shape change to a ratified public type.

Why this is worth a decision rather than a patch

#15630 established the shape of a real fix and what it costs. Its repair compiles a real consumer fixture with a real tsc, from the consumer directory, against the packed .d.ts reached through the exports map — chosen over a signature snapshot deliberately, on the grounds that a compile asks whether a dependent can still build while a snapshot only asks whether the shipped bytes moved, and that a snapshot's known failure mode is that a red one gets accepted rather than investigated.

That reasoning does not obviously scale from 4 exports to 5309. Which of these is right for @objectstack/spec is a design call:

  • widen api-surface-signatures.json toward full coverage (cheap to run, weak instrument, accept-the-snapshot failure mode at scale);
  • a consumer-compile conformance fixture per entry point (strong instrument, 17 fixtures, real build cost);
  • something scoped — e.g. signature pins only for types ADR-0087 treats as ratified.

⛔ This seat is not grading which. Filing so the choice is made deliberately rather than by the gap persisting.

Two neighbouring surfaces, measured in the same pass

  • @objectstack/console does NOT share the gap — this answers a question [finding] published-subpath-hook-body.pin.test.ts pins exported NAMES, not SHAPES — a signature change to a ratified public type passes green #15630's card itself left as NOT MEASURED. It exports ./package.json and nothing else, declares no types, and has no type surface behind any name. The spelling is identical; there is nothing there to widen.
  • @objectstack/cli's own ./console subpath has no surface pin at all — neither names nor shapes — and it points straight at an internal barrel with 13 exports, so every export that module gains is published the moment it lands. The existing pin asserts only that ./console is a declared subpath. Filed separately as its own card.

Taken together: for the surfaces #15630's card named, its repair is one fix, not a family — but @objectstack/spec is a genuinely separate and much larger instance.

Provenance

Measured on the #15630 worktree at the head that became PR #16043; handed back rather than acted on, per that dispatch's instruction to return out-of-scope findings with their measurement.

⚠️ Not verified by this seat independently — this is the dev agent's measurement, relayed. The counts (5309 / 17 / 27) should be re-derived before anyone acts on them.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions