Skip to content

Commit afb072c

Browse files
committed
docs(adr)+fix(uri): urn:visionclaw convergence ADR + dual-read; ratify ADR-089; resolve 4 ADR collisions
- ADR-105 records the urn:visionclaw durable-identifier convergence and the urn:ngm cutover: new mints converge via src/uri/mod.rs; parsers dual-read both schemes so persisted urn:ngm IDs keep resolving; bulk rewrite + urn:ngm:graph:* named graphs (ADR-100) are explicit Phase-2/permanent-exclusion. Implements the dual-read primitive (parse_dual, LegacyNgm); mint path already converged. - ADR-089 ratified Proposed->Accepted with a reclassification note (no CQRS bus was ever wired; sole path is direct hexser dispatch); the fabricated "114 CQRS handlers" README claim corrected to 56 direct DirectiveHandler/QueryHandler impls. - Four duplicate ADR numbers resolved: the second of each collided pair renamed to ADR-106/107/108/109 (028/030/031/086 primaries kept); ADR-063's stale src/uri/{mint,parse,kinds}.rs citation fixed; one-number-one-decision note added. cargo check -p visionclaw-server clean; uri:: tests 16/16. In-flight XR work untouched. Co-Authored-By: jjohare <github@thedreamlab.uk>
1 parent 44cca9d commit afb072c

11 files changed

Lines changed: 326 additions & 17 deletions

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ flowchart TB
150150
- `subClassOf` → attraction, `disjointWith` → repulsion in GPU physics
151151
- Every ontology mutation creates a GitHub PR — human veto before commit
152152
- Content-addressed immutable provenance beads (Nostr)
153-
- 10 DDD bounded contexts with CQRS — 114 command/query handlers
153+
- DDD bounded contexts with direct hexser dispatch — 56 `DirectiveHandler`/`QueryHandler` implementations across 5 application contexts (no CQRS bus; see ADR-089)
154154

