@thebackstoryis/engineering-with-ai 0.2.9 → 0.3.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 (37) hide show
  1. package/Docs/README.md +2 -0
  2. package/Docs/autonomous-intent-delivery.md +37 -0
  3. package/Docs/guide-catalogue.md +2 -0
  4. package/Docs/quality/persona-driven-test-scenarios.md +6 -0
  5. package/README.md +17 -0
  6. package/config/autonomy-worker.schema.json +70 -0
  7. package/config/autonomy.schema.json +25 -0
  8. package/package.json +3 -3
  9. package/public/app.js +7 -0
  10. package/public/autonomy.js +470 -0
  11. package/public/index.html +26 -0
  12. package/public/styles.css +64 -0
  13. package/skills-src/ewai-autonomy/SKILL.md +18 -0
  14. package/skills-src/ewai-autonomy/agents/openai.yaml +4 -0
  15. package/skills-src/ewai-deliver/SKILL.md +2 -0
  16. package/skills-src/ewai-test-scenarios/references/scenario-contract.md +6 -0
  17. package/src/autonomy-phase-contracts.mjs +88 -0
  18. package/src/autonomy-worker.mjs +15 -0
  19. package/src/autonomy.mjs +199 -0
  20. package/src/checkin.mjs +30 -6
  21. package/src/cli.mjs +67 -0
  22. package/src/delivery-gates.mjs +8 -1
  23. package/src/delivery.mjs +74 -3
  24. package/src/design-system-application.mjs +28 -0
  25. package/src/runtime/afk-conductor.mjs +191 -71
  26. package/src/runtime/autonomy-operations.mjs +250 -0
  27. package/src/runtime/autonomy-supervisor.mjs +426 -0
  28. package/src/runtime/autonomy-workers.mjs +333 -0
  29. package/src/runtime/autonomy-workspace.mjs +310 -0
  30. package/src/runtime/dashboard-actions.mjs +69 -0
  31. package/src/runtime/dashboard-server.mjs +25 -0
  32. package/src/runtime/database.mjs +25 -6
  33. package/src/runtime/intent-ownership.mjs +272 -0
  34. package/src/runtime/mcp-server.mjs +38 -0
  35. package/src/runtime/provider-adapters.mjs +365 -7
  36. package/src/runtime/work.mjs +21 -5
  37. package/src/test-scenarios.mjs +173 -20
package/Docs/README.md CHANGED
@@ -6,6 +6,8 @@ Conversation is the normal way to work with EWAI. Describe what you need in your
6
6
 
7
7
  For feature delivery, **`ewai-deliver` coordinates the full fourteen-stage workflow**, bringing in specialist skills as needed and resuming from the project's recorded state. You don't need to run each stage yourself. See the [delivery guide](developer-delivery-guide.md) for the stages and the decisions you'll be asked to make.
8
8
 
9
+ If you want EWAI to act on an approved, exact pool of registered intents, read [governed autonomous intent delivery](autonomous-intent-delivery.md). It starts off, needs a named and bounded grant, and leaves human Build approval and Manual QA separate.
10
+
9
11
  ## New to EWAI?
10
12
 
11
13
  1. [Install EWAI](operations/installation-updating-and-entitlements.md) and open it in your project folder.
