@revisium/orchestrator 0.1.0-alpha.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +150 -130
  2. package/control-plane/default-playbook/catalog/pipelines.json +280 -11
  3. package/control-plane/default-playbook/package.json +1 -1
  4. package/control-plane/default-playbook/prompts/developer.md +1 -0
  5. package/control-plane/default-playbook/prompts/triager.md +3 -0
  6. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -0
  7. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
  8. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
  9. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
  10. package/dist/api/graphql-api/pr/model/pr-readiness.model.js +30 -0
  11. package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -1
  12. package/dist/api/graphql-api/runs/inputs/create-run.input.js +6 -0
  13. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
  14. package/dist/api/graphql-api/runs/model/run.model.js +6 -0
  15. package/dist/api/graphql-api/runs/model/run.model.js.map +1 -1
  16. package/dist/api/graphql-api/share/model/issue-ref.model.js +53 -0
  17. package/dist/api/graphql-api/share/model/issue-ref.model.js.map +1 -0
  18. package/dist/cli/commands/lifecycle.js +113 -8
  19. package/dist/cli/commands/lifecycle.js.map +1 -1
  20. package/dist/cli/commands/mcp.js +8 -1
  21. package/dist/cli/commands/mcp.js.map +1 -1
  22. package/dist/cli/commands/process-tree.js +42 -0
  23. package/dist/cli/commands/process-tree.js.map +1 -1
  24. package/dist/cli/commands/rogue-reaper.js +63 -0
  25. package/dist/cli/commands/rogue-reaper.js.map +1 -0
  26. package/dist/config.js +9 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/control-plane/bootstrap.js +14 -1
  29. package/dist/control-plane/bootstrap.js.map +1 -1
  30. package/dist/control-plane/client-transport.js +1 -1
  31. package/dist/control-plane/client-transport.js.map +1 -1
  32. package/dist/control-plane/default-playbook-policy.js +593 -0
  33. package/dist/control-plane/default-playbook-policy.js.map +1 -0
  34. package/dist/control-plane/seed-default-playbook.js +77 -8
  35. package/dist/control-plane/seed-default-playbook.js.map +1 -1
  36. package/dist/e2e/kit/agents.js +15 -21
  37. package/dist/e2e/kit/agents.js.map +1 -1
  38. package/dist/e2e/kit/assertions.js +18 -13
  39. package/dist/e2e/kit/assertions.js.map +1 -1
  40. package/dist/e2e/kit/fake-integrator.js +11 -2
  41. package/dist/e2e/kit/fake-integrator.js.map +1 -1
  42. package/dist/e2e/kit/gh-emulator.js +2 -1
  43. package/dist/e2e/kit/gh-emulator.js.map +1 -1
  44. package/dist/e2e/kit/git-target-repo.js +1 -1
  45. package/dist/engine/dbos.service.js +3 -0
  46. package/dist/engine/dbos.service.js.map +1 -1
  47. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
  48. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
  49. package/dist/features/runs/queries/handlers/runs-query.handlers.js +1 -0
  50. package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -1
  51. package/dist/host/daemon.js +14 -1
  52. package/dist/host/daemon.js.map +1 -1
  53. package/dist/host/host-runtime.js +20 -2
  54. package/dist/host/host-runtime.js.map +1 -1
  55. package/dist/mcp/mcp-capabilities.js +16 -1
  56. package/dist/mcp/mcp-capabilities.js.map +1 -1
  57. package/dist/mcp/mcp-facade.service.js +325 -12
  58. package/dist/mcp/mcp-facade.service.js.map +1 -1
  59. package/dist/mcp/mcp-tools.js +58 -12
  60. package/dist/mcp/mcp-tools.js.map +1 -1
  61. package/dist/observability/activity-signal.js +107 -0
  62. package/dist/observability/activity-signal.js.map +1 -0
  63. package/dist/observability/index.js +1 -0
  64. package/dist/observability/index.js.map +1 -1
  65. package/dist/pipeline/data-driven-task.workflow.js +549 -44
  66. package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
  67. package/dist/pipeline/pipeline.service.js +195 -101
  68. package/dist/pipeline/pipeline.service.js.map +1 -1
  69. package/dist/pipeline/route-contract.js +4 -3
  70. package/dist/pipeline/route-contract.js.map +1 -1
  71. package/dist/pipeline-core/interpret.js +2 -0
  72. package/dist/pipeline-core/interpret.js.map +1 -1
  73. package/dist/pipeline-core/kit/builders.js +2 -0
  74. package/dist/pipeline-core/kit/builders.js.map +1 -1
  75. package/dist/pipeline-core/kit/fixtures.js +72 -21
  76. package/dist/pipeline-core/kit/fixtures.js.map +1 -1
  77. package/dist/pipeline-core/types.js +2 -0
  78. package/dist/pipeline-core/types.js.map +1 -1
  79. package/dist/pipeline-core/validate-dataflow.js +32 -0
  80. package/dist/pipeline-core/validate-dataflow.js.map +1 -1
  81. package/dist/playbook/import-mapper.js +8 -1
  82. package/dist/playbook/import-mapper.js.map +1 -1
  83. package/dist/poller/pr-readiness-core.js +299 -28
  84. package/dist/poller/pr-readiness-core.js.map +1 -1
  85. package/dist/revisium/playbooks.service.js +17 -2
  86. package/dist/revisium/playbooks.service.js.map +1 -1
  87. package/dist/revisium/run.service.js +1 -0
  88. package/dist/revisium/run.service.js.map +1 -1
  89. package/dist/run/append-event.js +8 -5
  90. package/dist/run/append-event.js.map +1 -1
  91. package/dist/run/create-run.js +5 -1
  92. package/dist/run/create-run.js.map +1 -1
  93. package/dist/run/inspect-run.js +30 -4
  94. package/dist/run/inspect-run.js.map +1 -1
  95. package/dist/run/issue-ref.js +88 -0
  96. package/dist/run/issue-ref.js.map +1 -0
  97. package/dist/runners/claude-code.service.js +2 -2
  98. package/dist/runners/claude-code.service.js.map +1 -1
  99. package/dist/runners/codex.service.js +2 -2
  100. package/dist/runners/codex.service.js.map +1 -1
  101. package/dist/runners/integrator-branch-naming.js +33 -13
  102. package/dist/runners/integrator-branch-naming.js.map +1 -1
  103. package/dist/runners/integrator.js +285 -72
  104. package/dist/runners/integrator.js.map +1 -1
  105. package/dist/runners/worktree.service.js +2 -2
  106. package/dist/runners/worktree.service.js.map +1 -1
  107. package/dist/task-control-plane/pr-readiness.service.js +15 -13
  108. package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
  109. package/dist/task-control-plane/run-watch.service.js +512 -0
  110. package/dist/task-control-plane/run-watch.service.js.map +1 -0
  111. package/dist/task-control-plane/task-control-plane-api.service.js +277 -25
  112. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  113. package/dist/worker/artifact-store.js +21 -3
  114. package/dist/worker/artifact-store.js.map +1 -1
  115. package/dist/worker/build-context.js +19 -3
  116. package/dist/worker/build-context.js.map +1 -1
  117. package/dist/worker/claude-code-runner.js +76 -15
  118. package/dist/worker/claude-code-runner.js.map +1 -1
  119. package/dist/worker/codex-runner.js +40 -13
  120. package/dist/worker/codex-runner.js.map +1 -1
  121. package/dist/worker/process-executor.js +149 -20
  122. package/dist/worker/process-executor.js.map +1 -1
  123. package/dist/worker/runner-common.js +29 -0
  124. package/dist/worker/runner-common.js.map +1 -1
  125. package/dist/worker/runner.js +16 -1
  126. package/dist/worker/runner.js.map +1 -1
  127. package/package.json +1 -1