155155
</td>
156156
<td width="50%">
@@ -484,7 +484,7 @@ flowchart TB
484484
```
485485

486486
<details>
487-
<summary><strong>Hexagonal architecture (9 ports · 12 adapters · 114 CQRS handlers)</strong></summary>
487+
<summary><strong>Hexagonal architecture (9 ports · 12 adapters · 56 direct hexser DirectiveHandler/QueryHandler impls — no CQRS bus, see ADR-089)</strong></summary>
488488

489489
VisionClaw follows strict hexagonal architecture. Business logic in `src/services/` depends only on port traits in `src/ports/`. Concrete implementations live in `src/adapters/`, swapped at startup via dependency injection.
490490

@@ -612,7 +612,7 @@ Each context has its own aggregate roots, domain events, and anti-corruption lay
612612

613613
| Layer | Technology | Detail |
614614
|:------|:-----------|:-------|
615-
| **Backend** | Rust 2021 · Actix-web | 427 files, 175K LOC · hexagonal CQRS · 9 ports · 12 adapters · 114 handlers |
615+
| **Backend** | Rust 2021 · Actix-web | 427 files, 175K LOC · hexagonal · direct hexser dispatch (no CQRS bus, ADR-089) · 9 ports · 12 adapters · 56 DirectiveHandler/QueryHandler impls |
616616
| **Frontend (desktop)** | React 19 · Three.js 0.182 · R3F | 370 files, 96K LOC · TypeScript 5.9 · InstancedMesh · SAB zero-copy |
617617
| **Frontend (XR)** | Babylon.js | Immersive/VR mode — Quest 3 foveated rendering, hand tracking |
618618
| **WASM** | Rust → wasm-pack | `scene-effects` crate: zero-copy `Float32Array` view over `WebAssembly.Memory` |

docs/README.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ Conceptual deep-dives that build understanding of how and why VisionClaw works.
186186
| Document | What it explains |
187187
|----------|-----------------|
188188
| [System Overview](explanation/system-overview.md) | End-to-end architectural blueprint — all layers and their interactions |
189-
| [Backend CQRS Pattern](explanation/backend-cqrs-pattern.md) | Hexagonal architecture with 9 ports, 12 adapters, 114 command/query handlers |
189+
| [Backend CQRS Pattern](explanation/backend-cqrs-pattern.md) | Hexagonal architecture with 9 ports, 12 adapters, 56 direct hexser DirectiveHandler/QueryHandler impls (no CQRS bus — see ADR-089) |
190190
| [Actor Hierarchy](explanation/actor-hierarchy.md) | 21-actor Actix supervision tree — roles, message protocols, failure strategies |
191191
| [Client Architecture](explanation/client-architecture.md) | React + Three.js component hierarchy, WebGL rendering pipeline, WASM integration |
192192
| [DDD Bounded Contexts](explanation/ddd-bounded-contexts.md) | Domain-Driven Design context map and aggregate boundaries |
@@ -240,6 +240,17 @@ Design decisions recorded as ADRs in [docs/adr/](adr/).
240240

241241
> ADR-015 through ADR-026 are not in this repository — those numbers were assigned to decisions that predated the current ADR process and were not backfilled.
242242
243+
> **Numbering convention (one-number-one-decision):** every ADR number maps to exactly
244+
> one decision. Duplicate-numbered files are renumbered to the next free number rather
245+
> than disambiguated by suffix. The 2026-06-11 sweep renumbered the colliding second
246+
> file of four pairs: `ADR-028-sparql-patch-ontology`**ADR-106**,
247+
> `ADR-030-ext-github-creds-in-pod`**ADR-107**, `ADR-031-layout-mode-system`**ADR-108**,
248+
> `ADR-086-sops-secrets-management`**ADR-109**. The primary of each pair keeps its number
249+
> (ADR-028 optional-auth, ADR-030 agent-memory-pods, ADR-031 gpu-analytics, ADR-086
250+
> git-over-http-ingest). See ADR-105 §Numbering. The previous historical `-ext` suffix
251+
> (e.g. ADR-028-ext) is retained where it still denotes a distinct accepted decision and
252+
> did not itself collide.
253+
243254
### Core Platform (ADR-011 to ADR-014)
244255

245256
| ADR | Title |
@@ -254,7 +265,7 @@ Design decisions recorded as ADRs in [docs/adr/](adr/).
254265
| ADR | Title |
255266
|-----|-------|
256267
| [ADR-027](adr/ADR-027-pod-backed-graph-views.md) | Pod-Backed Graph Views |
257-
| [ADR-028](adr/ADR-028-sparql-patch-ontology.md) | SPARQL PATCH for Ontology Mutations |
268+
| [ADR-106](adr/ADR-106-sparql-patch-ontology.md) | SPARQL PATCH for Ontology Mutations (renumbered from ADR-028; see ADR-105 §Numbering) |
258269
| [ADR-029](adr/ADR-029-type-index-discovery.md) | Type Index Discovery |
259270
| [ADR-030](adr/ADR-030-agent-memory-pods.md) | Agent Memory Pods |
260271

@@ -263,7 +274,7 @@ Design decisions recorded as ADRs in [docs/adr/](adr/).
263274
| ADR | Title | Description |
264275
|-----|-------|-------------|
265276
| [ADR-028-ext](adr/ADR-028-ext-optional-auth.md) | NIP-98 Optional Enterprise Auth | AccessLevel::Optional + caller-aware filter + legacy session deprecation path |
266-
| [ADR-030-ext](adr/ADR-030-ext-github-creds-in-pod.md) | Pod-Stored GitHub Credentials | Per-user GitHub creds in Pod ./private/config/github + power-user bootstrap CLI |
277+
| [ADR-107](adr/ADR-107-github-creds-in-pod.md) | Pod-Stored GitHub Credentials | Per-user GitHub creds in Pod ./private/config/github + power-user bootstrap CLI (renumbered from ADR-030-ext; see ADR-105 §Numbering) |
267278
| [ADR-050](adr/ADR-050-pod-backed-kgnode-schema.md) | Pod-Backed KGNode Schema | KGNode visibility/owner_pubkey/opaque_id/pod_url fields + PRIVATE_OPAQUE_FLAG + HMAC opaque IDs |
268279
| [ADR-051](adr/ADR-051-visibility-transitions.md) | Publish/Unpublish Saga | Visibility state machine: MOVE between /public and /private containers, 410 Gone, cache invalidation |
269280
| [ADR-052](adr/ADR-052-pod-default-wac-public-container.md) | Pod Default WAC + Container Layout | Default-private root ACL + /private, /public, /shared, /profile + double-gated writes |
@@ -272,7 +283,7 @@ Design decisions recorded as ADRs in [docs/adr/](adr/).
272283

273284
| ADR | Status | Title |
274285
|-----|--------|-------|
275-
| [ADR-031](adr/ADR-031-layout-mode-system.md) | Accepted | Layout Mode System |
286+
| [ADR-108](adr/ADR-108-layout-mode-system.md) | Accepted | Layout Mode System (renumbered from ADR-031; see ADR-105 §Numbering) |
276287
| ADR-032 (deleted) | **Superseded** | ~~RATK Integration for WebXR~~ → ADR-071 |
277288
| ADR-033 (deleted) | **Superseded** | ~~Vircadia SDK Decoupling~~ → ADR-071 |
278289
| [ADR-034](adr/ADR-034-needle-bead-provenance.md) | Accepted | NEEDLE Bead Provenance System |

docs/adr/ADR-063-urn-traced-operations.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ subsystems were generating opaque UUIDv4 identifiers instead of minted URNs,
1313
breaking traceability across the knowledge graph, observability stack, and
1414
federation boundary.
1515

16-
The VisionClaw Rust substrate has `src/uri/` (mint.rs, parse.rs, kinds.rs)
17-
with `mint_concept`, `mint_execution`, `mint_bead`, `mint_did_nostr`,
18-
`mint_owned_kg`, and `mint_group_members` — but several actors still use
16+
The VisionClaw Rust substrate has the converged minter at `src/uri/mod.rs`
17+
(a single module — the `mint.rs/parse.rs/kinds.rs` split cited in earlier drafts
18+
never landed; corrected per ADR-105) with `concept`, `execution`, `bead`,
19+
`did_nostr`, `kg`, `group_members`, `room`, `avatar`, plus `parse` / `parse_dual`
20+
and the BC20 `cross_from_agentbox` ingest — but several actors still use
1921
`Uuid::new_v4()` directly.
2022

2123
## Decision

docs/adr/ADR-089-cqrs-bus-removal.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,25 @@
22

33
| Field | Value |
44
|-------|-------|
5-
| Status | Proposed (2026-05-09) |
5+
| Status | Accepted (2026-06-11; proposed 2026-05-09) |
66
| Drives | PRD-015 §3 (isolated code registry), PRD-014 OBS-03 (dead code removal) |
77
| Companion ADRs | ADR-077 P8 (code quality gates) |
88
| Companion PRDs | PRD-014, PRD-015 |
99
| Affected repos | `VisionClaw` |
1010

11+
## 2026-06-11 reclassification
12+
13+
Moved Proposed → **Accepted**. The 2026-06-11 ADR-gap audit re-confirmed this ADR's
14+
premise directly against the tree: no command/query *bus* was ever wired into a
15+
production dispatch path. The sole command path is **direct hexser dispatch**
16+
`DirectiveHandler` / `QueryHandler` implementations invoked directly (and actor
17+
mailboxes for live state), never routed through an in-process CQRS bus. The
18+
`src/cqrs/` scaffold remained a dead, no-op experiment with zero consumers and zero
19+
coverage. Ratifying the deletion removes the contradiction between the dead scaffold
20+
and the actual direct-dispatch architecture. The companion correction is the README,
21+
whose "114 CQRS handlers" headline implied a bus that never existed; it now describes
22+
direct hexser `DirectiveHandler`/`QueryHandler` dispatch.
23+
1124
## Context
1225

1326
The `src/cqrs/` directory contains a full CQRS (Command Query Responsibility Segregation) event bus implementation spanning **3,200 lines** across 12 files:
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
# ADR-105 — `urn:visionclaw` Convergence and `urn:ngm` Cutover
2+
3+
| Field | Value |
4+
|-------|-------|
5+
| Status | Accepted (2026-06-11) |
6+
| Supersedes | the implicit "legacy scheme, no rip-out yet" prose in `src/uri/mod.rs` header and ADR-063 §1 |
7+
| Relates to | ADR-100 (ontology IRIs; keeps `urn:ngm:graph:*`), ADR-063 (URN-traced operations), ADR-077 P3 (canonical mint module) |
8+
| Affected repos | `VisionClaw` (+ the `agentbox` BC20 boundary it federates with) |
9+
| Authoritative code | `src/uri/mod.rs` (the converged minter) |
10+
11+
## Context
12+
13+
VisionClaw `main` carries **two** durable-identifier namespaces simultaneously:
14+
15+
1. **The converged `urn:visionclaw:<kind>` grammar** — a complete, typed,
16+
fail-closed minter shipped at **`src/uri/mod.rs`**. It mints 7 URN kinds
17+
(`concept`, `kg`, `bead`, `execution`, `group`, `room`, `avatar`) plus
18+
`did:nostr:<hex-pubkey>` for sovereign identity, with content-addressing
19+
(`sha256-12-<12 hex>`) and 64-char BIP-340 x-only hex pubkey scopes. It is the
20+
VisionClaw-side counterpart of the agentbox `urn:agentbox:*` grammar, and it is
21+
already wired into the live provenance/ingest paths
22+
(`src/handlers/enrichment_proposals_handler.rs`, `src/agent_events/provenance.rs`,
23+
`src/agent_events/ingest.rs`).
24+
25+
2. **The legacy `urn:ngm:*` scheme** — the pre-convergence persistence identifiers
26+
still live in ~20 sites across 5 source files. These are *not* incidental: they
27+
are the storage-IRI surface bound 1:1 to the Oxigraph named graphs
28+
(`urn:ngm:graph:knowledge`, `urn:ngm:graph:agent`, `urn:ngm:graph:ontology:*`)
29+
that **ADR-100 deliberately keeps unchanged**, plus the node/edge/domain IRIs
30+
that round-trip through SPARQL `FILTER (STRSTARTS(...))` clauses and the
31+
`iri_to_node_id` parser.
32+
33+
The `src/uri/mod.rs` header has admitted since it shipped that "VisionClaw `main`
34+
still carries the legacy `urn:ngm:*` scheme, which is left intact here to coexist
35+
(no rip-out yet)." The 2026-06-11 ADR-gap inventory flagged this as a **critical
36+
unratified decision**: the convergence had no ADR, no cutover plan, and no statement
37+
of what migrates versus what stays. This ADR ratifies the convergence and records the
38+
cutover boundary.
39+
40+
> **Stale-citation correction.** ADR-063 §1 cites the minter as
41+
> `src/uri/{mint.rs, parse.rs, kinds.rs}`. That layout never landed — the converged
42+
> minter is a single module at **`src/uri/mod.rs`** (mint constructors, `parse`,
43+
> `Kind`, BC20 ingest, and now `parse_dual` all colocated). All references should
44+
> point at `src/uri/mod.rs`.
45+
46+
## Decision
47+
48+
### D1 — New durable identifiers mint as `urn:visionclaw` via `src/uri/mod.rs`
49+
50+
Every **new** durable identifier minted on the VisionClaw side is produced through
51+
the typed constructors in `src/uri/mod.rs` (`concept`, `kg`, `bead`, `execution`,
52+
`group_members`, `room`, `avatar`, `did_nostr`). Ad-hoc `format!("urn:ngm:…")` /
53+
template-literal construction of **new** durable IDs is prohibited, mirroring the
54+
`uris.js` mandate on the agentbox side. New mints are converged-only; no new
55+
identifier is ever produced under the `urn:ngm:` prefix.
56+
57+
### D2 — Parsers dual-read BOTH namespaces (persisted `urn:ngm` keeps resolving)
58+
59+
The resolve/lookup path accepts **both** the converged grammar and legacy
60+
`urn:ngm:*`. This is implemented as `src/uri/mod.rs::parse_dual`, which:
61+
62+
* delegates to the strict `parse` for `did:nostr:*` / `urn:visionclaw:*`, and
63+
* returns `ParsedUri::LegacyNgm { sub }` for any `urn:ngm:<sub>` identifier, carried
64+
opaquely so it round-trips its string form without being re-minted under the
65+
converged grammar.
66+
67+
The strict `parse` is **unchanged** — it still rejects `urn:ngm:*`, because the mint
68+
path must stay converged-only. `parse_dual` is the entry point for surfaces that
69+
must resolve historically-persisted IDs. This guarantees that every already-stored
70+
`urn:ngm:node:*`, `urn:ngm:edge:*`, and `urn:ngm:domain:*` identifier keeps
71+
resolving after the cutover with zero data movement.
72+
73+
### D3 — `urn:ngm:graph:*` named graphs stay (per ADR-100)
74+
75+
The Oxigraph named-graph IRIs (`urn:ngm:graph:knowledge`, `urn:ngm:graph:agent`,
76+
`urn:ngm:graph:ontology:inferred`, …) are **not** changed. ADR-100 scopes ontology
77+
IRIs and explicitly leaves the `urn:ngm:graph:*` named graphs in place; this ADR
78+
reaffirms that. They are persistence-layer dataset coordinates, not federation-facing
79+
durable identifiers, and renaming them would require rewriting the entire stored
80+
quad set with no external benefit.
81+
82+
### D4 — BC20 is the cross-namespace anti-corruption boundary
83+
84+
The `urn:agentbox:*``urn:visionclaw:*` translation at the federation boundary is
85+
governed by the **BC20 anti-corruption layer**. The executable specification is
86+
agentbox `management-api/lib/bc20-provenance-bridge.js` (its `toVisionclaw` map); the
87+
VisionClaw-side counterpart is `src/uri/mod.rs::cross_from_agentbox`. The closed kind
88+
map is authoritative on both sides:
89+
90+
| agentbox kind | VisionClaw target | Notes |
91+
|---|---|---|
92+
| `agent` | `did:nostr:<pubkey>` | identity; structural round-trip |
93+
| `activity` | `urn:visionclaw:execution:<sha256-12>` | unscoped; owner in `owner_did` |
94+
| `thing` | `urn:visionclaw:kg:<pubkey>:<sha256-12>` | owner-scoped, content-addressed |
95+
| `memory` | `urn:visionclaw:concept:<domain>:<slug>` | needs elevation `{domain,slug}`; absent on the hot path → recorded as crossing-without-translation (`None`) |
96+
| _other_ || unmapped → `None` (closed-map discipline) |
97+
98+
`did:nostr:*` is already converged on both sides and passes through unchanged. The
99+
BC20 boundary is the **only** cross-namespace importer; nothing else translates
100+
between `urn:agentbox` and `urn:visionclaw`.
101+
102+
### D5 — Bulk rewrite of stored IDs is a deferred Phase-2 (OUT OF SCOPE here)
103+
104+
Rewriting the **already-persisted** `urn:ngm:node:*` / `urn:ngm:edge:*` /
105+
`urn:ngm:domain:*` identifiers in the Oxigraph store into the converged grammar is an
106+
explicit **Phase-2 data migration** and is **out of scope for this sprint**. It
107+
requires: a converged kind for node/edge persistence IRIs (the current minter has no
108+
`node`/`edge`/`domain` kind — `kg` is content-addressed by pubkey, not by the legacy
109+
`u32` node id), a stop-the-world or online migration of the stored quad set, a
110+
rewrite of every SPARQL `FILTER (STRSTARTS(STR(?s), "urn:ngm:edge:"))` and the
111+
`iri_to_node_id` round-trip parser in lockstep, and a re-derivation of node ids under
112+
the converged content-addressing scheme. None of that is attempted now. Dual-read
113+
(D2) is precisely what makes deferring it safe: nothing breaks while the legacy IDs
114+
remain in storage.
115+
116+
## Phase-2 backlog (sites left on `urn:ngm` deliberately)
117+
118+
These sites mint or round-trip `urn:ngm:*` and are **intentionally not converted** in
119+
this sprint because each is structurally bound to the ADR-100-protected named-graph
120+
storage and would desync stored quads from their FILTERs/parser if flipped in
121+
isolation:
122+
123+
| Site | What it is | Why deferred |
124+
|---|---|---|
125+
| `src/adapters/oxigraph_graph_repository.rs::node_iri` (`urn:ngm:node:{id}`) | persistence node IRI mint | round-trips via `iri_to_node_id`; no converged `node` kind exists; tied to stored quads |
126+
| `src/adapters/oxigraph_graph_repository.rs::edge_iri` + `remove_edge` (`urn:ngm:edge:*`) | persistence edge IRI mint | matched by 3 SPARQL `STRSTARTS` FILTERs; converting desyncs stored triples |
127+
| `src/adapters/oxigraph_graph_repository.rs` SPARQL FILTERs (lines ~296/327/347) | `STRSTARTS(STR(?s), "urn:ngm:edge:")` | must move in lockstep with the edge-IRI mint |
128+
| `src/adapters/oxigraph_graph_repository.rs::iri_to_node_id` (`strip_prefix("urn:ngm:node:")`) | node-IRI → `u32` round-trip | the inverse of `node_iri`; Phase-2 with it |
129+
| `src/services/github_sync_service.rs::ensure_domain_roots` (`urn:ngm:domain:{slug}`) | ontology `owl_class_iri` mint | joined against ontology named-graph quads + `enrich_node_from_quads` ngm-prefix match; ADR-100 territory |
130+
| `src/adapters/oxigraph_graph_repository.rs` / `src/handlers/ontology_handler.rs` `urn:ngm:graph:*` | named graphs | **stays permanently** per ADR-100/D3 (not a Phase-2 item — a permanent exclusion) |
131+
132+
## What was executed in this sprint (low-risk half)
133+
134+
* **Added `parse_dual` + `ParsedUri::LegacyNgm`** to `src/uri/mod.rs` (D2): the
135+
resolve path now accepts both schemes; strict `parse` stays converged-only so the
136+
mint path is unchanged and the existing ngm-rejection test still passes. New tests
137+
cover converged round-trip, legacy round-trip, empty-sub rejection, and
138+
foreign-namespace rejection.
139+
* **Confirmed** the converged minter is already the mint path for the live
140+
provenance/ingest surfaces (`enrichment_proposals_handler`, `agent_events`).
141+
* **Left** all persistence-IRI mints on `urn:ngm` (the Phase-2 table above), because
142+
converting any one in isolation desyncs the ADR-100-protected stored quad set from
143+
its FILTERs and round-trip parser.
144+
* **Corrected** the stale ADR-063 `src/uri/{mint,parse,kinds}.rs` citation to the
145+
real `src/uri/mod.rs`.
146+
147+
## Numbering
148+
149+
This ADR also anchors the **one-number-one-decision** numbering convention recorded
150+
in `docs/README.md`. ADR-105 is the next free number after the on-disk max (ADR-104).
151+
The same sweep that ratified this convergence renumbered four colliding duplicate-pair
152+
files to ADR-106…ADR-109 (see `docs/README.md` → "Numbering convention").
153+
154+
## Consequences
155+
156+
**Positive**
157+
158+
* The convergence is ratified; `src/uri/mod.rs` is the named authoritative minter.
159+
* Persisted `urn:ngm` IDs keep resolving (dual-read) with zero data movement.
160+
* The BC20 boundary and its closed kind map are recorded as the single
161+
cross-namespace anti-corruption spec.
162+
* The migration is explicitly deferred and scoped, not silently dropped.
163+
164+
**Negative / residual**
165+
166+
* Two durable namespaces coexist until Phase-2; readers must call `parse_dual`
167+
(not the strict `parse`) when they may encounter persisted legacy IDs.
168+
* `urn:ngm:graph:*` named graphs remain `ngm`-prefixed permanently (by ADR-100
169+
design, not by omission).
170+
171+
**Risks**
172+
173+
* A surface that calls strict `parse` where it should call `parse_dual` would fail to
174+
resolve a legacy ID. Mitigation: `parse_dual` is documented as the resolve-path
175+
entry point; the strict `parse` carries an explicit "rejects `urn:ngm:*`" contract
176+
and test.
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
# ADR-028: SPARQL PATCH for Ontology Mutations
1+
# ADR-106: SPARQL PATCH for Ontology Mutations
2+
3+
> **Renumber note (2026-06-11):** previously filed as `ADR-028-sparql-patch-ontology`,
4+
> which collided with `ADR-028-ext-optional-auth`. Renumbered to ADR-106 to enforce
5+
> the one-number-one-decision uniqueness convention (see ADR-105 §Numbering and the
6+
> ADR index in `README.md`). `ADR-028` now refers solely to optional-auth.
27
38
## Status
49
Accepted

docs/adr/ADR-030-ext-github-creds-in-pod.md renamed to docs/adr/ADR-107-github-creds-in-pod.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
# ADR-030-ext: GitHub Credentials in Pod — Sovereign Per-User Auth
1+
# ADR-107: GitHub Credentials in Pod — Sovereign Per-User Auth
2+
3+
> **Renumber note (2026-06-11):** previously filed as `ADR-030-ext-github-creds-in-pod`,
4+
> which collided with `ADR-030-agent-memory-pods`. Renumbered to ADR-107 to enforce the
5+
> one-number-one-decision uniqueness convention (see ADR-105 §Numbering and the ADR
6+
> index in `README.md`). `ADR-030` now refers solely to agent-memory-pods.
27
38
## Status
49

0 commit comments

Comments
 (0)