Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
21eac56
test(docs): lock current Noema architecture contract
seonghobae Aug 7, 2026
b882d95
docs(architecture): define runtime and authority boundaries
seonghobae Aug 7, 2026
9d89e46
docs(agents): align Claude guidance with current runtime
seonghobae Aug 7, 2026
0633cad
docs(doctoring): record architecture standards basis
seonghobae Aug 7, 2026
4201623
docs(readme): expose authoritative architecture contract
seonghobae Aug 7, 2026
06ae6aa
docs(changelog): record authoritative architecture contract
seonghobae Aug 7, 2026
0e16529
test(security): require immutable workflow SHA binding
seonghobae Aug 7, 2026
fadc728
fix(security): bind workflow trust to immutable OIDC SHA
seonghobae Aug 7, 2026
db31598
test(security): align SHA trust response contract
seonghobae Aug 7, 2026
0897ea4
test(security): pair replay fixture workflow SHA
seonghobae Aug 7, 2026
a379273
test(security): pair workflow refs with immutable SHA claims
seonghobae Aug 7, 2026
b7d5ffe
config(security): pin the trusted workflow source SHA
seonghobae Aug 7, 2026
22d8d19
test(readiness): require immutable workflow SHA configuration
seonghobae Aug 7, 2026
556c3f5
test(readiness): pair accepted workflow refs with SHA
seonghobae Aug 7, 2026
4ca7e7b
test(readiness): recheck workflow SHA binding updates
seonghobae Aug 7, 2026
34e2158
test(readiness): configure immutable workflow SHA
seonghobae Aug 7, 2026
dca5b42
test(readiness): require workflow SHA in absent-config evidence
seonghobae Aug 7, 2026
d71fe2f
fix(readiness): fail closed without immutable workflow SHA
seonghobae Aug 7, 2026
ea0a8c5
docs(architecture): bind workflow source and alarm semantics
seonghobae Aug 7, 2026
9afbe21
docs(doctoring): record immutable workflow and alarm evidence
seonghobae Aug 7, 2026
807556e
docs(agent): correct operations and workflow-source guidance
seonghobae Aug 7, 2026
cd4bc1b
test(architecture): lock runtime and workflow trust documentation
seonghobae Aug 7, 2026
abd7b15
test(security): cover missing immutable workflow SHA
seonghobae Aug 7, 2026
4c2ad65
test(architecture): assert actual route implementation syntax
seonghobae Aug 7, 2026
bd2c1d8
docs(changelog): record immutable workflow source trust
seonghobae Aug 7, 2026
54cdcc7
docs(runbook): remove unsafe workflow-prefix recovery guidance
seonghobae Aug 7, 2026
96dd9de
docs(onboarding): require exact workflow ref and SHA pair
seonghobae Aug 7, 2026
f7814b9
docs(api): specify immutable workflow SHA and readiness contract
seonghobae Aug 7, 2026
15dd443
test(docs): forbid unsafe workflow-source recovery guidance
seonghobae Aug 7, 2026
80113eb
test(docs): assert fail-closed recovery wording
seonghobae Aug 7, 2026
8ab8c8c
test(security): refuse OIDC parser disagreement before token minting
seonghobae Aug 7, 2026
c5d8712
test(security): require workflow identity for present tokens
seonghobae Aug 7, 2026
104f0ec
fix(security): fail closed on OIDC parser disagreement
seonghobae Aug 7, 2026
11e068e
test(security): reject both workflow claim families
seonghobae Aug 7, 2026
dfa77d5
fix(security): reject mixed OIDC claim families
seonghobae Aug 7, 2026
c67dbb8
test(architecture): bind routes to their owning layers
seonghobae Aug 7, 2026
5b018b9
test(oidc): accept complete caller metadata with reusable source iden…
seonghobae Aug 7, 2026
61796d3
fix(oidc): authenticate reusable source with caller metadata
seonghobae Aug 7, 2026
f0d1a8f
test(security): cover malformed claim families and SHA whitespace
seonghobae Aug 7, 2026
cd8f8b0
fix(security): reject whitespace in workflow SHA binding
seonghobae Aug 7, 2026
5d71f54
test(docs): separate readiness and token trust failures
seonghobae Aug 7, 2026
48b6ce4
test(security): reject untrusted bearer tokens before exchange
seonghobae Aug 7, 2026
ee8e7ef
docs(onboarding): separate readiness and token trust failures
seonghobae Aug 7, 2026
be75d66
docs(runbook): separate binding and token trust incidents
seonghobae Aug 7, 2026
0070231
test(docs): reject mixed readiness and token failure guidance
seonghobae Aug 7, 2026
91022fa
docs(runbook): separate readiness configuration from token blocking
seonghobae Aug 7, 2026
b53d193
test(docs): require accurate reusable workflow claim history
seonghobae Aug 7, 2026
1fa7f27
test(security): bind prefix-ref rejection to a complete OIDC pair
seonghobae Aug 7, 2026
eed57b7
docs(changelog): record legitimate reusable workflow claim pairs
seonghobae Aug 7, 2026
2819e15
fix(oidc): reject mismatched preferred ref before pair completeness
seonghobae Aug 7, 2026
451dd91
fix(security): remove unreachable workflow ref branch
seonghobae Aug 7, 2026
b5ed976
test(security): cover defensive workflow trust branches
seonghobae Aug 7, 2026
976cfc4
test(docs): require canonical Noema documentation graph
seonghobae Aug 9, 2026
964a286
test(docs): align status contract with canonical product specs
seonghobae Aug 9, 2026
aebdb3e
docs(product): add canonical Noema PRD
seonghobae Aug 9, 2026
591cd09
docs(technical): add canonical Noema TRD
seonghobae Aug 9, 2026
f028636
docs(adr): add decision-record index
seonghobae Aug 9, 2026
cfb9a99
docs(adr): separate evidence from authority
seonghobae Aug 9, 2026
62f264e
docs(adr): define work-conserving autonomous loop
seonghobae Aug 9, 2026
d46b8ca
docs(adr): bind evidence to exact source revisions
seonghobae Aug 9, 2026
779a6a6
docs(adr): require conditional repository writes
seonghobae Aug 9, 2026
eff7d8a
docs(model): add UML architecture views
seonghobae Aug 9, 2026
c107624
docs(model): add persistence and evidence ERD
seonghobae Aug 9, 2026
37d748f
docs(traceability): map requirements to decisions and proof
seonghobae Aug 9, 2026
eb0d20e
docs(test): add canonical Noema test strategy
seonghobae Aug 9, 2026
a9353e5
docs(operations): add canonical operability contract
seonghobae Aug 9, 2026
621176b
docs(index): add canonical documentation map
seonghobae Aug 9, 2026
376537b
docs(security): model autonomous maintenance threats
seonghobae Aug 9, 2026
8841e23
docs(index): link autonomous maintenance threat model
seonghobae Aug 9, 2026
165a36a
test(docs): require autonomous threat model
seonghobae Aug 9, 2026
3282d3c
test(docs): require durable documentation gap audit
seonghobae Aug 9, 2026
c746db1
docs(audit): record Noema documentation completeness gaps
seonghobae Aug 9, 2026
4b74f68
docs(index): link documentation gap audit
seonghobae Aug 9, 2026
65862d9
docs(agent): route architecture work through canonical doc map
seonghobae Aug 9, 2026
169f3e2
test(docs): require complete architecture decision set
seonghobae Aug 9, 2026
1f12f40
docs(adr): fail closed across untrusted materialization
seonghobae Aug 9, 2026
024cf69
docs(adr): separate branch proof from operational acceptance
seonghobae Aug 9, 2026
d314195
docs(adr): define deterministic package-manager identity
seonghobae Aug 9, 2026
573ff80
docs(adr): require atomic proposal publication
seonghobae Aug 9, 2026
5ad64bb
docs(adr): define central and local automation ownership
seonghobae Aug 9, 2026
c8187da
docs(adr): index additional decisions
seonghobae Aug 9, 2026
1ae7add
docs(traceability): cover complete ADR baseline
seonghobae Aug 9, 2026
768882e
docs(audit): align gap audit with nine ADR baseline
seonghobae Aug 9, 2026
e3c16df
docs(audit): track replay side-effect ordering gap
seonghobae Aug 9, 2026
5fa5574
test(docs): require malformed bearer status contract
seonghobae Aug 9, 2026
c908031
docs(api): correct malformed bearer status contract
seonghobae Aug 9, 2026
24627da
test(docs): require canonical documentation map from root README
seonghobae Aug 9, 2026
52c6f2b
test(docs): avoid requiring unsafe whole-file README rewrite
seonghobae Aug 9, 2026
c55a01d
test(docs): pin replay side-effect caveat until #81 integrates
seonghobae Aug 9, 2026
f29be08
test(docs): require continuation from every intermediate artifact
seonghobae Aug 9, 2026
b61236a
docs(product): require handoff after every intermediate artifact
seonghobae Aug 9, 2026
f530301
docs(adr): require deliverable handoff before automation exit
seonghobae Aug 9, 2026
2db492f
docs(traceability): map deliverable handoff to exact evidence
seonghobae Aug 9, 2026
48f22f8
docs(audit): require GitHub mutation and post-documentation continuation
seonghobae Aug 9, 2026
82d217a
test(docs): require technical handoff state machine
seonghobae Aug 9, 2026
55588c6
docs(technical): define deliverable handoff state machine
seonghobae Aug 9, 2026
8adaeca
test(docs): require changelog for canonical documentation baseline
seonghobae Aug 9, 2026
144a8de
docs(changelog): record canonical documentation graph
seonghobae Aug 9, 2026
0351a5d
test(docs): require licensing and IP transfer contract
seonghobae Aug 9, 2026
463d449
docs(acquisition): define licensing and IP transfer boundary
seonghobae Aug 9, 2026
b037822
docs(acquisition): index licensing and IP transfer contract
seonghobae Aug 9, 2026
319fdaa
docs(acquisition): trace licensing and transfer evidence
seonghobae Aug 9, 2026
61f9aea
test(docs): require private-target review authority ADR
seonghobae Aug 9, 2026
aaf5780
docs(adr): bind private-target review lookup to scoped app token
seonghobae Aug 9, 2026
0e7d867
docs(adr): index private-target review authentication decision
seonghobae Aug 9, 2026
d777fa2
docs(traceability): map private-target reviewer authority boundary
seonghobae Aug 9, 2026
480ea86
docs(architecture): reconcile active review and replay decisions
seonghobae Aug 9, 2026
381915d
test(docs): require independent reviewer governance ADR
seonghobae Aug 9, 2026
c5bedb4
docs(adr): define independent reviewer governance
seonghobae Aug 9, 2026
eabc40a
docs(adr): index independent reviewer governance
seonghobae Aug 9, 2026
7d8e2b5
docs(traceability): map independent reviewer governance
seonghobae Aug 9, 2026
20ef74b
test(docs): require independent-review ADR in canonical audit
seonghobae Aug 9, 2026
117da27
docs: refresh architecture sufficiency and ADR inventory
seonghobae Aug 9, 2026
a126a16
test(docs): require governance baseline in changelog
seonghobae Aug 9, 2026
9a4233e
test(docs): keep changelog contract at canonical graph level
seonghobae Aug 9, 2026
0a67a8b
test(docs): require runner-assignment evidence separation
seonghobae Aug 10, 2026
3d3162e
docs(trd): separate runner assignment evidence
seonghobae Aug 10, 2026
2279574
docs(uml): model runner assignment separately
seonghobae Aug 10, 2026
8e524dd
docs(erd): add runner assignment evidence model
seonghobae Aug 10, 2026
0eb2c32
docs(trace): connect runner assignment evidence
seonghobae Aug 10, 2026
1479dd1
docs(audit): classify runner assignment gap
seonghobae Aug 10, 2026
e2a7ad2
test(docs): refuse unmerged architecture as main truth
seonghobae Aug 10, 2026
6acec33
docs(architecture): mark unmerged baseline proposed
seonghobae Aug 10, 2026
b5bec77
test(docs): bind artifact license metadata to legal authority
seonghobae Aug 10, 2026
5711a28
docs(licensing): bind artifact license metadata to rights authority
seonghobae Aug 10, 2026
32b5b3d
docs(licensing): verify current OCI annotation source
seonghobae Aug 10, 2026
999d2d0
test(docs): reject stale active-work and rights evidence claims
seonghobae Aug 10, 2026
4a5469f
docs: reconcile active package and rights evidence traceability
seonghobae Aug 10, 2026
f9ac313
docs: refresh documentation fitness against live workstreams
seonghobae Aug 10, 2026
74255c9
docs: bind exact-release rights evidence to acquisition integrity
seonghobae Aug 10, 2026
4f75944
docs(security): preserve replay side-effect acceptance boundary
seonghobae Aug 10, 2026
a89ece4
test(docs): fail closed on stale protected-main agent guidance
seonghobae Aug 10, 2026
b3f1c2d
docs(governance): flag stale protected-main agent guidance
seonghobae Aug 10, 2026
e111508
chore(stack): integrate protected nanoid CI predecessor
seonghobae Aug 10, 2026
1ad9879
test(docs): require current protected-main successor graph
seonghobae Aug 10, 2026
983cf34
docs(architecture): refresh canonical gap audit after protected nanoi…
seonghobae Aug 10, 2026
efbb117
docs(traceability): map current protected-main successors and schedul…
seonghobae Aug 10, 2026
b56dd3d
docs(prd): align product status with current protected successors
seonghobae Aug 10, 2026
02e2c4b
test(docs): require current successor ownership
seonghobae Aug 10, 2026
79e3801
docs: trace current disclosure and scheduler evidence owners
seonghobae Aug 10, 2026
9df8950
docs: refresh current security and scheduler evidence owners
seonghobae Aug 10, 2026
8551257
test(docs): require OpenAPI successor traceability
seonghobae Aug 10, 2026
5a460f0
docs(api): index proposed OpenAPI contract
seonghobae Aug 10, 2026
c4fcc59
docs(traceability): map proposed OpenAPI contract
seonghobae Aug 10, 2026
bbf878e
docs(audit): register proposed OpenAPI successor
seonghobae Aug 10, 2026
3a7a066
docs(test): record credential-exchange coverage truth
seonghobae Aug 17, 2026
82c5f34
docs: converge canonical architecture onto current main
seonghobae Aug 17, 2026
e34d208
docs: refresh canonical gap audit to live protected truth
seonghobae Aug 17, 2026
bfd4079
docs: refresh traceability to current protected lineage
seonghobae Aug 17, 2026
162c578
docs: refresh canonical documentation gap truth
seonghobae Aug 17, 2026
332133f
docs: refresh evidence traceability to live state
seonghobae Aug 17, 2026
b0bd67e
docs: mark OpenAPI contract as protected truth
seonghobae Aug 17, 2026
1dba40a
test(docs): replace stale active-work ownership assertions
seonghobae Aug 17, 2026
a7930c8
test(docs): bind architecture checks to current protected runtime
seonghobae Aug 17, 2026
ef222b0
docs: align architecture with protected workflow trust
seonghobae Aug 17, 2026
6a00bba
test(docs): retire historical architecture contract assertions
seonghobae Aug 17, 2026
f530126
test(docs): align reviewer governance contract to current graph
seonghobae Aug 17, 2026
f9feecb
Merge protected main into canonical documentation branch
seonghobae Aug 17, 2026
979c1e2
docs: mark acquisition rights contract as protected
seonghobae Aug 17, 2026
0e02970
test(docs): bind licensing lineage to protected truth
seonghobae Aug 17, 2026
77ce38d
docs: remove closed PRs from ADR source ownership
seonghobae Aug 17, 2026
09044ac
test(docs): require PRD current-owner truth
seonghobae Aug 17, 2026
ec8cf7c
docs: align PRD to current protected product truth
seonghobae Aug 17, 2026
77f2d26
docs(traceability): classify external evidence explicitly
seonghobae Aug 17, 2026
b47ae37
Merge protected main into canonical documentation branch
seonghobae Aug 17, 2026
4017491
Merge protected main into canonical documentation branch
seonghobae Aug 17, 2026
c2d82f6
Merge protected main into canonical documentation branch
seonghobae Aug 17, 2026
1b40aff
test(docs): reject stale integrated-owner claims
seonghobae Aug 17, 2026
e3befca
docs: refresh canonical owner and protected-main truth
seonghobae Aug 17, 2026
c30648d
test(docs): reject closed PRs as current owners
seonghobae Aug 17, 2026
e1a2aef
docs: reconcile merged owners with protected truth
seonghobae Aug 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Noema Architecture & Trust Boundaries