@@ -0,0 +1,37 @@
1
+ # Governed autonomous intent delivery
2
+
3
+ EWAI can take bounded steps on intents you have already registered in a **consumer project**. The npm package supplies the engine; each consumer keeps its own intents, configured SPECS root, evidence and approvals. Installing or updating the package does not enrol an existing project in autonomous delivery. The mode starts **off by default**.
4
+
5
+ Autonomy is a way to delegate an exact pool of work, not a standing instruction to choose future intents. New intents are outside a grant until an owner reviews a new preview and gives a new named approval. A preview is **not permission** to execute. The dashboard's Autonomy view combines policy, preview and run information; `ewai autonomy status --project . --json` shows the current mode, grant, runs and questions. Use `ewai autonomy preview` to see executable, human-decision and blocked candidates. Read the configured root from `.ewai-pipeline/project.json`; do not assume `./SPECS`.
6
+
7
+ ## Delegate a bounded pool
8
+
9
+ 1. Confirm that each chosen intent is accepted, its dependencies and project standards are current, and the proposed provider is allowed and available on this host. Choose exact intent IDs, actions, provider, expiry, runtime, per-operation time and attempt limit. A broad domain or all-future-intents grant is not supported.
10
+ 2. Inspect a preview in the dashboard or CLI. Its executable, human-decision and blocked lists explain what can happen now. Recording a preview stores that displayed proposal for approval; it does not activate it.
11
+ 3. The named project owner reviews the exact displayed scope and digest, then approves that revision. Re-preview after a changed intent, budget, provider, dependency or configuration. Approval is a separate durable action, never inferred from chat, a preview, a test result or a worker's draft.
12
+ 4. Run once or start the local service only against that approved digest. Observe status and stop on a human question, blocked action or unknown execution outcome. Do not silently retry or enlarge scope.
13
+
14
+ For example, after reading the preview and obtaining the owner's decision:
15
+
16
+ ```sh
17
+ ewai autonomy preview --project . --intent product/alpha --action begin-harness --action prepare-phase --provider claude --expires-at 2030-12-01T17:00:00.000Z --max-runtime-ms 60000 --max-operation-ms 10000 --max-attempts 2 --record --json
18
+ ewai autonomy approve --project . --expected-digest sha256:REPLACE_WITH_DISPLAYED_DIGEST --approved-by 'Named owner' --yes --json
19
+ ewai autonomy run --project . --expected-digest sha256:REPLACE_WITH_APPROVED_GRANT_DIGEST --provider claude --yes --json
20
+ ewai autonomy status --project . --json
21
+ ```
22
+
23
+ These are examples, not a grant or a recommendation to run this particular intent. Use the actual returned digests and a future expiry appropriate to the project, in canonical `YYYY-MM-DDTHH:MM:SS.mmmZ` form. `ewai autonomy service` uses the same digest and provider for a continuing local supervisor. It is not a cloud scheduler and does not outlive its host as a running process. Provider availability and version checks fail closed; the orchestrating host cannot serve as its own independent validator. In this release, the pre-Build proposal adapter supports only macOS with pinned Claude Code `2.1.257 (Claude Code)` and a passing host conformance check; listing Codex or Antigravity in a scope does not make them available for that worker path. A missing or unverified provider must be resolved deliberately, not bypassed.
24
+
25
+ ## What autonomy can and cannot decide
26
+
27
+ The permitted path can start the harness and prepare source-bound drafts for supported phases. A worker's proposal is staged as a draft, with host-produced checks and explicit human questions. It cannot write a passing gate verdict, approve Build or Manual QA, make its prose authoritative owner evidence, or complete a phase on the strength of its own prose. Source references and schema checks do not prove the draft's facts; a human must review them. For actual phase delivery use `$ewai-deliver`, the canonical gate ledger, deterministic checks and the project's configured validation policy. Approved Build tasks still need their task graph, write-set and lease controls; autonomous operation does not create Build approval.
28
+
29
+ The supervisor records bounded action and provider-attempt counts. Its usage is provider-reported, not a hard money cap: the engine cannot guarantee a currency spend ceiling from token estimates or missing provider usage. Set tight time and attempt limits, observe provider billing separately, and use the provider's own spend controls where needed. A cancel request does not confirm termination of a child process. Check `executionStopped` and the durable run status before recovery, replacement or another grant. `recovery-required` calls for inspection of the recorded operation and explicit `recover`; it must not blindly repeat a potentially completed effect.
30
+
31
+ Answering an autonomy question records a private owner response for the run. It does not approve any Build, gate, Manual QA, deployment, release or acceptance decision. Inspect the project evidence and give those approvals through their separate guarded workflows. The dashboard and status projection omit private answer text. Revoke a grant when delegation should cease; revocation does not erase its evidence or assert that in-flight work has stopped.
32
+
33
+ ## Recovery and assurance boundary
34
+
35
+ Use `ewai autonomy status --project . --run RUN_ID --json` to inspect a run. `ewai autonomy pause|resume|cancel|recover --project . --run RUN_ID --expected-revision N --yes --json` applies a revision-bound control; a stale revision must be inspected again. For a human question, use the dashboard's guarded answer form or `ewai autonomy answer --project . --input PROJECT_RELATIVE_JSON --yes --json`, with a private project-local input file. Do not put private answers or credentials in chat or command arguments.
36
+
37
+ The package tests exercise a tarball-installed consumer with preseeded offline dependencies; they do not prove a fresh registry dependency bootstrap or migration from every historical version. A controlled test simulates a lost response and verifies no repeated canonical effect. A separate installed-worker test substitutes only the provider boundary with a local child process; it does not establish live provider conformance. Human Manual QA, external acceptance, deployment and npm release remain separate decisions and evidence.
@@ -20,6 +20,7 @@ Choose the section that matches your job. The optional team tools aren't prerequ
20
20
  - [Facilitate project Discovery](guided-discovery-facilitator-guide.md)