package/README.md CHANGED
@@ -1,168 +1,188 @@
1
- # agent-orchestrator
1
+ <div align="center">
2
2
 
3
- Local orchestrator for software-development tasks driven by short-lived AI agents (architect → developer →
4
- reviewer → integrator), hosted in **NestJS**. **DBOS** owns durable progress — execution is crash-safe and resumes
5
- from the first unfinished step — while **Revisium** owns meaning: roles, policy, inbox, events. Workflow-as-data is
6
- a post-MVP goal; see [`docs/architecture-overview.md`](./docs/architecture-overview.md).
3
+ # @revisium/orchestrator
7
4
 
8
- > 🚧 **Early alpha.** The end-to-end MVP works create a run → plan gate → implement → review → PR → merge
9
- > gate — see [`docs/roadmap.md`](./docs/roadmap.md).
5
+ Local-first orchestration for software-development work driven by short-lived agents.
10
6
 
11
- ## Start here
7
+ **Turn a task into a playbook-driven state machine.**
12
8
 
13
- - Repo context for agents: [`AGENTS.md`](./AGENTS.md)
14
- - Vision: [`docs/vision.md`](./docs/vision.md)
15
- - Architecture & invariants: [`docs/architecture-overview.md`](./docs/architecture-overview.md)
16
- - Docs index & roadmap: [`docs/README.md`](./docs/README.md) · [`docs/roadmap.md`](./docs/roadmap.md)
9
+ [![License](https://img.shields.io/github/license/revisium/orchestrator?color=blue)](LICENSE)
10
+ [![CI](https://github.com/revisium/orchestrator/actions/workflows/ci.yml/badge.svg)](https://github.com/revisium/orchestrator/actions/workflows/ci.yml)
11
+ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=revisium_agent-orchestrator&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=revisium_agent-orchestrator)
12
+ [![npm](https://img.shields.io/npm/v/@revisium/orchestrator?color=red)](https://www.npmjs.com/package/@revisium/orchestrator)
17
13
 
18
- ## Local Development
14
+ Part of the [Revisium](https://github.com/revisium/revisium) ecosystem.
19
15
 
20
- `revo` is one daemonized product. **`revo start`** brings up the whole stack — the standalone
21
- Revisium daemon plus the Revo host daemon that owns DBOS and serves the GraphQL + MCP front doors —
22
- and bootstraps the control-plane so it is ready to use. The CLI is lifecycle-only
23
- (`start` / `stop` / `status` / `restart` / `doctor` / `logs`); orchestration (runs, inbox, …) is
24
- reached over **MCP** (agents) or **GraphQL** (UI/scripts), both served by the daemon.
16
+ </div>
25
17
 
26
- Run a source checkout alongside an installed package without collisions via a named **profile**
27
- (`--profile dev`, or `REVO_PROFILE=dev`): the `dev` profile shifts the whole port band off the
28
- `default` profile, so the two never share a port, data dir, or `dbos` database.
18
+ ```mermaid
19
+ flowchart LR
20
+ task[Task]
21
+ playbook[Playbook]
22
+ machine[State machine]
23
+ outcome[Outcome]
29
24
 
30
- ```sh
31
- pnpm install
32
- pnpm run revo -- start --profile dev # standalone + host daemon, bootstrapped & ready
33
- pnpm run revo -- status --profile dev # stack health summary
34
- pnpm run revo -- doctor --profile dev # diagnose process / port / profile issues
35
- pnpm run revo -- logs --profile dev # tail host + standalone logs; add -f to follow
36
- pnpm run revo -- restart --profile dev # stop, then start
37
- pnpm run revo -- stop --profile dev
25
+ task --> playbook --> machine --> outcome
26
+
27
+ subgraph nodes[State machine nodes]
28
+ agent[Agent step] --> script[Script step] --> gate[Human gate] --> branch{Branch}
29
+ branch --> loop((Loop))
30
+ loop -. retry .-> agent
31
+ loop -. reroute .-> script
32
+ end
33
+
34
+ machine -. expands into .-> nodes
35
+ outcome --> pr[Pull request]
36
+ outcome --> evidence[Evidence]
37
+ outcome --> decisions[Decisions]
38
+ outcome --> history[Run history]
38
39
  ```
39
40
 
40
- | Knob | `default` (installed package) | `dev` (source checkout) |
41
- | --- | --- | --- |
42
- | data dir | `~/.revisium-orchestrator` | `~/.revisium-orchestrator-dev` |
43
- | standalone HTTP / Postgres | `19222` / `15440` | `19622` / `15840` |
44
- | Revo GraphQL | `19223` | `19623` |
45
- | DBOS database | `dbos` | `dbos_dev` |
41
+ > Revo is in active development. The package is suitable for evaluation and local experimentation; do not treat
42
+ > the public contract as stable yet.
43
+
44
+ ## Overview
46
45
 
47
- Any single knob can be overridden explicitly `REVO_DATA_DIR` / `REVO_PORT` / `REVO_PG_PORT` /
48
- `REVO_GRAPHQL_PORT` / `REVO_DBOS_DB` and an explicit env var always wins over the profile band.
46
+ Revo is a local control plane for agentic work. A caller creates a run, Revo selects a playbook, and the playbook
47
+ executes as a state machine made of agent steps, script steps, human gates, branches, and loops.
49
48
 
50
- Connect an agent over MCP (a thin stdio bridge that forwards to the running daemon):
49
+ The goal is not to replace coding agents. Revo coordinates them: it keeps state, records evidence, enforces gates,
50
+ and gives humans a stable place to approve plans, resolve questions, inspect feedback, and decide when work is ready
51
+ to ship.
52
+
53
+ ## How It Works
54
+
55
+ - **Playbooks define flow.** Roles, scripts, gates, verdicts, branches, and loop limits are data, not hidden prompt
56
+ convention.
57
+ - **Agent steps are short-lived.** Each agent process receives current state and exits after one step.
58
+ - **Script steps do deterministic work.** Automation such as integration, polling, and response actions stays outside
59
+ agent prompts.
60
+ - **Human gates are state changes.** A plan approval, question answer, or merge approval resolves an inbox item and
61
+ resumes the run.
62
+ - **Outputs are traceable.** Artifacts, evidence, decisions, attempts, cost, and run history are recorded for later
63
+ inspection.
64
+
65
+ ## Concepts
66
+
67
+ | Term | Meaning |
68
+ | --- | --- |
69
+ | **Revo** | The local orchestrator and control plane for software-development runs. |
70
+ | **Playbook** | A versioned bundle of roles, pipelines, policies, and routing rules. |
71
+ | **Pipeline** | A state-machine template that defines the steps, gates, branches, loops, and terminal outcomes. |
72
+ | **Role** | A named agent definition: prompt, model level, scope, runner, and allowed behavior. |
73
+ | **Agent step** | A pipeline node that starts a short-lived coding agent through a role. |
74
+ | **Script step** | A deterministic automation node used for integration, polling, readiness, or response actions. |
75
+ | **Human gate** | A required decision or answer; the run parks until an inbox item is resolved. |
76
+ | **Run** | One task moving through a selected playbook and pipeline. |
77
+ | **Attempt** | One execution of one step; the unit for logs, verdicts, tokens, and cost. |
78
+ | **MCP** | The local agent-facing tool bridge exposed by `revo mcp`. |
79
+ | **GraphQL API** | The local API surface for UI and script integrations. |
80
+
81
+ ## Alpha Install
82
+
83
+ The `@alpha` package is a prerelease for evaluating Revo locally. It uses the `default` profile:
51
84
 
52
85
  ```sh
53
- claude mcp add revo -- pnpm --dir "$PWD" run revo -- mcp
86
+ npm install -g @revisium/orchestrator@alpha
87
+ revo start
88
+ revo status
89
+ revo doctor
90
+ revo logs
91
+ revo stop
54
92
  ```
55
93
 
56
- Run the local verification gates:
94
+ Connect an MCP-capable agent to the installed binary:
57
95
 
58
96
  ```sh
59
- pnpm run typecheck
60
- pnpm run lint:ci
61
- pnpm run test:cov
62
- pnpm run verify
97
+ codex mcp add revo -- revo mcp
98
+ claude mcp add revo -- revo mcp
63
99
  ```
64
100
 
65
- The smoke scripts are guarded: they require a non-default `REVO_DATA_DIR`,
66
- `REVO_PORT`, `REVO_PG_PORT`, and `REVO_DBOS_DB`; GraphQL smoke paths also require
67
- `REVO_GRAPHQL_PORT`.
101
+ Default local ports:
102
+
103
+ | Service | Port |
104
+ | --- | --- |
105
+ | Revisium standalone HTTP | `19222` |
106
+ | embedded Postgres | `15440` |
107
+ | Revo GraphQL | `19223` |
108
+
109
+ GraphQL is available at `http://127.0.0.1:19223/graphql` in the default profile. The target contract is documented in
110
+ [docs/specs/graphql-admin-api-v1.spec.md](./docs/specs/graphql-admin-api-v1.spec.md), and the committed SDL is
111
+ [src/api/graphql-api/schema.graphql](./src/api/graphql-api/schema.graphql).
112
+
113
+ ## Roadmap
114
+
115
+ Revo is in active development. The public roadmap lives in GitHub Milestones and umbrella issues; this README only points to the current tracks.
116
+
117
+ | Track | Start here |
118
+ | --- | --- |
119
+ | Default playbook stabilization | [Milestone #1](https://github.com/revisium/orchestrator/milestone/1), [umbrella #146](https://github.com/revisium/orchestrator/issues/146) |
120
+ | GraphQL admin API v1 migration | [Milestone #4](https://github.com/revisium/orchestrator/milestone/4), [umbrella #167](https://github.com/revisium/orchestrator/issues/167) |
121
+ | Execution profiles and runner/model binding | [Milestone #5](https://github.com/revisium/orchestrator/milestone/5), [umbrella #168](https://github.com/revisium/orchestrator/issues/168) |
122
+ | Loop engineering layer | [Milestone #2](https://github.com/revisium/orchestrator/milestone/2), [umbrella #148](https://github.com/revisium/orchestrator/issues/148) |
123
+ | Role and pipeline authoring | [Milestone #3](https://github.com/revisium/orchestrator/milestone/3), [umbrella #157](https://github.com/revisium/orchestrator/issues/157) |
124
+
125
+ Use umbrella issues for initiative context and child issues for reviewable delivery slices. Work orders do not live in docs.
126
+
127
+ ## Local Development
128
+
129
+ Use the `dev` profile when running a source checkout next to an installed package. The profile has isolated ports,
130
+ data directory, and DBOS database.
68
131
 
69
132
  ```sh
70
- pnpm run smoke:control-plane
71
- pnpm run smoke:create-run
72
- pnpm run smoke:inspect-run
133
+ pnpm install
134
+ pnpm run revo -- start --profile dev
135
+ pnpm run revo -- status --profile dev
136
+ pnpm run revo -- doctor --profile dev
137
+ pnpm run revo -- logs --profile dev
138
+ pnpm run revo -- stop --profile dev
73
139
  ```
74
140
 
75
- ### Live Run Observability Smoke
141
+ | Knob | `default` | `dev` |
142
+ | --- | --- | --- |
143
+ | data dir | `~/.revisium-orchestrator` | `~/.revisium-orchestrator-dev` |
144
+ | standalone HTTP / Postgres | `19222` / `15440` | `19622` / `15840` |
145
+ | Revo GraphQL | `19223` | `19623` |
146
+ | DBOS database | `dbos` | `dbos_dev` |
147
+
148
+ Explicit environment variables override the profile: `REVO_DATA_DIR`, `REVO_PORT`, `REVO_PG_PORT`,
149
+ `REVO_GRAPHQL_PORT`, and `REVO_DBOS_DB`.
76
150
 
77
- This smoke runs a real agent. It can call provider CLIs and incur cost. Use it
78
- only when that is intentional.
151
+ ## Front Doors
152
+
153
+ `revo mcp` is the agent front door. It is a local stdio bridge to the daemon and exposes product-level tools for
154
+ runs, gates, repository diagnostics, method discovery, and PR readiness.
79
155
 
80
156
  ```sh
81
- export REVO_SMOKE_REPO=/path/to/local/sandbox-repo
82
- pnpm run revo -- start --profile dev # standalone + host daemon (serves GraphQL + MCP), ready
157
+ codex mcp add --env REVO_PROFILE=dev revo-dev -- pnpm --dir /abs/path/to/orchestrator run revo -- mcp
158
+ claude mcp add -e REVO_PROFILE=dev revo-dev -- pnpm --dir /abs/path/to/orchestrator run revo -- mcp
83
159
  ```
84
160
 
85
- Drive and observe a run through the daemon's front doors there are no `run`/`serve` CLI commands.
86
- From an agent, use the MCP tools (`create_run`, `start_run`, then `get_agent_activity` /
87
- `get_agent_log`). From a UI or script, use the GraphQL front door the daemon already serves at
88
- `http://127.0.0.1:$REVO_GRAPHQL_PORT/graphql` — create a run:
89
-
90
- ```graphql
91
- mutation Create($data: CreateRunInput!) {
92
- createRun(data: $data) {
93
- runId
94
- }
95
- }
96
- ```
161
+ For the `dev` profile, GraphQL is available at `http://127.0.0.1:19623/graphql`.
97
162
 
98
- Then observe it over the same endpoint:
99
-
100
- ```graphql
101
- query Activity($runId: ID!) {
102
- runAgentActivity(runId: $runId) {
103
- runId
104
- aggregateStatus
105
- latestOutputAt
106
- attempts {
107
- attemptId
108
- runner
109
- status
110
- stdoutBytes
111
- stderrBytes
112
- artifactRef
113
- }
114
- }
115
- }
116
-
117
- query Log($data: GetAgentLogInput!) {
118
- runAgentLog(data: $data) {
119
- runId
120
- attemptId
121
- stream
122
- offsetBytes
123
- nextOffsetBytes
124
- totalBytes
125
- truncated
126
- content
127
- }
128
- }
129
- ```
163
+ ## Verification
130
164
 
131
- For MCP, configure the MCP client to launch this checkout's local binary with the
132
- same environment. The MCP tools do not accept per-call profile arguments; the
133
- profile comes from the process environment.
134
-
135
- ```json
136
- {
137
- "mcpServers": {
138
- "revo-dev": {
139
- "command": "/path/to/agent-orchestrator/bin/revo.js",
140
- "args": ["mcp"],
141
- "env": {
142
- "REVO_DATA_DIR": "/path/to/.revisium-orchestrator-dev",
143
- "REVO_PORT": "19622",
144
- "REVO_PG_PORT": "15840",
145
- "REVO_GRAPHQL_PORT": "19623",
146
- "REVO_DBOS_DB": "dbos_dev"
147
- }
148
- }
149
- }
150
- }
165
+ ```sh
166
+ pnpm run typecheck
167
+ pnpm run lint:ci
168
+ pnpm run test:cov
169
+ pnpm run verify
151
170
  ```
152
171
 
153
- Useful MCP observability tools for the same run:
172
+ Smoke and e2e scripts that start local daemons may need an unsandboxed terminal and isolated non-default ports.
154
173
 
155
- - `get_agent_activity`
156
- - `get_agent_attempts`
157
- - `get_agent_log`
158
- - `read_agent_output_events`
159
- - `tail_agent_log`
174
+ ## Documentation
160
175
 
161
- If running from a sandboxed automation environment, local server checks may fail
162
- with `listen EPERM` or a misleading `No free port found from <port>`. Re-run the
163
- daemon, GraphQL, and MCP smoke commands from a normal terminal or an approved
164
- unsandboxed execution context.
176
+ | Start here | Purpose |
177
+ | --- | --- |
178
+ | [docs/README.md](./docs/README.md) | Documentation map and ownership rules |
179
+ | [docs/vision.md](./docs/vision.md) | Product direction, glossary, and capability map |
180
+ | [docs/architecture-overview.md](./docs/architecture-overview.md) | Runtime layers, invariants, and lifecycle |
181
+ | [docs/developer-guide.md](./docs/developer-guide.md) | Source map and contributor onboarding |
182
+ | [docs/specs/](./docs/specs/) | Exact product contracts |
183
+ | [docs/adr/](./docs/adr/) | Durable architecture decisions |
184
+ | [AGENTS.md](./AGENTS.md) | Repo-local instructions for coding agents |
165
185
 
166
186
  ## License
167
187
 
168
- See [LICENSE](./LICENSE).
188
+ MIT - see [LICENSE](./LICENSE).