**Status: Proposed canonical documentation — In review on PR #71.** Until #71 integrates, protected source and live GitHub governance remain implementation authority. This document describes protected behavior unless explicitly marked **Planned** or **External evidence**.

Noema is a bounded credential-exchange and automation service. Its core rule is: **verify GitHub Actions OIDC identity, mint a repository-scoped GitHub App installation token, and keep model judgement, review evidence, merge authority, release authority, and deployment authority separate.**

## 1. Protected runtime topology

The Cloudflare Worker is layered:

- `src/runtime-entrypoint.ts` owns `/ready` and delegates ordinary traffic.
- `src/entrypoint.ts` owns outer request and credential-bearing egress validation.
- `src/worker.ts` adds distributed rate limiting, an exact configured workflow-ref precheck, and OIDC replay coordination.
- `src/index.ts` performs cryptographic GitHub Actions OIDC verification and GitHub App installation-token exchange.
- `NoemaRateLimiter` is a SQLite-backed Durable Object for distributed request limiting.
- `NoemaOidcReplayGuard` is a SQLite-backed Durable Object for bounded single-use OIDC replay state.

Wrangler points to `src/runtime-entrypoint.ts` and declares:

```text
NOEMA_RATE_LIMITER → NoemaRateLimiter
NOEMA_OIDC_REPLAY_GUARD → NoemaOidcReplayGuard
```

