Skip to content

Consolidate normative scope into Core: declaration acceptance moved from Discovery and Trust; Collection Profile and Discovery and Trust become informative - #283

Closed
artvana wants to merge 2 commits into
docs/governance-remove-stewardfrom
spec/consolidate-normative-scope-into-core
Closed

Consolidate normative scope into Core: declaration acceptance moved from Discovery and Trust; Collection Profile and Discovery and Trust become informative#283
artvana wants to merge 2 commits into
docs/governance-remove-stewardfrom
spec/consolidate-normative-scope-into-core

Conversation

@artvana

@artvana artvana commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Narrows the normative surface to Core before the 3 September lock. Everything a conformant implementation must do is now stated in one document.

Stacked on #279 (docs/governance-remove-steward), because change F edits GOVERNANCE.md §5.5, which exists only on that branch. Merge #279 first, or retarget this at main once it lands.

A. Core §5 gains "Declaration acceptance"

New subsection after "Versioning and snapshots", in RFC 2119 terms, stating what was previously only in the Discovery and Trust companion:

  • a declaration is accepted only through owner/operator onboarding, an installed catalog, an accepted registry entry, or local provisioning, and a client MUST NOT introduce a source authority or declaration URI during authorization;
  • for provider_native, source.id MUST equal the already-accepted protected-resource identifier, and a mismatched source.id or source.kind MUST be rejected before consent or grant issuance;
  • publisher.id is an unauthenticated claim absent an accepted channel or configured mapping, and MUST NOT be relied on for acceptance, attribution, redirect policy or any other trust decision;
  • an accepted revision is keyed by authority binding, source.id and declaration_version; different parsed content under an accepted key is equivocation and MUST be rejected, with no ordering or freshness inferred from declaration_version;
  • retrieval MUST be HTTPS without ambient credentials, MUST enforce size, time and redirect-depth limits, MUST validate every redirect target and the final URL, MUST resolve DNS freshly per connection attempt, MUST reject a declaration requiring remote-schema retrieval, and MUST fail closed;
  • display values MUST be escaped for their output context, and current capabilities MUST NOT widen an issued grant.

§1's scope row for §5 no longer lists declaration discovery and trust as another layer and now names declaration acceptance as in scope. §5's opening note points at the informative document for retrieval mechanics.

B. Discovery and Trust becomes informative

Status header now reads "Informative. Implementation guidance. Normative requirements moved to Core §5 Declaration acceptance on 2026-09-02." The RFC 2119 keyword paragraph is removed. Content otherwise intact.

C. Collection Profile becomes informative

Status header now reads "Informative. Builder guidance for connector collection. Not a conformance requirement.", followed by: "A connector conforms to PDPP by producing a source declaration valid under Core §5 and serving its data through a resource server conforming to Core §8. No particular collection method is required."

D. README

Normative is Core alone. Both documents move to Informative with their new descriptions. The authority order now reads "the normative spec (spec-core.md)", and the lead paragraph says one root spec is normative rather than three.

E. Site

pnpm spec:check passes — 9 canonical pairs, 3 site-only extensions, 1 reference-only root spec.

  • The rail's PRIMARY_SLUGS is Core plus the three extension profiles. The two demoted documents move to a new GUIDANCE_SLUGS under a third rail heading, Implementer guidance, registered in rail.tsx's RAIL_SECTION_LABELS.
  • content/docs/meta.json gains an Implementer guidance separator and lists them under it.
  • The docs index's "Protocol" cards are Core only, with a separate "Implementer guidance" group marked informative. Its stale /docs/... hrefs are corrected to /specification/....
  • Both header sidecars gain an Informative callout naming the Core section that carries the requirements, and their descriptions say informative.

F. GOVERNANCE.md

§5.5 states, after the Conformant Source paragraph, that a connector source conforms by producing a declaration validating against Core §5 and serving through a resource server conforming to Core §8, with no particular collection method required.

Two corrections that came with the demotion

Both were direct contradictions once the two documents became informative, so they are fixed here rather than left to contradict the status headers:

  • Core's Requirements Language section said the Collection Profile "uses the same requirements language". It now states Core is the only normative PDPP document and names both informative documents.
  • Core §1 said the Collection Profile "standardizes that bridge". It now describes it as informative builder guidance and states the connector conformance rule.

Notes

