Skip to content

RFC: Core-resolved product manifests - #610

Open
filvecchiato wants to merge 1 commit into
rfc/granted-scopesfrom
feat/core-manifest-resolution
Open

RFC: Core-resolved product manifests#610
filvecchiato wants to merge 1 commit into
rfc/granted-scopesfrom
feat/core-manifest-resolution

Conversation

@filvecchiato

Copy link
Copy Markdown
Collaborator

The core resolves each product's root manifest from dotNS and answers whether one
product grants another a scope. Hosts neither fetch manifests nor decide what a
grant covers, so a grant means the same thing wherever a product runs.

Resolution derives the node, finds the resolver through the dotNS registry and
reads the manifest text record, reusing the gateway helpers and the
pinned-block transport the identity lookup drives. That transport lives in
runtime/dotns_lookup.rs, shared by both readers.

A resolved manifest is cached in CoreStorage and honoured for one day. The
lifetime is a revocation bound rather than a performance knob: a record edit
carries no signal, so a withdrawn grant takes effect when the manifest is next
read.

Every reason a grant cannot be established answers the same — unresolvable name,
no manifest, failed fetch, narrower scope — so a cross-product call cannot probe
which products exist. An unreachable chain withdraws grants rather than assuming
them.

Based on #454, which carries the adjudication seam this fills.

Verification

  • 817 truapi-server tests, whole workspace green
  • cargo +nightly fmt --check and workspace clippy clean
  • codegen regenerated and diffed: the only movement is the new
    CoreStorageKey::ProductManifest variant and the wire schema hash

A user's own denial is not consulted yet — nothing prompts for cross-product
access, so there is no stored denial to read. The check belongs with the prompt
that creates one.

The core reads a product's root manifest from dotNS and answers whether one
product grants another a scope, so `manifest_grants_scope` returns a real answer
instead of always refusing. Hosts neither fetch manifests nor decide what a grant
covers.

Resolution derives the node, finds the resolver through the dotNS registry and
reads the `manifest` text record, reusing the gateway helpers and the pinned-block
transport the identity lookup already drives. That transport moves out of
identity.rs into runtime/dotns_lookup.rs, since both readers need it.

A resolved manifest is cached in CoreStorage and honoured for one day. That
lifetime is a revocation bound: a record edit carries no signal, so a withdrawn
grant takes effect when the manifest is next read.

Every reason a grant cannot be established answers the same — unresolvable name,
no manifest, failed fetch, narrower scope — so a cross-product call cannot probe
which products exist, and an unreachable chain withdraws grants rather than
assuming them.
@filvecchiato
filvecchiato force-pushed the feat/core-manifest-resolution branch from e732261 to 482afe2 Compare September 4, 2026 16:11
@filvecchiato filvecchiato linked an issue Sep 4, 2026 that may be closed by this pull request
8 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RFC: Core-resolved product manifests

1 participant