Context
Parent #17533 owns the second blocking AgentOS extraction proof. Its runtime-denial half must execute every eligible Host-Edge launch target while refusing Cloud packages, but it must not blind-import an entrypoint that starts work, exits, or waits forever merely because static custody says edge.
Vega explicitly separated this H2 receipt from his composition lane: registry-owned runtime-probe eligibility is claimable; the isolated fixture and final instrumentErrors/topologyFindings composer remain with #17533's owner.
Live source at origin/dev@6f0b6619c8 corrects the count in that handoff. collectScriptModules() currently derives 74 unique launch targets; joining them to the reconciled #17525 registry yields 45 Edge targets, not the earlier 38-target snapshot. The population must therefore stay derived rather than become another count authority.
The current registry also groups 95 script-module identities under one Edge custody override. A group-level eligibility flag would silently classify 50 modules that are not in the runtime-probe population. Eligibility needs its own identity-scoped authority.
Structure evidence: the full npm run --silent ai:structure-map -- --files --loc succeeds at the current head. The owning siblings are ai/scripts/diagnostics/agentOsExtractionInventory.{mjs,json} and test/playwright/unit/ai/scripts/diagnostics/agentOsExtractionInventory.spec.mjs; this ticket introduces no new .mjs placement.
The Problem
The existing runtime denial instrument proves real package resolution by importing an explicit target in a child process under module.register() denial. That is correct for a known import-safe target such as ai/services.host.mjs. It is unsafe as a blanket loop over executable scripts:
- a module may run its CLI at top level rather than behind an entrypoint guard;
- import may schedule eager singleton lifecycle work;
- the module may call
process.exit(), spawn a daemon, acquire a lock, or wait on external state;
- an arbitrary non-zero exit can then masquerade as Cloud-package denial unless the composer already knows the target is eligible.
Static closure already recognizes this repository's import-safe guard while walking module facts, but guard syntax alone is not the runtime-probe contract. A guarded module can still import eager services, and an unguarded module may be a pure declarative entrypoint. The judgment must be explicit, source-owned, and drift-checked.
Today the inventory records custody but has no authority saying which derived Edge launch targets may be eagerly evaluated by proof 2. The only alternatives are silent omission or blind execution; both make AC-5 vacuous.
The Architectural Reality
agentOsExtractionInventory.json is the #17525 custody authority; this child extends it rather than creating a second registry.
collectScriptModules() already returns the exact launch-root identities and the derived script-module population.
- Preliminary reconciliation already joins each module to its explicit Edge/Cloud/shared custody before root/workflow/subprocess suggestions are built.
- Eligibility is a second axis over only the unique Edge launch-target population. It does not change disposition.
- #17533's final runtime composer consumes the eligibility result; this child does not run the denial proof or decide its controls.
- The existing inventory spec owns missing/stale/duplicate/same-count mutation resistance and remains the correct test home.
The Fix
Extend the existing inventory and registry in place:
- Add a dedicated identity-scoped
runtimeProbeEligibility authority to agentOsExtractionInventory.json. Each entry names exactly one script-module identity, eligible or ineligible, a non-empty source anchor, and a specific reason.
- Derive the governed population from unique
launchRoots[].rel identities whose reconciled script-module disposition is edge. Never hard-code the current count.
- Reconcile eligibility bidirectionally against that derived set. Missing, stale, duplicate, invalid-status, missing-source, and missing-reason entries are distinct errors. An eligibility row for an Edge module that is not a launch target is stale, not extra coverage.
- Attach the accepted eligibility and reason to the corresponding machine-readable script row (or a deterministic sibling receipt section) without altering custody/disposition.
- Emit total/eligible/ineligible counts plus exact identities in deterministic JSON/human output so #17533 can consume the authority without rereading the raw registry.
- Add mutation arms for a newly added Edge launch target, a removed target, duplicate identity, invalid status, and a same-count identity substitution.
- Preserve import safety: this child performs static/registry reconciliation only. It must not import or execute candidate scripts while classifying them.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
| Edge runtime-probe population |
collectScriptModules().launchRoots joined to reconciled script-module custody |
unique launch targets with disposition === edge; count is derived at runtime |
empty or unowned population REDs |
inventory module JSDoc |
current-tree population + added-target mutation |
runtimeProbeEligibility registry authority |
#17525 registry plus #17533 AC-5 |
exactly one identity-scoped eligible/ineligible judgment, source, and reason per derived target |
no default; missing/stale/duplicate/invalid entries RED |
registry description + reconciliation JSDoc |
missing/stale/duplicate/invalid/same-count mutations |
| machine receipt |
existing inventory JSON/human report |
deterministic exact eligibility rows and counts, orthogonal to custody |
no green-by-omission; errors remain non-zero |
formatter JSDoc |
repeat equality + current-tree exhaustive assertion |
Decision Record impact
Depends on ADR 0040 / PR #17624 and ADR 0039's paired static/runtime evidence contract. It does not amend either record.
Decision Record
Not needed. This is one evidence leaf under the topology and proof contracts already recorded by #17502 and #17533.
Discussion Criteria Mapping
| Parent criterion |
This child |
| #17533 AC-5 eligibility half |
every derived Edge launch target is explicitly eligible or ineligible with a reason before runtime denial composes it |
| no green by omission |
missing/new/substituted targets fail by exact identity; no count or default status licenses a probe |
| reuse existing instruments |
extends the #17525 inventory registry/receipt/spec; creates no parallel classifier or denial hook |
Acceptance Criteria
Out of Scope
- H1 manifest-authority promotion for outside-tree launch roots and package dependencies;
- building the isolated Edge-root / nested-Cloud fixture;
- executing the runtime denial hook or interpreting denial controls;
- composing
instrumentErrors / topologyFindings or naming successor blockers;
- moving files, changing package topology, or authorizing relocation;
- changing any script solely to make it probe-eligible.
Avoided Traps
- Group-level flag on the 95 Edge modules: over-classifies modules outside the launch-target population.
- Hard-coded 38/45 count: converts a measured snapshot into a second authority.
- Guard-syntax inference: confuses one static pattern with eager-evaluation safety.
- Blind import to discover safety: executes the risk the registry exists to prevent.
eligible by default: makes new launch targets invisible to the proof gate.
- Fold into #17533's composer: re-couples a clean authority receipt to fixture/runtime implementation and blocks parallel progress.
Related
Parent: #17533. Proof 1 / registry owner: #17525 / PR #17530. Decision record: #17502 / PR #17624. Epic: #17500.
Origin Session ID: 01a02ead-f0db-7b30-b4e2-54189808ab54
Retrieval Hint: AgentOS runtime probe eligibility Edge launch targets blind import #17533 H2
Context
Parent #17533 owns the second blocking AgentOS extraction proof. Its runtime-denial half must execute every eligible Host-Edge launch target while refusing Cloud packages, but it must not blind-import an entrypoint that starts work, exits, or waits forever merely because static custody says
edge.Vega explicitly separated this H2 receipt from his composition lane: registry-owned runtime-probe eligibility is claimable; the isolated fixture and final
instrumentErrors/topologyFindingscomposer remain with #17533's owner.Live source at
origin/dev@6f0b6619c8corrects the count in that handoff.collectScriptModules()currently derives 74 unique launch targets; joining them to the reconciled #17525 registry yields 45 Edge targets, not the earlier 38-target snapshot. The population must therefore stay derived rather than become another count authority.The current registry also groups 95
script-moduleidentities under one Edge custody override. A group-level eligibility flag would silently classify 50 modules that are not in the runtime-probe population. Eligibility needs its own identity-scoped authority.Structure evidence: the full
npm run --silent ai:structure-map -- --files --locsucceeds at the current head. The owning siblings areai/scripts/diagnostics/agentOsExtractionInventory.{mjs,json}andtest/playwright/unit/ai/scripts/diagnostics/agentOsExtractionInventory.spec.mjs; this ticket introduces no new.mjsplacement.The Problem
The existing runtime denial instrument proves real package resolution by importing an explicit target in a child process under
module.register()denial. That is correct for a known import-safe target such asai/services.host.mjs. It is unsafe as a blanket loop over executable scripts:process.exit(), spawn a daemon, acquire a lock, or wait on external state;Static closure already recognizes this repository's import-safe guard while walking module facts, but guard syntax alone is not the runtime-probe contract. A guarded module can still import eager services, and an unguarded module may be a pure declarative entrypoint. The judgment must be explicit, source-owned, and drift-checked.
Today the inventory records custody but has no authority saying which derived Edge launch targets may be eagerly evaluated by proof 2. The only alternatives are silent omission or blind execution; both make AC-5 vacuous.
The Architectural Reality
agentOsExtractionInventory.jsonis the #17525 custody authority; this child extends it rather than creating a second registry.collectScriptModules()already returns the exact launch-root identities and the derived script-module population.The Fix
Extend the existing inventory and registry in place:
runtimeProbeEligibilityauthority toagentOsExtractionInventory.json. Each entry names exactly one script-module identity,eligibleorineligible, a non-empty source anchor, and a specific reason.launchRoots[].relidentities whose reconciled script-module disposition isedge. Never hard-code the current count.Contract Ledger Matrix
collectScriptModules().launchRootsjoined to reconciledscript-modulecustodydisposition === edge; count is derived at runtimeruntimeProbeEligibilityregistry authorityDecision Record impact
Depends on ADR 0040 / PR #17624 and ADR 0039's paired static/runtime evidence contract. It does not amend either record.
Decision Record
Not needed. This is one evidence leaf under the topology and proof contracts already recorded by #17502 and #17533.
Discussion Criteria Mapping
Acceptance Criteria
eligibleorineligibleregistry judgment with a source anchor and specific reason; no status is inferred from filename or guard syntax.Out of Scope
instrumentErrors/topologyFindingsor naming successor blockers;Avoided Traps
eligibleby default: makes new launch targets invisible to the proof gate.Related
Parent: #17533. Proof 1 / registry owner: #17525 / PR #17530. Decision record: #17502 / PR #17624. Epic: #17500.
Origin Session ID: 01a02ead-f0db-7b30-b4e2-54189808ab54
Retrieval Hint:
AgentOS runtime probe eligibility Edge launch targets blind import #17533 H2