Date: headers on the three edited specs are stamped 2026-09-02. pnpm spec:dates was already failing on main for spec-connector-ecosystem.md, spec-deferred.md and spec-reference-implementation-examples.md; those are untouched, since stamping them would claim a substantive change that did not happen here.

apps/site-blume-spike/content/governance.md is regenerated from the root document by that spike's own sync-canonical-content.mjs.

Checks

spec:check passes. pnpm --dir apps/site types:check, test (202 passed, 0 failed), check (0 errors; the 4 suppressions/unused warnings are pre-existing) and build all pass.

Verified on the served production build: /specification, /specification/spec-discovery-and-trust and /specification/spec-collection-profile all return 200; the rail renders Specification (Core plus the three extensions), then Implementer guidance (the two demoted documents), then Programme; the informative callouts render on both guidance pages; and id="declaration-acceptance" resolves on /specification with the new subsection's text present.

Assisted-by: AI

🤖 Generated with Claude Code

https://claude.ai/code/session_01NECjjZbYWNTzq3bu7nuiDP

artvana and others added 2 commits September 2, 2026 22:06
Before the 3 September lock, the normative surface becomes Core alone.

Core §5 gains "Declaration acceptance", which states in RFC 2119 terms what
was previously only in the Discovery and Trust companion: a declaration is
accepted through onboarding, an installed catalog, an accepted registry entry
or local provisioning, and a client MUST NOT introduce a source authority or
declaration URI during authorization; provider_native source.id MUST equal the
already-accepted protected-resource identifier; publisher.id is an
unauthenticated claim absent a binding; an accepted revision is keyed by
authority binding, source.id and declaration_version, and different content
under an accepted key is equivocation; retrieval MUST be HTTPS without ambient
credentials, MUST enforce size, time and redirect-depth limits, MUST validate
every redirect target, MUST resolve DNS freshly, MUST reject remote-schema
retrieval and MUST fail closed; display values MUST be escaped; current
capabilities MUST NOT widen an issued grant.

§1's scope row for §5 no longer lists declaration discovery and trust as
another layer, and §5's note points at the informative document for mechanics.

spec-discovery-and-trust.md and spec-collection-profile.md become informative.
Discovery and Trust loses its RFC 2119 keyword paragraph; the Collection
Profile states that a connector conforms by producing a declaration valid
under Core §5 and serving through a resource server conforming to Core §8.
Content is otherwise intact.

Two lines in Core contradicted the demotion and are corrected with it: the
Requirements Language section said the Collection Profile "uses the same
requirements language", and §1 said it "standardizes" the collection bridge.

README's Normative list is Core alone, both documents move to Informative with
their new descriptions, and the authority order names the normative spec.

The site rail, meta.json and docs index list the two under "Implementer
guidance" rather than beside Core, and each site copy carries an informative
callout. GOVERNANCE.md §5.5 states the same connector conformance rule.

Date headers on the three edited specs are stamped 2026-09-02. Four other
specs were already stale under `pnpm spec:dates` and are left alone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NECjjZbYWNTzq3bu7nuiDP
Signed-off-by: Art A <129354338+artvana@users.noreply.github.com>
Generated from the root GOVERNANCE.md by that spike's own
sync-canonical-content.mjs, so it carries the §5.5 connector conformance
sentence rather than drifting again.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NECjjZbYWNTzq3bu7nuiDP
Signed-off-by: Art A <129354338+artvana@users.noreply.github.com>
@vercel

vercel Bot commented Sep 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
pdpp Ready Ready Preview Sep 2, 2026 8:08pm UTC

Request Review

tnunamak added a commit that referenced this pull request Sep 2, 2026
…gateway

OWNER-DECISION: normative (adds one SHOULD NOT). Not ratified.

Sources: Geneva notes (c) and (f), relayed 2026-09-02:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788337128917169
and the owner's clarification in-thread:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788342568209169
"the spec could refer to authorization and resource servers without
defining how data gets into the resource server ... The Collection Profile
spec can define how data connectors can get data into a resource server."
Note (f) asked for a sanity check on a personal server acting as a gateway
to platform data using an owner credential against the platform's PDPP API.

Two additions to Section 3, after Example B.

First, Core states plainly that it defines no ingest path and that
conformance does not depend on one. Section 3 already called its two
examples a spectrum rather than a closed set; this says the same thing as a
statement about Core's scope rather than as a caveat about the examples.

