diff --git a/build/adr/addressing-and-permanence/v1/index.html b/build/adr/addressing-and-permanence/v1/index.html index dcf4fb8..027f6aa 100644 --- a/build/adr/addressing-and-permanence/v1/index.html +++ b/build/adr/addressing-and-permanence/v1/index.html @@ -1,6 +1,6 @@ - + Policy addressing and permanence -
policy-nexus-adr-0001 accepted · accepted-1 the-custodian reviewed 2026-08-18generated from canonical source — do not edit

Policy addressing and permanence

Source: policy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · a8fb62a3bcbff3daf03e5d3d56c3ca3a5bd991f8

Review due: 2027-02-18

  • Status: accepted
  • Date: 2026-08-18
  • Owner: the-custodian
+
policy-nexus-adr-0001 accepted · accepted-1 the-custodian reviewed 2026-08-18generated from canonical source — do not edit

Policy addressing and permanence

Source: policy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · 9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0

Review due: 2027-02-18

  • Status: accepted
  • Date: 2026-08-18
  • Owner: the-custodian

Decision

A document has one stable current address and immutable revision addresses:

/<kind>/<document>/<version>/
@@ -211,4 +211,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
 

Consequences

  • Builds fail if a source disappears, an id differs, a path collides, or an immutable revision would change; stale output is not silently called fresh.
  • Pages show status, revision, owner, last review and exact source revision.
  • Availability remains restart recovery on the single-node rail. This contract promises stable addressing, not a high-availability SLA.
-
policy-nexus-adr-0001 · accepted-1 · acceptedpolicy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · a8fb62a3bcbff3daf03e5d3d56c3ca3a5bd991f8
+
diff --git a/build/architecture/coulomb-estate/v0.1/index.html b/build/architecture/coulomb-estate/v0.1/index.html new file mode 100644 index 0000000..637911c --- /dev/null +++ b/build/architecture/coulomb-estate/v0.1/index.html @@ -0,0 +1,274 @@ + + + + +Coulomb estate architecture + +
coulomb-estate-architecture proposed · draft-1 the-custodian reviewed 2026-08-18generated from canonical source — do not edit

Coulomb estate architecture

Source: the-custodian · canon/architecture/coulomb-estate_v0.1.md · 5b51623198d9959793762f447f5813960c0b5df8

Review due: 2027-02-18

About this document

+

This is the first-wave estate map. It describes how the Coulomb / Custodian estate is put together: canons, hubs, rails, and publication. System-level arc42 documents (Railiance, NetKingdom, State Hub, Policy Nexus) live in their owning repos. Chapter 9 lists estate ADRs; it does not paste them.

+
+

01Introduction and Goals

+

the-custodian holds meaning, boundaries, and continuity for a local-first agent estate. Implementation lives in product repos. Coordination state is a read-model of repository files, not the origin of those files.

+

1.1 Requirements Overview

+
  • Work, decisions, and canon originate as files in the owning repo.
  • A publication surface keeps governing documents at permanent URLs.
  • Runtime (Rails, rApps, identity, storage) is consumed from platform packages, not reimplemented in the custodian.
  • Cross-repo work is coordinated, not owned, by a dedicated project repo when it does not belong to one product.
+

1.2 Quality Goals

+
  1. Rebuildability — State Hub can be reconstructed from registered repository files (ADR-001).
  2. Concept ownership — canons import, they do not redefine (ADR-006).
  3. Permanence of published policy addresses (policy-nexus ADR-0001).
  4. Honest currency — stale documents are visibly stale.
+

1.3 Stakeholders

+
RoleConcern
OperatorWhat must be discussed in person; ratification.
the-custodianCanon, values, constitution, estate ADRs.
Product reposImplementation and per-repo ADRs.
railiance-platformSubstrate: DNS, TLS, ingress, hosting.
policy-nexusPublication only.
info-tech-canonSemantic model, not this estate's building blocks.
+
+

02Architecture Constraints

+

N/A in this revision — local-first files, no second source of truth, stdlib-preferring tooling, single-node rail availability. To be written as first-wave complete.

+
+

03System Scope and Context

+

In: estate canon (constitution, standards, architecture ADRs), the federation of canons, the publication contract, the hub-as-read-model rule, and the map of first-wave systems.

+

Out: product implementation, InfoTechCanon's landscape model, regulatory intake (risk-nexus), and per-system deployment detail (those belong in the system arc42).

+

3.1 Business Context

+

The estate is a set of repositories that together run Coulomb products and the agent work-factory. Readers need one map of what governs what. Owners need a place that is not also the implementation.

+

3.2 Technical Context

+
NeighbourInterface
Owning git reposSource of workplans, ADRs, canon.
State HubDerived index / cache of those files.
policy.coulomb.socialGenerated publication of canon and ADRs.
Railiance reefRuntime for hubs, rApps, Forgejo.
NetKingdomIdentity, tenancy, IAM profile.
info-tech-canonImported semantics, not estate structure.
+
+

04Solution Strategy

+
  • Files first. Workplans and ADRs are markdown in git. The hub rebuilds from them (ADR-001, ADR-003).
  • One registrar. Workplan identifiers are globally unique; this workstation is not the registrar (ADR-007).
  • Three canons, federated. Custodian (governance), InfoTechCanon (information-system semantics), CommerceCanon (counterparty semantics). They import, they do not redefine (ADR-006).
  • Publish, do not author. policy-nexus reads owning repos and emits static addresses. It never writes back.
  • Project repos for cross-repo work (prj-*), not an unbound hub workplan (ADR-005).
+
+

05Building Block View

+

5.1 Level 1 – System/Top-Level

+
                    ┌─────────────────────────┐
+                    │     the-custodian       │
+                    │  constitution, values,  │
+                    │  estate ADRs, memory    │
+                    └────────────┬────────────┘
+           ┌─────────────────────┼─────────────────────┐
+           ▼                     ▼                     ▼
+   ┌───────────────┐    ┌────────────────┐    ┌─────────────────┐
+   │ info-tech-    │    │ commerce-canon │    │ net-kingdom     │
+   │ canon         │    │                │    │ (identity /     │
+   │ (semantics)   │    │                │    │  tenancy)       │
+   └───────────────┘    └────────────────┘    └────────┬────────┘
+                                                       │
+   ┌───────────────┐    ┌────────────────┐             │
+   │ state-hub     │◄───│ product repos  │◄────────────┘
+   │ (read model)  │    │ + project repos│
+   └───────────────┘    └────────┬───────┘
+                                 │
+                    ┌────────────┴────────────┐
+                    ▼                         ▼
+           ┌────────────────┐        ┌─────────────────┐
+           │ railiance      │        │ policy-nexus    │
+           │ (reef, rApps)  │        │ (publication)   │
+           └────────────────┘        └─────────────────┘
+

5.2 Level 2 – Key Components

+

N/A in this revision.

+

5.3 Level 3 – Internal Structure (as needed)

+

N/A in this revision.

+
+

06Runtime View

+

N/A — estate coordination is file sync plus hub rebuild, not a single runtime scenario. System runtimes belong in their own arc42.

+
+

07Deployment View

+

N/A — Railiance owns where things run. This document names the substrate; it does not map nodes.

+
+

08Cross-Cutting Concepts

+

N/A in this revision. Concept ownership and the hub/cache split are already in §4 and the ADRs in §9.

+
+

09Architecture Decisions

+

Estate ADRs in the-custodian/canon/architecture/. Publication ids still need repo prefixes (WP-0003). Status is the source front-matter.

+
SourceStatusDecision
adr-001-workplans-as-repo-artefacts.mdacceptedWorkplans and tasks originate as repo files; the hub is a read model.
adr-002-custodian-agent-runtime-design.mdacceptedCustodian agent runtime design.
adr-003-materialized-derived-state.mdacceptedHub state is derived and fingerprint-invalidated.
adr-004-connectivity-first-network-posture.mdacceptedConnectivity-first network posture.
adr-005-cross-repo-workplans-project-repos.mdacceptedCross-repo work lives in a prj-* repo.
adr-006-canon-federation-concept-ownership.mdacceptedThree canons; import, do not redefine.
adr-007-workplan-identity-and-repo-worker-topology.mdacceptedGlobally unique workplan ids; one registrar.
adr-008-multi-tenancy-model.mdsupersededRelocated to NetKingdom Tenancy Posture.
adr-010-hub-authority-and-local-cache-model.mdproposedTwo kinds of hub data; local cache vs authority.
adr-011-federated-namespaces-and-reconciliation-limits.mdproposedFederated namespaces and reconciliation limits.
+

Related, not estate-owned: policy-nexus ADR-0001 (addressing), NetKingdom Tenancy Posture (published), railiance-master ADR-0001–0008 (published).

+

Unresolved WP-0003 conflicts (hosts/infra duplicate ADR-003/004, coulomb-social ADR-0002 partial supersession) are not listed as current.

