Skip to content

v0.22.0 — the pack is asked for the way, not only for the symbol

Choose a tag to compare

@github-actions github-actions released this 01 Sep 13:45
· 29 commits to main since this release

Why update. If you are on 0.21.1 and GraphCompose 2.3 is what you build
against, this release is the difference between having its knowledge and being
able to ask for it. 2.3 ships a knowledge bundle — the API split per surface,
a routing table, a claims index — and 0.21.1 can import that bundle and then
not read it: api-query looked only for the flat api-surface.json the local
extractor writes, so a 2.3 pack reported no allow-list while carrying a larger
one than the line had ever had. Two gates went quiet the same way, announcing a
missing file for a pack that was newer than they could read, and the freshness
check could not see that a new minor line had shipped at all — it compared
against its own line only, so 2.3.0 was published and it went on reporting
"current".

What is new rather than repaired: routing. A surface says a symbol exists; it
cannot say which of three ways is right, and that is where wrong-API choices
come from — a skills list in two columns is a row with weights, and nothing in
a signature says so. --task answers that from the pinned line's own table.

To get it: update the plugin, then import the bundle from the GraphCompose
release you build against —
node tools/api-surface/import-bundle.mjs --from graph-compose-knowledge-<version>.zip.
The 2.3.0 pack is already in this release. Nothing in your workspace needs
migrating, and every older line keeps answering exactly as before: 1.6 through
2.2 stay on the flat layout, which is correct — they describe frozen releases
that will never get a bundle.

Added

  • --task and --tasks: which way, not just what exists. A surface says a
    symbol exists; it cannot say which of three ways is right, and that is where
    wrong-API choices come from — a skills list in two columns is a row with
    weights, and nothing in a signature says so. --tasks lists the intents the
    pack's routing/tasks.json answers; --task <id> returns the decision: the
    recommended route and why, the alternatives with what each costs, the named
    engine constraints, and the symbols to verify. A miss exits 3 with the near
    matches, so a caller can branch on it. The route's docs anchors are paths in
    the GraphCompose repository — the bundle ships knowledge, not prose — and the
    answer says so rather than sending a reader after a file this workspace has
    never had. A route with no confirmedBy comes back confirmed: false, so an
    unreviewed recommendation does not read like a reviewed one.

  • --surface, and the surface in every answer. A bundle pack splits the API
    five ways, and which surface a type sits in decides whether a template may
    call it at all. --surface <name> restricts the search; every answer now
    carries surface, and stability when it is not stable, because "does it
    exist" and "is it something I should be calling yet" are the same question
    asked twice and an answer omitting the second reads as a green light. It is
    refused alongside --task: a route is not a search over surfaces, and a flag
    accepted but not honoured makes an answer look filtered when it is not.

  • A pack can carry knowledge without prose, and preflight says so. The
    GraphCompose 2.3 bundle brings api/, routing/ and claims/ and zero
    pages, where the 2.2 pack has 29. Importing it made 2.3 a supported line —
    correctly, its allow-list is the authority for 2.3 — and left the skills block
    answering loadingMap: null, which reads as "nothing to load" rather than
    "this pack does not carry that half". A run proceeded without guidance instead
    of going to find it.

    Preflight now reports knowledgeOnly and, under guidance, the nearest
    older line that has prose: its loading map, its worked starting point for
    the document kind, and a note saying the pinned line's allow-list still
    decides what exists. Two things it will not do. It never points a line at
    newer prose — borrowing downward risks a construction the pinned line has
    replaced, which the drift gate polices, while borrowing upward names API the
    line does not have at all. And it drops 00-api-surface.md from the borrowed
    starting point: a worked starting point opens with the allow-list, and that
    one file crossing a line is an agent authoring against the wrong closed set
    while believing it has the right one.

Fixed

  • The query CLI reads all three pack layouts. api/ + manifest.json from
    a bundle import, the flat api-surface.json from the local extractor, and
    00-api-surface.md for packs that predate it — a bundle pack wins where both
    are present. An old pack's answer is unchanged byte for byte: surface and
    stability are omitted rather than nulled, so nothing reading these has to
    learn a second shape. --surface on a flat pack, and --task on a pack with
    no routing table, each say which command would bring what is missing instead
    of failing as if the pack were broken. excluded.json is never read as a
    surface, so a deliberately excluded symbol is not reported as public API.
  • create-3-author.md asks for the route before choosing a primitive. It
    told the agent to grep 00-api-surface.md, which is the cost api-query
    exists to remove, and said nothing about routing. It now opens with the five
    rules — ask routing, take recommended, honour constraints, verify
    symbols against this line, and treat docs as an anchor rather than a file
    you have — and falls through to --search when the line has no routing table.