Second, the gateway idea is recorded as already permitted, because it is:
the personal server is a conformant client in the first relationship and a
conformant resource server in the second. Nothing new is needed to build
it. The open part is not whether it works but what the onward grant may
say about the originating one, so the paragraph names that question and
adds an interim SHOULD NOT against issuing an onward grant broader or
longer than the grant the records arrived under.

WHAT THIS DOES NOT DO, and why:

The instinct in note (c) was that connectors and native mode "are currently
superficial and can be edited out of the core spec entirely". They are not
superficial, and this branch does not remove them. `source.kind` is a
required field of the source declaration, its two values are validated
against the accepted declaration before consent, a mismatch is a Source
validation failure, and the derived provenance is recorded in consent
evidence and in the issued grant. Art's open #283 adds a further normative
rule keyed on `provider_native`. Removing `source.kind` is a breaking change
to the declaration schema and the grant, not an editorial deletion, and it
would conflict with #283 rather than compose with it.

What note (c) actually asked for -- that Core not define how data reaches
the resource server -- is what this commit states, and what #283 delivers
from the other direction by making the Collection Profile informative.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak added a commit that referenced this pull request Sep 2, 2026
OWNER-DECISION: normative. Three new requirements in Core; two documents
demoted out of the normative set. Not ratified.

Source: owner scope addendum 2026-09-02 ~17:40, item B; text taken from the
sibling audit at local/SPEC-SURFACE-AUDIT-0902.md (inserts A, B and C of
its section 1.5). The audit is read-only analysis by a separate lane; this
commit applies its proposed text, it does not re-derive it.

Art wants v0.1.0's normative surface to be the core spec alone. The audit
traced what actually depends on the two companion documents and found the
load-bearing residue is about 200 words. Applied here:

1. Equivocation, into Section 5 Versioning and snapshots. Core already said
   declaration_version is opaque with no implied ordering; it never said
   what happens when the SAME version label later carries DIFFERENT content.
   That is the security property -- it is what stops a publisher swapping
   content under a label an authorization server already consented against
   -- and it was the single genuine gap. Now a MUST.

2. Source acceptance, as a new Section 6 subsection. Core described what a
   selection request contains, never what it may not name. The rule that a
   client cannot introduce a source authority, declaration location, or
   revision during authorization is enforced fail-closed in the reference
   implementation's PAR path today; Core now states it.

3. Publisher attribution, replacing two dangling pointers. Core deferred
   twice to "discovery and trust policy" -- a document that, after Art's
   #279 removes Official Source, has zero inbound references anywhere in
   the repository. The rule is now stated where the field is defined.

Both companion documents are relabelled Informative in their root status
lines, and both header sidecars gain the Informative callout they never
had, so the site stops rendering them beside Core with no visible status
distinction.

WHAT THIS DELIBERATELY DOES NOT DO:

The Collection Profile is NOT moved to data-connectors tonight, on the
audit's recommendation and for a reason worth repeating: a manifest written
to its published bindings table is rejected by the reference
implementation's own validator (the spec publishes `browser_automation`;
the validator accepts `browser` and hard-rejects unknown keys; 0 of 45
shipping manifests use the published name). Moving a known-wrong contract
into the repo whose authors are its primary readers ships the defect to
exactly the people most likely to follow it. Reclassify now, refresh, then
move something true.

The three extension profiles are left alone. They are already allowlisted
in ratified OpenSpec governance, CI-enforced, status-labelled, and required
not to be depended on by Core. They are the pattern, not the problem.

README.md and the site rail's grouping are NOT touched here, though both
are stale in exactly this respect. Art's open #283 makes those same edits.
Duplicating them guarantees a conflict and gains nothing. The slug list
keeps a comment explaining why it was left unrestructured.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak added a commit that referenced this pull request Sep 2, 2026
…gateway

OWNER-DECISION: normative (adds one SHOULD NOT). Not ratified.

Sources: Geneva notes (c) and (f), relayed 2026-09-02:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788337128917169
and the owner's clarification in-thread:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788342568209169
"the spec could refer to authorization and resource servers without
defining how data gets into the resource server ... The Collection Profile
spec can define how data connectors can get data into a resource server."
Note (f) asked for a sanity check on a personal server acting as a gateway
to platform data using an owner credential against the platform's PDPP API.