21
21
  - [Create or revise an intent in Intent Studio](guided-intent-workspace-guide.md)
22
22
  - [Choose work with the Companion](context-aware-delivery-companion-user-guide.md)
23
+ - [Delegate an exact pool of intents with guarded autonomy](autonomous-intent-delivery.md)
23
24
  - [Contribute information to work in progress](guided-phase-evidence-drafting-guide.md)
24
25
  - [Review evidence from meeting notes or transcripts](meeting-evidence-user-guide.md)
25
26
  - [Turn reviewed evidence into project documents](knowledge-proposals-user-guide.md)
@@ -34,6 +35,7 @@ Choose the section that matches your job. The optional team tools aren't prerequ
34
35
  ## Engineering and checking your own application
35
36
 
36
37
  - [Take an intent through delivery](developer-delivery-guide.md)
38
+ - [Operate governed autonomous intent delivery](autonomous-intent-delivery.md)
37
39
  - [Assess what a change could affect](blast-radius-and-impact-routing-guide.md)
38
40
  - [Understand repository coverage and analysis limits](repository-source-map-guide.md)
39
41
  - [Choose and compare investigation depth](reproducible-archaeology-and-discovery-depth.md)
@@ -99,6 +99,12 @@ ewai test-scenarios status <intent-slug> --project . --json
99
99
  | `stale` | An authoritative source changed after review | Prepare again and obtain a fresh named review. Preserve the old record for comparison. |
100
100
  | `invalid` | The pair, schema, slug, or digest cannot be trusted | Investigate the files and recovery evidence. Do not infer truth from Markdown. |
101
101
 
102
+ New records use versioned intent-content fingerprints. Only EWAI's workflow frontmatter (`status`, `delivery_status`, `current_phase`, `delivery_state_path` and `updated_at`) is excluded. The complete intent body and all other metadata still participate, including content beyond the displayed excerpts. Plan, Test Plan, standards and impact sources retain their existing whole-file fingerprints. Moving to another delivery phase does not, by itself, change the agreed test expectations.
103
+
104
+ Preparation requires at least one recognised intent source: captured text under `Problem`, `Desired outcome` or `Constraints`, or a listed journey or acceptance criterion. Planning documents alone cannot anchor an intent fingerprint. Missing intent sources fail closed, including for historical packs. Non-workflow metadata must use plain mappings, arrays and JSON scalar values; explicitly typed YAML dates, sets, ordered maps, binary values, non-finite numbers and cyclic aliases are rejected before a content fingerprint is accepted. Use quoted date strings and ordinary lists where appropriate. Existing evidence is preserved if current sources become unsupported; correct the source through named review, not by editing the evidence pair.
105
+
106
+ Older unversioned packs keep conservative whole-file checking. Before their sources change, repeating the original `record` command with the unchanged candidate and the same named reviewer adds `test-scenarios.source-baseline.json`. This write-once compatibility receipt binds the still-current sources to the original record. Neither accepted JSON nor Markdown is rewritten. Preparation and status do not create the receipt. Keep it with the evidence pair: a missing receipt restores legacy checking, and an invalid or mismatched receipt fails closed. Already-stale legacy evidence cannot be silently upgraded, and this compatibility path does not accept revised expectations or replace the named review required for genuine source changes.
107
+
102
108
  Open the work item's **Test scenarios** tab to see which behaviours have reviewed scenarios, where gaps remain and how each scenario will be checked. The panel labelled **Coverage loom** shows this coverage; it doesn't run tests. You can inspect the supporting evidence and active personas, then filter the view without changing the recorded work. Preparing, recording and running scenarios happens through the EWAI conversation or CLI, not this read-only panel.
103
109
 
104
110
  ## Build automated tests
package/README.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  Engineering With AI (EWAI) helps you plan, build and review software with an AI assistant. It gives the assistant a shared record of the project, a delivery workflow and checks against your engineering standards. You keep control of the decisions and approve implementation before it starts.
4
4
 