Routes have different meanings: `/health` is liveness, `/ready` is offline configuration readiness, and `/exchange` is the credential-bearing exchange API. A healthy process is not automatically ready to exchange credentials.

## 2. Current workflow trust contract

Protected runtime exposes `ALLOWED_WORKFLOW_REF_PREFIX`. Despite the legacy name, `src/worker.ts` parses it as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected.

The protected runtime does not expose `ALLOWED_WORKFLOW_SHA`, `workflow_sha`, or `job_workflow_sha` in this wrapper contract. Therefore canonical documentation must not claim paired SHA validation is deployed. Cryptographic OIDC verification in `src/index.ts` is a separate authority from the outer exact-ref precheck.

**Planned:** a stronger immutable workflow-source binding may be introduced only by a separately reviewed source change with realistic RED/GREEN regressions and deployment/configuration evidence. That stronger immutable workflow-source binding is **not implemented on protected main** merely because historical branch prose described it.

## 3. Runtime data flow

```mermaid
flowchart LR
A[GitHub Actions caller] -->|OIDC + target_repository| B[src/runtime-entrypoint.ts]
B --> C{route}
C -->|/health| H[Liveness]
C -->|/ready| R[Readiness]
C -->|/exchange| E[src/entrypoint.ts]
E --> L[NoemaRateLimiter]
L --> W[src/worker.ts\nexact workflow ref]
W --> O[src/index.ts\nOIDC verification]
O --> G[GitHub App token exchange]
G --> P[NoemaOidcReplayGuard]
P --> T[Repository-scoped token]
```