Two additions to Section 3, after Example B.

First, Core states plainly that it defines no ingest path and that
conformance does not depend on one. Section 3 already called its two
examples a spectrum rather than a closed set; this says the same thing as a
statement about Core's scope rather than as a caveat about the examples.

Second, the gateway idea is recorded as already permitted, because it is:
the personal server is a conformant client in the first relationship and a
conformant resource server in the second. Nothing new is needed to build
it. The open part is not whether it works but what the onward grant may
say about the originating one, so the paragraph names that question and
adds an interim SHOULD NOT against issuing an onward grant broader or
longer than the grant the records arrived under.

WHAT THIS DOES NOT DO, and why:

The instinct in note (c) was that connectors and native mode "are currently
superficial and can be edited out of the core spec entirely". They are not
superficial, and this branch does not remove them. `source.kind` is a
required field of the source declaration, its two values are validated
against the accepted declaration before consent, a mismatch is a Source
validation failure, and the derived provenance is recorded in consent
evidence and in the issued grant. Art's open #283 adds a further normative
rule keyed on `provider_native`. Removing `source.kind` is a breaking change
to the declaration schema and the grant, not an editorial deletion, and it
would conflict with #283 rather than compose with it.

What note (c) actually asked for -- that Core not define how data reaches
the resource server -- is what this commit states, and what #283 delivers
from the other direction by making the Collection Profile informative.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak added a commit that referenced this pull request Sep 2, 2026
OWNER-DECISION: normative. Three new requirements in Core; two documents
demoted out of the normative set. Not ratified.

Source: owner scope addendum 2026-09-02 ~17:40, item B; text taken from the
sibling audit at local/SPEC-SURFACE-AUDIT-0902.md (inserts A, B and C of
its section 1.5). The audit is read-only analysis by a separate lane; this
commit applies its proposed text, it does not re-derive it.

Art wants v0.1.0's normative surface to be the core spec alone. The audit
traced what actually depends on the two companion documents and found the
load-bearing residue is about 200 words. Applied here:

1. Equivocation, into Section 5 Versioning and snapshots. Core already said
   declaration_version is opaque with no implied ordering; it never said
   what happens when the SAME version label later carries DIFFERENT content.
   That is the security property -- it is what stops a publisher swapping
   content under a label an authorization server already consented against
   -- and it was the single genuine gap. Now a MUST.

2. Source acceptance, as a new Section 6 subsection. Core described what a
   selection request contains, never what it may not name. The rule that a
   client cannot introduce a source authority, declaration location, or
   revision during authorization is enforced fail-closed in the reference
   implementation's PAR path today; Core now states it.

3. Publisher attribution, replacing two dangling pointers. Core deferred
   twice to "discovery and trust policy" -- a document that, after Art's
   #279 removes Official Source, has zero inbound references anywhere in
   the repository. The rule is now stated where the field is defined.

Both companion documents are relabelled Informative in their root status
lines, and both header sidecars gain the Informative callout they never
had, so the site stops rendering them beside Core with no visible status
distinction.

WHAT THIS DELIBERATELY DOES NOT DO:

The Collection Profile is NOT moved to data-connectors tonight, on the
audit's recommendation and for a reason worth repeating: a manifest written
to its published bindings table is rejected by the reference
implementation's own validator (the spec publishes `browser_automation`;
the validator accepts `browser` and hard-rejects unknown keys; 0 of 45
shipping manifests use the published name). Moving a known-wrong contract
into the repo whose authors are its primary readers ships the defect to
exactly the people most likely to follow it. Reclassify now, refresh, then
move something true.

The three extension profiles are left alone. They are already allowlisted
in ratified OpenSpec governance, CI-enforced, status-labelled, and required
not to be depended on by Core. They are the pattern, not the problem.

README.md and the site rail's grouping are NOT touched here, though both
are stale in exactly this respect. Art's open #283 makes those same edits.
Duplicating them guarantees a conflict and gains nothing. The slug list
keeps a comment explaining why it was left unrestructured.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak added a commit that referenced this pull request Sep 3, 2026
…gateway

OWNER-DECISION: normative (adds one SHOULD NOT). Not ratified.

