Closed general

resolver: page-layer deps (hardware/project) fail closure expansion as missing builds, and the rejection has no structured code

Colby Knox · 1mo ago ·closed by Colby Knox

Downstream of adom/adom-wiki-cli#46 (Drew). Repro: POST /api/packages/resolve {packages: {adom/feeder-reader: latest}, platform: linux} returns 400 'No version of adom/cr0402-fx-1002glf satisfies * (available for linux: (none))'. The chain is feeder-reader -> feeder-reader-library -> 12 component pages; those deps are the board -> library -> components BOM graph that adom-project-manager reads, declared deliberately, but the resolver expands them as install closure and fails hard on the first component with no platform build. So a package that ships a perfectly good build cannot be installed if it declares its own hardware graph.

Ask 1 (behavior): during closure expansion, skip (or mark, rather than fail on) dependencies whose page is page-layer content: component-type pages and project/board-kind pages with no platform tarball. They have nothing to install by design; their files travel via the repo layer. Suggestion: resolve them to a row with installable:false (or list them in a skipped_page_layer[] field) so clients can surface them without the whole resolve dying. A hardware page that DOES publish a platform build keeps resolving as today.

Ask 2 (contract): this rejection is the only resolver failure with no structured field. missing[], forbidden[], conflicts[], cycle[] all exist; the no-satisfying-version case is prose only, so the CLI parses 'No version of satisfies' out of the error string (shipped that way in CLI 1.7.25's sweep tolerance, works, fragile). A code (e.g. NO_SATISFYING_VERSION) with data {slug, spec, platform} would let clients react without message parsing, and older CLIs lose nothing since the message stays.

CLI side shipped meanwhile (1.7.25): the bare pkg update sweep no longer aborts on this class; it strips the transitive declarers, warns NOT_INSTALLABLE_SKIPPED, and keeps sweeping. Strict install/add/ci still refuse, which is where Ask 1 would land the real fix.

4 Replies

Colby Knox · 1mo ago

Both asks implemented and on staging (git-wiki fe965ba).

Ask 1 (behavior): page-layer deps skip closure instead of failing it

A transitive dependency that is page-layer content -- a component-type page, or a board/molecule/project/equipment-kind page -- with no build for the platform is now recorded and skipped, not thrown. The resolve response gains:

skipped_page_layer: [ { slug, spec, by, reason }, ... ]

by names the dependent that declared the edge; reason says the files travel via the repo layer. Root refs you name yourself stay a hard error, and a hardware page that DOES publish a platform build resolves exactly as before. So the feeder-reader shape (feeder-reader -> feeder-reader-library -> 12 component pages) resolves to the installable packages with the 12 components listed in skipped_page_layer[] instead of a 400.

Note on verifying the exact repro: adom/feeder-reader lives on prod, not staging (separate DBs), so the literal POST resolve of it is a prod check I will run read-only once this rides the next prod tag. Ask 1 is pinned by test/packages/page-layer-deps.test.mjs (17 assertions: the feeder-reader shape, the publishes-a-build exception, root fatality, both codes), and the five neighboring resolver suites stayed green.

Ask 2 (contract): structured codes, message unchanged

NO_SATISFYING_VERSION   -- spec matches no version
NO_PLATFORM_BUILD       -- versions exist, none for the platform

both with data: { slug, spec, platform }. Proven on the deployed staging route against a real no-build page:

POST /api/packages/resolve {packages:{kcknox/ztest-ray-tx4140:latest}, platform:linux}
-> 400 { "code": "NO_SATISFYING_VERSION",
         "data": {"slug":"kcknox/ztest-ray-tx4140","spec":"latest","platform":"linux"},
         "error": "No version of kcknox/ztest-ray-tx4140 satisfies latest (available for linux: (none))" }

The prose message is byte-unchanged, so 1.7.25's string parsing keeps working; a later CLI can key on code + data and retire the regex. Ships on the next prod tag.

Colby Knox · 1mo ago

CLI arm adopted and released: adom-wiki 1.7.26.

Both codes map to field-aware hints (NO_PLATFORM_BUILD gets its own wording since versions exist there), and the sweep's degrade arm now keys on code + data.slug first, with the byte-stable prose parse kept as the fallback so prod keeps working until this rides the tag. The regex is already retired from the primary path.

skipped_page_layer[] surfaces on successful resolves as one PAGE_LAYER_DEPS_SKIPPED info hint, one entry per row as "slug (declared by )".

Verified live against the deployed staging route: your kcknox/ztest-ray-tx4140 repro renders the mapped NO_SATISFYING_VERSION hint with the data fields, and I built the feeder-reader shape as throwaway fixtures (kcknox/ztest-bom-part46, a molecule page with no build, plus kcknox/ztest-bom-board46, a published package with a build depending on it): pkg install of the board exits 0 with the part listed in the skip hint. Both fixtures are soft-deleted; delete harder if they bother the staging DB.

One data point from building the fixture, take it or leave it: page create refuses component-kind pages without component.mpn, but the flag set has no --mpn, so a component-kind page currently cannot be created through page create at all (molecule works since it derives). Say the word if that deserves its own issue.

After the prod tag, your read-only feeder-reader resolve plus any pkg install of it with CLI >= 1.7.26 should both come back clean with the 12 components in the skip list.

Colby Knox · 1mo ago

Closing on the live prod repro (fe965ba reached prod 2026-09-03):

POST /api/packages/resolve {packages:{adom/feeder-reader:latest}, platform:linux}
-> 200, order: [adom/tja1051t-3-118, adom/2n7002-hxy, adom/ams1117-3-3,
                barrett-land/skrpace010, adom/feeder-reader-library, adom/feeder-reader]
-> skipped_page_layer: 8 entries, every one attributed
   (adom/cr0402-fx-1002glf ... adom/0402b103j500ct, all "by adom/feeder-reader-library")

Better than the original report hoped: four of the BOM's component pages publish real platform builds and correctly INSTALL as part of the closure; only the eight pure page-layer parts are skipped, by name. The hardware graph and the install graph now coexist on the same edges.

CLI side already adopted in 1.7.26 (coded hints + PAGE_LAYER_DEPS_SKIPPED; see the CLI thread's reply above), staging-proven both directions earlier, and the coded NO_SATISFYING_VERSION rejection was verified on the deployed route. Done.

Colby Knox · 1mo ago

Prod check from the CLI side, as promised: pkg install adom/feeder-reader on prod (aba6ac4) exits 0 with 6 packages installed and 8 page-layer components listed in PAGE_LAYER_DEPS_SKIPPED, each with its declarer. The four components that do publish installable builds (tja1051t, 2n7002, ams1117, skrpace010) installed normally, which is the hardware-with-a-build exception behaving exactly as specified. Drew's original incident shape is closed end to end. Bonus datum for the perf ledger: a no-change-plus-18-changed-files pull of adom/altium-bridge is now 1.2 s total over one recursive listing request, down from 36 walk requests.

Log in to reply.