+
+

10Quality Requirements

+

N/A in this revision — rebuildability and currency already have mechanical checks (fix-consistency, make currency).

+
+

11Risks and Technical Debt

+

N/A in this revision. Known residual: this workstation cannot mint hub UUIDs (ADR-007 registrar). Markitect arc42-v1 is not registered yet.

+
+

12Glossary

+
TermMeaning
EstateThe set of Coulomb / Custodian repos, canons, hubs, and rails.
CanonGoverning documents owned by one of the three federated canons.
Read modelA derived index. Never the origin of work or decisions.
Publication entryOne explicit object in policy-nexus publication.json.
First-wave completeChapters 1, 3, 4, 5.1, 9 and 12 are real; others real or N/A.
Project repoA prj-* repo that coordinates cross-repo work (ADR-005).
+
diff --git a/build/architecture/coulomb-estate/v0.1/revisions/draft-1/index.html b/build/architecture/coulomb-estate/v0.1/revisions/draft-1/index.html new file mode 100644 index 0000000..637911c --- /dev/null +++ b/build/architecture/coulomb-estate/v0.1/revisions/draft-1/index.html @@ -0,0 +1,274 @@ + + + + +Coulomb estate architecture + +
coulomb-estate-architecture proposed · draft-1 the-custodian reviewed 2026-08-18generated from canonical source — do not edit

Coulomb estate architecture

Source: the-custodian · canon/architecture/coulomb-estate_v0.1.md · 5b51623198d9959793762f447f5813960c0b5df8

Review due: 2027-02-18

About this document

+

This is the first-wave estate map. It describes how the Coulomb / Custodian estate is put together: canons, hubs, rails, and publication. System-level arc42 documents (Railiance, NetKingdom, State Hub, Policy Nexus) live in their owning repos. Chapter 9 lists estate ADRs; it does not paste them.

+
+

01Introduction and Goals

+

the-custodian holds meaning, boundaries, and continuity for a local-first agent estate. Implementation lives in product repos. Coordination state is a read-model of repository files, not the origin of those files.

+

1.1 Requirements Overview

+
  • Work, decisions, and canon originate as files in the owning repo.
  • A publication surface keeps governing documents at permanent URLs.
  • Runtime (Rails, rApps, identity, storage) is consumed from platform packages, not reimplemented in the custodian.
  • Cross-repo work is coordinated, not owned, by a dedicated project repo when it does not belong to one product.
+

1.2 Quality Goals

+
  1. Rebuildability — State Hub can be reconstructed from registered repository files (ADR-001).
  2. Concept ownership — canons import, they do not redefine (ADR-006).
  3. Permanence of published policy addresses (policy-nexus ADR-0001).
  4. Honest currency — stale documents are visibly stale.
+

1.3 Stakeholders

+
RoleConcern
OperatorWhat must be discussed in person; ratification.
the-custodianCanon, values, constitution, estate ADRs.
Product reposImplementation and per-repo ADRs.
railiance-platformSubstrate: DNS, TLS, ingress, hosting.
policy-nexusPublication only.
info-tech-canonSemantic model, not this estate's building blocks.
+
+

02Architecture Constraints

+

N/A in this revision — local-first files, no second source of truth, stdlib-preferring tooling, single-node rail availability. To be written as first-wave complete.

+
+

03System Scope and Context

+

In: estate canon (constitution, standards, architecture ADRs), the federation of canons, the publication contract, the hub-as-read-model rule, and the map of first-wave systems.

+

Out: product implementation, InfoTechCanon's landscape model, regulatory intake (risk-nexus), and per-system deployment detail (those belong in the system arc42).

+

3.1 Business Context

+

The estate is a set of repositories that together run Coulomb products and the agent work-factory. Readers need one map of what governs what. Owners need a place that is not also the implementation.

+

3.2 Technical Context

+
NeighbourInterface
Owning git reposSource of workplans, ADRs, canon.
State HubDerived index / cache of those files.
policy.coulomb.socialGenerated publication of canon and ADRs.
Railiance reefRuntime for hubs, rApps, Forgejo.
NetKingdomIdentity, tenancy, IAM profile.
info-tech-canonImported semantics, not estate structure.
+
+

04Solution Strategy

+
  • Files first. Workplans and ADRs are markdown in git. The hub rebuilds from them (ADR-001, ADR-003).
  • One registrar. Workplan identifiers are globally unique; this workstation is not the registrar (ADR-007).
  • Three canons, federated. Custodian (governance), InfoTechCanon (information-system semantics), CommerceCanon (counterparty semantics). They import, they do not redefine (ADR-006).
  • Publish, do not author. policy-nexus reads owning repos and emits static addresses. It never writes back.
  • Project repos for cross-repo work (prj-*), not an unbound hub workplan (ADR-005).
+
+

05Building Block View

+

5.1 Level 1 – System/Top-Level

+
                    ┌─────────────────────────┐
+                    │     the-custodian       │
+                    │  constitution, values,  │
+                    │  estate ADRs, memory    │
+                    └────────────┬────────────┘
+           ┌─────────────────────┼─────────────────────┐
+           ▼                     ▼                     ▼
+   ┌───────────────┐    ┌────────────────┐    ┌─────────────────┐
+   │ info-tech-    │    │ commerce-canon │    │ net-kingdom     │
+   │ canon         │    │                │    │ (identity /     │
+   │ (semantics)   │    │                │    │  tenancy)       │
+   └───────────────┘    └────────────────┘    └────────┬────────┘
+                                                       │
+   ┌───────────────┐    ┌────────────────┐             │
+   │ state-hub     │◄───│ product repos  │◄────────────┘
+   │ (read model)  │    │ + project repos│
+   └───────────────┘    └────────┬───────┘
+                                 │
+                    ┌────────────┴────────────┐
+                    ▼                         ▼
+           ┌────────────────┐        ┌─────────────────┐
+           │ railiance      │        │ policy-nexus    │
+           │ (reef, rApps)  │        │ (publication)   │
+           └────────────────┘        └─────────────────┘
+

5.2 Level 2 – Key Components

+

N/A in this revision.

+

5.3 Level 3 – Internal Structure (as needed)

+

N/A in this revision.

+
+

06Runtime View

+

N/A — estate coordination is file sync plus hub rebuild, not a single runtime scenario. System runtimes belong in their own arc42.

+
+

07Deployment View

+

N/A — Railiance owns where things run. This document names the substrate; it does not map nodes.

+
+

08Cross-Cutting Concepts

+

N/A in this revision. Concept ownership and the hub/cache split are already in §4 and the ADRs in §9.

+
+

09Architecture Decisions

+

Estate ADRs in the-custodian/canon/architecture/. Publication ids still need repo prefixes (WP-0003). Status is the source front-matter.

+
SourceStatusDecision
adr-001-workplans-as-repo-artefacts.mdacceptedWorkplans and tasks originate as repo files; the hub is a read model.
adr-002-custodian-agent-runtime-design.mdacceptedCustodian agent runtime design.
adr-003-materialized-derived-state.mdacceptedHub state is derived and fingerprint-invalidated.
adr-004-connectivity-first-network-posture.mdacceptedConnectivity-first network posture.
adr-005-cross-repo-workplans-project-repos.mdacceptedCross-repo work lives in a prj-* repo.
adr-006-canon-federation-concept-ownership.mdacceptedThree canons; import, do not redefine.
adr-007-workplan-identity-and-repo-worker-topology.mdacceptedGlobally unique workplan ids; one registrar.
adr-008-multi-tenancy-model.mdsupersededRelocated to NetKingdom Tenancy Posture.
adr-010-hub-authority-and-local-cache-model.mdproposedTwo kinds of hub data; local cache vs authority.
adr-011-federated-namespaces-and-reconciliation-limits.mdproposedFederated namespaces and reconciliation limits.
+

Related, not estate-owned: policy-nexus ADR-0001 (addressing), NetKingdom Tenancy Posture (published), railiance-master ADR-0001–0008 (published).

+

Unresolved WP-0003 conflicts (hosts/infra duplicate ADR-003/004, coulomb-social ADR-0002 partial supersession) are not listed as current.

+
+

10Quality Requirements

+

N/A in this revision — rebuildability and currency already have mechanical checks (fix-consistency, make currency).

+
+

11Risks and Technical Debt

+

N/A in this revision. Known residual: this workstation cannot mint hub UUIDs (ADR-007 registrar). Markitect arc42-v1 is not registered yet.

+
+

12Glossary