Sources: Geneva notes (c) and (f), relayed 2026-09-02:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788337128917169
and the owner's clarification in-thread:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788342568209169
"the spec could refer to authorization and resource servers without
defining how data gets into the resource server ... The Collection Profile
spec can define how data connectors can get data into a resource server."
Note (f) asked for a sanity check on a personal server acting as a gateway
to platform data using an owner credential against the platform's PDPP API.

Two additions to Section 3, after Example B.

First, Core states plainly that it defines no ingest path and that
conformance does not depend on one. Section 3 already called its two
examples a spectrum rather than a closed set; this says the same thing as a
statement about Core's scope rather than as a caveat about the examples.

Second, the gateway idea is recorded as already permitted, because it is:
the personal server is a conformant client in the first relationship and a
conformant resource server in the second. Nothing new is needed to build
it. The open part is not whether it works but what the onward grant may
say about the originating one, so the paragraph names that question and
adds an interim SHOULD NOT against issuing an onward grant broader or
longer than the grant the records arrived under.

WHAT THIS DOES NOT DO, and why:

The instinct in note (c) was that connectors and native mode "are currently
superficial and can be edited out of the core spec entirely". They are not
superficial, and this branch does not remove them. `source.kind` is a
required field of the source declaration, its two values are validated
against the accepted declaration before consent, a mismatch is a Source
validation failure, and the derived provenance is recorded in consent
evidence and in the issued grant. Art's open #283 adds a further normative
rule keyed on `provider_native`. Removing `source.kind` is a breaking change
to the declaration schema and the grant, not an editorial deletion, and it
would conflict with #283 rather than compose with it.

What note (c) actually asked for -- that Core not define how data reaches
the resource server -- is what this commit states, and what #283 delivers
from the other direction by making the Collection Profile informative.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
@artvana
artvana requested review from annakaz and tnunamak September 3, 2026 07:55
@artvana

artvana commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

@tnunamak @annakaz — review context for all three open PRs, and the order to take them, is in one comment on #279: #279 (comment)

This one is stacked on #279's branch, so it needs #279 first. Retarget it at main if you would rather take them separately.

tnunamak added a commit that referenced this pull request Sep 3, 2026
…gateway

OWNER-DECISION: normative (adds one SHOULD NOT). Not ratified.

Sources: Geneva notes (c) and (f), relayed 2026-09-02:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788337128917169
and the owner's clarification in-thread:
https://vana-org.slack.com/archives/C0B9AKY6ZDH/p1788342568209169
"the spec could refer to authorization and resource servers without
defining how data gets into the resource server ... The Collection Profile
spec can define how data connectors can get data into a resource server."
Note (f) asked for a sanity check on a personal server acting as a gateway
to platform data using an owner credential against the platform's PDPP API.

Two additions to Section 3, after Example B.

First, Core states plainly that it defines no ingest path and that
conformance does not depend on one. Section 3 already called its two
examples a spectrum rather than a closed set; this says the same thing as a
statement about Core's scope rather than as a caveat about the examples.

Second, the gateway idea is recorded as already permitted, because it is:
the personal server is a conformant client in the first relationship and a
conformant resource server in the second. Nothing new is needed to build
it. The open part is not whether it works but what the onward grant may
say about the originating one, so the paragraph names that question and
adds an interim SHOULD NOT against issuing an onward grant broader or
longer than the grant the records arrived under.

WHAT THIS DOES NOT DO, and why:

The instinct in note (c) was that connectors and native mode "are currently
superficial and can be edited out of the core spec entirely". They are not
superficial, and this branch does not remove them. `source.kind` is a
required field of the source declaration, its two values are validated
against the accepted declaration before consent, a mismatch is a Source
validation failure, and the derived provenance is recorded in consent
evidence and in the issued grant. Art's open #283 adds a further normative
rule keyed on `provider_native`. Removing `source.kind` is a breaking change
to the declaration schema and the grant, not an editorial deletion, and it
would conflict with #283 rather than compose with it.

What note (c) actually asked for -- that Core not define how data reaches
the resource server -- is what this commit states, and what #283 delivers
from the other direction by making the Collection Profile informative.

Assisted-by: AI
Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
@tnunamak

tnunamak commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Superseded by #285, merged to main as 99fcca3. This PR's commits were carried into that stack with authorship preserved (as #307 for the governance model and #308 for the normative-scope consolidation), with the follow-on changes recorded in the stack's decision rows. Closing without merge so the history has one path.

@tnunamak tnunamak closed this Sep 3, 2026
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.

2 participants