Each boundary is fail-closed where its owning implementation requires a control. Success at an earlier boundary never proves a later one.

## 4. Optional CWL composition

Noema remains independently deployable. CWL composition is through versioned protocol/evidence contracts rather than shared process or database state.

- `ContextualWisdomLab/.github` may own central reusable workflow policy.
- `contextual-orchestrator` owns model routing/orchestration behind its published gateway contract.
- `naruon` may consume Noema contracts, but Noema does not require naruon persistence, runtime, or deployment lifecycle.

These are separate ownership domains. Noema does not duplicate their internal authority.

## 5. Evidence and authority separation

| Plane | Meaning | Not equivalent to |
| --- | --- | --- |
| runner assignment | job obtained execution capacity | check success, approval, merge |
| check runs | CI/security result | formal approval |
| commit statuses | integration status | check run or approval |
| review evidence | formal/commented review state | merge permission by itself |
| model judgement | LLM assessment | independent approval or source truth |
| live ruleset | repository governance | source correctness |
| merge authority | permission after live gates | release/deployment authority |
| release authority | version/artifact publication | deployment success |
| deployment authority | production/environment control | buyer/legal evidence |

Queued, pending, skipped-required, cancelled, failed, stale-head, predecessor-head, synthetic-only, status-only, and model-only evidence is non-passing for a gate requiring terminal current evidence.

