-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevolith.satellite.json
More file actions
98 lines (98 loc) · 7.72 KB
/
Copy pathevolith.satellite.json
File metadata and controls
98 lines (98 loc) · 7.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
{
"$schema": "https://evolith.dev/schemas/satellite-manifest/v1.json",
"manifestVersion": "1.1.0",
"repo": "evolith_tracker",
"displayName": "Evolith Tracker",
"role": "satellite",
"roleStatement": "Evolith Tracker is ALWAYS a satellite of Evolith Core. It owns its own domain, microservices and independent database, but it is never the authority of governance rules — it is an external client of the Core API Exposure Layer.",
"upstream": {
"name": "Evolith Core",
"repo": "evolith_arch32",
"url": "https://github.com/beyondnetcode/evolith_arch32",
"role": "root-authority",
"roleStatement": "Evolith Core is the ROOT repository and the authority of rules/governance. It exposes its domain through the Core API Exposure Layer (ADR-0074) and must never be redefined here.",
"localReferenceCopy": {
"path": "./.evolith_arch32_tmp",
"tracked": false,
"gitignored": true,
"note": "Disposable local clone of the Core repo for offline reference. NOT a real linkage and NOT committed. Re-clone/update from the upstream URL when stale. Upstream now ships ADRs 0074–0089 with category-qualified IDs (core/, nodejs/, dotnet/, android/); refresh the snapshot if it predates them."
}
},
"responsibilityModel": "Core evaluates stateless. Tracker persists operational lifecycle. Agent Runtime orchestrates scans and adapters. OPA/rulesets govern policy. ADRs/Blueprints function as baseline. GitHub/PRs manage Core standard evolution.",
"boundary": {
"invariants": [
"The Tracker DECIDES the gates; the Core only produces evaluations/evidence.",
"The Core is the authority of rules/governance; the Tracker must not redefine Core rules.",
"The Core API is REST-only under /api/v1 (no GraphQL, no SSE) plus a separate MCP gateway (ADR-0074).",
"The BFF / Application Gateway lives in the Tracker (this repo) and is the ONLY authenticated perimeter (UMS-delegated Bearer + authorization graph); the Core does not authenticate (ADR-0075 core api-key strategy is superseded by ADR-0080).",
"Content-bearing Core calls pass repositoryRef {url, revision} + an opaque workspaceRef + operationId; the Core never receives a user token, credential, tenant identity, or absolute path (ADR-0080).",
"No Core schema may leak raw to the Tracker UI — an Anti-Corruption Layer (ACL) translates Core contracts (e.g. EvaluationVerdict) to Tracker view-models.",
"A Core TechnicalEvaluationResult / EvaluationVerdict is technical evidence, NOT a canonical GateDecision; only the Tracker produces GateDecisions.",
"Tenant isolation and PII stripping are enforced on every composed request.",
"Core is stateless — it must never persist tenants, products, initiatives, conversations, transactions, evidence, lifecycle states, comments, approvals, exceptions, or historical results.",
"Tracker is the sole persistence layer — it stores all evaluation transactions, evidence, contextual ADRs, Core improvement proposals, and operational lifecycle state.",
"Every request/response exchange between Tracker and Core must be recorded as a CoreEvaluationTransaction in Tracker.",
"Tracker only proposes Core standard changes via the repository workflow (issue → ADR → branch → PR → review → merge). Tracker never modifies Core directly.",
"Two ADR levels exist: contextual ADRs (persisted in Tracker per tenant/product/initiative) and Core general ADRs (proposed via formal repository workflow)."
],
"governingAdrs": [
{ "id": "core/0073", "title": "Unified CLI/MCP Output Contract", "location": "upstream:evolith_arch32", "status": "present upstream" },
{ "id": "core/0074", "title": "Core API Exposure Layer (REST-only /api/v1 + MCP)", "location": "upstream:evolith_arch32", "status": "present upstream" },
{ "id": "nodejs/0075", "title": "Application Gateway BFF with NestJS", "location": "upstream:evolith_arch32", "status": "present upstream" },
{ "id": "core/0078", "title": "Domain–Financial Separation Governance", "location": "upstream:evolith_arch32", "status": "present upstream" },
{ "id": "core/0079", "title": "Multi-Topology Reference Corpus", "location": "upstream:evolith_arch32", "status": "present upstream" },
{ "id": "core/0080", "title": "Remote Repository Reference Contract (supersedes core/0075 api-key auth)", "location": "upstream:evolith_arch32", "status": "present upstream" },
{ "id": "tracker/T-028", "title": "CoreEvaluationTransaction as First-Class Entity", "location": "./DECISIONS.md#t-028", "status": "active (this repo)" },
{ "id": "tracker/T-029", "title": "Contextual ADR in Tracker vs Core General ADR", "location": "./DECISIONS.md#t-029", "status": "active (this repo)" },
{ "id": "tracker/T-030", "title": "Core Standard Change Request — Core Evolution Flow", "location": "./DECISIONS.md#t-030", "status": "active (this repo)" }
],
"localDecisionsLog": "./DECISIONS.md"
},
"coreApi": {
"exposureLayer": "Core API Exposure Layer (ADR-0074)",
"transport": ["REST", "MCP"],
"transportNote": "REST-only under /api/v1 (no GraphQL, no SSE). MCP is a separate gateway. Responses use the ADR-0073 flat envelope; errors use RFC 9457 application/problem+json.",
"auth": "No auth to Core. The Tracker BFF is the only authenticated perimeter (UMS-delegated Bearer + authorization graph); Core calls carry repositoryRef + opaque workspaceRef + operationId, never credentials (ADR-0080).",
"sdk": "@evolith/sdk-client (typed REST + MCP client; preferred over hand-rolled HTTP)",
"restEndpoints": [
"GET /api/v1/health",
"GET /api/v1/projects",
"GET /api/v1/phases",
"POST /api/v1/phases/transition",
"GET /api/v1/gates",
"GET /api/v1/architecture",
"GET /api/v1/metrics",
"GET /api/v1/reference",
"POST /api/v1/composable-validate",
"POST /api/v1/evaluate"
],
"evaluation": {
"endpoint": "POST /api/v1/evaluate",
"requestSchema": "SatelliteManifestSchema (Core canonical, zod): { satellitePath, corePath?, topology?, phase? }",
"response": "EvaluationVerdict (ADR-0073 SuccessEnvelope): { passed, resolvedTopology, gates[], summary, evaluatedAt }",
"engine": "SatelliteEvaluationPipeline -> OpaEvaluator (rulesets/opa/policy.wasm); per-rule result: passed | failed | skipped (skipped when wasm absent)",
"note": "Local/dev contract uses satellitePath; the hosted contract uses repositoryRef + workspaceRef (ADR-0080). The verdict is technical evidence; the Tracker maps it via ACL and decides the gate."
},
"mcpServer": "@evolith/mcp-server",
"contract": {
"baseUrl": "TBD — confirm Core-API base URL before coding",
"version": "v1 (path-versioned: /api/v1)",
"openapi": "Core-API Swagger (ADR-0073 envelope) — confirm served path before coding"
}
},
"canonicalModelRefs": {
"trackerInterfaceDesign": "upstream:reference/products/evolith-tracker/sdlc-tracker-technical-interfaces.md",
"satelliteManifestSchema": "upstream:packages/core-domain/src/schemas/satellite-manifest.schema.ts",
"evaluationVerdict": "upstream:packages/core-domain/src/domain/satellite-manifest.ts",
"phaseId": "upstream:packages/core-domain/src/domain/sdlc/phase-id.ts (canonical: discovery|design|construction|qa|release; f1..f5 deprecated aliases; F# = topology maturity, not phases)",
"topologyDimensions": "upstream:reference/architecture/topologies/topology-dimensions.md (ADR-0079)"
},
"links": {
"readme": "./README.md",
"masterIndex": "./MASTER_INDEX.md",
"decisions": "./DECISIONS.md",
"coreIntegrationDesign": "./reference/specs/design/tracker-core-integration-design.md",
"gapsRegister": "./docs/audit/tracker-gap-tracking.md"
},
"lastReviewed": "2026-07-02"
}