+
TermMeaning
EstateThe set of Coulomb / Custodian repos, canons, hubs, and rails.
CanonGoverning documents owned by one of the three federated canons.
Read modelA derived index. Never the origin of work or decisions.
Publication entryOne explicit object in policy-nexus publication.json.
First-wave completeChapters 1, 3, 4, 5.1, 9 and 12 are real; others real or N/A.
Project repoA prj-* repo that coordinates cross-repo work (ADR-005).
+
diff --git a/build/architecture/policy-nexus/v0.1/index.html b/build/architecture/policy-nexus/v0.1/index.html index 20fce95..b70ce49 100644 --- a/build/architecture/policy-nexus/v0.1/index.html +++ b/build/architecture/policy-nexus/v0.1/index.html @@ -1,6 +1,6 @@ - + Policy Nexus architecture -
policy-nexus-architecture proposed · draft-1 the-custodian reviewed 2026-08-18generated from canonical source — do not edit

Policy Nexus architecture

Source: policy-nexus · docs/architecture/policy-nexus_v0.1.md · a8fb62a3bcbff3daf03e5d3d56c3ca3a5bd991f8

Review due: 2027-02-18

About this document

+
policy-nexus-architecture proposed · draft-1 the-custodian reviewed 2026-08-18generated from canonical source — do not edit

Policy Nexus architecture

Source: policy-nexus · docs/architecture/policy-nexus_v0.1.md · 9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0

Review due: 2027-02-18

About this document

This document follows the arc42 template for the publication surface at policy.coulomb.social. It is the first-wave architecture document this repository is allowed to author. Other first-wave systems are written in their owning repos.

01Introduction and Goals

@@ -245,4 +245,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off

12Glossary

TermMeaning
Current addressThe stable URL for the document as it now stands.
Revision addressWrite-once URL for one source digest.
Publication entryOne object in publication.json. Discovery is not publication.
First-wave completeChapters 1, 3, 4, 5.1, 9 and 12 are real; others real or N/A.
-
policy-nexus-architecture · draft-1 · proposedpolicy-nexus · docs/architecture/policy-nexus_v0.1.md · a8fb62a3bcbff3daf03e5d3d56c3ca3a5bd991f8
+
diff --git a/build/index.html b/build/index.html index 71d81e3..dba736f 100644 --- a/build/index.html +++ b/build/index.html @@ -183,4 +183,4 @@ footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-fam .route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px} a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} -
policy surfacegenerated from canonical sources — do not edit

Coulomb Policy Nexus

Canon and architecture decisions at stable addresses, with visible currency.

DocumentStatusLifecycleRevisionOwnerReviewedReview dueCurrency
NetKingdom Tenancy Posture v0.1proposedactivedraft-8net-kingdom2026-08-172027-02-17current
Policy Nexus architectureproposedactivedraft-1the-custodian2026-08-182027-02-18current
Policy addressing and permanenceacceptedactiveaccepted-1the-custodian2026-08-182027-02-18current
Repository Prefix Architectureacceptedactiveaccepted-1railiance-master2026-07-252027-01-25current
Wave 1 rail-kubernetes Boundaryacceptedactiveaccepted-1railiance-master2026-07-252027-01-25current
First-Wave rapp Selectionacceptedactiveaccepted-1railiance-master2026-07-252027-01-25current
First-Wave reef Rolloutacceptedactiveaccepted-1railiance-master2026-07-262027-01-26current
Derived Rail Compositionacceptedactiveaccepted-1railiance-master2026-07-262027-01-26current
Reef Production Admissionacceptedactiveaccepted-1railiance-master2026-08-152027-02-15current
Rapp Declaration Contractacceptedactiveaccepted-1railiance-master2026-08-132027-02-13current
Private-by-default Exposureacceptedactiveaccepted-1railiance-master2026-08-152027-02-15current
+
policy surfacegenerated from canonical sources — do not edit

Coulomb Policy Nexus

Canon and architecture decisions at stable addresses, with visible currency.

