diff --git a/AGENTS.md b/AGENTS.md index 98e251e5c..68c83686e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,7 +27,7 @@ Interview flows are data (`packages/extension/scores/`). Schemas: `packages/sche ## Setup (in order; each step has a check) ```bash -git clone git@github.com:harmoniqs/amicissimode.git && cd amicode +git clone git@github.com:harmoniqs/amicode.git && cd amicode corepack enable && pnpm install # check: exits 0, lockfile untouched pnpm -r build # check: packages/extension/dist/extension.js exists pnpm --filter amicode run fetch:opencode # check: vendor/opencode//opencode exists diff --git a/packages/extension/agents/develop.md b/packages/extension/agents/develop.md index ae129f253..453497024 100644 --- a/packages/extension/agents/develop.md +++ b/packages/extension/agents/develop.md @@ -90,14 +90,19 @@ record; this prose is the binding, never a second spec. (when human-in-the-loop) is by a reviewer who is never the implementer. **No per-slice PRs in orchestrated mode.** After each slice's branch merges into the integration branch, **remove its worktree immediately** via - `amicode_workspace` — do not accumulate worktrees across slices. + `amicode_workspace` — do not accumulate worktrees across slices. The gate + suite includes the skills-integrity lint when present on the branch, and + merged work that changed a package API surface is grep-checked against + skill references — hits become ledger findings. **Dispatch discipline** — the implementer (the `implementer` subagent card) is your only writer role: fresh context per slice, one issue per cast, worktree- bound, no PR and no merge in orchestrated mode. You gate and merge; the implementer returns the branch and a structured result (issue, status, branch, commit_shas, ac_results, notes). A slice that hits its step limit -returns `EXHAUSTED:` — an open loop for you, not a failure to hide. +returns `EXHAUSTED:` — an open loop for you, not a failure to hide. The +loop-boundary ledger update includes the campaign's skill delta — findings +filed, skills touched, proposals pending. **Hard rules** — issue + PR for all package work (the development gate); never merge non-green work; never push directly to protected branches; promotion diff --git a/packages/extension/agents/research.md b/packages/extension/agents/research.md index 01894d557..c5423aab0 100644 --- a/packages/extension/agents/research.md +++ b/packages/extension/agents/research.md @@ -75,7 +75,11 @@ run the spec review (`--allow-unreviewed` forbidden for launch-shaped work) experiment, assigned env per the checkout registry) → run the gates YOURSELF via bash (verdicts derived from commands, never self-reported; no LLM judges a fidelity claim) → cast the **analyzer** (read-only, raw artifacts only) → -commit the ledger update → repeat. +commit the ledger update → repeat. The analyzer cast carries the +skill-friction check — instructions-vs-reality mismatches become findings, +repeated un-skilled idioms become skill proposals — and the record boundary +carries the same skill-delta row (findings filed, skills touched, proposals +pending). **The boundary** — read-only ops and bounded side-effect-free one-liners are probes; the moment work writes a durable file, launches a solve, or runs a diff --git a/packages/extension/modes/develop/card.md b/packages/extension/modes/develop/card.md index ae129f253..453497024 100644 --- a/packages/extension/modes/develop/card.md +++ b/packages/extension/modes/develop/card.md @@ -90,14 +90,19 @@ record; this prose is the binding, never a second spec. (when human-in-the-loop) is by a reviewer who is never the implementer. **No per-slice PRs in orchestrated mode.** After each slice's branch merges into the integration branch, **remove its worktree immediately** via - `amicode_workspace` — do not accumulate worktrees across slices. + `amicode_workspace` — do not accumulate worktrees across slices. The gate + suite includes the skills-integrity lint when present on the branch, and + merged work that changed a package API surface is grep-checked against + skill references — hits become ledger findings. **Dispatch discipline** — the implementer (the `implementer` subagent card) is your only writer role: fresh context per slice, one issue per cast, worktree- bound, no PR and no merge in orchestrated mode. You gate and merge; the implementer returns the branch and a structured result (issue, status, branch, commit_shas, ac_results, notes). A slice that hits its step limit -returns `EXHAUSTED:` — an open loop for you, not a failure to hide. +returns `EXHAUSTED:` — an open loop for you, not a failure to hide. The +loop-boundary ledger update includes the campaign's skill delta — findings +filed, skills touched, proposals pending. **Hard rules** — issue + PR for all package work (the development gate); never merge non-green work; never push directly to protected branches; promotion diff --git a/packages/extension/modes/research/card.md b/packages/extension/modes/research/card.md index 01894d557..c5423aab0 100644 --- a/packages/extension/modes/research/card.md +++ b/packages/extension/modes/research/card.md @@ -75,7 +75,11 @@ run the spec review (`--allow-unreviewed` forbidden for launch-shaped work) experiment, assigned env per the checkout registry) → run the gates YOURSELF via bash (verdicts derived from commands, never self-reported; no LLM judges a fidelity claim) → cast the **analyzer** (read-only, raw artifacts only) → -commit the ledger update → repeat. +commit the ledger update → repeat. The analyzer cast carries the +skill-friction check — instructions-vs-reality mismatches become findings, +repeated un-skilled idioms become skill proposals — and the record boundary +carries the same skill-delta row (findings filed, skills touched, proposals +pending). **The boundary** — read-only ops and bounded side-effect-free one-liners are probes; the moment work writes a durable file, launches a solve, or runs a diff --git a/packages/extension/skills/research/SKILL.md b/packages/extension/skills/research/SKILL.md index e055e76be..b9c6224c4 100644 --- a/packages/extension/skills/research/SKILL.md +++ b/packages/extension/skills/research/SKILL.md @@ -104,7 +104,7 @@ running `amico env promote` on any staged proposals in `ledger/environment-propo ## The campaign ledger (create at kickoff, before any work) -Path: `/ledger/campaigns/campaign--.md`. Nine sections, in order: +Path: `/ledger/campaigns/campaign--.md` — this project-local ledger serves Research-Project-scoped work and reconciles to the **session ledger** in the personal vault (`sessions/session--.md`, per `director-core`'s discovery rule) at each loop boundary. Nine sections, in order: 1. Objective & standing directives 2. Hypothesis ledger (H# → verdict → evidence → wiki-links) diff --git a/packages/extension/test/fixtures/vault-cards/invalid/confidence-wrong-type.json b/packages/extension/test/fixtures/vault-cards/invalid/confidence-wrong-type.json index 08f835a4b..20d146cd9 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/confidence-wrong-type.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/confidence-wrong-type.json @@ -2,6 +2,7 @@ "confidence": 5, "date": "2026-08-22", "evidence": [], + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-negative.json b/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-negative.json index 5b1020f4c..95a01b44f 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-negative.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-negative.json @@ -5,8 +5,8 @@ "gate": "X", "platform": "transmon", "session_id": "s", - "status": "solved", + "status": "completed", "tags": [], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-out-of-range.json b/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-out-of-range.json index 40c0b6c8d..01ae67402 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-out-of-range.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/experiment-fidelity-out-of-range.json @@ -5,8 +5,8 @@ "gate": "X", "platform": "transmon", "session_id": "s", - "status": "solved", + "status": "completed", "tags": [], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/invalid/experiment-missing-fidelity.json b/packages/extension/test/fixtures/vault-cards/invalid/experiment-missing-fidelity.json index 3066bd501..7185bd700 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/experiment-missing-fidelity.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/experiment-missing-fidelity.json @@ -4,8 +4,8 @@ "gate": "X", "platform": "transmon", "session_id": "s", - "status": "solved", + "status": "completed", "tags": [], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/invalid/experiment-negative-duration.json b/packages/extension/test/fixtures/vault-cards/invalid/experiment-negative-duration.json index b8fdc614f..a68fe68c3 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/experiment-negative-duration.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/experiment-negative-duration.json @@ -5,8 +5,8 @@ "gate": "X", "platform": "transmon", "session_id": "s", - "status": "solved", + "status": "completed", "tags": [], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/invalid/malformed-review-by.json b/packages/extension/test/fixtures/vault-cards/invalid/malformed-review-by.json index eacd0f22c..2c0d4d620 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/malformed-review-by.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/malformed-review-by.json @@ -3,6 +3,7 @@ "date": "2026-08-22", "evidence": [], "review_by": "last tuesday", + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/provenance-not-array.json b/packages/extension/test/fixtures/vault-cards/invalid/provenance-not-array.json index da77ea190..aa6863ffc 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/provenance-not-array.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/provenance-not-array.json @@ -3,6 +3,7 @@ "date": "2026-08-22", "evidence": [], "provenance": "not-an-array", + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/review-by-calendar-invalid.json b/packages/extension/test/fixtures/vault-cards/invalid/review-by-calendar-invalid.json index 84b2fd7c9..67d23ae5c 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/review-by-calendar-invalid.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/review-by-calendar-invalid.json @@ -3,6 +3,7 @@ "date": "2026-08-22", "evidence": [], "review_by": "2026-02-30", + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/review-by-wrong-type.json b/packages/extension/test/fixtures/vault-cards/invalid/review-by-wrong-type.json index 9d330bcae..8545a37e7 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/review-by-wrong-type.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/review-by-wrong-type.json @@ -3,6 +3,7 @@ "date": "2026-08-22", "evidence": [], "review_by": 2026, + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/sentinel-conflict.json b/packages/extension/test/fixtures/vault-cards/invalid/sentinel-conflict.json index 613978713..d77f042ac 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/sentinel-conflict.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/sentinel-conflict.json @@ -7,6 +7,7 @@ ], "provenance_unrecoverable": true, "reviewed_after": "journal/pass-1.md", + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/sentinel-empty-reviewed-after.json b/packages/extension/test/fixtures/vault-cards/invalid/sentinel-empty-reviewed-after.json index 7ffcdf09c..d06b65b77 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/sentinel-empty-reviewed-after.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/sentinel-empty-reviewed-after.json @@ -5,6 +5,7 @@ "provenance": [], "provenance_unrecoverable": true, "reviewed_after": "", + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/sentinel-no-review-pointer.json b/packages/extension/test/fixtures/vault-cards/invalid/sentinel-no-review-pointer.json index 43318b65f..4d946b6c6 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/sentinel-no-review-pointer.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/sentinel-no-review-pointer.json @@ -3,6 +3,7 @@ "date": "2026-08-22", "evidence": [], "provenance_unrecoverable": true, + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/invalid/unknown-confidence.json b/packages/extension/test/fixtures/vault-cards/invalid/unknown-confidence.json index 239ac1371..2761c1c9e 100644 --- a/packages/extension/test/fixtures/vault-cards/invalid/unknown-confidence.json +++ b/packages/extension/test/fixtures/vault-cards/invalid/unknown-confidence.json @@ -2,6 +2,7 @@ "confidence": "certain", "date": "2026-08-22", "evidence": [], + "session_id": null, "source": "s", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/valid-md/insight-cat-state.md b/packages/extension/test/fixtures/vault-cards/valid-md/insight-cat-state.md index c83409fd6..28e89d396 100644 --- a/packages/extension/test/fixtures/vault-cards/valid-md/insight-cat-state.md +++ b/packages/extension/test/fixtures/vault-cards/valid-md/insight-cat-state.md @@ -1,6 +1,7 @@ --- type: insight date: 2026-08-22 +session_id: 20260913-cat-state source: session-2026-08-21 evidence: - experiments/e-cat.md diff --git a/packages/extension/test/fixtures/vault-cards/valid/device-mini.json b/packages/extension/test/fixtures/vault-cards/valid/device-mini.json index 72c33b2fb..21ef56b20 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/device-mini.json +++ b/packages/extension/test/fixtures/vault-cards/valid/device-mini.json @@ -1,4 +1,6 @@ { + "device_class": "classical", + "location": "desk", "name": "Mac mini", "platforms": [ "server" diff --git a/packages/extension/test/fixtures/vault-cards/valid/experiment-cavity-failed.json b/packages/extension/test/fixtures/vault-cards/valid/experiment-cavity-failed.json index 86f7d8bee..0c07178f5 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/experiment-cavity-failed.json +++ b/packages/extension/test/fixtures/vault-cards/valid/experiment-cavity-failed.json @@ -9,6 +9,6 @@ "tags": [ "fock" ], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/experiment-fluxonium-ext.json b/packages/extension/test/fixtures/vault-cards/valid/experiment-fluxonium-ext.json index ecdd75236..1d66d6d0b 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/experiment-fluxonium-ext.json +++ b/packages/extension/test/fixtures/vault-cards/valid/experiment-fluxonium-ext.json @@ -9,11 +9,11 @@ ], "review_by": "2026-11-16", "session_id": "s4", - "status": "solved", + "status": "completed", "subject": "fluxonium-x", "tags": [ "fluxonium" ], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/experiment-rydberg-cz.json b/packages/extension/test/fixtures/vault-cards/valid/experiment-rydberg-cz.json index 79e0f9363..552371c6f 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/experiment-rydberg-cz.json +++ b/packages/extension/test/fixtures/vault-cards/valid/experiment-rydberg-cz.json @@ -5,10 +5,10 @@ "gate": "CZ", "platform": "rydberg", "session_id": "s2", - "status": "solved", + "status": "completed", "tags": [ "cz" ], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/experiment-transmon-x.json b/packages/extension/test/fixtures/vault-cards/valid/experiment-transmon-x.json index f90ddc55e..af9e37dad 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/experiment-transmon-x.json +++ b/packages/extension/test/fixtures/vault-cards/valid/experiment-transmon-x.json @@ -5,10 +5,10 @@ "gate": "X", "platform": "transmon", "session_id": "s1", - "status": "solved", + "status": "completed", "tags": [ "x-gate" ], - "task_type": "experiment-sim", + "task_type": "experiment", "type": "experiment" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/hypothesis-falsified.json b/packages/extension/test/fixtures/vault-cards/valid/hypothesis-falsified.json index 14cdc3906..61c624fae 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/hypothesis-falsified.json +++ b/packages/extension/test/fixtures/vault-cards/valid/hypothesis-falsified.json @@ -3,8 +3,9 @@ "evidence": [ "experiments/e6.md" ], + "session_id": null, "source": "session", - "status": "falsified", + "status": "refuted", "tags": [ "magnus" ], diff --git a/packages/extension/test/fixtures/vault-cards/valid/hypothesis-open.json b/packages/extension/test/fixtures/vault-cards/valid/hypothesis-open.json index 82f442964..8f83cf51f 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/hypothesis-open.json +++ b/packages/extension/test/fixtures/vault-cards/valid/hypothesis-open.json @@ -1,6 +1,7 @@ { "date": "2026-08-18", "evidence": [], + "session_id": null, "source": "session", "status": "open", "tags": [ diff --git a/packages/extension/test/fixtures/vault-cards/valid/hypothesis-tested.json b/packages/extension/test/fixtures/vault-cards/valid/hypothesis-tested.json index 523cafa0a..59b0911e2 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/hypothesis-tested.json +++ b/packages/extension/test/fixtures/vault-cards/valid/hypothesis-tested.json @@ -3,8 +3,9 @@ "evidence": [ "experiments/e5.md" ], + "session_id": null, "source": "session", - "status": "tested", + "status": "confirmed", "tags": [ "bilinear" ], diff --git a/packages/extension/test/fixtures/vault-cards/valid/insight-full-extensions.json b/packages/extension/test/fixtures/vault-cards/valid/insight-full-extensions.json index 78d60f9a1..e18663f90 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/insight-full-extensions.json +++ b/packages/extension/test/fixtures/vault-cards/valid/insight-full-extensions.json @@ -8,6 +8,7 @@ "experiments/e2.md" ], "review_by": "2026-11-18", + "session_id": null, "source": "session", "subject": "warm-starts", "tags": [ diff --git a/packages/extension/test/fixtures/vault-cards/valid/insight-minimal.json b/packages/extension/test/fixtures/vault-cards/valid/insight-minimal.json index 27558b97b..e70af7b60 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/insight-minimal.json +++ b/packages/extension/test/fixtures/vault-cards/valid/insight-minimal.json @@ -2,6 +2,7 @@ "confidence": "medium", "date": "2026-08-19", "evidence": [], + "session_id": null, "source": "retro", "tags": [], "type": "insight" diff --git a/packages/extension/test/fixtures/vault-cards/valid/insight-plain.json b/packages/extension/test/fixtures/vault-cards/valid/insight-plain.json index 1e0c81e8e..6d1005a29 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/insight-plain.json +++ b/packages/extension/test/fixtures/vault-cards/valid/insight-plain.json @@ -4,6 +4,7 @@ "evidence": [ "experiments/e1.md" ], + "session_id": null, "source": "session", "tags": [ "warm-starts" diff --git a/packages/extension/test/fixtures/vault-cards/valid/insight-routing.json b/packages/extension/test/fixtures/vault-cards/valid/insight-routing.json index c9cb8fedb..2e1d3811e 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/insight-routing.json +++ b/packages/extension/test/fixtures/vault-cards/valid/insight-routing.json @@ -4,6 +4,7 @@ "evidence": [ "experiments/e4.md" ], + "session_id": null, "source": "session", "subject": "model-routing", "tags": [ diff --git a/packages/extension/test/fixtures/vault-cards/valid/insight-sentinel-reviewed.json b/packages/extension/test/fixtures/vault-cards/valid/insight-sentinel-reviewed.json index cbc1844f5..f502e1a55 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/insight-sentinel-reviewed.json +++ b/packages/extension/test/fixtures/vault-cards/valid/insight-sentinel-reviewed.json @@ -7,6 +7,7 @@ "provenance": [], "provenance_unrecoverable": true, "reviewed_after": "journal/pass-1.md", + "session_id": null, "source": "session", "tags": [ "legacy" diff --git a/packages/extension/test/fixtures/vault-cards/valid/meeting-design.json b/packages/extension/test/fixtures/vault-cards/valid/meeting-design.json index 16f1d6af9..9134af114 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/meeting-design.json +++ b/packages/extension/test/fixtures/vault-cards/valid/meeting-design.json @@ -3,8 +3,10 @@ "aaron" ], "date": "2026-08-18", + "org": "[[org-harmoniqs]]", "tags": [ "design" ], + "topic": "weekly sync", "type": "meeting" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/meeting-weekly.json b/packages/extension/test/fixtures/vault-cards/valid/meeting-weekly.json index 80d6a1f71..12b6f485e 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/meeting-weekly.json +++ b/packages/extension/test/fixtures/vault-cards/valid/meeting-weekly.json @@ -4,8 +4,10 @@ "kate" ], "date": "2026-08-15", + "org": "[[org-harmoniqs]]", "tags": [ "weekly" ], + "topic": "weekly sync", "type": "meeting" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/method-bangbang.json b/packages/extension/test/fixtures/vault-cards/valid/method-bangbang.json index 39f535ea3..62b86b087 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/method-bangbang.json +++ b/packages/extension/test/fixtures/vault-cards/valid/method-bangbang.json @@ -1,7 +1,10 @@ { - "applicability": "short-time gates, drive-limited regimes", + "applicability": [ + "short-time gates, drive-limited regimes" + ], "date": "2026-08-01", "name": "bang-bang parameterization", + "session_id": null, "source": "literature", "tags": [ "parameterization" diff --git a/packages/extension/test/fixtures/vault-cards/valid/method-smooth.json b/packages/extension/test/fixtures/vault-cards/valid/method-smooth.json index c34c39e0e..7ecc8e04d 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/method-smooth.json +++ b/packages/extension/test/fixtures/vault-cards/valid/method-smooth.json @@ -1,10 +1,13 @@ { - "applicability": "transmon single-qubit gates", + "applicability": [ + "transmon single-qubit gates" + ], "date": "2026-08-02", "name": "smooth parameterization", "provenance": [ "experiments/e7.md" ], + "session_id": null, "source": "demo", "tags": [ "parameterization" diff --git a/packages/extension/test/fixtures/vault-cards/valid/org-harmoniqs.json b/packages/extension/test/fixtures/vault-cards/valid/org-harmoniqs.json index dfb1aa958..4113ec38a 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/org-harmoniqs.json +++ b/packages/extension/test/fixtures/vault-cards/valid/org-harmoniqs.json @@ -1,5 +1,7 @@ { + "domain": "quantum control", "name": "Harmoniqs", + "relationship": "partner", "tags": [ "team" ], diff --git a/packages/extension/test/fixtures/vault-cards/valid/paper-quera.json b/packages/extension/test/fixtures/vault-cards/valid/paper-quera.json index bb42b05c7..b8a896dd3 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/paper-quera.json +++ b/packages/extension/test/fixtures/vault-cards/valid/paper-quera.json @@ -3,9 +3,15 @@ "authors": [ "Bluvstein" ], - "date": "2026-08-06", + "date_read": "2026-08-06", + "relevance": "high", + "session_id": null, + "systems": [ + "spin" + ], "tags": [ "rydberg" ], + "title": "2211.15453 study", "type": "paper" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/paper-willow.json b/packages/extension/test/fixtures/vault-cards/valid/paper-willow.json index 8469e2945..12fe591ca 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/paper-willow.json +++ b/packages/extension/test/fixtures/vault-cards/valid/paper-willow.json @@ -4,9 +4,15 @@ "Willow", "Andersen" ], - "date": "2026-08-05", + "date_read": "2026-08-05", + "relevance": "high", + "session_id": null, + "systems": [ + "spin" + ], "tags": [ "spin-qubits" ], + "title": "2405.17385 study", "type": "paper" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/plan-active.json b/packages/extension/test/fixtures/vault-cards/valid/plan-active.json index f32bbefa4..b5d9bb4fb 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/plan-active.json +++ b/packages/extension/test/fixtures/vault-cards/valid/plan-active.json @@ -1,8 +1,11 @@ { "date": "2026-08-22", - "status": "active", + "session_id": null, + "spec": "[[spec-20260821-164000-gates]]", + "status": "executing", "tags": [ "telaio" ], - "type": "plan" + "type": "plan", + "visibility": "local" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/plan-landed.json b/packages/extension/test/fixtures/vault-cards/valid/plan-landed.json index e4253dae6..b2837c16a 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/plan-landed.json +++ b/packages/extension/test/fixtures/vault-cards/valid/plan-landed.json @@ -1,8 +1,11 @@ { "date": "2026-08-20", - "status": "landed", + "session_id": null, + "spec": "[[spec-20260821-164000-gates]]", + "status": "completed", "tags": [ "telaio" ], - "type": "plan" + "type": "plan", + "visibility": "local" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/retro-session-a.json b/packages/extension/test/fixtures/vault-cards/valid/retro-session-a.json index 729db6db9..b4f31fc12 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/retro-session-a.json +++ b/packages/extension/test/fixtures/vault-cards/valid/retro-session-a.json @@ -1,5 +1,7 @@ { "date": "2026-08-16", + "outcome": "success", + "session_id": null, "tags": [ "session" ], diff --git a/packages/extension/test/fixtures/vault-cards/valid/retro-session-b.json b/packages/extension/test/fixtures/vault-cards/valid/retro-session-b.json index f17a8c53a..3feddae9a 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/retro-session-b.json +++ b/packages/extension/test/fixtures/vault-cards/valid/retro-session-b.json @@ -1,5 +1,7 @@ { "date": "2026-08-17", + "outcome": "success", + "session_id": null, "tags": [ "session" ], diff --git a/packages/extension/test/fixtures/vault-cards/valid/spec-approved.json b/packages/extension/test/fixtures/vault-cards/valid/spec-approved.json index e523b743a..66b55bc71 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/spec-approved.json +++ b/packages/extension/test/fixtures/vault-cards/valid/spec-approved.json @@ -3,9 +3,11 @@ "platform": "transmon", "priority": "p1", "review_by": "2027-08-21", + "session_id": null, "status": "approved", "tags": [ "context" ], - "type": "spec" + "type": "spec", + "visibility": "local" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/spec-draft.json b/packages/extension/test/fixtures/vault-cards/valid/spec-draft.json index ccf095bca..0f48a0853 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/spec-draft.json +++ b/packages/extension/test/fixtures/vault-cards/valid/spec-draft.json @@ -2,9 +2,11 @@ "date": "2026-08-21", "platform": "transmon", "priority": "p1", + "session_id": null, "status": "draft", "tags": [ "context" ], - "type": "spec" + "type": "spec", + "visibility": "local" } diff --git a/packages/extension/test/fixtures/vault-cards/valid/spec-superseded.json b/packages/extension/test/fixtures/vault-cards/valid/spec-superseded.json index 14be240d6..a02d47d6f 100644 --- a/packages/extension/test/fixtures/vault-cards/valid/spec-superseded.json +++ b/packages/extension/test/fixtures/vault-cards/valid/spec-superseded.json @@ -2,9 +2,11 @@ "date": "2026-08-18", "platform": "cavity", "priority": "p2", - "status": "superseded", + "session_id": null, + "status": "abandoned", "tags": [ "distillation" ], - "type": "spec" + "type": "spec", + "visibility": "local" } diff --git a/packages/extension/test/vault_schemas.test.ts b/packages/extension/test/vault_schemas.test.ts index 6ae390719..60c5ef46f 100644 --- a/packages/extension/test/vault_schemas.test.ts +++ b/packages/extension/test/vault_schemas.test.ts @@ -44,7 +44,10 @@ describe("card schemas", () => { }); it("a legacy card with no extension fields still validates (backward compat)", () => { - const legacy = { type: "insight", date: "2026-01-01", source: "s", evidence: [], confidence: "medium", tags: [] }; + // amico-vault alignment (F26, PR #1052): `source` is now a tolerated + // legacy extra (not required), session_id is present-either-way (null on + // a human-curated card). + const legacy = { type: "insight", date: "2026-01-01", session_id: null, source: "s", evidence: [], confidence: "medium", tags: [] }; const res = validateCard(legacy, schemas); expect(res.errors, JSON.stringify(res.errors)).toEqual([]); expect(res.ok).toBe(true); @@ -54,6 +57,7 @@ describe("card schemas", () => { const full = { type: "insight", date: "2026-08-22", + session_id: null, source: "session", evidence: ["experiments/x.md"], confidence: "high", @@ -106,7 +110,7 @@ describe("invalid fixture corpus (refusals with named schema paths)", () => { "tombstone-dangling-pointer.json": "$.pointer", "tombstone-superseded-no-pointer.json": "$.pointer", "tombstone-expired-ttl-no-date.json": "$.original_review_by", - "missing-required.json": "$.source", + "missing-required.json": "$.session_id", "untyped.json": "$.type", "unknown-type.json": "$.type", "record-missing-origin.json": "$.origin", @@ -165,6 +169,7 @@ describe("sentinel semantics", () => { const bad = { type: "insight", date: "2026-08-22", + session_id: null, source: "s", evidence: [], confidence: "medium", @@ -180,6 +185,7 @@ describe("sentinel semantics", () => { const bad = { type: "insight", date: "2026-08-22", + session_id: null, source: "s", evidence: [], confidence: "medium", @@ -193,6 +199,7 @@ describe("sentinel semantics", () => { const good = { type: "insight", date: "2026-08-22", + session_id: null, source: "s", evidence: [], confidence: "low", @@ -209,13 +216,13 @@ describe("reviewer adversarial semantics (2026-08-23 pass, #517)", () => { it("accepts fidelity at the [0, 1] boundaries", () => { const base = { type: "experiment", - task_type: "experiment-sim", + task_type: "experiment", date: "2026-08-22", session_id: "s", platform: "transmon", gate: "X", duration_us: 10, - status: "solved", + status: "completed", tags: [], }; for (const fidelity of [0, 1]) { @@ -225,7 +232,7 @@ describe("reviewer adversarial semantics (2026-08-23 pass, #517)", () => { }); it("accepts a real leap day but refuses a non-leap Feb 29", () => { - const base = { type: "insight", date: "2026-08-22", source: "s", evidence: [], confidence: "medium", tags: [] }; + const base = { type: "insight", date: "2026-08-22", session_id: null, source: "s", evidence: [], confidence: "medium", tags: [] }; expect(validateCard({ ...base, review_by: "2024-02-29" }, schemas).ok).toBe(true); expect(validateCard({ ...base, review_by: "2027-02-29" }, schemas).ok).toBe(false); }); diff --git a/packages/extension/vault-schemas/cards/device.schema.json b/packages/extension/vault-schemas/cards/device.schema.json index 1c5153a78..089163b15 100644 --- a/packages/extension/vault-schemas/cards/device.schema.json +++ b/packages/extension/vault-schemas/cards/device.schema.json @@ -34,6 +34,16 @@ "high" ] }, + "device_class": { + "enum": [ + "classical", + "quantum" + ] + }, + "location": { + "minLength": 1, + "type": "string" + }, "name": { "minLength": 1, "type": "string" @@ -62,8 +72,11 @@ "type": "string" }, "status": { - "minLength": 1, - "type": "string" + "enum": [ + "online", + "offline", + "maintenance" + ] }, "subject": { "minLength": 1, @@ -83,7 +96,9 @@ "type", "name", "status", + "device_class", "platforms", + "location", "tags" ], "title": "device card", diff --git a/packages/extension/vault-schemas/cards/experiment.schema.json b/packages/extension/vault-schemas/cards/experiment.schema.json index c14c4e6a4..de382687b 100644 --- a/packages/extension/vault-schemas/cards/experiment.schema.json +++ b/packages/extension/vault-schemas/cards/experiment.schema.json @@ -42,6 +42,15 @@ "minimum": 0, "type": "number" }, + "failure_mode": { + "enum": [ + null, + "stagnation", + "divergence", + "constraint_violation", + "infeasible" + ] + }, "fidelity": { "maximum": 1, "minimum": 0, @@ -74,11 +83,33 @@ }, "session_id": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] }, - "status": { + "source": { + "enum": [ + null, + "demo-ingest", + "doc-ingest", + "agent" + ] + }, + "source_path": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "running", + "completed", + "failed", + "stalled" + ] }, "subject": { "minLength": 1, @@ -91,11 +122,23 @@ "type": "array" }, "task_type": { - "minLength": 1, - "type": "string" + "enum": [ + "experiment", + "validation", + "regression", + "reproduction", + "parameter-study" + ] }, "type": { "const": "experiment" + }, + "warm_started_from": { + "minLength": 1, + "type": [ + "string", + "null" + ] } }, "required": [ diff --git a/packages/extension/vault-schemas/cards/hypothesis.schema.json b/packages/extension/vault-schemas/cards/hypothesis.schema.json index c3acfb21b..6c9830336 100644 --- a/packages/extension/vault-schemas/cards/hypothesis.schema.json +++ b/packages/extension/vault-schemas/cards/hypothesis.schema.json @@ -44,6 +44,13 @@ }, "type": "array" }, + "platform": { + "minLength": 1, + "type": [ + "string", + "null" + ] + }, "provenance": { "items": { "type": "string" @@ -61,13 +68,21 @@ "minLength": 1, "type": "string" }, - "source": { + "session_id": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] }, "status": { - "minLength": 1, - "type": "string" + "enum": [ + "open", + "untested", + "confirmed", + "refuted", + "abandoned" + ] }, "subject": { "minLength": 1, @@ -86,7 +101,7 @@ "required": [ "type", "date", - "source", + "session_id", "status", "evidence", "tags" diff --git a/packages/extension/vault-schemas/cards/insight.schema.json b/packages/extension/vault-schemas/cards/insight.schema.json index 3b05836c3..c52cd830a 100644 --- a/packages/extension/vault-schemas/cards/insight.schema.json +++ b/packages/extension/vault-schemas/cards/insight.schema.json @@ -61,9 +61,12 @@ "minLength": 1, "type": "string" }, - "source": { + "session_id": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] }, "subject": { "minLength": 1, @@ -82,7 +85,7 @@ "required": [ "type", "date", - "source", + "session_id", "evidence", "confidence", "tags" diff --git a/packages/extension/vault-schemas/cards/meeting.schema.json b/packages/extension/vault-schemas/cards/meeting.schema.json index a92078d97..4f43d431d 100644 --- a/packages/extension/vault-schemas/cards/meeting.schema.json +++ b/packages/extension/vault-schemas/cards/meeting.schema.json @@ -44,6 +44,10 @@ "format": "date", "type": "string" }, + "org": { + "minLength": 1, + "type": "string" + }, "provenance": { "items": { "type": "string" @@ -71,6 +75,10 @@ }, "type": "array" }, + "topic": { + "minLength": 1, + "type": "string" + }, "type": { "const": "meeting" } @@ -79,6 +87,8 @@ "type", "date", "attendees", + "org", + "topic", "tags" ], "title": "meeting card", diff --git a/packages/extension/vault-schemas/cards/method.schema.json b/packages/extension/vault-schemas/cards/method.schema.json index e3f154526..142f3acd8 100644 --- a/packages/extension/vault-schemas/cards/method.schema.json +++ b/packages/extension/vault-schemas/cards/method.schema.json @@ -28,8 +28,10 @@ ], "properties": { "applicability": { - "minLength": 1, - "type": "string" + "items": { + "type": "string" + }, + "type": "array" }, "confidence": { "enum": [ @@ -63,9 +65,12 @@ "minLength": 1, "type": "string" }, - "source": { + "session_id": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] }, "subject": { "minLength": 1, @@ -85,7 +90,7 @@ "type", "name", "date", - "source", + "session_id", "applicability", "tags" ], diff --git a/packages/extension/vault-schemas/cards/org.schema.json b/packages/extension/vault-schemas/cards/org.schema.json index 70d5d2b50..3b08b309a 100644 --- a/packages/extension/vault-schemas/cards/org.schema.json +++ b/packages/extension/vault-schemas/cards/org.schema.json @@ -34,6 +34,10 @@ "high" ] }, + "domain": { + "minLength": 1, + "type": "string" + }, "name": { "minLength": 1, "type": "string" @@ -47,6 +51,13 @@ "provenance_unrecoverable": { "type": "boolean" }, + "relationship": { + "enum": [ + "partner", + "customer", + "academic" + ] + }, "review_by": { "format": "date", "type": "string" @@ -72,6 +83,8 @@ "required": [ "type", "name", + "domain", + "relationship", "tags" ], "title": "org card", diff --git a/packages/extension/vault-schemas/cards/paper.schema.json b/packages/extension/vault-schemas/cards/paper.schema.json index 7fc1a2443..2032ed2ff 100644 --- a/packages/extension/vault-schemas/cards/paper.schema.json +++ b/packages/extension/vault-schemas/cards/paper.schema.json @@ -44,7 +44,7 @@ "high" ] }, - "date": { + "date_read": { "format": "date", "type": "string" }, @@ -57,6 +57,13 @@ "provenance_unrecoverable": { "type": "boolean" }, + "relevance": { + "enum": [ + "high", + "medium", + "low" + ] + }, "review_by": { "format": "date", "type": "string" @@ -65,25 +72,46 @@ "minLength": 1, "type": "string" }, + "session_id": { + "minLength": 1, + "type": [ + "string", + "null" + ] + }, "subject": { "minLength": 1, "type": "string" }, + "systems": { + "items": { + "type": "string" + }, + "type": "array" + }, "tags": { "items": { "type": "string" }, "type": "array" }, + "title": { + "minLength": 1, + "type": "string" + }, "type": { "const": "paper" } }, "required": [ "type", - "date", "arxiv", + "title", "authors", + "date_read", + "session_id", + "relevance", + "systems", "tags" ], "title": "paper card", diff --git a/packages/extension/vault-schemas/cards/person.schema.json b/packages/extension/vault-schemas/cards/person.schema.json index 225371a49..726eaa8bf 100644 --- a/packages/extension/vault-schemas/cards/person.schema.json +++ b/packages/extension/vault-schemas/cards/person.schema.json @@ -34,6 +34,13 @@ "high" ] }, + "contact": { + "minLength": 1, + "type": [ + "string", + "null" + ] + }, "name": { "minLength": 1, "type": "string" diff --git a/packages/extension/vault-schemas/cards/plan.schema.json b/packages/extension/vault-schemas/cards/plan.schema.json index 8ba4e3af2..2575466a3 100644 --- a/packages/extension/vault-schemas/cards/plan.schema.json +++ b/packages/extension/vault-schemas/cards/plan.schema.json @@ -55,10 +55,27 @@ "minLength": 1, "type": "string" }, - "status": { + "session_id": { + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "spec": { "minLength": 1, "type": "string" }, + "status": { + "enum": [ + "draft", + "approved", + "executing", + "completed", + "abandoned", + "failed" + ] + }, "subject": { "minLength": 1, "type": "string" @@ -71,13 +88,23 @@ }, "type": { "const": "plan" + }, + "visibility": { + "enum": [ + "local", + "team", + "public" + ] } }, "required": [ "type", "date", + "session_id", "status", - "tags" + "spec", + "tags", + "visibility" ], "title": "plan card", "type": "object" diff --git a/packages/extension/vault-schemas/cards/retrospective.schema.json b/packages/extension/vault-schemas/cards/retrospective.schema.json index 1e6d41bde..670ab4621 100644 --- a/packages/extension/vault-schemas/cards/retrospective.schema.json +++ b/packages/extension/vault-schemas/cards/retrospective.schema.json @@ -38,6 +38,14 @@ "format": "date", "type": "string" }, + "outcome": { + "enum": [ + "success", + "partial", + "failed", + "abandoned" + ] + }, "provenance": { "items": { "type": "string" @@ -55,6 +63,13 @@ "minLength": 1, "type": "string" }, + "session_id": { + "minLength": 1, + "type": [ + "string", + "null" + ] + }, "subject": { "minLength": 1, "type": "string" @@ -72,6 +87,8 @@ "required": [ "type", "date", + "session_id", + "outcome", "tags" ], "title": "retrospective card", diff --git a/packages/extension/vault-schemas/cards/spec.schema.json b/packages/extension/vault-schemas/cards/spec.schema.json index 2d2ec336b..e2933a1e3 100644 --- a/packages/extension/vault-schemas/cards/spec.schema.json +++ b/packages/extension/vault-schemas/cards/spec.schema.json @@ -38,13 +38,26 @@ "format": "date", "type": "string" }, + "linked_plan": { + "minLength": 1, + "type": [ + "string", + "null" + ] + }, "platform": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] }, "priority": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] }, "provenance": { "items": { @@ -63,9 +76,21 @@ "minLength": 1, "type": "string" }, - "status": { + "session_id": { "minLength": 1, - "type": "string" + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "draft", + "approved", + "in-progress", + "completed", + "abandoned" + ] }, "subject": { "minLength": 1, @@ -79,15 +104,22 @@ }, "type": { "const": "spec" + }, + "visibility": { + "enum": [ + "local", + "team", + "public" + ] } }, "required": [ "type", "date", + "session_id", "status", - "priority", - "platform", - "tags" + "tags", + "visibility" ], "title": "spec card", "type": "object" diff --git a/packages/extension/vault-schemas/generate.mjs b/packages/extension/vault-schemas/generate.mjs index 8927e4f54..8d41298e2 100644 --- a/packages/extension/vault-schemas/generate.mjs +++ b/packages/extension/vault-schemas/generate.mjs @@ -49,66 +49,85 @@ const SENTINEL_RULE = { }, }; -// The 12 legacy (schema-check) types: properties + required per the -// amico-schema-check table, extension fields optional on all. +// The 12 legacy (schema-check) types — aligned to `amico-vault`'s YAML +// Frontmatter Schemas, the single owner since PR #1052 (skills-integrity +// F26: the old amico-schema-check table had drifted — insight's phantom +// required `source`, paper's wrong `date`, missing session_id/visibility +// floors, etc.). Required sets mirror the aligned amico-schema-check table +// field for field; amico-vault's closed vocabularies (task_type, statuses, +// relevance, outcome, failure_mode, device_class, relationship, visibility, +// experiment's ingest `source`) are enums; optional/nullable fields +// (experiment's source_path/warm_started_from, spec's priority/platform/ +// linked_plan, hypothesis's platform, person's contact) are declared but +// never required — their absence is not a schema violation. +// session_id is REQUIRED but nullable (uuid on agent notes, null on +// human-curated ones, present either way — amico-vault "Session ID"): +// `type: ["string", "null"]` is the honest JSON-Schema union; the shipped +// subset validator treats a type array as unchecked (under-validation, not +// mis-validation) while `required` still enforces presence. +const nullableStr = { type: ["string", "null"], minLength: 1 }; const LEGACY = { experiment: { properties: { - task_type: str, + task_type: { enum: ["experiment", "validation", "regression", "reproduction", "parameter-study"] }, date, - session_id: str, + session_id: nullableStr, + source: { enum: [null, "demo-ingest", "doc-ingest", "agent"] }, + source_path: nullableStr, platform: str, gate: str, fidelity: { type: "number", minimum: 0, maximum: 1 }, duration_us: { type: "number", minimum: 0 }, - status: str, + status: { enum: ["running", "completed", "failed", "stalled"] }, + failure_mode: { enum: [null, "stagnation", "divergence", "constraint_violation", "infeasible"] }, + warm_started_from: nullableStr, tags: stringArray, }, required: ["type", "task_type", "date", "session_id", "platform", "gate", "fidelity", "duration_us", "status", "tags"], }, insight: { - properties: { date, source: str, evidence: stringArray, tags: stringArray }, - required: ["type", "date", "source", "evidence", "confidence", "tags"], + properties: { date, session_id: nullableStr, evidence: stringArray, confidence: { enum: ["high", "medium", "low"] }, tags: stringArray }, + required: ["type", "date", "session_id", "evidence", "confidence", "tags"], }, hypothesis: { - properties: { date, source: str, status: str, evidence: stringArray, tags: stringArray }, - required: ["type", "date", "source", "status", "evidence", "tags"], + properties: { date, session_id: nullableStr, status: { enum: ["open", "untested", "confirmed", "refuted", "abandoned"] }, platform: nullableStr, evidence: stringArray, tags: stringArray }, + required: ["type", "date", "session_id", "status", "evidence", "tags"], }, method: { - properties: { name: str, date, source: str, applicability: str, tags: stringArray }, - required: ["type", "name", "date", "source", "applicability", "tags"], + properties: { name: str, date, session_id: nullableStr, applicability: stringArray, tags: stringArray }, + required: ["type", "name", "date", "session_id", "applicability", "tags"], }, paper: { - properties: { date, arxiv: str, authors: stringArray, tags: stringArray }, - required: ["type", "date", "arxiv", "authors", "tags"], + properties: { arxiv: str, title: str, authors: stringArray, date_read: date, session_id: nullableStr, relevance: { enum: ["high", "medium", "low"] }, systems: stringArray, tags: stringArray }, + required: ["type", "arxiv", "title", "authors", "date_read", "session_id", "relevance", "systems", "tags"], }, spec: { - properties: { date, status: str, priority: str, platform: str, tags: stringArray }, - required: ["type", "date", "status", "priority", "platform", "tags"], + properties: { date, session_id: nullableStr, status: { enum: ["draft", "approved", "in-progress", "completed", "abandoned"] }, priority: nullableStr, platform: nullableStr, linked_plan: nullableStr, tags: stringArray, visibility: { enum: ["local", "team", "public"] } }, + required: ["type", "date", "session_id", "status", "tags", "visibility"], }, plan: { - properties: { date, status: str, tags: stringArray }, - required: ["type", "date", "status", "tags"], + properties: { date, session_id: nullableStr, status: { enum: ["draft", "approved", "executing", "completed", "abandoned", "failed"] }, spec: str, tags: stringArray, visibility: { enum: ["local", "team", "public"] } }, + required: ["type", "date", "session_id", "status", "spec", "tags", "visibility"], }, retrospective: { - properties: { date, tags: stringArray }, - required: ["type", "date", "tags"], + properties: { date, session_id: nullableStr, outcome: { enum: ["success", "partial", "failed", "abandoned"] }, tags: stringArray }, + required: ["type", "date", "session_id", "outcome", "tags"], }, person: { - properties: { name: str, org: str, role: str, tags: stringArray }, + properties: { name: str, org: str, role: str, contact: nullableStr, tags: stringArray }, required: ["type", "name", "org", "role", "tags"], }, org: { - properties: { name: str, tags: stringArray }, - required: ["type", "name", "tags"], + properties: { name: str, domain: str, relationship: { enum: ["partner", "customer", "academic"] }, tags: stringArray }, + required: ["type", "name", "domain", "relationship", "tags"], }, device: { - properties: { name: str, status: str, platforms: stringArray, tags: stringArray }, - required: ["type", "name", "status", "platforms", "tags"], + properties: { name: str, status: { enum: ["online", "offline", "maintenance"] }, device_class: { enum: ["classical", "quantum"] }, platforms: stringArray, location: str, tags: stringArray }, + required: ["type", "name", "status", "device_class", "platforms", "location", "tags"], }, meeting: { - properties: { date, attendees: stringArray, tags: stringArray }, - required: ["type", "date", "attendees", "tags"], + properties: { date, attendees: stringArray, org: str, topic: str, tags: stringArray }, + required: ["type", "date", "attendees", "org", "topic", "tags"], }, };