## 6. exact-head and live-base invariants

Repository automation must:

1. bind source review and CI claims to the **exact-head** SHA;
2. resolve the live base independently instead of treating historical PR-base metadata as the protected tip;
3. refetch mutable targets immediately before writes;
4. keep check runs, commit statuses, review evidence, scanner evidence, and model judgement separate;
5. fully paginate evidence before claiming completeness;
6. reject stale/predecessor evidence as current success;
7. avoid self-modifying repair workflows and never weaken gates to manufacture green evidence.

These control-plane invariants are separate from the OIDC runtime's current exact-ref trust contract.

## 7. Credential and network boundaries

Worker runtime secrets enter `src/` through typed Cloudflare bindings, including `GITHUB_APP_ID`, `GITHUB_APP_PRIVATE_KEY_PEM`, and optional `GITHUB_APP_INSTALLATION_ID`. Production code does not gain ambient secret reads through `process.env` or `os.getenv()`.

Credential-bearing GitHub traffic uses bounded origin/request/response validation. OIDC discovery/JWKS traffic is public verification traffic and does not carry GitHub App credentials. Unexpected redirect/origin/path/method, unbounded bodies, malformed upstream responses, and timeouts fail closed at their owning boundary.

Model-facing automation uses the `NOEMA_LLM_*` gateway contract where applicable. Upstream provider credentials stay behind `contextual-orchestrator`; reviewer and repository-write credentials remain separate from model execution authority. `COPILOT_GITHUB_TOKEN` is not a substitute.