5
+ ## EWAI can now pick up the next ready piece of work
6
+
7
+ If you’ve prepared several work items, you can choose which ones EWAI is allowed to take on. EWAI checks what’s ready, uses the priorities you’ve recorded to pick the next item, and starts its delivery workflow. Once you’ve separately approved the Build, it can run the approved build tasks, their tests and a fresh review.
8
+
9
+ This `0.3.0` release brings the capability out of beta. It adds dashboard and command-line controls to preview the work, approve the exact list, set time and attempt limits, follow progress, and pause, cancel or recover a run. New work isn’t added to the list automatically. EWAI stops when it needs a decision from you.
10
+
11
+ The final whole-delivery test stage, Manual QA and release preparation still happen through the normal EWAI workflow. EWAI doesn’t approve or complete those steps for you.
12
+
13
+ To use the release in a project without replacing a global installation, run:
14
+
15
+ ```bash
16
+ npm install --save-dev @thebackstoryis/engineering-with-ai
17
+ npx ewai
18
+ ```
19
+
20
+ To install or update EWAI globally, run `npm install --global @thebackstoryis/engineering-with-ai`.
21
+
5
22
  ## Install and start
6
23
 
7
24
  You'll need Node.js 22.5 or newer, npm, and a supported AI command-line tool such as Codex or Claude Code, installed and signed in.
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://engineeringwith.ai/schemas/autonomy-worker.schema.json",
4
+ "title": "EWAI phase worker proposal",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema",
9
+ "contractDigest",
10
+ "phase",
11
+ "artifacts"
12
+ ],
13
+ "properties": {
14
+ "schema": {
15
+ "const": "ewai.autonomy-phase-proposal/v1"
16
+ },
17
+ "contractDigest": {
18
+ "type": "string",
19
+ "pattern": "^sha256:[a-f0-9]{64}$"
20
+ },
21
+ "phase": {
22
+ "enum": [
23
+ "intent",
24
+ "reconcile",
25
+ "plan",
26
+ "pattern-validation",
27
+ "test-plan"
28
+ ]
29
+ },
30
+ "artifacts": {
31
+ "type": "array",
32
+ "minItems": 1,
33
+ "maxItems": 8,
34
+ "items": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": [
38
+ "path",
39
+ "content",
40
+ "sourceRefs"
41
+ ],
42
+ "properties": {
43
+ "path": {
44
+ "type": "string",
45
+ "minLength": 1,
46
+ "maxLength": 120,
47
+ "pattern": "^[a-z0-9]+(?:[-/][a-z0-9]+)*\\.md$"
48
+ },
49
+ "content": {
50
+ "type": "string",
51
+ "minLength": 1,
52
+ "maxLength": 32768
53
+ },
54
+ "sourceRefs": {
55
+ "type": "array",
56
+ "minItems": 1,
57
+ "maxItems": 32,
58
+ "uniqueItems": true,
59
+ "items": {
60
+ "type": "string",
61
+ "minLength": 1,
62
+ "maxLength": 80,
63
+ "pattern": "^[a-z][a-z0-9_.-]*$"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "ewai.autonomy-scope/v1",
4
+ "title": "Explicit autonomous intent delegation scope",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["intentIds", "actions", "providers", "expiresAt", "limits"],
8
+ "properties": {
9
+ "intentIds": { "type": "array", "minItems": 1, "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "maxLength": 160, "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*/[a-z0-9]+(?:-[a-z0-9]+)*$" } },
10
+ "actions": { "type": "array", "minItems": 1, "maxItems": 3, "uniqueItems": true, "items": { "enum": ["begin-harness", "prepare-phase", "afk-build"] } },
11
+ "providers": { "type": "array", "minItems": 1, "maxItems": 3, "uniqueItems": true, "items": { "enum": ["codex", "claude", "antigravity"] } },
12
+ "expiresAt": { "type": "string", "format": "date-time", "pattern": "^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d\\.\\d{3}Z$" },
13
+ "limits": {
14
+ "type": "object", "additionalProperties": false,
15
+ "required": ["maxConcurrentIntents", "maxRuntimeMs", "maxOperationMs", "maxAttempts"],
16
+ "properties": {
17
+ "maxConcurrentIntents": { "const": 1 },
18
+ "maxRuntimeMs": { "type": "integer", "minimum": 1, "maximum": 86400000 },
19
+ "maxOperationMs": { "type": "integer", "minimum": 1, "maximum": 86400000 },
20
+ "maxAttempts": { "type": "integer", "minimum": 1, "maximum": 100 }
21
+ },
22
+ "$comment": "The domain additionally requires maxOperationMs <= maxRuntimeMs. No hard money or token cap is promised."
23
+ }
24
+ }
25
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thebackstoryis/engineering-with-ai",
3
- "version": "0.2.9",
3
+ "version": "0.3.0",
4
4
  "description": "A human-centred, AI-augmented engineering pipeline",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "The Backstory Is",
@@ -53,8 +53,8 @@
53
53
  "precheck": "node scripts/publication-check.mjs --source-only && node --check src/runtime/tree-sitter-index.mjs && node --check src/design-system-application.mjs && node --check src/team-hub-resources.mjs && node --check src/dashboard-preferences.mjs && node --check public/dashboard-navigation.js",
54
54
  "publication:check": "node scripts/publication-check.mjs",
55
55
  "prepack": "node scripts/publication-check.mjs --quiet",
56
- "check": "node --check src/error-reporting.mjs && node --check src/team-hub.mjs && node --check src/runtime/team-hub-client.mjs && node --check src/runtime/team-hub-database.mjs && node --check src/runtime/team-hub-server.mjs && node --check src/runtime/team-hub.mjs && node --check src/runtime/error-reporting.mjs && node --check src/launcher.mjs && node --check src/afk-worker.mjs && node --check src/companion-opening.mjs && node --check src/companion.mjs && node --check src/cli.mjs && node --check src/checkin.mjs && node --check src/persona-licence-config.mjs && node --check src/persona-website-provider.mjs && node --check src/persona-zip.mjs && node --check src/persona-entitlements.mjs && node --check src/context.mjs && node --check src/archaeology.mjs && node --check src/evidence-depth.mjs && node --check src/prototype-iterations.mjs && node --check src/solution-readiness.mjs && node --check src/delivery-artifacts.mjs && node --check src/delivery-documents.mjs && node --check src/delivery-gates.mjs && node --check src/delivery.mjs && node --check src/design-systems.mjs && node --check src/design-system-authoring.mjs && node --check src/execution-state.mjs && node --check src/intent-dependencies.mjs && node --check src/task-graph.mjs && node --check src/test-scenarios.mjs && node --check src/security-validation-config.mjs && node --check src/starter-materialisation-contract.mjs && node --check src/validation-config.mjs && node --check src/project.mjs && node --check src/install.mjs && node --check src/intents.mjs && node --check src/intent-maps.mjs && node --check src/discovery.mjs && node --check src/packs.mjs && node --check src/organisation-blueprints.mjs && node --check src/organisation-policies.mjs && node --check src/policy-design-gates.mjs && node --check src/policy-gate-integration.mjs && node --check src/personas.mjs && node --check src/platform-metadata-analysis.mjs && node --check src/power-platform-source-map.mjs && node --check src/salesforce-source-map.mjs && node --check src/repository-source-map.mjs && node --check src/runtime/context-assembly.mjs && node --check src/runtime/context-benchmarks.mjs && node --check src/runtime/database.mjs && node --check src/runtime/execution-leases.mjs && node --check src/runtime/provider-adapters.mjs && node --check src/runtime/security-validation.mjs && node --check src/runtime/starter-materialisation.mjs && node --check src/runtime/policy-workspace.mjs && node --check src/runtime/lifecycle-hooks.mjs && node --check src/runtime/afk-conductor.mjs && node --check src/runtime/dashboard-actions.mjs && node --check src/runtime/dashboard-handoffs.mjs && node --check src/runtime/persona-engagement.mjs && node --check src/runtime/evidence-depth-workspace.mjs && node --check src/runtime/prototype-iterations.mjs && node --check src/runtime/guided-discovery.mjs && node --check src/runtime/guided-intents.mjs && node --check src/runtime/phase-contributions.mjs && node --check src/runtime/impact-analysis.mjs && node --check src/runtime/paths.mjs && node --check src/runtime/intents.mjs && node --check src/runtime/knowledge.mjs && node --check src/runtime/palace.mjs && node --check src/runtime/repository-index.mjs && node --check src/runtime/runs.mjs && node --check src/runtime/work.mjs && node --check src/runtime/version.mjs && node --check src/runtime/dashboard.mjs && node --check src/runtime/dashboard-server.mjs && node --check src/runtime/mcp-config.mjs && node --check src/runtime/mcp-server.mjs && node --check public/app.js && node --check public/team-hub/app.js && node --check scripts/setup.mjs",
57
- "test": "node --test",
56
+ "check": "node --check src/error-reporting.mjs && node --check src/team-hub.mjs && node --check src/runtime/team-hub-client.mjs && node --check src/runtime/team-hub-database.mjs && node --check src/runtime/team-hub-server.mjs && node --check src/runtime/team-hub.mjs && node --check src/runtime/error-reporting.mjs && node --check src/launcher.mjs && node --check src/afk-worker.mjs && node --check src/companion-opening.mjs && node --check src/companion.mjs && node --check src/cli.mjs && node --check src/checkin.mjs && node --check src/persona-licence-config.mjs && node --check src/persona-website-provider.mjs && node --check src/persona-zip.mjs && node --check src/persona-entitlements.mjs && node --check src/context.mjs && node --check src/archaeology.mjs && node --check src/evidence-depth.mjs && node --check src/prototype-iterations.mjs && node --check src/solution-readiness.mjs && node --check src/delivery-artifacts.mjs && node --check src/delivery-documents.mjs && node --check src/delivery-gates.mjs && node --check src/delivery.mjs && node --check src/design-systems.mjs && node --check src/design-system-authoring.mjs && node --check src/execution-state.mjs && node --check src/intent-dependencies.mjs && node --check src/task-graph.mjs && node --check src/test-scenarios.mjs && node --check src/security-validation-config.mjs && node --check src/starter-materialisation-contract.mjs && node --check src/validation-config.mjs && node --check src/project.mjs && node --check src/install.mjs && node --check src/intents.mjs && node --check src/intent-maps.mjs && node --check src/discovery.mjs && node --check src/packs.mjs && node --check src/organisation-blueprints.mjs && node --check src/organisation-policies.mjs && node --check src/policy-design-gates.mjs && node --check src/policy-gate-integration.mjs && node --check src/personas.mjs && node --check src/platform-metadata-analysis.mjs && node --check src/power-platform-source-map.mjs && node --check src/salesforce-source-map.mjs && node --check src/repository-source-map.mjs && node --check src/runtime/context-assembly.mjs && node --check src/runtime/context-benchmarks.mjs && node --check src/runtime/database.mjs && node --check src/runtime/execution-leases.mjs && node --check src/runtime/provider-adapters.mjs && node --check src/runtime/security-validation.mjs && node --check src/runtime/starter-materialisation.mjs && node --check src/runtime/policy-workspace.mjs && node --check src/runtime/lifecycle-hooks.mjs && node --check src/runtime/afk-conductor.mjs && node --check src/runtime/dashboard-actions.mjs && node --check src/runtime/dashboard-handoffs.mjs && node --check src/runtime/persona-engagement.mjs && node --check src/runtime/evidence-depth-workspace.mjs && node --check src/runtime/prototype-iterations.mjs && node --check src/runtime/guided-discovery.mjs && node --check src/runtime/guided-intents.mjs && node --check src/runtime/phase-contributions.mjs && node --check src/runtime/impact-analysis.mjs && node --check src/runtime/paths.mjs && node --check src/runtime/intents.mjs && node --check src/runtime/knowledge.mjs && node --check src/runtime/palace.mjs && node --check src/runtime/repository-index.mjs && node --check src/runtime/runs.mjs && node --check src/runtime/work.mjs && node --check src/runtime/version.mjs && node --check src/runtime/dashboard.mjs && node --check src/runtime/dashboard-server.mjs && node --check src/runtime/mcp-config.mjs && node --check src/runtime/mcp-server.mjs && node --check src/autonomy.mjs && node --check src/autonomy-phase-contracts.mjs && node --check src/autonomy-worker.mjs && node --check src/runtime/autonomy-supervisor.mjs && node --check src/runtime/autonomy-operations.mjs && node --check src/runtime/autonomy-workers.mjs && node --check src/runtime/autonomy-workspace.mjs && node --check public/autonomy.js && node --check public/app.js && node --check public/team-hub/app.js && node --check scripts/setup.mjs",
57
+ "test": "node --test --test-concurrency=2",
58
58
  "test:team-hub:coverage": "node --test --experimental-test-coverage --test-coverage-lines=90 --test-coverage-functions=85 --test-coverage-branches=75 --test-coverage-include='src/runtime/team-hub-client.mjs' --test-coverage-include='src/runtime/team-hub-database.mjs' tests/team-hub-server.test.mjs tests/team-hub-client.test.mjs tests/team-hub-resource-registry.test.mjs tests/team-hub-adapters.test.mjs tests/team-hub-operational.test.mjs",
59
59
  "lint": "npm run check",
60
60
  "setup": "node scripts/setup.mjs",
package/public/app.js CHANGED
@@ -19,6 +19,7 @@ const meetingEvidenceDisclaimer = 'Security validation is evidence, not certific
19
19
  const knowledgeProposalDisclaimer = 'Security validation is evidence, not certification or proof that this system is secure. Tools can miss vulnerabilities and produce false positives. A qualified human must review the scope, findings, limitations and residual risk before release.';
20
20
 
21
21
  import {createDashboardNavigation} from './dashboard-navigation.js';
22
+ import {configureAutonomyDashboard, loadAutonomyState, renderAutonomyIntentDetail} from './autonomy.js';
22
23
 
23
24
  const state = {
24
25
  project: null,
@@ -1313,6 +1314,7 @@ function renderDrawer() {
1313
1314
  button.setAttribute('tabindex', active ? '0' : '-1');
1314
1315
  });
1315
1316
  element('drawerContent').innerHTML = renderers[state.selectedTab](state.selected);
1317
+ if (state.selectedTab === 'overview') renderAutonomyIntentDetail(state.selected.item);
1316
1318
  }
1317
1319
 
1318
1320
  function activateDrawerTab(tab, { focus = false } = {}) {
@@ -3814,6 +3816,7 @@ async function refreshRuntime() {
3814
3816
  if (state.view === 'companion' && !state.companionLoading) await loadCompanion();
3815
3817
  if (state.view === 'portfolio' && !state.portfolioLoading) await loadPortfolio();
3816
3818
  if (state.view === 'rollout' && !state.rolloutLoading) await loadRollout();
3819
+ if (['configuration', 'companion', 'live'].includes(state.view) || element('intentDialog').open) await loadAutonomyState();
3817
3820
  element('pollStatus').textContent = 'Updated just now · refreshing every 5 seconds';
3818
3821
  if (state.selected && element('intentDialog').open) {
3819
3822
  const previous = state.selected;
@@ -3878,6 +3881,7 @@ function setView(view) {
3878
3881
  if (view === 'companion') loadCompanion().catch(console.error);
3879
3882
  if (view === 'portfolio') loadPortfolio().catch(console.error);
3880
3883
  if (view === 'rollout') loadRollout().catch(console.error);
3884
+ if (['configuration', 'companion', 'live'].includes(view)) loadAutonomyState().catch(console.error);
3881
3885
  if (!state.pollTimer) state.pollTimer = window.setInterval(() => refreshRuntime().catch(console.error), 5000);
3882
3886
  refreshRuntime().catch(console.error);
3883
3887
  }
@@ -4734,6 +4738,7 @@ element('showDone').addEventListener('change', (event) => {
4734
4738
  renderBoard();
4735
4739
  });
4736
4740
  element('refresh').addEventListener('click', () => {
4741
+ if (['configuration', 'companion', 'live'].includes(state.view)) loadAutonomyState().catch(console.error);
4737
4742
  if (state.view === 'hooks') loadHooks().catch(console.error);
4738
4743
  else if (state.view === 'policies') loadPolicy().catch(console.error);
4739
4744
  else if (state.view === 'security') loadSecurity().catch(console.error);
@@ -4888,7 +4893,9 @@ element('premiumSetupForm').addEventListener('submit', async event => {
4888
4893
  });
4889
4894
 
4890
4895
  const navigation=createDashboardNavigation({api,onSelect:setView,onManageLicence:()=>element('premiumSetup').click()});
4896
+ configureAutonomyDashboard({api,getItems:()=>state.items,openIntent:openItem,showView:setView});
4891
4897
  Promise.all([navigation.refresh(),loadBoard()]).then(() => {
4898
+ loadAutonomyState().catch(console.error);
4892
4899
  if (!state.pollTimer) state.pollTimer = window.setInterval(() => refreshRuntime().catch(console.error), 5000);
4893
4900
  }).catch((error) => {
4894
4901
  element('runtimeStatus').textContent = error.message;