DocumentStatusLifecycleRevisionOwnerReviewedReview dueCurrency
NetKingdom Tenancy Posture v0.1proposedactivedraft-8net-kingdom2026-08-172027-02-17current
Coulomb estate architectureproposedactivedraft-1the-custodian2026-08-182027-02-18current
Policy Nexus architectureproposedactivedraft-1the-custodian2026-08-182027-02-18current
Policy addressing and permanenceacceptedactiveaccepted-1the-custodian2026-08-182027-02-18current
Repository Prefix Architectureacceptedactiveaccepted-1railiance-master2026-07-252027-01-25current
Wave 1 rail-kubernetes Boundaryacceptedactiveaccepted-1railiance-master2026-07-252027-01-25current
First-Wave rapp Selectionacceptedactiveaccepted-1railiance-master2026-07-252027-01-25current
First-Wave reef Rolloutacceptedactiveaccepted-1railiance-master2026-07-262027-01-26current
Derived Rail Compositionacceptedactiveaccepted-1railiance-master2026-07-262027-01-26current
Reef Production Admissionacceptedactiveaccepted-1railiance-master2026-08-152027-02-15current
Rapp Declaration Contractacceptedactiveaccepted-1railiance-master2026-08-132027-02-13current
Private-by-default Exposureacceptedactiveaccepted-1railiance-master2026-08-152027-02-15current
diff --git a/build/publication-manifest.json b/build/publication-manifest.json index 400a852..0bd7c0f 100644 --- a/build/publication-manifest.json +++ b/build/publication-manifest.json @@ -17,6 +17,23 @@ "status": "proposed", "title": "NetKingdom Tenancy Posture v0.1" }, + { + "canonical_path": "architecture/coulomb-estate/v0.1/index.html", + "currency": "current", + "id": "coulomb-estate-architecture", + "last_reviewed": "2026-08-18", + "lifecycle": "active", + "owner": "the-custodian", + "review_due": "2027-02-18", + "revision": "draft-1", + "revision_path": "architecture/coulomb-estate/v0.1/revisions/draft-1/index.html", + "source_digest": "0ab59ab79931e19615648da435e4a636836904a1189f5b53e3ee8467bea49841", + "source_path": "canon/architecture/coulomb-estate_v0.1.md", + "source_repo": "the-custodian", + "source_revision": "5b51623198d9959793762f447f5813960c0b5df8", + "status": "proposed", + "title": "Coulomb estate architecture" + }, { "canonical_path": "architecture/policy-nexus/v0.1/index.html", "currency": "current", @@ -30,7 +47,7 @@ "source_digest": "179cbb86bca95f71f46f51ca1971ff1c274eed7d900adf0672b537d4bcc5b480", "source_path": "docs/architecture/policy-nexus_v0.1.md", "source_repo": "policy-nexus", - "source_revision": "a8fb62a3bcbff3daf03e5d3d56c3ca3a5bd991f8", + "source_revision": "9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0", "status": "proposed", "title": "Policy Nexus architecture" }, @@ -47,7 +64,7 @@ "source_digest": "a28668fb4b8b6c5ec8c94baac000061276d85ef1849ec7ab8d132b913dbfe3be", "source_path": "docs/adr/ADR-0001-addressing-and-permanence.md", "source_repo": "policy-nexus", - "source_revision": "a8fb62a3bcbff3daf03e5d3d56c3ca3a5bd991f8", + "source_revision": "9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0", "status": "accepted", "title": "Policy addressing and permanence" }, diff --git a/docs/adr-review/SUMMARY.md b/docs/adr-review/SUMMARY.md index 69b2f6a..fc67f55 100644 --- a/docs/adr-review/SUMMARY.md +++ b/docs/adr-review/SUMMARY.md @@ -1,18 +1,20 @@ # ADR review ledger summary -Rows: 126 +Rows: 127 ## Inventory dispositions - `excluded`: 2 - `metadata-pending`: 105 -- `published`: 11 +- `published`: 12 - `unsupported-format`: 8 ## Proposed dispositions -- `publish`: 9 -- `unreviewed`: 117 +- `conflict`: 5 +- `publish`: 27 +- `superseded`: 5 +- `unreviewed`: 90 ## Front-matter `id` collisions @@ -37,6 +39,14 @@ Rows: 126 - `ADR-0010`: net-kingdom/docs/adr/ADR-0010-orchestration-vs-dependency-self-coherent-intent.md, the-custodian/canon/architecture/adr-010-hub-authority-and-local-cache-model.md - `ADR-0011`: net-kingdom/docs/adr/ADR-0011-iam-profile-ownership-and-version-governance.md, the-custodian/canon/architecture/adr-011-federated-namespaces-and-reconciliation-limits.md +## Conflict rows + +- `coulomb-social/docs/adr/ADR-0002-space-content-forgejo-markdown.md` (kinds 2): Status is 'superseded in part' by ADR-0003/0004. Not a clean superseded or accepted. Who rules: coulomb-social. +- `railiance-hosts/docs/adr/ADR-003-railiance-5repo-stack-architecture.md` (kinds 6): Accepted 5-repo stack ADR is byte-identical in railiance-hosts and railiance-infra. Two current copies of one decision. Who rules: those two repos, or railiance-master if the stack story moved. +- `railiance-hosts/docs/adr/ADR-004-forgejo-in-cluster-actions-runner.md` (kinds 6): Accepted Forgejo runner ADR is byte-identical in railiance-hosts and railiance-infra. Who rules: those two repos. +- `railiance-infra/docs/adr/ADR-003-railiance-5repo-stack-architecture.md` (kinds 6): Identical accepted copy of the hosts ADR-003. Do not publish both. +- `railiance-infra/docs/adr/ADR-004-forgejo-in-cluster-actions-runner.md` (kinds 6): Identical accepted copy of the hosts ADR-004. Do not publish both. + ## Missing files None. diff --git a/docs/adr-review/conflicts.md b/docs/adr-review/conflicts.md new file mode 100644 index 0000000..8ffd35d --- /dev/null +++ b/docs/adr-review/conflicts.md @@ -0,0 +1,60 @@ +# ADR conflict pass (WP-0003-T03) + +Kinds 1–4 and 6. Kind 5 waits on the estate arc42 chapter 9. Rulings +live in `rulings.json` and survive a ledger refresh. + +## How kind 1 is treated + +A shared **front-matter `id`** (`ADR-001` in four repos, `ADR-0001` in +three, `netkingdom-iam-profile` on two files) cannot appear twice in +`publication.json`. That is a prefix/rename packet, not a contradiction +of decisions. The ledger records kind `1` automatically. Disposition +stays `publish` or `unreviewed` unless another kind applies. + +Bare `ADR-NNNN` in many filenames is expected. It is not kind 1. + +## Kind 2 — status lie + +| Source | What the files say | Who rules | +| --- | --- | --- | +| `net-kingdom/canon/standards/iam-profile_v0.2.md` | Front-matter `accepted`. v0.3 says it supersedes v0.2. | net-kingdom | +| `railiance-hosts` and `railiance-infra` `ADR-002` | Body **Status: Superseded by ADR-003**. No YAML `status`. | those repos | +| `coulomb-social/docs/adr/ADR-0002-…` | Status is **superseded in part** by ADR-0003/0004. | coulomb-social | + +Mentions of “supersedes” meaning *this* ADR replaces an older one (flex-auth +0003, artifact-store 0001, glas-harness 001) are not status lies. + +## Kind 3 — missing / stale successor + +| Source | Gap | Who rules | +| --- | --- | --- | +| `the-custodian/canon/standards/iam-profile_v0.1.md` | `superseded_by` still names v0.2; current is v0.3. | the-custodian | + +Custodian ADR-008 already names Tenancy Posture. No gap. + +## Kind 4 — contradicting decisions + +No pair of *accepted* ADRs was found that cannot both be true. +railiance-platform ADR-0003 restates custodian ADR-001 (hub is a read +model). That is alignment, not a clash. + +## Kind 6 — duplicate current claim + +| Sources | Claim | Who rules | +| --- | --- | --- | +| custodian ADR-008 vs Tenancy Posture | Multi-tenancy framework. ADR-008 is already superseded. T04: `superseded`. | already ruled in the source | +| iam-profile v0.2 and v0.3 | Same `id`, both `accepted`. T04: v0.2 `superseded`, v0.3 `publish` after id fix. | net-kingdom | +| railiance-hosts and railiance-infra ADR-002 | Identical superseded copies. | those repos (historical only) | +| railiance-hosts and railiance-infra ADR-003 | Identical **accepted** 5-repo stack ADR. **Conflict.** | those repos or railiance-master | +| railiance-hosts and railiance-infra ADR-004 | Identical **accepted** Forgejo runner ADR. **Conflict.** | those repos | + +## Conflict rows that stay unpublished + +Until the owner rules: + +1. `railiance-hosts` / `railiance-infra` ADR-003 +2. `railiance-hosts` / `railiance-infra` ADR-004 +3. `coulomb-social` ADR-0002 (partial supersession) + +Kind 5 (architecture miss) is not run yet. It starts when +`coulomb-estate_v0.1.md` chapter 9 exists. diff --git a/docs/adr-review/ledger.json b/docs/adr-review/ledger.json index 27986c4..ebce131 100644 --- a/docs/adr-review/ledger.json +++ b/docs/adr-review/ledger.json @@ -41,8 +41,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Cross-repo event bridge. Id ACT-ADR-001 is unique. Needs owner/revision/review front-matter.", "source_path": "docs/adr/adr-001-event-bridge-architecture.md", "source_repo": "activity-core", "successor": "" @@ -85,8 +85,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Cross-repo definition format. Unique id. Needs owner/revision/review.", "source_path": "docs/adr/adr-002-definition-format.md", "source_repo": "activity-core", "successor": "" @@ -127,8 +127,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Cross-repo rule/instruction split. Unique id. Needs owner/revision/review.", "source_path": "docs/adr/adr-003-rule-instruction-model.md", "source_repo": "activity-core", "successor": "" @@ -168,8 +168,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Cross-repo producer trust boundary. Unique id. Needs owner/revision/review.", "source_path": "docs/adr/adr-004-producer-trust-boundary.md", "source_repo": "activity-core", "successor": "" @@ -204,8 +204,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Cross-repo ops-run vs work-record split. Unique id. Needs owner/revision/review.", "source_path": "docs/adr/adr-005-ops-runs-vs-dev-work-records.md", "source_repo": "activity-core", "successor": "" @@ -500,7 +500,9 @@ "target-revenue/docs/adr/ADR-0001-stage0-library-stack.md", "the-custodian/canon/architecture/adr-001-workplans-as-repo-artefacts.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-001", @@ -527,7 +529,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-001' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-001-workplan-prefix.md", "source_repo": "coulomb-loop", "successor": "" @@ -548,7 +550,9 @@ "target-revenue/docs/adr/ADR-0002-hosted-trust-service-stack.md", "the-custodian/canon/architecture/adr-002-custodian-agent-runtime-design.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-002", @@ -574,7 +578,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-002' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-002-customer-supplier-boundary.md", "source_repo": "coulomb-loop", "successor": "" @@ -593,7 +597,9 @@ "rapp-postgres/docs/adr/ADR-0003-e3-row-level-security-contract.md", "the-custodian/canon/architecture/adr-003-materialized-derived-state.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-003", @@ -619,7 +625,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-003' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-003-cadence-ramp-policy.md", "source_repo": "coulomb-loop", "successor": "" @@ -637,7 +643,9 @@ "rapp-postgres/docs/adr/ADR-0004-platform-pg-cell-ceiling.md", "the-custodian/canon/architecture/adr-004-connectivity-first-network-posture.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-004", @@ -663,7 +671,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-004' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-004-repo-rotation-on-diminishing-returns.md", "source_repo": "coulomb-loop", "successor": "" @@ -686,7 +694,9 @@ "target-revenue/docs/adr/ADR-0001-stage0-library-stack.md", "the-custodian/canon/architecture/adr-001-workplans-as-repo-artefacts.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-0001", @@ -712,7 +722,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-0001' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-0001-netkingdom-identity.md", "source_repo": "coulomb-social", "successor": "" @@ -733,7 +743,9 @@ "target-revenue/docs/adr/ADR-0002-hosted-trust-service-stack.md", "the-custodian/canon/architecture/adr-002-custodian-agent-runtime-design.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 2 + ], "file_present": true, "frontmatter": { "id": "", @@ -758,11 +770,11 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "conflict", + "review_notes": "Status is 'superseded in part' by ADR-0003/0004. Not a clean superseded or accepted. Who rules: coulomb-social.", "source_path": "docs/adr/ADR-0002-space-content-forgejo-markdown.md", "source_repo": "coulomb-social", - "successor": "" + "successor": "coulomb-social/docs/adr/ADR-0003-page-centric-markdown-sor.md" }, { "bare_adr": "ADR-0003", @@ -1235,7 +1247,9 @@ "target-revenue/docs/adr/ADR-0001-stage0-library-stack.md", "the-custodian/canon/architecture/adr-001-workplans-as-repo-artefacts.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-001", @@ -1262,7 +1276,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-001' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-001-workplan-convention.md", "source_repo": "kaizen-agentic", "successor": "" @@ -1283,7 +1297,9 @@ "target-revenue/docs/adr/ADR-0002-hosted-trust-service-stack.md", "the-custodian/canon/architecture/adr-002-custodian-agent-runtime-design.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-002", @@ -1309,7 +1325,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-002' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-002-project-memory-convention.md", "source_repo": "kaizen-agentic", "successor": "" @@ -1328,7 +1344,9 @@ "rapp-postgres/docs/adr/ADR-0003-e3-row-level-security-contract.md", "the-custodian/canon/architecture/adr-003-materialized-derived-state.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-003", @@ -1354,7 +1372,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-003' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-003-protocols-artifact-convention.md", "source_repo": "kaizen-agentic", "successor": "" @@ -1372,7 +1390,9 @@ "rapp-postgres/docs/adr/ADR-0004-platform-pg-cell-ceiling.md", "the-custodian/canon/architecture/adr-004-connectivity-first-network-posture.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-004", @@ -1398,7 +1418,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-004' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-004-project-metrics-convention.md", "source_repo": "kaizen-agentic", "successor": "" @@ -1411,7 +1431,9 @@ "railiance-master/docs/adr/ADR-0005-derived-rail-composition.md", "the-custodian/canon/architecture/adr-005-cross-repo-workplans-project-repos.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-005", @@ -1436,7 +1458,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-005' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-005-scheduled-agent-execution.md", "source_repo": "kaizen-agentic", "successor": "" @@ -1535,7 +1557,9 @@ "target-revenue/docs/adr/ADR-0001-stage0-library-stack.md", "the-custodian/canon/architecture/adr-001-workplans-as-repo-artefacts.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-0001", @@ -1561,7 +1585,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-0001' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-0001-choose-go-for-keycape.md", "source_repo": "key-cape", "successor": "" @@ -1699,7 +1723,11 @@ { "bare_adr": "", "bare_adr_collisions": [], - "conflict_kinds": [], + "conflict_kinds": [ + 1, + 2, + 6 + ], "file_present": true, "frontmatter": { "id": "netkingdom-iam-profile", @@ -1722,16 +1750,19 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "superseded", + "review_notes": "v0.3 says it supersedes v0.2, but v0.2 is still status accepted and shares id netkingdom-iam-profile. Who rules: net-kingdom (status + unique id).", "source_path": "canon/standards/iam-profile_v0.2.md", "source_repo": "net-kingdom", - "successor": "" + "successor": "net-kingdom/canon/standards/iam-profile_v0.3.md" }, { "bare_adr": "", "bare_adr_collisions": [], - "conflict_kinds": [], + "conflict_kinds": [ + 1, + 6 + ], "file_present": true, "frontmatter": { "id": "netkingdom-iam-profile", @@ -1754,8 +1785,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Current IAM profile. Cannot publish until id is unique (e.g. netkingdom-iam-profile-v0.3). Who rules: net-kingdom.", "source_path": "canon/standards/iam-profile_v0.3.md", "source_repo": "net-kingdom", "successor": "" @@ -2283,7 +2314,10 @@ "target-revenue/docs/adr/ADR-0002-hosted-trust-service-stack.md", "the-custodian/canon/architecture/adr-002-custodian-agent-runtime-design.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 2, + 6 + ], "file_present": true, "frontmatter": { "id": "", @@ -2308,11 +2342,11 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "superseded", + "review_notes": "Body is superseded by ADR-003. Byte-identical copy also lives in railiance-infra. Who rules: railiance-hosts/infra which copy is historical.", "source_path": "docs/adr/ADR-002-repo-boundary-hosts-vs-bootstrap.md", "source_repo": "railiance-hosts", - "successor": "" + "successor": "railiance-hosts/docs/adr/ADR-003-railiance-5repo-stack-architecture.md" }, { "bare_adr": "ADR-0003", @@ -2328,7 +2362,9 @@ "rapp-postgres/docs/adr/ADR-0003-e3-row-level-security-contract.md", "the-custodian/canon/architecture/adr-003-materialized-derived-state.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 6 + ], "file_present": true, "frontmatter": { "id": "", @@ -2353,8 +2389,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "conflict", + "review_notes": "Accepted 5-repo stack ADR is byte-identical in railiance-hosts and railiance-infra. Two current copies of one decision. Who rules: those two repos, or railiance-master if the stack story moved.", "source_path": "docs/adr/ADR-003-railiance-5repo-stack-architecture.md", "source_repo": "railiance-hosts", "successor": "" @@ -2372,7 +2408,9 @@ "rapp-postgres/docs/adr/ADR-0004-platform-pg-cell-ceiling.md", "the-custodian/canon/architecture/adr-004-connectivity-first-network-posture.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 6 + ], "file_present": true, "frontmatter": { "id": "", @@ -2397,8 +2435,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "conflict", + "review_notes": "Accepted Forgejo runner ADR is byte-identical in railiance-hosts and railiance-infra. Who rules: those two repos.", "source_path": "docs/adr/ADR-004-forgejo-in-cluster-actions-runner.md", "source_repo": "railiance-hosts", "successor": "" @@ -2419,7 +2457,10 @@ "target-revenue/docs/adr/ADR-0002-hosted-trust-service-stack.md", "the-custodian/canon/architecture/adr-002-custodian-agent-runtime-design.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 2, + 6 + ], "file_present": true, "frontmatter": { "id": "", @@ -2444,11 +2485,11 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "superseded", + "review_notes": "Identical to the railiance-hosts copy; both say superseded by ADR-003.", "source_path": "docs/adr/ADR-002-repo-boundary-hosts-vs-bootstrap.md", "source_repo": "railiance-infra", - "successor": "" + "successor": "railiance-infra/docs/adr/ADR-003-railiance-5repo-stack-architecture.md" }, { "bare_adr": "ADR-0003", @@ -2464,7 +2505,9 @@ "rapp-postgres/docs/adr/ADR-0003-e3-row-level-security-contract.md", "the-custodian/canon/architecture/adr-003-materialized-derived-state.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 6 + ], "file_present": true, "frontmatter": { "id": "", @@ -2489,8 +2532,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "conflict", + "review_notes": "Identical accepted copy of the hosts ADR-003. Do not publish both.", "source_path": "docs/adr/ADR-003-railiance-5repo-stack-architecture.md", "source_repo": "railiance-infra", "successor": "" @@ -2508,7 +2551,9 @@ "rapp-postgres/docs/adr/ADR-0004-platform-pg-cell-ceiling.md", "the-custodian/canon/architecture/adr-004-connectivity-first-network-posture.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 6 + ], "file_present": true, "frontmatter": { "id": "", @@ -2533,8 +2578,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "conflict", + "review_notes": "Identical accepted copy of the hosts ADR-004. Do not publish both.", "source_path": "docs/adr/ADR-004-forgejo-in-cluster-actions-runner.md", "source_repo": "railiance-infra", "successor": "" @@ -2897,8 +2942,8 @@ "id" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Binds other repos on S3. Needs a unique publication id in front-matter.", "source_path": "docs/adr/ADR-0001-s3-platform-service-boundary.md", "source_repo": "railiance-platform", "successor": "" @@ -2939,8 +2984,8 @@ "id" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Proposed placement-policy ownership. Bindings are cross-repo. Needs a unique id.", "source_path": "docs/adr/ADR-0002-placement-policy-ownership.md", "source_repo": "railiance-platform", "successor": "" @@ -2979,8 +3024,8 @@ "id" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Restates ADR-001 for this repo. Needs a unique publication id (front-matter has title but no id).", "source_path": "docs/adr/ADR-0003-decisions-live-in-the-repo.md", "source_repo": "railiance-platform", "successor": "" @@ -3217,7 +3262,9 @@ "target-revenue/docs/adr/ADR-0001-stage0-library-stack.md", "the-custodian/canon/architecture/adr-001-workplans-as-repo-artefacts.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-001", @@ -3244,7 +3291,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-001' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-001-agent-harness-architecture.md", "source_repo": "rein-aharness", "successor": "" @@ -3267,7 +3314,9 @@ "rein-aharness/docs/adr/ADR-001-agent-harness-architecture.md", "the-custodian/canon/architecture/adr-001-workplans-as-repo-artefacts.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-0001", @@ -3293,7 +3342,7 @@ ], "notes": "", "proposed_disposition": "unreviewed", - "review_notes": "", + "review_notes": "Front-matter id 'ADR-0001' is shared; pick a repo-prefixed publication id before publish. Who rules: owning repo.", "source_path": "docs/adr/ADR-0001-stage0-library-stack.md", "source_repo": "target-revenue", "successor": "" @@ -3360,7 +3409,9 @@ "rein-aharness/docs/adr/ADR-001-agent-harness-architecture.md", "target-revenue/docs/adr/ADR-0001-stage0-library-stack.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-001", @@ -3386,8 +3437,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate rule: workplans originate as repo files. Needs a unique publication id (e.g. CUST-ADR-001) before publish.", "source_path": "canon/architecture/adr-001-workplans-as-repo-artefacts.md", "source_repo": "the-custodian", "successor": "" @@ -3408,7 +3459,9 @@ "rapp-postgres/docs/adr/ADR-0002-data-retention-and-erasure.md", "target-revenue/docs/adr/ADR-0002-hosted-trust-service-stack.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-002", @@ -3433,8 +3486,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate ADR. Prefix the publication id before publish.", "source_path": "canon/architecture/adr-002-custodian-agent-runtime-design.md", "source_repo": "the-custodian", "successor": "" @@ -3453,7 +3506,9 @@ "railiance-platform/docs/adr/ADR-0003-decisions-live-in-the-repo.md", "rapp-postgres/docs/adr/ADR-0003-e3-row-level-security-contract.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-003", @@ -3478,8 +3533,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate ADR: hub is a derived read-model. Prefix the publication id before publish.", "source_path": "canon/architecture/adr-003-materialized-derived-state.md", "source_repo": "the-custodian", "successor": "" @@ -3497,7 +3552,9 @@ "railiance-master/docs/adr/ADR-0004-first-wave-reef-rollout.md", "rapp-postgres/docs/adr/ADR-0004-platform-pg-cell-ceiling.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-004", @@ -3522,8 +3579,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate ADR. Prefix the publication id before publish.", "source_path": "canon/architecture/adr-004-connectivity-first-network-posture.md", "source_repo": "the-custodian", "successor": "" @@ -3536,7 +3593,9 @@ "railiance-infra/docs/adr/ADR-005-k3s-api-tunnel-only.md", "railiance-master/docs/adr/ADR-0005-derived-rail-composition.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 1 + ], "file_present": true, "frontmatter": { "id": "ADR-005", @@ -3560,8 +3619,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate ADR. Prefix the publication id before publish.", "source_path": "canon/architecture/adr-005-cross-repo-workplans-project-repos.md", "source_repo": "the-custodian", "successor": "" @@ -3595,8 +3654,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate ADR. Id ADR-006 is unique in front-matter today; still prefix for consistency.", "source_path": "canon/architecture/adr-006-canon-federation-concept-ownership.md", "source_repo": "the-custodian", "successor": "" @@ -3630,8 +3689,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Estate ADR. Prefix the publication id for consistency.", "source_path": "canon/architecture/adr-007-workplan-identity-and-repo-worker-topology.md", "source_repo": "the-custodian", "successor": "" @@ -3642,7 +3701,9 @@ "net-kingdom/docs/adr/ADR-0008-object-storage-sts-credential-vending.md", "railiance-master/docs/adr/ADR-0008-private-by-default-exposure.md" ], - "conflict_kinds": [], + "conflict_kinds": [ + 6 + ], "file_present": true, "frontmatter": { "id": "ADR-008", @@ -3664,8 +3725,8 @@ "review" ], "notes": "Relocated to net-kingdom Tenancy Posture. Duplicate-claim candidate (kind 6).", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "superseded", + "review_notes": "Body and front-matter already say relocated to Tenancy Posture. Not a live duplicate claim. Who ruled: T04 from the document itself.", "source_path": "canon/architecture/adr-008-multi-tenancy-model.md", "source_repo": "the-custodian", "successor": "netkingdom-tenancy-posture" @@ -3697,8 +3758,8 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "publish", + "review_notes": "Proposed estate ADR. Publish as proposed once prefixed and review metadata is added.", "source_path": "canon/architecture/adr-010-hub-authority-and-local-cache-model.md", "source_repo": "the-custodian", "successor": "" @@ -3729,9 +3790,36 @@ "review" ], "notes": "", + "proposed_disposition": "publish", + "review_notes": "Proposed estate ADR. Publish as proposed once prefixed and review metadata is added.", + "source_path": "canon/architecture/adr-011-federated-namespaces-and-reconciliation-limits.md", + "source_repo": "the-custodian", + "successor": "" + }, + { + "bare_adr": "", + "bare_adr_collisions": [], + "conflict_kinds": [], + "file_present": true, + "frontmatter": { + "id": "coulomb-estate-architecture", + "last_reviewed": "2026-08-18", + "owner": "the-custodian", + "review_interval": "6m", + "revision": "draft-1", + "status": "proposed", + "title": "Coulomb estate architecture", + "updated": "", + "version": "0.1" + }, + "id_collisions": [], + "inventory_disposition": "published", + "inventory_reason": "Published through an explicit publication.json document entry.", + "missing_fields": [], + "notes": "", "proposed_disposition": "unreviewed", "review_notes": "", - "source_path": "canon/architecture/adr-011-federated-namespaces-and-reconciliation-limits.md", + "source_path": "canon/architecture/coulomb-estate_v0.1.md", "source_repo": "the-custodian", "successor": "" }, @@ -4110,7 +4198,9 @@ { "bare_adr": "", "bare_adr_collisions": [], - "conflict_kinds": [], + "conflict_kinds": [ + 3 + ], "file_present": true, "frontmatter": { "id": "canon-iam-profile", @@ -4131,11 +4221,11 @@ "review" ], "notes": "", - "proposed_disposition": "unreviewed", - "review_notes": "", + "proposed_disposition": "superseded", + "review_notes": "Already superseded. Recorded successor still points at v0.2; v0.3 now supersedes v0.2. Who rules: the-custodian to update superseded_by.", "source_path": "canon/standards/iam-profile_v0.1.md", "source_repo": "the-custodian", - "successor": "" + "successor": "net-kingdom/canon/standards/iam-profile_v0.3.md" }, { "bare_adr": "", @@ -4764,6 +4854,7 @@ "successor": "" } ], + "rulings": "/home/worsch/policy-nexus/docs/adr-review/rulings.json", "schema_version": 1, "source_inventory": "source-inventory.json" } diff --git a/docs/adr-review/protocol.md b/docs/adr-review/protocol.md index 93b0a84..c2ef909 100644 --- a/docs/adr-review/protocol.md +++ b/docs/adr-review/protocol.md @@ -73,6 +73,12 @@ except for the first publish set named in WP-0003 (this repo's ADR-0001 and the eight railiance-master ADRs), which start as `publish` because they are already relevance-obvious. +T03/T04 write `rulings.json`. A ledger refresh merges those four +review fields onto the regenerated facts. Kind `1` is also applied +automatically when a front-matter `id` is shared; that alone does not +flip the row to `conflict` — it is a prefix packet, not a +contradiction. + ## First publish set - `policy-nexus` `docs/adr/ADR-0001-addressing-and-permanence.md` diff --git a/docs/adr-review/rulings.json b/docs/adr-review/rulings.json new file mode 100644 index 0000000..4ec1f45 --- /dev/null +++ b/docs/adr-review/rulings.json @@ -0,0 +1,232 @@ +{ + "schema_version": 1, + "ruled_at": "2026-08-18", + "workplan": "POLICY-NEXUS-WP-0003", + "note": "T03/T04 overlay. Regenerating the ledger merges these fields onto inventory facts. Kind 1 on a shared front-matter id is also applied automatically.", + "rulings": [ + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-008-multi-tenancy-model.md", + "proposed_disposition": "superseded", + "conflict_kinds": [6], + "successor": "netkingdom-tenancy-posture", + "review_notes": "Body and front-matter already say relocated to Tenancy Posture. Not a live duplicate claim. Who ruled: T04 from the document itself." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/standards/iam-profile_v0.1.md", + "proposed_disposition": "superseded", + "conflict_kinds": [3], + "successor": "net-kingdom/canon/standards/iam-profile_v0.3.md", + "review_notes": "Already superseded. Recorded successor still points at v0.2; v0.3 now supersedes v0.2. Who rules: the-custodian to update superseded_by." + }, + { + "source_repo": "net-kingdom", + "source_path": "canon/standards/iam-profile_v0.2.md", + "proposed_disposition": "superseded", + "conflict_kinds": [1, 2, 6], + "successor": "net-kingdom/canon/standards/iam-profile_v0.3.md", + "review_notes": "v0.3 says it supersedes v0.2, but v0.2 is still status accepted and shares id netkingdom-iam-profile. Who rules: net-kingdom (status + unique id)." + }, + { + "source_repo": "net-kingdom", + "source_path": "canon/standards/iam-profile_v0.3.md", + "proposed_disposition": "publish", + "conflict_kinds": [1, 6], + "successor": "", + "review_notes": "Current IAM profile. Cannot publish until id is unique (e.g. netkingdom-iam-profile-v0.3). Who rules: net-kingdom." + }, + { + "source_repo": "railiance-hosts", + "source_path": "docs/adr/ADR-002-repo-boundary-hosts-vs-bootstrap.md", + "proposed_disposition": "superseded", + "conflict_kinds": [2, 6], + "successor": "railiance-hosts/docs/adr/ADR-003-railiance-5repo-stack-architecture.md", + "review_notes": "Body is superseded by ADR-003. Byte-identical copy also lives in railiance-infra. Who rules: railiance-hosts/infra which copy is historical." + }, + { + "source_repo": "railiance-infra", + "source_path": "docs/adr/ADR-002-repo-boundary-hosts-vs-bootstrap.md", + "proposed_disposition": "superseded", + "conflict_kinds": [2, 6], + "successor": "railiance-infra/docs/adr/ADR-003-railiance-5repo-stack-architecture.md", + "review_notes": "Identical to the railiance-hosts copy; both say superseded by ADR-003." + }, + { + "source_repo": "railiance-hosts", + "source_path": "docs/adr/ADR-003-railiance-5repo-stack-architecture.md", + "proposed_disposition": "conflict", + "conflict_kinds": [6], + "successor": "", + "review_notes": "Accepted 5-repo stack ADR is byte-identical in railiance-hosts and railiance-infra. Two current copies of one decision. Who rules: those two repos, or railiance-master if the stack story moved." + }, + { + "source_repo": "railiance-infra", + "source_path": "docs/adr/ADR-003-railiance-5repo-stack-architecture.md", + "proposed_disposition": "conflict", + "conflict_kinds": [6], + "successor": "", + "review_notes": "Identical accepted copy of the hosts ADR-003. Do not publish both." + }, + { + "source_repo": "railiance-hosts", + "source_path": "docs/adr/ADR-004-forgejo-in-cluster-actions-runner.md", + "proposed_disposition": "conflict", + "conflict_kinds": [6], + "successor": "", + "review_notes": "Accepted Forgejo runner ADR is byte-identical in railiance-hosts and railiance-infra. Who rules: those two repos." + }, + { + "source_repo": "railiance-infra", + "source_path": "docs/adr/ADR-004-forgejo-in-cluster-actions-runner.md", + "proposed_disposition": "conflict", + "conflict_kinds": [6], + "successor": "", + "review_notes": "Identical accepted copy of the hosts ADR-004. Do not publish both." + }, + { + "source_repo": "coulomb-social", + "source_path": "docs/adr/ADR-0002-space-content-forgejo-markdown.md", + "proposed_disposition": "conflict", + "conflict_kinds": [2], + "successor": "coulomb-social/docs/adr/ADR-0003-page-centric-markdown-sor.md", + "review_notes": "Status is 'superseded in part' by ADR-0003/0004. Not a clean superseded or accepted. Who rules: coulomb-social." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-001-workplans-as-repo-artefacts.md", + "proposed_disposition": "publish", + "conflict_kinds": [1], + "successor": "", + "review_notes": "Estate rule: workplans originate as repo files. Needs a unique publication id (e.g. CUST-ADR-001) before publish." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-002-custodian-agent-runtime-design.md", + "proposed_disposition": "publish", + "conflict_kinds": [1], + "successor": "", + "review_notes": "Estate ADR. Prefix the publication id before publish." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-003-materialized-derived-state.md", + "proposed_disposition": "publish", + "conflict_kinds": [1], + "successor": "", + "review_notes": "Estate ADR: hub is a derived read-model. Prefix the publication id before publish." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-004-connectivity-first-network-posture.md", + "proposed_disposition": "publish", + "conflict_kinds": [1], + "successor": "", + "review_notes": "Estate ADR. Prefix the publication id before publish." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-005-cross-repo-workplans-project-repos.md", + "proposed_disposition": "publish", + "conflict_kinds": [1], + "successor": "", + "review_notes": "Estate ADR. Prefix the publication id before publish." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-006-canon-federation-concept-ownership.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Estate ADR. Id ADR-006 is unique in front-matter today; still prefix for consistency." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-007-workplan-identity-and-repo-worker-topology.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Estate ADR. Prefix the publication id for consistency." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-010-hub-authority-and-local-cache-model.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Proposed estate ADR. Publish as proposed once prefixed and review metadata is added." + }, + { + "source_repo": "the-custodian", + "source_path": "canon/architecture/adr-011-federated-namespaces-and-reconciliation-limits.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Proposed estate ADR. Publish as proposed once prefixed and review metadata is added." + }, + { + "source_repo": "activity-core", + "source_path": "docs/adr/adr-001-event-bridge-architecture.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Cross-repo event bridge. Id ACT-ADR-001 is unique. Needs owner/revision/review front-matter." + }, + { + "source_repo": "activity-core", + "source_path": "docs/adr/adr-002-definition-format.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Cross-repo definition format. Unique id. Needs owner/revision/review." + }, + { + "source_repo": "activity-core", + "source_path": "docs/adr/adr-003-rule-instruction-model.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Cross-repo rule/instruction split. Unique id. Needs owner/revision/review." + }, + { + "source_repo": "activity-core", + "source_path": "docs/adr/adr-004-producer-trust-boundary.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Cross-repo producer trust boundary. Unique id. Needs owner/revision/review." + }, + { + "source_repo": "activity-core", + "source_path": "docs/adr/adr-005-ops-runs-vs-dev-work-records.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Cross-repo ops-run vs work-record split. Unique id. Needs owner/revision/review." + }, + { + "source_repo": "railiance-platform", + "source_path": "docs/adr/ADR-0001-s3-platform-service-boundary.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Binds other repos on S3. Needs a unique publication id in front-matter." + }, + { + "source_repo": "railiance-platform", + "source_path": "docs/adr/ADR-0002-placement-policy-ownership.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Proposed placement-policy ownership. Bindings are cross-repo. Needs a unique id." + }, + { + "source_repo": "railiance-platform", + "source_path": "docs/adr/ADR-0003-decisions-live-in-the-repo.md", + "proposed_disposition": "publish", + "conflict_kinds": [], + "successor": "", + "review_notes": "Restates ADR-001 for this repo. Needs a unique publication id (front-matter has title but no id)." + } + ] +} diff --git a/publication.json b/publication.json index 5aebd29..536dd53 100644 --- a/publication.json +++ b/publication.json @@ -15,7 +15,8 @@ "repositories": { "net-kingdom": {"path": "../net-kingdom"}, "policy-nexus": {"path": "."}, - "railiance-master": {"path": "../railiance-master"} + "railiance-master": {"path": "../railiance-master"}, + "the-custodian": {"path": "../the-custodian"} }, "documents": [ { @@ -28,6 +29,14 @@ "subtitle": "A framework for describing, holding and improving multi-tenancy — including where we are not there yet.", "review_interval": "6m" }, + { + "id": "coulomb-estate-architecture", + "source_repo": "the-custodian", + "source_path": "canon/architecture/coulomb-estate_v0.1.md", + "canonical_path": "architecture/coulomb-estate/v0.1/index.html", + "revision_path": "architecture/coulomb-estate/v0.1/revisions/{revision}/index.html", + "review_interval": "6m" + }, { "id": "policy-nexus-architecture", "source_repo": "policy-nexus", diff --git a/source-inventory.json b/source-inventory.json index 90a9e49..a2c4d83 100644 --- a/source-inventory.json +++ b/source-inventory.json @@ -565,6 +565,12 @@ "source_path": "canon/architecture/adr-011-federated-namespaces-and-reconciliation-limits.md", "source_repo": "the-custodian" }, + { + "disposition": "published", + "reason": "Published through an explicit publication.json document entry.", + "source_path": "canon/architecture/coulomb-estate_v0.1.md", + "source_repo": "the-custodian" + }, { "disposition": "metadata-pending", "reason": "In scope; awaits explicit publication addressing and owner/revision/review metadata.", diff --git a/tests/test_adr_review_ledger.py b/tests/test_adr_review_ledger.py index 6fdd28c..658302d 100644 --- a/tests/test_adr_review_ledger.py +++ b/tests/test_adr_review_ledger.py @@ -76,3 +76,94 @@ class AdrReviewLedgerTest(unittest.TestCase): rows["alpha/docs/adr/ADR-0001-one.md"]["bare_adr_collisions"], ) self.assertEqual("unreviewed", rows["alpha/docs/adr/ADR-0001-one.md"]["proposed_disposition"]) + + def test_rulings_overlay_and_shared_id_kind_one(self) -> None: + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + (root / "alpha/docs/adr").mkdir(parents=True) + (root / "beta/docs/adr").mkdir(parents=True) + (root / "alpha/docs/adr/one.md").write_text( + "---\nid: ADR-001\ntitle: One\nstatus: accepted\nowner: alpha\n" + "revision: 1\nlast_reviewed: \"2026-08-18\"\nreview_interval: 6m\n---\n# One\n", + encoding="utf-8", + ) + (root / "beta/docs/adr/two.md").write_text( + "---\nid: ADR-001\ntitle: Two\nstatus: accepted\nowner: beta\n" + "revision: 1\nlast_reviewed: \"2026-08-18\"\nreview_interval: 6m\n---\n# Two\n", + encoding="utf-8", + ) + config = root / "source-inventory.config.json" + config.write_text( + json.dumps( + { + "schema_version": 1, + "repositories": { + "alpha": { + "branch": "main", + "remote": "https://example.invalid/a.git", + "selectors": ["docs/adr/*.md"], + }, + "beta": { + "branch": "main", + "remote": "https://example.invalid/b.git", + "selectors": ["docs/adr/*.md"], + }, + }, + } + ), + encoding="utf-8", + ) + inventory = root / "source-inventory.json" + inventory.write_text( + json.dumps( + { + "schema_version": 1, + "sources": [ + { + "source_repo": "alpha", + "source_path": "docs/adr/one.md", + "disposition": "metadata-pending", + "reason": "pending", + }, + { + "source_repo": "beta", + "source_path": "docs/adr/two.md", + "disposition": "metadata-pending", + "reason": "pending", + }, + ], + } + ), + encoding="utf-8", + ) + rulings = root / "rulings.json" + rulings.write_text( + json.dumps( + { + "schema_version": 1, + "rulings": [ + { + "source_repo": "beta", + "source_path": "docs/adr/two.md", + "proposed_disposition": "conflict", + "conflict_kinds": [6], + "successor": "", + "review_notes": "duplicate claim", + } + ], + } + ), + encoding="utf-8", + ) + ledger = build_ledger( + inventory, + config, + policy_root=root, + source_root=root, + rulings_path=rulings, + ) + rows = {f"{row['source_repo']}/{row['source_path']}": row for row in ledger["rows"]} + self.assertEqual("unreviewed", rows["alpha/docs/adr/one.md"]["proposed_disposition"]) + self.assertIn(1, rows["alpha/docs/adr/one.md"]["conflict_kinds"]) + self.assertEqual("conflict", rows["beta/docs/adr/two.md"]["proposed_disposition"]) + self.assertEqual([6, 1], rows["beta/docs/adr/two.md"]["conflict_kinds"]) diff --git a/tools/adr_review_ledger.py b/tools/adr_review_ledger.py index ac5a602..f1f72d7 100644 --- a/tools/adr_review_ledger.py +++ b/tools/adr_review_ledger.py @@ -82,11 +82,30 @@ def _frontmatter(path: Path) -> dict[str, str]: return {key: value for key, value in meta.items() if value} +def _load_rulings(path: Path | None) -> dict[tuple[str, str], dict[str, Any]]: + if path is None or not path.exists(): + return {} + payload = _read_json(path) + rulings: dict[tuple[str, str], dict[str, Any]] = {} + for ruling in payload.get("rulings", []): + key = (ruling["source_repo"], ruling["source_path"]) + if key in rulings: + raise ValueError(f"duplicate ruling: {key[0]}/{key[1]}") + rulings[key] = ruling + return rulings + + def build_ledger( - inventory_path: Path, config_path: Path, *, policy_root: Path, source_root: Path + inventory_path: Path, + config_path: Path, + *, + policy_root: Path, + source_root: Path, + rulings_path: Path | None = None, ) -> dict[str, Any]: inventory = _read_json(inventory_path) config = _read_json(config_path) + rulings = _load_rulings(rulings_path) paths = _repo_paths(config, policy_root=policy_root, source_root=source_root) rows: list[dict[str, Any]] = [] for source in inventory.get("sources", []): @@ -123,11 +142,7 @@ def build_ledger( "notes": SPECIALS.get(key, ""), "proposed_disposition": "publish" if key in FIRST_PUBLISH else "unreviewed", "conflict_kinds": [], - "successor": ( - "netkingdom-tenancy-posture" - if key == ("the-custodian", "canon/architecture/adr-008-multi-tenancy-model.md") - else "" - ), + "successor": "", "review_notes": "", } ) @@ -150,11 +165,31 @@ def build_ledger( row["bare_adr_collisions"] = [ other for other in by_bare.get(row["bare_adr"], []) if other != label ] + key = (row["source_repo"], row["source_path"]) + ruling = rulings.get(key) + if ruling: + for field in ( + "proposed_disposition", + "conflict_kinds", + "successor", + "review_notes", + ): + if field in ruling: + row[field] = ruling[field] + if row["id_collisions"] and 1 not in row["conflict_kinds"]: + row["conflict_kinds"] = [*row["conflict_kinds"], 1] + if not row["review_notes"]: + row["review_notes"] = ( + f"Front-matter id {row['frontmatter']['id']!r} is shared; " + "pick a repo-prefixed publication id before publish. " + "Who rules: owning repo." + ) return { "schema_version": 1, "protocol": "docs/adr-review/protocol.md", "source_inventory": "source-inventory.json", + "rulings": str(rulings_path) if rulings_path else "", "rows": rows, } @@ -210,6 +245,17 @@ def _summary(ledger: dict[str, Any]) -> str: [f"{row['source_repo']}/{row['source_path']}", *row["bare_adr_collisions"]] ) lines.append(f"- `{key}`: {others}") + conflicts = [row for row in rows if row["proposed_disposition"] == "conflict"] + lines.extend(["", "## Conflict rows", ""]) + if not conflicts: + lines.append("None.") + else: + for row in conflicts: + kinds = ",".join(str(kind) for kind in row["conflict_kinds"]) or "-" + lines.append( + f"- `{row['source_repo']}/{row['source_path']}` " + f"(kinds {kinds}): {row['review_notes']}" + ) lines.extend(["", "## Missing files", ""]) if not missing_files: lines.append("None.") @@ -226,6 +272,7 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument("--inventory", type=Path, default=Path("source-inventory.json")) parser.add_argument("--output", type=Path, default=Path("docs/adr-review/ledger.json")) parser.add_argument("--summary", type=Path, default=Path("docs/adr-review/SUMMARY.md")) + parser.add_argument("--rulings", type=Path, default=Path("docs/adr-review/rulings.json")) parser.add_argument("--policy-root", type=Path) parser.add_argument("--source-root", type=Path) args = parser.parse_args(argv) @@ -238,6 +285,7 @@ def main(argv: list[str] | None = None) -> int: config_path, policy_root=policy_root, source_root=source_root, + rulings_path=args.rulings.resolve() if args.rulings else None, ) args.output.parent.mkdir(parents=True, exist_ok=True) args.output.write_text( diff --git a/workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md b/workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md index 6dd6e12..897eef0 100644 --- a/workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md +++ b/workplans/POLICY-NEXUS-WP-0002-arc42-architecture-collection.md @@ -196,7 +196,7 @@ even as a stub. ```task id: POLICY-NEXUS-WP-0002-T04 -status: todo +status: done priority: high ``` @@ -211,6 +211,11 @@ satisfy T01 so this repo can publish it. This is the document WP-0003 checks other ADRs against when the conflict is "this decision does not fit the estate". +Completed 2026-08-18 in +`the-custodian/canon/architecture/coulomb-estate_v0.1.md`. Chapters 1, 3, +4, 5.1, 9 and 12 are real. Chapter 9 lists the estate ADRs and excludes +unresolved WP-0003 conflicts. + ### T05 — Remaining first-wave stubs in owning repos ```task @@ -254,7 +259,8 @@ publication stays explicit. 2026-08-18: `docs/architecture/*.md` is a policy-nexus selector. `policy-nexus-architecture` is published at -`/architecture/policy-nexus/v0.1/`. Other first-wave documents still +`/architecture/policy-nexus/v0.1/`. Estate map is published at +`/architecture/coulomb-estate/v0.1/`. Other first-wave documents still need owning-repo files. ### T07 — Smoke the published collection diff --git a/workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md b/workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md index deb8e43..e7a64b4 100644 --- a/workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md +++ b/workplans/POLICY-NEXUS-WP-0003-adr-review-cleanup-publish.md @@ -171,7 +171,7 @@ special. First-publish-set rows start as `publish`; everything else is ```task id: POLICY-NEXUS-WP-0003-T03 -status: todo +status: done priority: high ``` @@ -185,11 +185,17 @@ estate-level). Do not resolve a custodian-level clash in this repo. **Acceptance:** every `conflict` row is readable by the owning-repo agent that will have to act on it. +Completed 2026-08-18. `docs/adr-review/conflicts.md` and `rulings.json`. +Kind 1 is automatic on a shared front-matter id and is a prefix packet. +Live unpublished conflicts: hosts/infra ADR-003, hosts/infra ADR-004, +coulomb-social ADR-0002. No kind-4 contradiction found. Kind 5 waits +on chapter 9 (now present on the estate stub; re-check in T04). + ### T04 — Relevance filter ```task id: POLICY-NEXUS-WP-0003-T04 -status: todo +status: progress priority: high ``` @@ -207,6 +213,13 @@ publishes them. Per-repo proposals go out in T05 packets. Kind-5 (architecture miss) runs here once WP-0002-T04 exists, and again when T05 of that workplan lands a system document. +2026-08-18: first relevance slice is in `rulings.json`. Superseded: +custodian ADR-008, both IAM Profile predecessors, both ADR-002 host/infra +copies. Publish (after prefix/metadata packets): estate ADRs 001–007 and +010–011, activity-core 001–005, railiance-platform 0001–0003, IAM +Profile v0.3. Remainder still `unreviewed`. Kind 5 against the estate +chapter 9: the listed estate ADRs match; no miss on that document. + ### T05 — Cleanup packets ```task