## 8. Durable state and time

`NoemaRateLimiter` and `NoemaOidcReplayGuard` own different minimal state. Raw credentials are not their persistence model. Missing or malformed backend decisions fail closed where the control is required.

Durable Object alarms are at-least-once. Handlers reread current deadline/expiry state and **reschedule** from current state so delayed alarms cannot delete newer state. Storage-class, binding-name, or lifecycle changes require migration/rollback analysis.

## 9. Standalone and modular MSA contract

- **Standalone first:** Noema can deploy, roll back, expose readiness, and serve its core API without another CWL service.
- **Protocol composition:** integrations use documented API/event/evidence contracts, not cross-service application-table SQL.
- **No shared-secret coupling:** provider/reviewer secrets stay in their owning trust domain.
- **Independent failure domains:** orchestration or reviewer failure cannot relax credential verification.
- **Versioned evidence:** machine-readable evidence names producer/schema/source identity without implying extra authority.
- **Data design:** new owned relational objects use descriptive two-or-more-word `snake_case` names and 3NF by default.

## 10. Verification by change family

| Change | Minimum proof |
| --- | --- |
| `/exchange` | typecheck, realistic public/API regressions, exact owned-production coverage, security scan |
| OIDC/GitHub App | issuer/audience/repository/workflow-ref, malformed token/JWKS, replay, redirect/egress, secret non-disclosure regressions |
| Durable Objects | cross-instance semantics, delayed/retried alarm, current-state reschedule, malformed backend/storage-failure tests |
| GitHub Actions/control plane | least privilege, exact-head/live-base binding, full pagination, stale-head refusal, evidence-class separation |
| LLM integration | gateway contract, provider-key isolation, deterministic gates independent of model judgement |
| release/acquisition | protected source, CI/security/coverage, package/SBOM/provenance/reproducibility, licensing/NOTICE, rollback/recovery, later operational/buyer evidence |

Owned production remains subject to exact 100% statement/branch/function/line coverage where tooling exposes those metrics. Coverage exclusions do not substitute for executable behavior tests.

## 11. Independent gates and non-claims

Repository source/docs cannot fabricate stronger live `main` governance than the current ruleset, independent approval, App provisioning, reviewer staffing, protected production approval, immutable release/signing/provenance, 30-day KPI evidence, customer/revenue evidence, or legal transfer authority. These remain separate evidence classes and fail closed when required but absent.

## 12. Canonical documentation graph

- `docs/PRD.md`, `docs/TRD.md`
- `docs/adr/README.md`
- `docs/UML.md`, `docs/ERD.md`
- `docs/TEST_STRATEGY.md`, `docs/OPERABILITY.md`
- `docs/TRACEABILITY.md`
- protected `openapi.json` and `docs/api-spec.md`
- `docs/threat-model.md`, `docs/automation-threat-model.md`
- `docs/LICENSING_AND_IP_TRANSFER.md`
- `docs/DOCUMENTATION_GAP_AUDIT.md`
- `docs/doctoring/architecture-trust-boundaries.md`

Root README/customer copy may have a separate active owner; the canonical architecture graph must not race that owner merely to satisfy historical wording assertions.

## 13. Architectural decision

The default shape is **small credential-exchange service + explicit state coordinators + external orchestration/review planes**. New model orchestration, artifact processing, repository mutation, or deployment authority should first be evaluated as a separate bounded component rather than folded into `/exchange`.

Architecture changes must keep source behavior, realistic regression tests, canonical documentation, traceability, and CHANGELOG semantics consistent without promoting active-PR behavior to protected truth.
Loading
Loading