diff --git a/.github/shard-manifest.json b/.github/shard-manifest.json index 75c8e58e..fb0f4f99 100644 --- a/.github/shard-manifest.json +++ b/.github/shard-manifest.json @@ -144,6 +144,7 @@ ], "rest-2": [ "tests/test_abilities.py", + "tests/test_agent_reporting.py", "tests/test_ai_actions.py", "tests/test_arch_caches.py", "tests/test_arch_cli_parity.py", diff --git a/.github/ui-revision.txt b/.github/ui-revision.txt new file mode 100644 index 00000000..138a0aab --- /dev/null +++ b/.github/ui-revision.txt @@ -0,0 +1 @@ +3c9a5f664c147790c490fae0a256e7764b4b9157 diff --git a/.github/workflows/release-pair.yml b/.github/workflows/release-pair.yml index dc12c6b0..568b83a8 100644 --- a/.github/workflows/release-pair.yml +++ b/.github/workflows/release-pair.yml @@ -42,6 +42,10 @@ on: permissions: contents: read +concurrency: + group: release-pair-${{ github.event.inputs.core_sha }}-${{ github.event.inputs.ui_sha }} + cancel-in-progress: true + run-name: "release pair core ${{ github.event.inputs.core_sha }} ui ${{ github.event.inputs.ui_sha }}" @@ -78,14 +82,14 @@ jobs: echo "ui_sha=$ui_sha" >> "$GITHUB_OUTPUT" - name: Check out Core at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository ref: ${{ steps.inputs.outputs.core_sha }} fetch-depth: 0 - name: Check out UI at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: Aram164/learningos-obsidian-ui path: obsidian-ui @@ -114,10 +118,10 @@ jobs: test -z "$(git -C obsidian-ui status --porcelain)" \ || { echo "UI checkout is not clean" >&2; exit 1; } - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 22 # The documented project environment is the repository venv: parser @@ -204,7 +208,7 @@ jobs: - name: Upload this shard's JUnit results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: junit-${{ matrix.shard }} path: junit-out/ @@ -220,7 +224,7 @@ jobs: # their per-test tmp dirs must never enter the population. - name: Upload this leg's witness population if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: population-${{ matrix.shard }} path: | @@ -269,12 +273,12 @@ jobs: echo "ui_sha=$ui_sha" >> "$GITHUB_OUTPUT" - name: Check out Core at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository ref: ${{ steps.inputs.outputs.core_sha }} fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - name: Install Core development dependencies @@ -302,7 +306,7 @@ jobs: echo "LOS_SCRUT_BIN=$bin" >> "$GITHUB_ENV" - name: Download the witness population - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: population-* path: population-in @@ -392,7 +396,11 @@ jobs: cases = [] for leg in sorted(parts): for log in sorted(parts[leg][2].glob("*.jsonl")): - shutil.copy(log, audit / log.name) + target = audit / log.name + assert not target.exists(), ( + f"audit log {log.name!r} from leg {leg!r} collides " + f"with an earlier leg's log of the same name") + shutil.copy(log, target) index = parts[leg][2] / "cases.txt" if index.is_file(): cases.extend(index.read_text(encoding="utf-8").split()) @@ -473,7 +481,7 @@ jobs: - name: Upload this shard's JUnit results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: junit-${{ matrix.shard }} path: junit-out/ @@ -505,14 +513,14 @@ jobs: echo "ui_sha=$ui_sha" >> "$GITHUB_OUTPUT" - name: Check out Core at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository ref: ${{ steps.inputs.outputs.core_sha }} fetch-depth: 0 - name: Check out UI at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: Aram164/learningos-obsidian-ui path: obsidian-ui @@ -540,14 +548,14 @@ jobs: fi test -z "$(git -C obsidian-ui status --porcelain)" \ || { echo "UI checkout is not clean" >&2; exit 1; } - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 22 # The UI check's contract:check-production step imports the real # learning_os package from the sibling Core checkout (PYTHON, .venv, # python3, python are probed, in that order) — the same project venv # the paired gate builds before its own npm run check. - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - name: Install Core development dependencies @@ -593,24 +601,37 @@ jobs: echo "ui_sha_short=${ui_sha:0:12}" >> "$GITHUB_OUTPUT" - name: Check out Core at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository ref: ${{ steps.inputs.outputs.core_sha }} fetch-depth: 0 - name: Check out UI at the exact SHA - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: Aram164/learningos-obsidian-ui path: obsidian-ui ref: ${{ steps.inputs.outputs.ui_sha }} fetch-depth: 0 - - uses: actions/setup-python@v5 + # This workflow certifies the pair Core declares, not an arbitrary + # combination: the dispatched UI SHA must equal Core's own pin. + - name: Require the dispatched UI SHA to equal Core's declared pin + working-directory: . + env: + UI_SHA_INPUT: ${{ steps.inputs.outputs.ui_sha }} + run: | + pinned="$(tr -d '[:space:]' < repository/.github/ui-revision.txt)" + if [ "$pinned" != "$UI_SHA_INPUT" ]; then + echo "ui_sha $UI_SHA_INPUT does not equal Core's .github/ui-revision.txt pin $pinned" >&2 + exit 1 + fi + + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 22 - name: Install Core development dependencies @@ -622,70 +643,22 @@ jobs: run: npm ci --ignore-scripts - name: Download every shard's JUnit results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: junit-* merge-multiple: true path: junit-in # The completeness proof, run on every trigger: collect the whole - # suite fresh, count elements across all shard results, - # and require set equality — no test lost, none duplicated, none - # invented. Then the static gates the local paired gate runs before - # pytest: lint, typecheck, validate, warning baseline. + # suite fresh, map every shard back to its canonical + # node ID, and require multiset equality — no test lost, none + # duplicated, none invented. Then the static gates the local + # paired gate runs before pytest: lint, typecheck, validate, + # warning baseline. - name: Prove the shards are exactly the suite, then run static gates run: | set -eu - .venv/bin/python - <<'PY' - import json - import subprocess - import sys - import xml.etree.ElementTree as ET - from pathlib import Path - - manifest = json.loads( - Path(".github/shard-manifest.json").read_text(encoding="utf-8")) - disk = sorted(f"tests/{p.name}" - for p in Path("tests").glob("test_*.py")) - from collections import Counter - covered = Counter(f for leg in manifest["legs"].values() - for f in leg) - for name, count in sorted(covered.items()): - expected = (manifest.get("node_shards", {}).get(name, {}) - .get("count", 1)) - assert count == expected, ( - f"{name} appears in {count} legs, expected {expected}") - assert sorted(covered) == disk, ( - f".github/shard-manifest.json does not partition tests/: " - f"missing={sorted(set(disk) - set(covered))} " - f"extra={sorted(set(covered) - set(disk))}") - - out = subprocess.run( - [".venv/bin/python", "-m", "pytest", "--collect-only", "-q", - "-m", "not live_install"], - capture_output=True, text=True, check=True) - tail = out.stdout.strip().splitlines()[-1] - # "8520/8521 tests collected (1 deselected) in 7.26s" - collected = int(tail.split()[0].split("/")[0]) - ran = 0 - skipped = 0 - for path in sorted(Path("../junit-in").glob("junit-*.xml")): - root = ET.parse(path).getroot() - for case in root.iter("testcase"): - ran += 1 - if case.find("skipped") is not None: - skipped += 1 - if (case.find("failure") is not None - or case.find("error") is not None): - sys.exit(f"{path.name}: failing testcase " - f"{case.get('classname')}::{case.get('name')}") - assert ran == collected, ( - f"shards ran {ran} tests; the full collection has {collected} " - "(deselecting live_install) — a test was lost, duplicated " - "or added") - print(f"gate: {ran} tests across shards == full collection " - f"({skipped} skipped, visible, never blocking)") - PY + .venv/bin/python tools/check_shard_completeness.py --junit-dir ../junit-in .venv/bin/python -m ruff check tools tests .venv/bin/python tools/code_reachability.py .venv/bin/python -m mypy @@ -715,6 +688,7 @@ jobs: --ui-sha "$UI_SHA" \ --workflow-run-id "$WORKFLOW_RUN_ID" \ --workflow-run-attempt "$WORKFLOW_RUN_ATTEMPT" \ + --system-check-passed \ --live-install-scope not-run-live-install-deselected \ --out ../release-pair-artifact/pair-receipt.json @@ -734,7 +708,7 @@ jobs: --artifact-dir ../release-pair-artifact - name: Upload learningos-pair-- - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: "learningos-pair-${{ steps.inputs.outputs.core_sha_short }}-${{ steps.inputs.outputs.ui_sha_short }}" path: release-pair-artifact diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index f8d6d243..6b207f68 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -28,7 +28,7 @@ name: validate on: push: - branches: ['**'] + branches: [main] pull_request: {} schedule: - cron: "0 6 * * 1" # Mondays 06:00 UTC ≈ 08:00 Berlin @@ -41,6 +41,11 @@ on: permissions: contents: read +# PR updates supersede older checks; scheduled audits retain their own lifetime. +concurrency: + group: validate-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: pytest-shards: @@ -59,7 +64,7 @@ jobs: working-directory: repository steps: - name: Check out Core - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository fetch-depth: 0 @@ -69,32 +74,34 @@ jobs: # the producer-owned manifest contract removed: Core can pass while # shipping a shape the UI cannot decode. # - # Prefer a same-named consumer branch when one exists, otherwise use - # main. This makes a two-repository change test the pair being - # reviewed without reintroducing a permanent branch pin. - - name: Resolve the matching consumer branch + # Core declares the exact consumer commit; branch movement cannot + # silently change the pair under review. Push that UI commit first. + - name: Read the exact UI revision declared by Core id: consumer-ref - env: - REQUESTED_REF: ${{ github.head_ref || github.ref_name }} + working-directory: repository run: | - if git ls-remote --exit-code --heads \ - https://github.com/Aram164/learningos-obsidian-ui.git \ - "refs/heads/$REQUESTED_REF" >/dev/null 2>&1; then - echo "ref=$REQUESTED_REF" >> "$GITHUB_OUTPUT" - else - echo "ref=main" >> "$GITHUB_OUTPUT" - fi + set -eu + ref="$(tr -d '\r\n' < .github/ui-revision.txt)" + printf '%s\n' "$ref" | grep -Eq '^[0-9a-f]{40}$' \ + || { echo "Core must declare one exact UI SHA" >&2; exit 1; } + echo "ref=$ref" >> "$GITHUB_OUTPUT" # The UI checkout also serves the paired tests inside the suite # (test_ui_gateway_recovery drives the real harness in # obsidian-ui/tests/; the contract-mirror tests read the sibling). - name: Check out the paired UI consumer - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: Aram164/learningos-obsidian-ui ref: ${{ steps.consumer-ref.outputs.ref }} path: obsidian-ui + - name: Verify the declared UI checkout + working-directory: obsidian-ui + env: + DECLARED_UI_SHA: ${{ steps.consumer-ref.outputs.ref }} + run: test "$(git rev-parse HEAD)" = "$DECLARED_UI_SHA" + - name: Print the resolved UI ref and commit working-directory: obsidian-ui env: @@ -102,11 +109,12 @@ jobs: run: | printf 'UI ref resolved: %s\n' "$RESOLVED_UI_REF" printf 'UI commit checked out: %s\n' "$(git rev-parse HEAD)" + test "$(git rev-parse HEAD)" = "$RESOLVED_UI_REF" - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 22 # The documented project environment is the repository venv: parser @@ -193,7 +201,7 @@ jobs: - name: Upload this shard's JUnit results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: junit-${{ matrix.shard }} path: junit-out/ @@ -209,7 +217,7 @@ jobs: # their per-test tmp dirs must never enter the population. - name: Upload this leg's witness population if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: population-${{ matrix.shard }} path: | @@ -242,11 +250,11 @@ jobs: working-directory: repository steps: - name: Check out Core - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - name: Install Core development dependencies @@ -274,7 +282,7 @@ jobs: echo "LOS_SCRUT_BIN=$bin" >> "$GITHUB_ENV" - name: Download the witness population - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: population-* path: population-in @@ -445,7 +453,7 @@ jobs: - name: Upload this shard's JUnit results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: junit-${{ matrix.shard }} path: junit-out/ @@ -461,36 +469,39 @@ jobs: contents: read steps: - name: Check out Core - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository fetch-depth: 0 - - name: Resolve the matching consumer branch + - name: Read the exact UI revision declared by Core id: consumer-ref - env: - REQUESTED_REF: ${{ github.head_ref || github.ref_name }} + working-directory: repository run: | - if git ls-remote --exit-code --heads \ - https://github.com/Aram164/learningos-obsidian-ui.git \ - "refs/heads/$REQUESTED_REF" >/dev/null 2>&1; then - echo "ref=$REQUESTED_REF" >> "$GITHUB_OUTPUT" - else - echo "ref=main" >> "$GITHUB_OUTPUT" - fi + set -eu + ref="$(tr -d '\r\n' < .github/ui-revision.txt)" + printf '%s\n' "$ref" | grep -Eq '^[0-9a-f]{40}$' \ + || { echo "Core must declare one exact UI SHA" >&2; exit 1; } + echo "ref=$ref" >> "$GITHUB_OUTPUT" - name: Check out the paired UI consumer - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: Aram164/learningos-obsidian-ui ref: ${{ steps.consumer-ref.outputs.ref }} path: obsidian-ui - - uses: actions/setup-node@v4 + + - name: Verify the declared UI checkout + working-directory: obsidian-ui + env: + DECLARED_UI_SHA: ${{ steps.consumer-ref.outputs.ref }} + run: test "$(git rev-parse HEAD)" = "$DECLARED_UI_SHA" + - uses: actions/setup-node@v7 with: node-version: 22 # The UI check's contract:check-production step imports the real # learning_os package from the sibling Core checkout (PYTHON, .venv, # python3, python are probed, in that order) — the same project venv # the paired gate builds before its own npm run check. - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - name: Install Core development dependencies @@ -518,11 +529,11 @@ jobs: working-directory: repository steps: - name: Check out Core - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: repository fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.14.4" - name: Install Core development dependencies @@ -531,7 +542,7 @@ jobs: .venv/bin/python -m pip install -e ".[dev]" - name: Download every shard's JUnit results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: junit-* merge-multiple: true @@ -545,56 +556,7 @@ jobs: - name: Prove the shards are exactly the suite, then run static gates run: | set -eu - .venv/bin/python - <<'PY' - import json - import subprocess - import sys - import xml.etree.ElementTree as ET - from pathlib import Path - - manifest = json.loads( - Path(".github/shard-manifest.json").read_text(encoding="utf-8")) - disk = sorted(f"tests/{p.name}" - for p in Path("tests").glob("test_*.py")) - from collections import Counter - covered = Counter(f for leg in manifest["legs"].values() - for f in leg) - for name, count in sorted(covered.items()): - expected = (manifest.get("node_shards", {}).get(name, {}) - .get("count", 1)) - assert count == expected, ( - f"{name} appears in {count} legs, expected {expected}") - assert sorted(covered) == disk, ( - f".github/shard-manifest.json does not partition tests/: " - f"missing={sorted(set(disk) - set(covered))} " - f"extra={sorted(set(covered) - set(disk))}") - - out = subprocess.run( - [".venv/bin/python", "-m", "pytest", "--collect-only", "-q", - "-m", "not live_install"], - capture_output=True, text=True, check=True) - tail = out.stdout.strip().splitlines()[-1] - # "8520/8521 tests collected (1 deselected) in 7.26s" - collected = int(tail.split()[0].split("/")[0]) - ran = 0 - skipped = 0 - for path in sorted(Path("../junit-in").glob("junit-*.xml")): - root = ET.parse(path).getroot() - for case in root.iter("testcase"): - ran += 1 - if case.find("skipped") is not None: - skipped += 1 - if (case.find("failure") is not None - or case.find("error") is not None): - sys.exit(f"{path.name}: failing testcase " - f"{case.get('classname')}::{case.get('name')}") - assert ran == collected, ( - f"shards ran {ran} tests; the full collection has {collected} " - "(deselecting live_install) — a test was lost, duplicated " - "or added") - print(f"gate: {ran} tests across shards == full collection " - f"({skipped} skipped, visible, never blocking)") - PY + .venv/bin/python tools/check_shard_completeness.py --junit-dir ../junit-in .venv/bin/python -m ruff check tools tests .venv/bin/python tools/code_reachability.py .venv/bin/python -m mypy diff --git a/Makefile b/Makefile index 32177651..77df973b 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ help: @echo "make test-affected [BASE=main] - run the groups touched by this branch" @echo "make test-paired - run the Core/UI boundary tests (the pre-push gate's UI-only path)" @echo "make test-parallel - run the suite in parallel for fast feedback (WORKERS=4 workers max, zz population files stay serial; never the gate)" - @echo "make bench - run the read-only benchmark scripts (never a gate, no thresholds)" + @echo "make bench - compare a disposable workload with retained measurements (no thresholds)" @echo "make test - run the complete test suite, including full-repository checks" @echo "make lint - run the defect-oriented static checks used by CI" @echo "make code-check - verify Core reachability, dependency cycles, and entrypoint direction" @@ -131,11 +131,10 @@ test-paired: test-parallel: $(PY) -m pytest -q -n $(WORKERS) --dist loadscope -m "not live_install" --ignore=tests/test_scenarios_zz_refusal_sites.py --ignore=tests/test_scenarios_zz_operational_owners.py -# Discoverability only: the read-only benchmark scripts are noisy by nature, -# so they are runnable but never a gate and never part of check/CI. +# Synthetic fixture setup is outside timed samples. Performance comparisons +# are informational: this target is never a gate or part of check/CI. bench: - $(PY) tests/benchmark_runtime.py - $(PY) tests/benchmark_agent_reads.py + $(PY) tests/benchmark_runtime.py --baseline tests/architecture/runtime-benchmark-baseline.json lint: $(PY) -m ruff check tools tests diff --git a/pyproject.toml b/pyproject.toml index 4f7bc623..c8e8e329 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,7 +75,8 @@ files = [ "tools/learning_os/app/projection_readiness.py", "tools/learning_os/app/agent_reporting.py", "tools/learning_os/app/agent_plans.py", - "tools/learning_os/adapters/agent_workers.py", + "tools/learning_os/adapters/agent_runner.py", + "tools/learning_os/app/agent_presentation.py", ] # Linting (engineering review 2026-08-18, item 12; added 2026-08-21). diff --git a/system/OPERATOR-POLICY.md b/system/OPERATOR-POLICY.md index ece94f0f..ddf7d520 100644 --- a/system/OPERATOR-POLICY.md +++ b/system/OPERATOR-POLICY.md @@ -228,3 +228,36 @@ propose the honest three-way call for each — **promote, keep gestating, or prune**. Deleting a garden note needs no heavyweight approval (it was never canonical), but always name which notes you are removing. The tiebreaker is unchanged: reduce organizational burden rather than create it. + +--- + +## 15. Human review before protected merges + +Aram's decision on 2026-10-27: "Add human-review policy now; leave PRs for me." +This is an agent operating rule. It does not claim that GitHub can distinguish a +human from an agent using the same approval-capable account credential. + +A PR changing any of these paths requires Aram's explicit review before merge: + +- `AGENTS.md`; +- `tests/architecture/surface-approvals.yaml`; +- `system/OPERATOR.md` or this policy; +- `system/contracts/**`; +- `tools/hooks/**`. + +Present the proposed change and verification for its exact head commit. A broad +implementation request, a green check, or an agent's own review is not that +approval. A subsequent substantive change requires renewed review. Agents must +not manufacture approval, approve their own gate, or change review controls to +clear a merge. Record actual human approval without rewriting its wording or +claiming an earlier approval that was not established. + +Roles still come from the current task, as `AGENTS.md` requires. An implementation +assignment permits preparing and updating reviewable PRs, including authorized +overnight work; it does not create a standing merge role. Overnight PR updates +follow the same review boundary. The 2026-10-27 improvement campaign leaves +its PRs for Aram to merge. + +Independent GitHub enforcement would require a separate agent identity and +appropriately limited credentials. That provisioning was not selected here; +do not present the operating rule as an independently enforced GitHub setting. diff --git a/system/OPERATOR.md b/system/OPERATOR.md index 71b8ed50..aebea78f 100644 --- a/system/OPERATOR.md +++ b/system/OPERATOR.md @@ -94,8 +94,8 @@ same thing; `capabilities governance-question --json` answers what binds that task. `capabilities --compact --json` names every command the gateway has, with the task each one starts. -For multi-step agent work (several dependent reads/writes), use the -declared runner `tools/agent_run.py PLAN --root ROOT` (see +For multi-step agent work (several dependent reads/writes), agents may use the +experimental runner `tools/agent_run.py PLAN --root ROOT` (see [agent plans](procedures/agent-plans.md)); a single focused read remains a direct `los` call below. diff --git a/system/contracts/agent-plan-input.schema.json b/system/contracts/agent-plan-input.schema.json index 51868285..bdefd99e 100644 --- a/system/contracts/agent-plan-input.schema.json +++ b/system/contracts/agent-plan-input.schema.json @@ -1 +1,247 @@ -{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"schema_version":{"enum":[1,2]},"session_id":{"type":"string","maxLength":128},"on_error":{"enum":["stop","continue"]},"read_workers":{"type":"integer","minimum":1,"maximum":4},"deadline_s":{"type":"number","exclusiveMinimum":0},"report_max_bytes":{"type":"integer","minimum":1024},"steps":{"type":"array","minItems":1,"maxItems":256}},"required":["steps"],"additionalProperties":false} +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "steps" + ], + "additionalProperties": false, + "properties": { + "schema_version": { + "type": "integer", + "const": 2, + "default": 2 + }, + "session_id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^\\S(?:[\\s\\S]*\\S)?$" + }, + "on_error": { + "enum": [ + "stop", + "continue" + ] + }, + "read_workers": { + "type": "integer", + "minimum": 1, + "maximum": 4, + "description": "Legacy compatibility field; all accepted values execute serially with one worker." + }, + "deadline_s": { + "type": "number", + "exclusiveMinimum": 0 + }, + "report_max_bytes": { + "type": "integer", + "minimum": 1024 + }, + "steps": { + "type": "array", + "minItems": 1, + "maxItems": 256, + "items": { + "type": "object", + "required": [ + "id" + ], + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "minLength": 1, + "maxLength": 64 + }, + "depends_on": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "kind": { + "const": "log" + }, + "use": { + "type": "string", + "minLength": 1 + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "argv": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "writes": { + "type": "array", + "items": { + "type": "string" + } + }, + "ready_timeout_s": { + "type": "number", + "minimum": 0 + }, + "summary": { + "type": "object", + "additionalProperties": false, + "properties": { + "fields": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?!_missing_fields(?:\\.|$))[^.]+(?:\\.[^.]+)*$" + } + }, + "max_items": { + "type": "integer", + "minimum": 1 + }, + "max_bytes": { + "type": "integer", + "minimum": 64 + } + } + }, + "key": { + "type": "string", + "pattern": "\\S" + }, + "text": { + "type": "string", + "pattern": "\\S" + }, + "stage_id": { + "type": "string", + "minLength": 1 + }, + "unit_id": { + "type": "string", + "minLength": 1 + }, + "describe": { + "type": "boolean" + }, + "write": { + "type": "boolean" + }, + "preflight": { + "type": "boolean" + }, + "clusters": { + "type": "boolean" + } + }, + "allOf": [ + { + "if": { + "required": [ + "kind" + ], + "properties": { + "kind": { + "const": "log" + } + } + }, + "then": { + "required": [ + "text", + "key" + ], + "not": { + "anyOf": [ + { + "required": [ + "use" + ] + }, + { + "required": [ + "argv" + ] + }, + { + "required": [ + "args" + ] + } + ] + } + }, + "else": { + "oneOf": [ + { + "required": [ + "argv" + ], + "not": { + "anyOf": [ + { + "required": [ + "use" + ] + }, + { + "required": [ + "args" + ] + } + ] + } + }, + { + "required": [ + "use" + ], + "not": { + "required": [ + "argv" + ] + } + } + ] + } + }, + { + "if": { + "required": [ + "describe" + ], + "properties": { + "describe": { + "const": true + } + } + }, + "then": { + "required": [ + "use" + ] + } + }, + { + "if": { + "required": [ + "stage_id" + ] + }, + "then": { + "required": [ + "unit_id" + ] + } + } + ] + } + } + } +} diff --git a/system/contracts/contract-register.yaml b/system/contracts/contract-register.yaml index 154118ca..0af3078d 100644 --- a/system/contracts/contract-register.yaml +++ b/system/contracts/contract-register.yaml @@ -195,9 +195,9 @@ contracts: - declaration: system/contracts/review-consolidation.yaml governs: >- - The finding/caller adoption register for the systemwide review - consolidation: every finding names an owner, affected callers, - regression tests and a disposition. Metadata only, not learner state. + The historical finding/caller adoption record for the review merged in + PR #59. Its schema and evidence references remain checked for integrity; + it grants no current operational or installation authority. enforced_by: test checker: tests.test_review_consolidation test: tests/test_review_consolidation.py diff --git a/system/contracts/data-contract.yaml b/system/contracts/data-contract.yaml index 60547049..b5d7bf7d 100644 --- a/system/contracts/data-contract.yaml +++ b/system/contracts/data-contract.yaml @@ -19,8 +19,8 @@ # 4. freeze the new shape as tests/fixtures/formats/v/ # # Rebuild with: python tools/schema_contract.py --bump -contract_version: 61 -schema_fingerprint: sha256:9caec3ee7c1dccd7450fd8f19ce1c4216a0edbdd2d7fab836193bc26b64393da +contract_version: 62 +schema_fingerprint: sha256:24099ce4a7fd3c0eb8d53c715ab90ba4e8f2b368b3b43985dd0a35fe6a9f3485 record_schemas: 36 history: - version: 1 @@ -446,3 +446,9 @@ history: unchanged, requiring no migration. migration: null fixture: tests/fixtures/formats/v46/ +- version: 62 + adopted: '2026-10-27' + note: Explicit types on existing array/object refinement constraints for strict + consumers; existing record shapes remain valid + migration: null + fixture: tests/fixtures/formats/v62/ diff --git a/system/contracts/manifest-contract.yaml b/system/contracts/manifest-contract.yaml index f2c5b3d9..acfc9737 100644 --- a/system/contracts/manifest-contract.yaml +++ b/system/contracts/manifest-contract.yaml @@ -46,7 +46,7 @@ # Keys that were once published and must never come back under this name. # `exam_spine` was a strict subset of `academic_deadlines` — a second shape for # the same facts (ADR-006, 2026-08-03). -contract_version: 15 +contract_version: 16 top_level_keys: - _generated - academic_deadlines @@ -103,8 +103,8 @@ index_keys: - unit_to_study_map - workspace_to_modules - workspace_to_units -schema_path: system/contracts/manifest-v15.schema.json -schema_sha256: sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f +schema_path: system/contracts/manifest-v16.schema.json +schema_sha256: sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55 forbidden_top_level_keys: - exam_spine history: @@ -195,7 +195,12 @@ history: mirrored_in_ui: contracts/manifest-v14.lock.json - version: 15 adopted: '2026-09-23' - note: 'projected sources carry bounded discovery provenance (or null) and - examination: evaluated, the count of current approved assessment routes, - and metadata_placed (two-pass intake Library badge and agent source read)' + note: 'projected sources carry bounded discovery provenance (or null) and examination: + evaluated, the count of current approved assessment routes, and metadata_placed + (two-pass intake Library badge and agent source read)' mirrored_in_ui: contracts/manifest-v15.lock.json +- version: 16 + adopted: '2026-10-27' + note: Explicit object types for strict consumer compilation; projection keys and + data shapes unchanged + mirrored_in_ui: contracts/manifest-v16.lock.json diff --git a/system/contracts/manifest-v16.schema.json b/system/contracts/manifest-v16.schema.json new file mode 100644 index 00000000..31adc0b0 --- /dev/null +++ b/system/contracts/manifest-v16.schema.json @@ -0,0 +1,3743 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://learningos.local/contracts/manifest-v16.schema.json", + "title": "LearningOS atomic manifest v16", + "type": "object", + "additionalProperties": false, + "required": [ + "_generated", + "academic_deadlines", + "ai_actions", + "artifact_revisions", + "backlinks", + "counts", + "garden_entries", + "indexes", + "module_concept_edges", + "module_source_maps", + "modules", + "programs", + "progress", + "project_aliases", + "project_relationships", + "projects", + "records", + "relations", + "resume_pointer", + "review_items", + "semesters", + "stages", + "study_maps", + "thematic_groups", + "topic_packs", + "topics", + "units", + "unit_material_syntheses" + ], + "properties": { + "_generated": { + "$ref": "#/$defs/generated" + }, + "academic_deadlines": { + "type": "array", + "items": { + "$ref": "#/$defs/academicDeadline" + } + }, + "ai_actions": { + "$ref": "#/$defs/aiActions" + }, + "artifact_revisions": { + "$ref": "#/$defs/integerMap" + }, + "backlinks": { + "$ref": "#/$defs/backlinks" + }, + "counts": { + "$ref": "#/$defs/counts" + }, + "garden_entries": { + "type": "array", + "items": { + "$ref": "#/$defs/gardenEntry" + } + }, + "indexes": { + "$ref": "#/$defs/indexes" + }, + "module_concept_edges": { + "description": "The Module x Concept crossing. One row per (module, concept) pair for which at least one EXPLICIT authored tag exists - a stage's `concepts` tag or a knowledge-map node's reviewed `concept_ids`. Never inferred from titles, prose, notes, sources, or similarity; absence means not mapped, never that no relationship exists. Ordered by (module_id, concept_id).", + "type": "array", + "items": { + "$ref": "#/$defs/moduleConceptEdge" + } + }, + "module_source_maps": { + "type": "array", + "items": { + "$ref": "#/$defs/moduleSourceMap" + } + }, + "modules": { + "type": "array", + "items": { + "$ref": "#/$defs/moduleRecord" + } + }, + "programs": { + "type": "array", + "items": { + "$ref": "#/$defs/programRecord" + } + }, + "progress": { + "$ref": "#/$defs/progress" + }, + "project_aliases": { + "$ref": "#/$defs/stringMap" + }, + "project_relationships": { + "type": "array", + "items": { + "$ref": "#/$defs/projectRelationship" + } + }, + "projects": { + "type": "array", + "items": { + "$ref": "#/$defs/projectRecord" + } + }, + "records": { + "type": "array", + "items": { + "$ref": "#/$defs/projectedRecord" + } + }, + "relations": { + "type": "array", + "items": { + "$ref": "#/$defs/relation" + } + }, + "resume_pointer": { + "$ref": "#/$defs/resumePointer" + }, + "review_items": { + "type": "array", + "items": { + "$ref": "#/$defs/reviewItem" + } + }, + "semesters": { + "type": "array", + "items": { + "$ref": "#/$defs/semester" + } + }, + "stages": { + "type": "array", + "items": { + "$ref": "#/$defs/flatStage" + } + }, + "study_maps": { + "type": "array", + "items": { + "$ref": "#/$defs/studyMap" + } + }, + "thematic_groups": { + "type": "array", + "items": { + "$ref": "#/$defs/thematicGroup" + } + }, + "topic_packs": { + "type": "array", + "items": { + "$ref": "#/$defs/collectionRecord" + } + }, + "topics": { + "type": "array", + "items": { + "$ref": "#/$defs/topic" + } + }, + "units": { + "type": "array", + "items": { + "$ref": "#/$defs/projectedUnit" + } + }, + "unit_material_syntheses": { + "type": "array", + "items": { + "$ref": "#/$defs/unitMaterialSynthesisProjection" + } + } + }, + "$defs": { + "jsonValue": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "array", + "items": { + "$ref": "#/$defs/jsonValue" + } + }, + { + "$ref": "#/$defs/jsonObject" + } + ] + }, + "jsonObject": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "$ref": "#/$defs/jsonValue" + } + }, + "routeId": { + "type": "string", + "pattern": "^route-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "projectedRecord": { + "oneOf": [ + { + "$ref": "#/$defs/noteRecord" + }, + { + "$ref": "#/$defs/conceptRecord" + }, + { + "$ref": "#/$defs/sourceRecord" + }, + { + "$ref": "#/$defs/projectRecord" + }, + { + "$ref": "#/$defs/projectRelationship" + }, + { + "$ref": "#/$defs/compatibilityAlias" + }, + { + "$ref": "#/$defs/moduleRecord" + }, + { + "$ref": "#/$defs/collectionRecord" + }, + { + "$ref": "#/$defs/workspaceRecord" + }, + { + "$ref": "#/$defs/learningPathRecord" + }, + { + "$ref": "#/$defs/programRecord" + }, + { + "$ref": "#/$defs/projectedUnit" + }, + { + "$ref": "#/$defs/studyMap" + }, + { + "$ref": "#/$defs/moduleSourceMap" + }, + { + "$ref": "#/$defs/unitMaterialSynthesisProjection" + }, + { + "$ref": "#/$defs/coordinationRecord" + } + ] + }, + "unitMaterialSynthesisProjection": { + "allOf": [ + { + "$ref": "https://learningos.local/schema/unit-material-synthesis.schema.json#/$defs/canonicalRecord" + }, + { + "type": "object", + "required": [ + "freshness", + "completeness" + ], + "properties": { + "freshness": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "reasons" + ], + "properties": { + "status": { + "enum": [ + "current", + "stale" + ] + }, + "reasons": { + "type": "array", + "uniqueItems": true, + "items": { + "enum": [ + "source_map_revision", + "source_map_checksum", + "route_set_checksum", + "material_checksums", + "policy", + "current-basis-unavailable", + "analysis-refs-stale" + ] + } + } + } + }, + "completeness": { + "type": "object", + "additionalProperties": false, + "required": [ + "complete", + "current_route_count", + "assessed_route_count", + "deep_reviewed_count", + "screened_count", + "unevaluated_count", + "unavailable_count", + "missing_route_ids", + "orphaned_route_ids", + "duplicate_route_ids" + ], + "properties": { + "complete": { + "type": "boolean" + }, + "current_route_count": { + "type": "integer", + "minimum": 0 + }, + "assessed_route_count": { + "type": "integer", + "minimum": 0 + }, + "deep_reviewed_count": { + "type": "integer", + "minimum": 0 + }, + "screened_count": { + "type": "integer", + "minimum": 0 + }, + "unevaluated_count": { + "type": "integer", + "minimum": 0 + }, + "unavailable_count": { + "type": "integer", + "minimum": 0 + }, + "missing_route_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/$defs/routeId" + } + }, + "orphaned_route_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/$defs/routeId" + } + }, + "duplicate_route_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/$defs/routeId" + } + } + } + } + } + } + ], + "unevaluatedProperties": false, + "type": "object" + }, + "moduleRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "title", + "revision", + "path", + "kind", + "area_id", + "thematic_group_ids", + "status", + "administrative_status", + "operational_state", + "is_actionable", + "institution", + "code", + "credits", + "semester", + "components", + "examination", + "attempts", + "grade", + "unit_order", + "source_map" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "module" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "kind": { + "enum": [ + "academic", + "skill", + "project", + "foundation" + ] + }, + "area_id": { + "type": [ + "string", + "null" + ], + "pattern": "^program-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "thematic_group_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^thematic-group-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "status": { + "enum": [ + "planned", + "enrolled", + "active", + "paused", + "awaiting-grade", + "completed", + "dropped", + "archived" + ] + }, + "administrative_status": { + "type": [ + "string", + "null" + ], + "enum": [ + "planned", + "enrolled", + "awaiting-grade", + "completed", + "dropped", + "archived", + null + ] + }, + "operational_state": { + "enum": [ + "none", + "complete", + "active", + "paused" + ] + }, + "is_actionable": { + "type": "boolean" + }, + "institution": { + "type": [ + "string", + "null" + ] + }, + "code": { + "type": [ + "string", + "null" + ] + }, + "credits": { + "type": [ + "number", + "null" + ], + "minimum": 0 + }, + "semester": { + "type": [ + "string", + "null" + ], + "pattern": "^(sose|wise)-[0-9]{4}$" + }, + "components": { + "$ref": "https://learningos.local/schema/module.schema.json#/properties/components" + }, + "examination": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "https://learningos.local/schema/module.schema.json#/properties/examination" + } + ] + }, + "attempts": { + "$ref": "https://learningos.local/schema/module.schema.json#/properties/attempts" + }, + "grade": { + "type": [ + "number", + "null" + ], + "minimum": 1, + "maximum": 5 + }, + "unit_order": { + "$ref": "https://learningos.local/schema/module.schema.json#/properties/unit_order" + }, + "source_map": { + "oneOf": [ + { + "const": "source-map.yaml" + }, + { + "type": "null" + } + ] + } + } + }, + "programRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "title", + "kind", + "status", + "default", + "semester_bound", + "revision", + "path" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^program-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "program" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "kind": { + "enum": [ + "academic", + "skills", + "projects" + ] + }, + "status": { + "enum": [ + "active", + "metadata-only", + "archived" + ] + }, + "default": { + "type": "boolean" + }, + "semester_bound": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "boundary_action": { + "type": "string" + }, + "semesters": { + "type": "array", + "items": { + "$ref": "#/$defs/programSemester" + } + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string", + "minLength": 1 + } + } + }, + "programSemester": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "status", + "order" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^semester-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "status": { + "enum": [ + "current", + "previous", + "future", + "archived" + ] + }, + "order": { + "type": "integer", + "minimum": 0 + } + } + }, + "projectRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "id", + "type", + "title", + "project_type", + "status", + "root_uri", + "objective", + "milestone_ids", + "linked_module_ids", + "unit_ids", + "workspace_ids", + "thematic_group_ids", + "boundaries", + "revision", + "path", + "relationship_ids" + ], + "properties": { + "schema_version": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/schema_version" + }, + "id": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/id" + }, + "type": { + "const": "project" + }, + "title": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/title" + }, + "project_type": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/project_type" + }, + "status": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/status" + }, + "root_uri": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/root_uri" + }, + "objective": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/objective" + }, + "milestone_ids": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/milestone_ids" + }, + "linked_module_ids": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/linked_module_ids" + }, + "unit_ids": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/unit_ids" + }, + "workspace_ids": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/workspace_ids" + }, + "thematic_group_ids": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/thematic_group_ids" + }, + "boundaries": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/boundaries" + }, + "structure": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/structure" + }, + "files": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/files" + }, + "decisions": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/decisions" + }, + "migrated_from": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/migrated_from" + }, + "migrated_at": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/migrated_at" + }, + "migration": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/migration" + }, + "source_sha256": { + "$ref": "https://learningos.local/schema/project.schema.json#/properties/source_sha256" + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "relationship_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^relationship-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + } + }, + "projectRelationship": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "from_project_id", + "to_id", + "to_type", + "relation_type", + "reason", + "contribution", + "path" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^relationship-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "project-relationship" + }, + "from_project_id": { + "type": "string", + "pattern": "^project-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "to_type": { + "enum": [ + "module", + "source", + "topic-pack", + "note", + "file" + ] + }, + "relation_type": { + "enum": [ + "uses", + "informs", + "depends-on", + "produces", + "related" + ] + }, + "reason": { + "type": "string", + "minLength": 1 + }, + "contribution": { + "type": "string", + "minLength": 1 + }, + "path": { + "type": "string", + "minLength": 1 + } + } + }, + "compatibilityAlias": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "target_id", + "target_type", + "path" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "type": { + "const": "compatibility-alias" + }, + "target_id": { + "type": "string", + "pattern": "^project-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "target_type": { + "const": "project" + }, + "path": { + "const": "projects/aliases.yaml" + } + } + }, + "noteRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "title", + "path", + "domain", + "summary", + "role", + "state", + "authorship", + "concepts", + "sources", + "contexts", + "attachments", + "evidence", + "supersedes", + "reviewed", + "transcription", + "semantic_review", + "atlas_question", + "material_analysis" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^note-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "note" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "domain": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "role": { + "enum": [ + "synthesis", + "reference", + "derivation", + "exercise-bank", + "mock-exam", + "implementation", + "question", + "crosswalk" + ] + }, + "state": { + "type": [ + "string", + "null" + ], + "enum": [ + "rough", + "evolving", + "mature", + "deprecated", + null + ] + }, + "authorship": { + "type": [ + "string", + "null" + ], + "enum": [ + "user", + "mixed", + "external", + "operator-drafted", + null + ] + }, + "concepts": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "sources": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "contexts": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^workspace-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "attachments": { + "type": "array", + "items": { + "type": "string" + } + }, + "evidence": { + "$ref": "https://learningos.local/schema/note.schema.json#/properties/evidence" + }, + "supersedes": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^note-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "reviewed": { + "type": [ + "string", + "null" + ], + "format": "date" + }, + "transcription": { + "type": [ + "string", + "null" + ], + "enum": [ + "none", + "manual", + "ai-assisted", + null + ] + }, + "semantic_review": { + "type": [ + "string", + "null" + ], + "enum": [ + "unreviewed", + "user-reviewed", + null + ] + }, + "atlas_question": { + "type": [ + "object", + "null" + ], + "required": [ + "state", + "target" + ], + "additionalProperties": false, + "properties": { + "state": { + "enum": [ + "open", + "resolved" + ] + }, + "answer_notes": { + "type": "array", + "items": { + "type": "string", + "pattern": "^note-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "uniqueItems": true + }, + "target": { + "oneOf": [ + { + "type": "object", + "required": [ + "concepts" + ], + "additionalProperties": false, + "properties": { + "concepts": { + "type": "array", + "items": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "minItems": 1, + "maxItems": 2, + "uniqueItems": true + } + } + }, + { + "type": "object", + "required": [ + "from", + "type", + "to" + ], + "additionalProperties": false, + "properties": { + "from": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "enum": [ + "requires", + "builds-on", + "derives", + "generalizes", + "contrasts-with", + "equivalent-to", + "applies-in", + "motivates" + ] + }, + "to": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + } + ] + } + } + }, + "material_analysis": { + "type": [ + "object", + "null" + ], + "required": [ + "resolution", + "material", + "recorded_source_digest", + "inspected_range", + "frozen_input_sha256", + "frozen_input_bytes" + ], + "additionalProperties": false, + "properties": { + "resolution": { + "enum": [ + "resolved", + "unresolved", + "unavailable", + "stale" + ] + }, + "material": { + "type": "string", + "minLength": 1 + }, + "source_id": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "recorded_source_digest": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "live_source_digest": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "inspected_range": { + "type": "object", + "required": [ + "start", + "end" + ], + "additionalProperties": false, + "properties": { + "start": { + "type": "integer", + "minimum": 1 + }, + "end": { + "type": "integer", + "minimum": 1 + } + } + }, + "anchors": { + "type": "array", + "items": { + "type": "object", + "required": [ + "topic", + "purpose", + "locator" + ], + "additionalProperties": false, + "properties": { + "topic": { + "type": "string", + "minLength": 1 + }, + "purpose": { + "type": "string", + "minLength": 1 + }, + "locator": { + "type": "string", + "minLength": 1 + }, + "note": { + "type": "string" + } + } + } + }, + "frozen_input_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "frozen_input_bytes": { + "type": "integer", + "minimum": 1 + }, + "model": { + "type": "string" + }, + "built": { + "type": "string", + "format": "date" + } + }, + "allOf": [ + { + "if": { + "properties": { + "resolution": { + "const": "resolved" + } + } + }, + "then": { + "required": [ + "source_id" + ] + }, + "else": { + "not": { + "required": [ + "source_id" + ] + } + } + } + ] + } + } + }, + "conceptRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "title", + "path", + "aliases", + "deprecated" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "concept" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "aliases": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "deprecated": { + "type": "boolean" + } + } + }, + "sourceRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "title", + "revision", + "path", + "source_type", + "thematic_group_ids", + "topics", + "url", + "material", + "material_path", + "material_exists", + "authors", + "organization", + "year", + "identifiers", + "roles", + "evaluations", + "discovery", + "examination" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "source" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "source_type": { + "enum": [ + "book", + "paper", + "lecture", + "course", + "video", + "website", + "documentation", + "software", + "conversation", + "other" + ] + }, + "thematic_group_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^thematic-group-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "topics": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^topic-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "url": { + "type": [ + "string", + "null" + ], + "format": "uri" + }, + "material": { + "type": [ + "string", + "null" + ], + "pattern": "^material://.+" + }, + "material_path": { + "type": [ + "string", + "null" + ] + }, + "material_exists": { + "type": "boolean" + }, + "authors": { + "type": "array", + "items": { + "type": "string" + } + }, + "organization": { + "type": [ + "string", + "null" + ] + }, + "year": { + "type": [ + "integer", + "null" + ], + "minimum": 1800, + "maximum": 2100 + }, + "identifiers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "roles": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "evaluations": { + "type": "array", + "items": { + "$ref": "#/$defs/sourceEvaluation" + } + }, + "discovery": { + "anyOf": [ + { + "$ref": "https://learningos.local/schema/sources.schema.json#/properties/sources/items/properties/discovery" + }, + { + "type": "null" + } + ] + }, + "examination": { + "$ref": "#/$defs/sourceExamination" + } + } + }, + "sourceExamination": { + "type": "object", + "additionalProperties": false, + "required": [ + "evaluated", + "approved_analysis_count", + "metadata_placed" + ], + "properties": { + "evaluated": { + "type": "boolean" + }, + "approved_analysis_count": { + "type": "integer", + "minimum": 0 + }, + "metadata_placed": { + "type": "boolean" + } + } + }, + "sourceEvaluation": { + "type": "object", + "additionalProperties": false, + "required": [ + "roles", + "level", + "audience", + "prerequisites", + "strengths", + "weaknesses", + "reviewed", + "concepts", + "useful_sections" + ], + "properties": { + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "level": { + "type": [ + "string", + "null" + ], + "enum": [ + "introductory", + "intermediate", + "advanced", + "reference", + null + ] + }, + "audience": { + "type": "array", + "items": { + "type": "string" + } + }, + "prerequisites": { + "type": "array", + "items": { + "type": "string" + } + }, + "strengths": { + "type": "array", + "items": { + "type": "string" + } + }, + "weaknesses": { + "type": "array", + "items": { + "type": "string" + } + }, + "reviewed": { + "type": [ + "string", + "null" + ], + "format": "date" + }, + "concepts": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "useful_sections": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "section", + "note" + ], + "properties": { + "section": { + "type": "string" + }, + "note": { + "type": "string" + } + } + } + } + } + }, + "collectionRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "revision", + "collection_kind", + "title", + "path", + "thematic_group_ids", + "purpose", + "sources", + "summary", + "domain", + "entries" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "type": { + "enum": [ + "collection", + "topic-pack" + ] + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "collection_kind": { + "enum": [ + "catalogue", + "topic-pack" + ] + }, + "title": { + "type": "string", + "minLength": 1 + }, + "path": { + "type": "string", + "pattern": "^sources/collections/.+\\.yaml$" + }, + "thematic_group_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^thematic-group-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "purpose": { + "type": [ + "string", + "null" + ] + }, + "sources": { + "type": "array", + "items": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "summary": { + "type": "string" + }, + "domain": { + "type": "string", + "minLength": 1 + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "source", + "group", + "why" + ], + "properties": { + "source": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "group": { + "type": [ + "string", + "null" + ] + }, + "why": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + }, + "workspaceRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "title", + "revision", + "path", + "status", + "standing", + "archived", + "deadline", + "objective", + "next_action", + "concepts", + "notes", + "sources", + "program_ids", + "module_ids", + "unit_ids", + "project_id" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^workspace-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "workspace" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "status": { + "enum": [ + "active", + "blocked", + "complete" + ] + }, + "standing": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "deadline": { + "type": [ + "string", + "null" + ], + "format": "date" + }, + "objective": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "concepts": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "notes": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^note-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "sources": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "program_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^program-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "module_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "unit_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^unit-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "project_id": { + "type": [ + "string", + "null" + ], + "pattern": "^project-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + }, + "learningPathRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "revision", + "title", + "path", + "workspace_id", + "area", + "module_id", + "status", + "current_stage", + "created", + "updated", + "objective", + "source_plan", + "stages", + "shelving", + "archived" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^path-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "learning-path" + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "path": { + "type": "string", + "minLength": 1 + }, + "workspace_id": { + "type": "string", + "pattern": "^workspace-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "area": { + "enum": [ + "university", + "personal" + ] + }, + "module_id": { + "type": [ + "string", + "null" + ], + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "status": { + "enum": [ + "active", + "paused", + "ready-to-shelve", + "complete" + ] + }, + "current_stage": { + "type": "string", + "pattern": "^stage-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "created": { + "type": "string", + "format": "date" + }, + "updated": { + "type": [ + "string", + "null" + ], + "format": "date" + }, + "objective": { + "type": "string" + }, + "source_plan": { + "type": [ + "string", + "null" + ] + }, + "stages": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/projectedPathStage" + } + }, + "shelving": { + "$ref": "https://learningos.local/schema/learning-path.schema.json#/properties/shelving" + }, + "archived": { + "type": "boolean" + } + } + }, + "projectedPathStage": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "status", + "objective", + "done_when", + "resources", + "notes_text", + "notes_updated" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^stage-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "status": { + "enum": [ + "pending", + "active", + "complete", + "skipped" + ] + }, + "objective": { + "type": "string", + "minLength": 1 + }, + "done_when": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + }, + "estimate_minutes": { + "type": "integer", + "minimum": 1 + }, + "exam_critical": { + "type": "boolean" + }, + "concepts": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "resources": { + "type": "array", + "items": { + "$ref": "#/$defs/resource" + } + }, + "notes_path": { + "type": "string" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/$defs/stageAttachment" + } + }, + "completed": { + "type": "string", + "format": "date" + }, + "notes_text": { + "type": "string" + }, + "notes_updated": { + "type": [ + "string", + "null" + ] + } + } + }, + "coordinationRecord": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "path", + "sections" + ], + "properties": { + "id": { + "const": "coordination" + }, + "type": { + "const": "coordination" + }, + "path": { + "const": "work/COORDINATION.md" + }, + "sections": { + "type": "object", + "additionalProperties": false, + "required": [ + "Commitments", + "Priorities", + "Dependencies", + "Deferrals" + ], + "properties": { + "Commitments": { + "type": "string" + }, + "Priorities": { + "type": "string" + }, + "Dependencies": { + "type": "string" + }, + "Deferrals": { + "type": "string" + } + } + } + } + }, + "stringMap": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "integerMap": { + "type": "object", + "additionalProperties": { + "type": "integer", + "minimum": 0 + } + }, + "stringArrayMap": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "generated": { + "type": "object", + "additionalProperties": false, + "required": [ + "contract_version", + "generated_at", + "generator", + "schema_sha256", + "snapshot_id", + "source_dirty", + "source_fingerprint", + "source_revision", + "warning" + ], + "properties": { + "contract_version": { + "const": 16 + }, + "generated_at": { + "type": "string" + }, + "generator": { + "type": "string", + "minLength": 1 + }, + "schema_sha256": { + "type": "string", + "pattern": "^sha256:[0-9a-f]{64}$" + }, + "snapshot_id": { + "type": "string", + "pattern": "^sha256:[0-9a-f]{64}$" + }, + "source_dirty": { + "type": "boolean" + }, + "source_fingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "source_revision": { + "type": [ + "string", + "null" + ] + }, + "warning": { + "type": "string" + } + } + }, + "academicDeadline": { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "label", + "start_date", + "end_date" + ], + "properties": { + "kind": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "minLength": 1 + }, + "module_id": { + "type": "string" + }, + "modules": { + "type": "array", + "items": { + "$ref": "#/$defs/deadlineModule" + } + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "registration_state": { + "type": "string" + }, + "start_date": { + "type": "string", + "format": "date" + }, + "end_date": { + "type": "string", + "format": "date" + }, + "termin": { + "type": "integer", + "minimum": 1 + }, + "time": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + } + } + }, + "deadlineModule": { + "type": "object", + "additionalProperties": false, + "required": [ + "module_id", + "title", + "action", + "termins" + ], + "properties": { + "module_id": { + "type": "string", + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "action": { + "type": [ + "string", + "null" + ] + }, + "termins": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "integer", + "minimum": 1, + "maximum": 3 + } + } + } + }, + "aiActions": { + "type": "object", + "additionalProperties": false, + "required": [ + "available", + "contract_version", + "provider_adapters", + "requests" + ], + "properties": { + "available": { + "type": "array", + "items": { + "$ref": "#/$defs/aiAction" + } + }, + "contract_version": { + "const": 1 + }, + "provider_adapters": { + "type": "array", + "items": { + "$ref": "#/$defs/aiProviderAdapter" + } + }, + "requests": { + "type": "array", + "items": { + "$ref": "#/$defs/aiRequest" + } + } + } + }, + "aiAction": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "description", + "target_kinds", + "interaction_mode", + "status", + "supported_providers" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "target_kinds": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + }, + "interaction_mode": { + "type": "string", + "minLength": 1 + }, + "status": { + "enum": [ + "planned", + "implemented" + ] + }, + "supported_providers": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + } + } + }, + "aiProviderAdapter": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "adapter", + "available", + "supported_modes", + "supports_direct_delivery" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "adapter": { + "type": "string", + "minLength": 1 + }, + "available": { + "type": "boolean" + }, + "supported_modes": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + }, + "supports_direct_delivery": { + "type": "boolean" + } + } + }, + "aiRequest": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "action_id", + "target", + "provider", + "status", + "created_at", + "delivery_id", + "receipt_id", + "bundle_path" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^ai-request-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "action_id": { + "type": "string", + "pattern": "^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$" + }, + "target": { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "id" + ], + "properties": { + "kind": { + "type": "string", + "minLength": 1 + }, + "id": { + "type": "string", + "minLength": 1 + } + } + }, + "provider": { + "type": "string", + "minLength": 1 + }, + "status": { + "enum": [ + "prepared", + "delivery-ready", + "completed" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "delivery_id": { + "type": [ + "string", + "null" + ] + }, + "receipt_id": { + "type": [ + "string", + "null" + ] + }, + "bundle_path": { + "type": "string", + "pattern": "^operations/ai-actions/requests/[^/]+$" + } + } + }, + "backlinks": { + "type": "object", + "additionalProperties": false, + "properties": { + "concept_relations": { + "$ref": "#/$defs/jsonObject" + }, + "concept_to_notes": { + "$ref": "#/$defs/stringArrayMap" + }, + "module_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "module_to_workspaces": { + "$ref": "#/$defs/stringArrayMap" + }, + "note_incoming": { + "$ref": "#/$defs/stringArrayMap" + }, + "source_to_notes": { + "$ref": "#/$defs/stringArrayMap" + }, + "source_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "unit_to_workspaces": { + "$ref": "#/$defs/stringArrayMap" + }, + "workspace_to_notes": { + "$ref": "#/$defs/stringArrayMap" + } + } + }, + "counts": { + "type": "object", + "additionalProperties": false, + "required": [ + "ai_action_requests", + "collections", + "concepts", + "garden_entries", + "inbox_items", + "learning_paths", + "learning_paths_active", + "modules", + "notes", + "notes_reviewed", + "notes_with_evidence", + "programs", + "projects", + "relations", + "source_feedback_records", + "sources", + "sources_with_topics", + "stages", + "stages_complete", + "study_maps", + "thematic_groups", + "topic_packs", + "topics", + "units", + "units_needing_map", + "workspaces_active", + "workspaces_archived" + ], + "properties": { + "ai_action_requests": { + "type": "integer", + "minimum": 0 + }, + "collections": { + "type": "integer", + "minimum": 0 + }, + "concepts": { + "type": "integer", + "minimum": 0 + }, + "garden_entries": { + "type": "integer", + "minimum": 0 + }, + "inbox_items": { + "type": "integer", + "minimum": 0 + }, + "learning_paths": { + "type": "integer", + "minimum": 0 + }, + "learning_paths_active": { + "type": "integer", + "minimum": 0 + }, + "modules": { + "type": "integer", + "minimum": 0 + }, + "notes": { + "type": "integer", + "minimum": 0 + }, + "notes_reviewed": { + "type": "integer", + "minimum": 0 + }, + "notes_with_evidence": { + "type": "integer", + "minimum": 0 + }, + "programs": { + "type": "integer", + "minimum": 0 + }, + "projects": { + "type": "integer", + "minimum": 0 + }, + "relations": { + "type": "integer", + "minimum": 0 + }, + "source_feedback_records": { + "type": "integer", + "minimum": 0 + }, + "sources": { + "type": "integer", + "minimum": 0 + }, + "sources_with_topics": { + "type": "integer", + "minimum": 0 + }, + "stages": { + "type": "integer", + "minimum": 0 + }, + "stages_complete": { + "type": "integer", + "minimum": 0 + }, + "study_maps": { + "type": "integer", + "minimum": 0 + }, + "thematic_groups": { + "type": "integer", + "minimum": 0 + }, + "topic_packs": { + "type": "integer", + "minimum": 0 + }, + "topics": { + "type": "integer", + "minimum": 0 + }, + "units": { + "type": "integer", + "minimum": 0 + }, + "units_needing_map": { + "type": "integer", + "minimum": 0 + }, + "workspaces_active": { + "type": "integer", + "minimum": 0 + }, + "workspaces_archived": { + "type": "integer", + "minimum": 0 + } + } + }, + "gardenEntry": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "last_ai_request_id", + "path", + "revision", + "state", + "tags", + "title", + "transcription_path", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "last_ai_request_id": { + "type": [ + "string", + "null" + ] + }, + "path": { + "type": "string" + }, + "revision": { + "type": "string" + }, + "state": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "type": "string" + }, + "transcription_path": { + "type": [ + "string", + "null" + ] + }, + "type": { + "const": "garden-note" + } + } + }, + "indexes": { + "type": "object", + "additionalProperties": false, + "required": [ + "component_to_units", + "concept_to_modules", + "concept_to_units", + "module_to_concepts", + "module_to_units", + "project_aliases", + "project_to_relationships", + "project_to_units", + "project_to_workspaces", + "source_to_modules", + "source_to_units", + "unit_to_concepts", + "unit_to_material_synthesis", + "unit_to_study_map", + "workspace_to_modules", + "workspace_to_units" + ], + "properties": { + "component_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "concept_to_modules": { + "$ref": "#/$defs/stringArrayMap" + }, + "concept_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "module_to_concepts": { + "$ref": "#/$defs/stringArrayMap" + }, + "module_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "project_aliases": { + "$ref": "#/$defs/stringMap" + }, + "project_to_relationships": { + "$ref": "#/$defs/stringArrayMap" + }, + "project_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "project_to_workspaces": { + "$ref": "#/$defs/stringArrayMap" + }, + "source_to_modules": { + "$ref": "#/$defs/stringArrayMap" + }, + "source_to_units": { + "$ref": "#/$defs/stringArrayMap" + }, + "unit_to_concepts": { + "$ref": "#/$defs/stringArrayMap" + }, + "unit_to_material_synthesis": { + "type": "object", + "additionalProperties": { + "type": "string", + "pattern": "^material-synthesis-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "unit_to_study_map": { + "$ref": "#/$defs/stringMap" + }, + "workspace_to_modules": { + "$ref": "#/$defs/stringArrayMap" + }, + "workspace_to_units": { + "$ref": "#/$defs/stringArrayMap" + } + } + }, + "projectedRoute": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "unit_id", + "source_id", + "title", + "format", + "angle", + "covers", + "depth", + "scope" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^route-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "unit_id": { + "type": "string", + "pattern": "^unit-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "source_id": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "format": { + "type": "string", + "minLength": 1 + }, + "angle": { + "type": "string", + "minLength": 1 + }, + "angle_detail": { + "type": "string", + "minLength": 1 + }, + "covers": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^knowledge-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + }, + "depth": { + "type": "string", + "minLength": 1 + }, + "scope": { + "type": "string", + "minLength": 1 + }, + "locator": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + }, + "vault_path": { + "type": "string" + }, + "material_uri": { + "type": "string" + }, + "material_path": { + "type": "string" + }, + "material_exists": { + "type": "boolean" + }, + "requires_assets": { + "description": "Files the activity itself needs before it can be done — a dataset it analyses, a code template it fills in. Distinct from the material being reachable: `_resource_available` answers 'can he open the worksheet', and this answers 'can he do what the worksheet asks'. Blatt 4 Aufgabe 3(b) needs International_Education_Costs.csv and aufgabe3.py from Moodle, neither registered here, and the session still reported the route ready (audit workbench/audits/synthetic-learner-2026-09-12, F06). An entry with no `material_uri` is by definition unregistered; the session keeps the route and names the parts that cannot be attempted, rather than dropping the runnable work or inventing a substitute dataset.", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "material_uri": { + "type": "string", + "pattern": "^material://" + }, + "needed_for": { + "description": "Which part of the activity, in the sheet's own numbering.", + "type": "string", + "minLength": 1 + }, + "obtain_from": { + "description": "Where the exact file comes from. Never a substitute.", + "type": "string", + "minLength": 1 + } + } + } + }, + "exposes_solutions_for": { + "description": "Route ids whose activities this material answers — a verifiable claim about content, that opening this hands over the worked solutions to those tasks, never a judgment of quality. The session compiler refuses to put such a route in the same proposal as an evidence step it answers: explaining with the answer key and then asking for unaided transfer on that same task measures nothing (audit workbench/audits/synthetic-learner-2026-09-12, F03).", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^route-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + } + }, + "moduleConceptEdge": { + "type": "object", + "additionalProperties": false, + "required": [ + "module_id", + "concept_id", + "evidence" + ], + "properties": { + "module_id": { + "type": "string", + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "concept_id": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "evidence": { + "description": "Why this cell is filled. At least one item: an edge with no evidence is an inferred edge, and this projection does not publish those.", + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { + "$ref": "#/$defs/stageConceptEvidence" + }, + { + "$ref": "#/$defs/knowledgeNodeEvidence" + } + ] + } + } + } + }, + "stageConceptEvidence": { + "description": "A stage's explicit `concepts` tag. Retains unit, study-map and stage identity, so a filled cell drills into the exact stage.", + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "unit_id", + "study_map_id", + "stage_id" + ], + "properties": { + "kind": { + "const": "stage-concept" + }, + "unit_id": { + "type": "string", + "pattern": "^unit-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "study_map_id": { + "type": "string", + "pattern": "^study-map-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "stage_id": { + "type": "string", + "pattern": "^stage-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + }, + "knowledgeNodeEvidence": { + "description": "A knowledge-map node's reviewed `concept_ids`. Retains unit and node identity.", + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "unit_id", + "node_id" + ], + "properties": { + "kind": { + "const": "knowledge-node" + }, + "unit_id": { + "type": "string", + "pattern": "^unit-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "node_id": { + "type": "string", + "pattern": "^knowledge-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + }, + "moduleSourceMap": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "module_id", + "sources", + "revision", + "path" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^source-map-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "module-source-map" + }, + "module_id": { + "type": "string", + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string" + }, + "sources": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "source_id", + "role", + "why", + "priority", + "unit_routes" + ], + "properties": { + "source_id": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "role": { + "type": "string", + "minLength": 1 + }, + "why": { + "type": "string", + "minLength": 1 + }, + "when": { + "type": "string" + }, + "priority": { + "type": "integer", + "minimum": 0 + }, + "unit_routes": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string", + "pattern": "^unit-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + { + "$ref": "#/$defs/projectedRoute" + } + ] + } + } + } + } + } + } + }, + "knowledgeNode": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "summary" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^knowledge-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "builds_on": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "concept_ids": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^concept-[a-z0-9]+(?:-[a-z0-9]+)*$" + } + } + } + }, + "projectedUnit": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "module_id", + "kind", + "title", + "order", + "scope", + "status", + "artifacts", + "workspace_ids", + "source_selections", + "scope_sources", + "revision", + "path", + "project_ids", + "needs_study_map", + "notes_text", + "note_sections", + "notes_updated" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^unit-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "type": { + "const": "unit" + }, + "module_id": { + "type": "string", + "pattern": "^module-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "component_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "title": { + "type": "string" + }, + "order": { + "type": "integer", + "minimum": 0 + }, + "scope": { + "type": "string" + }, + "status": { + "type": "string" + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string" + }, + "needs_study_map": { + "type": "boolean" + }, + "notes_text": { + "type": "string" + }, + "notes_updated": { + "type": [ + "string", + "null" + ] + }, + "project_ids": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "knowledge_map": { + "type": "object", + "additionalProperties": false, + "required": [ + "summary", + "nodes" + ], + "properties": { + "summary": { + "type": "string" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/$defs/knowledgeNode" + } + } + } + }, + "scope_sources": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "source_id", + "authority" + ], + "properties": { + "source_id": { + "type": "string" + }, + "authority": { + "type": "string" + }, + "locator": { + "type": "string" + } + } + } + }, + "source_selections": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "source_id", + "locator", + "purpose" + ], + "properties": { + "route_id": { + "type": "string", + "pattern": "^route-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "source_id": { + "type": "string" + }, + "locator": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "stage_ids": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + } + } + }, + "current_study_map": { + "type": "string" + }, + "working_note": { + "type": "string" + }, + "artifacts": { + "$ref": "https://learningos.local/schema/unit.schema.json#/properties/artifacts" + }, + "parent_unit_id": { + "type": "string" + }, + "child_unit_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "related_module_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "workspace_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "note_sections": { + "type": "array", + "items": { + "$ref": "#/$defs/unitNoteSection" + } + } + } + }, + "unitNoteSection": { + "type": "object", + "additionalProperties": false, + "required": [ + "recorded_at", + "title", + "stage_ids", + "attachments", + "text", + "summary" + ], + "properties": { + "recorded_at": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string", + "minLength": 1 + }, + "stage_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/$defs/stageAttachment" + } + }, + "text": { + "type": "string" + }, + "summary": { + "type": "string" + } + } + }, + "stageAttachment": { + "type": "object", + "additionalProperties": false, + "required": [ + "path", + "label" + ], + "properties": { + "path": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "minLength": 1 + } + } + }, + "sourceFeedback": { + "type": "object", + "additionalProperties": false, + "required": [ + "source_id", + "feedback", + "recorded" + ], + "properties": { + "source_id": { + "type": "string", + "pattern": "^source-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "resource_id": { + "type": "string", + "pattern": "^resource-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "feedback": { + "enum": [ + "helpful", + "too-advanced", + "wrong-perspective", + "useful-for-derivation", + "useful-for-review", + "skipped" + ] + }, + "note": { + "type": "string" + }, + "recorded": { + "type": "string", + "format": "date" + } + } + }, + "resource": { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "label" + ], + "properties": { + "id": { + "type": "string" + }, + "route_id": { + "type": "string", + "pattern": "^route-[a-z0-9]+(?:-[a-z0-9]+)*$" + }, + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "source_id": { + "type": "string" + }, + "locator": { + "type": "string" + }, + "angle": { + "type": "string" + }, + "angle_detail": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + }, + "vault_path": { + "type": "string" + }, + "scope_triage": { + "type": "string" + }, + "material_uri": { + "type": "string" + }, + "material_path": { + "type": "string" + }, + "material_exists": { + "type": "boolean" + } + } + }, + "projectedStage": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "status", + "objective", + "done_when", + "resources", + "working_note", + "attachments", + "source_feedback", + "scope_triage", + "notes_text", + "notes_updated" + ], + "properties": { + "id": { + "type": "string" + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string" + }, + "status": { + "type": "string" + }, + "objective": { + "type": "string" + }, + "done_when": { + "type": "array", + "items": { + "type": "string" + } + }, + "estimate_minutes": { + "type": "integer", + "minimum": 1 + }, + "exam_critical": { + "type": "boolean" + }, + "concepts": { + "type": "array", + "items": { + "type": "string" + } + }, + "scope_triage": { + "type": "string" + }, + "resources": { + "type": "array", + "items": { + "$ref": "#/$defs/resource" + } + }, + "working_note": { + "type": "string" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/$defs/stageAttachment" + } + }, + "source_feedback": { + "type": "array", + "items": { + "$ref": "#/$defs/sourceFeedback" + } + }, + "detour_id": { + "type": "string" + }, + "completed": { + "type": "string" + }, + "study_map_id": { + "type": "string" + }, + "unit_id": { + "type": "string" + }, + "module_id": { + "type": "string" + }, + "notes_text": { + "type": "string" + }, + "notes_updated": { + "type": [ + "string", + "null" + ] + } + } + }, + "flatStage": { + "allOf": [ + { + "$ref": "#/$defs/projectedStage" + }, + { + "required": [ + "study_map_id", + "unit_id", + "module_id" + ], + "type": "object" + } + ] + }, + "studyMap": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "type", + "unit_id", + "module_id", + "status", + "current_stage", + "source_plan", + "stages", + "shelving", + "revision", + "path" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "const": "study-map" + }, + "plan_template_version": { + "type": "integer", + "minimum": 1 + }, + "unit_id": { + "type": "string" + }, + "module_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "current_stage": { + "type": "string" + }, + "source_plan": { + "$ref": "https://learningos.local/schema/study-map.schema.json#/properties/source_plan" + }, + "detours": { + "$ref": "https://learningos.local/schema/study-map.schema.json#/properties/detours" + }, + "shelving": { + "$ref": "https://learningos.local/schema/study-map.schema.json#/properties/shelving" + }, + "stages": { + "type": "array", + "items": { + "$ref": "#/$defs/projectedStage" + } + }, + "revision": { + "type": "integer", + "minimum": 0 + }, + "path": { + "type": "string" + } + } + }, + "progress": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "stages_complete", + "stages_total", + "units_complete", + "units_needing_map", + "units_total" + ], + "properties": { + "stages_complete": { + "type": "integer", + "minimum": 0 + }, + "stages_total": { + "type": "integer", + "minimum": 0 + }, + "units_complete": { + "type": "integer", + "minimum": 0 + }, + "units_needing_map": { + "type": "integer", + "minimum": 0 + }, + "units_total": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "relation": { + "type": "object", + "additionalProperties": false, + "required": [ + "from", + "type", + "to", + "context", + "source" + ], + "properties": { + "from": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "to": { + "type": [ + "string", + "null" + ] + }, + "context": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + } + } + }, + "resumePointer": { + "oneOf": [ + { + "type": "object", + "maxProperties": 0 + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "module_id", + "unit_id", + "study_map_id", + "stage_id", + "updated" + ], + "properties": { + "type": { + "const": "resume-pointer" + }, + "module_id": { + "type": "string" + }, + "unit_id": { + "type": "string" + }, + "study_map_id": { + "type": "string" + }, + "stage_id": { + "type": "string" + }, + "updated": { + "type": "string" + } + } + } + ] + }, + "reviewItem": { + "type": "object", + "additionalProperties": false, + "required": [ + "category", + "context", + "id", + "reason", + "target", + "title" + ], + "properties": { + "category": { + "type": "string" + }, + "context": { + "type": "string" + }, + "id": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "target": { + "$ref": "#/$defs/jsonObject" + }, + "title": { + "type": "string" + } + } + }, + "semester": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "order", + "program_id", + "status", + "title" + ], + "properties": { + "id": { + "type": "string" + }, + "order": { + "type": "integer" + }, + "program_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, + "thematicGroup": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "description", + "order" + ], + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "order": { + "type": "integer" + } + } + }, + "topic": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "domain" + ], + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "domain": { + "type": "string" + } + } + } + } +} diff --git a/system/contracts/normative-corpus.yaml b/system/contracts/normative-corpus.yaml index 8b968cbd..59c0694b 100644 --- a/system/contracts/normative-corpus.yaml +++ b/system/contracts/normative-corpus.yaml @@ -205,12 +205,12 @@ documents: audience: developer applies_to: [] class: reference - status: current - authority: informative + status: frozen + authority: historical owner: system-map summary: >- - Informative owner/caller adoption table for the review consolidation - register; the binding contracts remain OPERATOR.md and component pages. + Historical owner/caller adoption record for the consolidation merged in + PR #59; it grants no current behavior, installation or process authority. - path: system/developer/C4.md audience: developer diff --git a/system/contracts/release-pair-receipt.schema.json b/system/contracts/release-pair-receipt.schema.json index 297a5d8b..46fb1580 100644 --- a/system/contracts/release-pair-receipt.schema.json +++ b/system/contracts/release-pair-receipt.schema.json @@ -39,7 +39,7 @@ "build-info.json": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"} } }, - "system_check_passed": {"const": true}, + "system_check_passed": {"type": "boolean"}, "stress_scope": { "enum": ["not-run-materials-unprovisioned", "full"], "description": "The workflow checkout provisions neither repository's external materials tree, so `make stress` cannot run in CI; the mandatory stress gate stays local. A receipt states this explicitly rather than implying stress ran." diff --git a/system/contracts/review-consolidation.schema.json b/system/contracts/review-consolidation.schema.json index eda82a7a..66e71d33 100644 --- a/system/contracts/review-consolidation.schema.json +++ b/system/contracts/review-consolidation.schema.json @@ -1 +1,114 @@ -{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","required":["schema_version","findings"],"properties":{"schema_version":{"const":1},"findings":{"type":"array","minItems":42,"items":{"type":"object","required":["id","source","root_cause","owner","affected_callers","existing_repair","regression_tests","disposition","measured_evidence","source_status","hosted_ci_status","installed_status"],"properties":{"disposition":{"enum":["already-inherited","implemented","implemented-opt-in","rejected-as-unsafe"]}}}}},"additionalProperties":false} +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Historical review-consolidation record", + "type": "object", + "required": [ + "schema_version", + "recorded_revision", + "findings" + ], + "additionalProperties": false, + "properties": { + "schema_version": { + "const": 2 + }, + "recorded_revision": { + "const": "d3d3b3510349f84cee2d7aca1b8601330409539d" + }, + "findings": { + "type": "array", + "minItems": 42, + "maxItems": 42, + "items": { + "type": "object", + "required": [ + "id", + "source", + "root_cause", + "owner", + "affected_callers", + "existing_repair", + "regression_tests", + "disposition", + "measured_evidence", + "source_status", + "owner_path", + "caller_paths" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^[A-Z][0-9]{2}$" + }, + "source": { + "type": "string", + "minLength": 1 + }, + "root_cause": { + "type": "string", + "minLength": 1 + }, + "owner": { + "type": "string", + "minLength": 1 + }, + "affected_callers": { + "type": "string", + "minLength": 1 + }, + "existing_repair": { + "type": "string", + "minLength": 1 + }, + "regression_tests": { + "type": "string", + "minLength": 1 + }, + "disposition": { + "enum": [ + "already-inherited", + "implemented", + "implemented-opt-in", + "rejected-as-unsafe" + ] + }, + "measured_evidence": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + }, + "source_status": { + "enum": [ + "inherited-regression-covered", + "implemented", + "implemented-opt-in", + "rejected-as-unsafe" + ] + }, + "owner_path": { + "type": "string", + "minLength": 1 + }, + "caller_paths": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + } + } + } +} diff --git a/system/contracts/review-consolidation.yaml b/system/contracts/review-consolidation.yaml index 4cb34c5b..c5ae2f0c 100644 --- a/system/contracts/review-consolidation.yaml +++ b/system/contracts/review-consolidation.yaml @@ -1,4 +1,5 @@ -schema_version: 1 +schema_version: 2 +recorded_revision: d3d3b3510349f84cee2d7aca1b8601330409539d findings: - id: G30 source: '#30' @@ -8,10 +9,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_material_slices.py disposition: already-inherited - measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/store/materials/slices.py caller_paths: - tools/learning_os/app/pipeline.py @@ -26,10 +26,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_claim_status_audits.py disposition: already-inherited - measured_evidence: tests/test_claim_status_audits.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/derive/semantics/claim_audits.py caller_paths: - tools/learning_os/app/pipeline.py @@ -44,10 +43,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_claim_status_audits.py disposition: already-inherited - measured_evidence: tests/test_claim_status_audits.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/claim_admission.py caller_paths: - tools/learning_os/app/pipeline.py @@ -60,10 +58,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_material_slices.py disposition: already-inherited - measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/store/materials/slices.py caller_paths: - tools/learning_os/app/pipeline.py @@ -78,10 +75,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_material_slices.py disposition: already-inherited - measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/store/materials/resolution.py caller_paths: - tools/learning_os/app/pipeline.py @@ -96,10 +92,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_material_slices.py disposition: already-inherited - measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/store/materials/slices.py caller_paths: - tools/learning_os/app/pipeline.py @@ -114,10 +109,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_goal_lifecycle_properties.py disposition: already-inherited - measured_evidence: tests/test_goal_lifecycle_properties.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/goals.py caller_paths: - tools/learning_os/app/pipeline.py @@ -132,10 +126,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_ai_actions.py disposition: already-inherited - measured_evidence: tests/test_ai_actions.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/ai.py caller_paths: - tools/learning_os/app/pipeline.py @@ -148,10 +141,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_c1e_backup_symlinked_subtree.py disposition: already-inherited - measured_evidence: tests/test_c1e_backup_symlinked_subtree.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/backup_manifest.py caller_paths: - tools/learning_os/app/pipeline.py @@ -164,10 +156,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_phaseB_prospective_lineage.py disposition: already-inherited - measured_evidence: tests/test_phaseB_prospective_lineage.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/plan.py caller_paths: - tools/learning_os/app/pipeline.py @@ -180,10 +171,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_plan_rigor.py disposition: already-inherited - measured_evidence: tests/test_plan_rigor.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/derive/validation/plan_rigor.py caller_paths: - tools/learning_os/app/pipeline.py @@ -196,10 +186,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_note_evidence.py disposition: already-inherited - measured_evidence: tests/test_note_evidence.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/notes.py caller_paths: - tools/learning_os/app/pipeline.py @@ -212,10 +201,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_transaction_faults.py disposition: already-inherited - measured_evidence: tests/test_transaction_faults.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/store/transactions.py caller_paths: - tools/learning_os/app/pipeline.py @@ -228,10 +216,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_curriculum_v2.py disposition: already-inherited - measured_evidence: tests/test_curriculum_v2.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/maps.py caller_paths: - tools/learning_os/app/pipeline.py @@ -244,10 +231,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_plan_rigor.py disposition: already-inherited - measured_evidence: tests/test_plan_rigor.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/derive/validation/plan_rigor.py caller_paths: - tools/learning_os/app/pipeline.py @@ -260,10 +246,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_intelligence_scan.py disposition: already-inherited - measured_evidence: tests/test_intelligence_scan.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/ranking.py caller_paths: - tools/learning_os/app/pipeline.py @@ -278,10 +263,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_material_slices.py disposition: already-inherited - measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/store/materials/slices.py caller_paths: - tools/learning_os/app/pipeline.py @@ -296,10 +280,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_goal_select.py disposition: already-inherited - measured_evidence: tests/test_goal_select.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/ranking.py caller_paths: - tools/learning_os/app/pipeline.py @@ -314,10 +297,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_procedures.py disposition: already-inherited - measured_evidence: tests/test_procedures.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: inherited-regression-covered - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/reads.py caller_paths: - tools/learning_os/app/pipeline.py @@ -332,17 +314,17 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/agent_run.py caller_paths: - tools/agent_run.py - tools/learning_os/app/agent_plans.py - id: R51 - note: projection.observe is approved under the authorized D07 plan and registered in the generated CLI; agent - dependencies and UI recovery call the shared authority service with distinct policies + note: The recorded implementation exposed projection.observe. Current approval authority + is surface-approvals.yaml; this historical row does not establish the earlier + approval. source: '#51' root_cause: dependency readiness weak owner: projection readiness service @@ -350,10 +332,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_projection_readiness.py disposition: implemented - measured_evidence: tests/test_projection_readiness.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/projection_readiness.py caller_paths: - tools/agent_run.py @@ -369,10 +350,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/validation_service.py caller_paths: - tools/agent_run.py @@ -386,10 +366,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/agent_run.py caller_paths: - tools/agent_run.py @@ -402,10 +381,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/agent_reporting.py caller_paths: - tools/agent_run.py @@ -418,10 +396,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/agent_run.py caller_paths: - tools/agent_run.py @@ -434,10 +411,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/agent_plans.py caller_paths: - tools/agent_run.py @@ -450,10 +426,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/agent_run.py caller_paths: - tools/agent_run.py @@ -466,10 +441,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/agent_run.py caller_paths: - tools/agent_run.py @@ -482,10 +456,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/agent_plans.py caller_paths: - tools/agent_run.py @@ -498,10 +471,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/domain/agent_plans.py caller_paths: - tools/agent_run.py @@ -514,10 +486,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_read_session.py disposition: implemented - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/read_session.py caller_paths: - tools/agent_run.py @@ -534,10 +505,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_read_session.py disposition: implemented-opt-in - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented-opt-in - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/adapters/agent_workers.py caller_paths: - tools/agent_run.py @@ -552,10 +522,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_read_session.py disposition: implemented - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/read_session.py caller_paths: - tools/agent_run.py @@ -568,10 +537,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/agent_plans.py caller_paths: - tools/agent_run.py @@ -584,10 +552,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_validation_cache.py disposition: implemented - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/validation_service.py caller_paths: - tools/agent_run.py @@ -601,10 +568,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_agent_run.py disposition: implemented - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/agent_reporting.py caller_paths: - tools/agent_run.py @@ -617,10 +583,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/benchmark_agent_plans.py disposition: implemented - measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tests/benchmark_agent_plans.py caller_paths: - tools/agent_run.py @@ -633,10 +598,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_procedures.py disposition: implemented - measured_evidence: tests/test_procedures.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: system/procedures/agent-plans.md caller_paths: - system/OPERATOR.md @@ -649,10 +613,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_pre_push_hook.py disposition: implemented - measured_evidence: tests/test_pre_push_hook.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/hooks/pre-push caller_paths: - tools/hooks/pre-push @@ -665,10 +628,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_review_consolidation.py disposition: implemented - measured_evidence: tests/test_review_consolidation.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: implemented - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: system/contracts/review-consolidation.yaml caller_paths: - tests/test_review_consolidation.py @@ -680,10 +642,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_note_create.py disposition: rejected-as-unsafe - measured_evidence: tests/test_note_create.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: rejected-as-unsafe - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/notes.py caller_paths: - tools/seal_envelope.py @@ -696,10 +657,9 @@ findings: existing_repair: 'recorded main history through PR #48 / runner 3604c43' regression_tests: tests/test_verbatim_anchor_admission.py disposition: rejected-as-unsafe - measured_evidence: tests/test_verbatim_anchor_admission.py; external promotion record implementation/OUTCOME.md + measured_evidence: + - https://github.com/Aram164/LearningOS/actions/runs/40455753138 source_status: rejected-as-unsafe - hosted_ci_status: external-promotion-record - installed_status: external-promotion-record owner_path: tools/learning_os/app/handlers/synthesis.py caller_paths: - tools/learning_os/app/handlers/synthesis.py diff --git a/system/contracts/task-scope.yaml b/system/contracts/task-scope.yaml index b62dce94..f892921b 100644 --- a/system/contracts/task-scope.yaml +++ b/system/contracts/task-scope.yaml @@ -17,6 +17,7 @@ schema_version: 1 tasks: - id: discover-capabilities + entry_verb: capabilities task: Discover capabilities entry_read: '`capabilities --compact --json`, then `capabilities NAME --json`' procedures: @@ -26,6 +27,7 @@ tasks: - system/OPERATOR.md - id: log-a-line + entry_verb: capture task: Log a line (`log:`) entry_read: '`capabilities capture.create --json`, or `capabilities stage.note.write --json` for an identified stage' procedures: @@ -39,6 +41,7 @@ tasks: - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2 - id: record-stage-progress + entry_verb: stage-progress task: Record stage progress or end a session entry_read: '`capabilities stage.progress.update --json`' procedures: @@ -52,6 +55,7 @@ tasks: - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2 - id: create-or-revise-a-durable-note + entry_verb: note-create task: Create or revise a durable note entry_read: '`capabilities note.create --json`, or `capabilities note.revise --json` for an existing note' procedures: @@ -65,6 +69,7 @@ tasks: - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2 - id: save-source-analyses + entry_verb: note-analysis-save-batch task: Save source analyses entry_read: '`capabilities note.analysis.save_batch --json`' procedures: @@ -78,6 +83,7 @@ tasks: - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2 - id: edit-a-known-material-route + entry_verb: plan-edit-context task: Edit a known material route entry_read: '`plan-edit-context UNIT_ID --route-id ROUTE_ID` or `--route-ids A B`' procedures: @@ -89,6 +95,7 @@ tasks: - system/ARCHITECTURE.md#14a-module-first-curriculum-model - id: edit-a-known-stage + entry_verb: plan-edit-context task: Edit a known stage entry_read: '`plan-edit-context UNIT_ID --stage-id STAGE_ID`' procedures: @@ -100,6 +107,7 @@ tasks: - system/ARCHITECTURE.md#14a-module-first-curriculum-model - id: unit-coverage-and-unknown-ids + entry_verb: plan-edit-context task: Unit coverage, source completeness, or unknown IDs entry_read: '`plan-edit-context UNIT_ID --brief`' procedures: @@ -111,6 +119,7 @@ tasks: - system/WORKFLOWS.md#26-source-routing-and-feedback - id: open-work-or-priority-question + entry_verb: bootstrap task: Open work or priority question entry_read: '`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination' procedures: @@ -122,6 +131,7 @@ tasks: - system/CLAUDE.md - id: known-record-or-stage-note + entry_verb: inspect task: Known record or stage note entry_read: '`inspect ID`, including a batch of known IDs' procedures: @@ -134,6 +144,7 @@ tasks: - system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006 - id: note-body-or-saved-reasoning + entry_verb: note-read task: Note body or saved reasoning entry_read: '`note-read NOTE_ID`' procedures: @@ -144,6 +155,7 @@ tasks: - system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006 - id: material-or-concept-explanation + entry_verb: material-context task: Material or concept explanation entry_read: '`material-context`, then an exact `material-span` when needed' procedures: @@ -154,6 +166,7 @@ tasks: - system/WORKFLOWS.md#26-source-routing-and-feedback - id: resume-recorded-study + entry_verb: resume task: Resume recorded study entry_read: '`resume` or `resume --study`' procedures: @@ -165,6 +178,7 @@ tasks: - system/CLAUDE.md - id: changes-awaiting-a-decision + entry_verb: intelligence-scan task: Changes awaiting a decision entry_read: '`intelligence-scan --brief --json`' procedures: @@ -175,6 +189,7 @@ tasks: - system/WORKFLOWS.md#30-review-exact-goal-decisions-together - id: ability-evidence + entry_verb: ability-context task: Ability evidence entry_read: '`ability-context` horizon, then a known ability' procedures: @@ -185,6 +200,7 @@ tasks: - system/WORKFLOWS.md#8-record-evidence - id: governance-question + entry_verb: semantic task: Governance question entry_read: '`semantic --list`, then `semantic PREDICATE --input k=v`' procedures: @@ -195,6 +211,7 @@ tasks: - system/SEMANTIC-CONTRACT.md - id: process-a-lecture + entry_verb: module-plan-import task: Process a lecture (23) entry_read: '`capabilities module.plan.import --json`, then `plan-edit-context UNIT_ID --brief`' procedures: @@ -208,6 +225,7 @@ tasks: - system/WORKFLOWS.md#6-add-or-evaluate-a-source - id: untranscribable-workflows + entry_verb: null task: Turn the semester (24), promote a Master's module (27) entry_read: none — stop and ask procedures: [] diff --git a/system/developer/components/cli-adapter.md b/system/developer/components/cli-adapter.md index 979ad31a..49b303c4 100644 --- a/system/developer/components/cli-adapter.md +++ b/system/developer/components/cli-adapter.md @@ -15,7 +15,7 @@ Parse CLI requests and render operation outcomes without owning semantic rules. ## Depends on and used by -Depends on: `contracts`, `diagnostics`, `domain`, `loading`, `operation-pipeline`. +Depends on: `contracts`, `diagnostics`, `domain`, `operation-pipeline`. Used by: none. diff --git a/system/developer/components/loading.md b/system/developer/components/loading.md index f3b4159a..95398703 100644 --- a/system/developer/components/loading.md +++ b/system/developer/components/loading.md @@ -22,7 +22,7 @@ Load authored records and expand declared references into repository read models Depends on: `domain`. -Used by: `ai-action-store`, `ai-delivery`, `backup`, `cli-adapter`, `derived-store`, `diagnostics`, `evidence`, `learner-derivations`, `masters-planning`, `materials`, `operation-handlers`, `operation-pipeline`, `plan-gate`, `projection`, `semantics`, `transactions`, `validation`. +Used by: `ai-action-store`, `ai-delivery`, `backup`, `derived-store`, `diagnostics`, `evidence`, `learner-derivations`, `masters-planning`, `materials`, `operation-handlers`, `operation-pipeline`, `plan-gate`, `projection`, `semantics`, `transactions`, `validation`. ## Invariants diff --git a/system/developer/components/operation-pipeline.md b/system/developer/components/operation-pipeline.md index 443da026..3115358a 100644 --- a/system/developer/components/operation-pipeline.md +++ b/system/developer/components/operation-pipeline.md @@ -26,6 +26,7 @@ Admit, lock, dispatch and settle one operation through the shared application bo - `tools/learning_os/app/ranking.py` - `tools/learning_os/app/session.py` - `tools/learning_os/app/agent_plans.py` +- `tools/learning_os/app/agent_presentation.py` - `tools/learning_os/app/agent_reporting.py` - `tools/learning_os/app/projection_readiness.py` - `tools/learning_os/app/read_session.py` diff --git a/system/developer/review-consolidation.md b/system/developer/review-consolidation.md index e0a2a0fe..fdce9efe 100644 --- a/system/developer/review-consolidation.md +++ b/system/developer/review-consolidation.md @@ -1,7 +1,7 @@ # Review consolidation register -Informative owner/caller adoption table for the systemwide review -consolidation. The machine-checkable register is +Historical owner/caller adoption record for the consolidation merged in +PR #59 at `d3d3b35`. The machine-checkable record is `system/contracts/review-consolidation.yaml`, validated by `tests/test_review_consolidation.py`. This page is not a rulebook; the binding contracts remain OPERATOR.md and the owning component pages. @@ -9,5 +9,8 @@ binding contracts remain OPERATOR.md and the owning component pages. Every finding names one owner, its affected callers, regression tests and a disposition: `already-inherited`, `implemented`, `implemented-opt-in`, or `rejected-as-unsafe` (inline envelope and stamp-only cache authority). -Source, hosted-CI and installed status are tracked separately; a green -source branch never claims live installation. +Owner and caller paths describe the recorded revision, so later refactoring +does not rewrite this history. Evidence links point to retained repository +artifacts and the original exact-pair CI run. Current CI and installation +state belong to their actual systems; this record grants neither authority +nor a current health claim. diff --git a/system/procedures/add-or-evaluate-a-source.md b/system/procedures/add-or-evaluate-a-source.md index a4b8e8bb..f6ff9d31 100644 --- a/system/procedures/add-or-evaluate-a-source.md +++ b/system/procedures/add-or-evaluate-a-source.md @@ -187,8 +187,8 @@ any destination outside the transcript `TMPDIR`. ```scrut $ mkdir -p "$TMPDIR/inv-pair/repo" && export INV_PAIR="$(realpath "$TMPDIR/inv-pair")" INV_REPO="$(realpath "$TMPDIR/inv-pair/repo")" && $H/los-anchored-copy materials_manifest "$INV_REPO" -sha256:110e3f0ca7cc152523bddb53ed2cd4d727864cc6d6a0a20317e37f705f5a423e Makefile -sha256:7459e53dd4686b40891104ec1b02e90319fb9060406032e895ae010b875b6077 pyproject.toml +sha256:a0583ab05765120a52f688d88ed6cd03e56c1567d7183328d0c640424297b575 Makefile +sha256:6b5296af66bf7bfb1a03b3dbb6c8ee6778fa4e7ba121fac957d73d8502f14161 pyproject.toml sha256:0c84a5cae52dc8aa786e0009eaaa38e9e2f202b5f140e8cb07d1b188bc338ba8 tools/learning_os/__init__.py sha256:9f4511b38e35ff56efa15bc8b486a589d9dc42eed38ab331da85c7e7f6503c41 tools/learning_os/domain/material_inventory.py sha256:8bdcc529afb1448f8856ba13e615b894989c70786024d702e839f62b52e96e3b tools/materials_manifest.py diff --git a/system/procedures/agent-plans.md b/system/procedures/agent-plans.md index ef6e0abd..f07cd309 100644 --- a/system/procedures/agent-plans.md +++ b/system/procedures/agent-plans.md @@ -48,10 +48,14 @@ schema=2 ok=2/2 $ $H/los-assert-receipt --last --capability capture.create ``` -The default worker count is one. Opt in to two through four workers only for -measured workloads; process startup can dominate small plans. Read waves stop at -every write or unknown-effect operation. `deadline_s` stops admission and -cancellable reads, while an admitted commit is allowed to finish. +Plans execute serially. Legacy `read_workers` values 1 through 4 remain accepted +and all execute with one worker; no worker processes are created. Read epochs +stop at every write or unknown-effect operation. `deadline_s` stops new steps, +bounds lock waits and subprocess calls by the remaining time, and reports a +timed-out write as uncertain. An in-process handler that has acquired its lock +can finish its work; the deadline does not interrupt its commit. Explicit +`schema_version: 1` is refused with a migration message; omitted versions +default to version 2. Only operations explicitly declaring `read` effects in the executing Core are reads. Derived writes, canonical writes (including `session-end`), and unknown effects require a plan `session_id` and cannot run after an unresolved write, for both @@ -61,6 +65,13 @@ A receipt establishes commitment; an explicit gateway refusal can establish no commit. A porcelain error's generic `commit: none` cannot prove that it had no side effects. Without reliable evidence, later writes are skipped even under `on_error: continue`; independent reads can still run. +Dependency readiness is receipt-based: a dependent step waits until every +write it depends on has a verified transaction receipt and the current +projection — freshly verified against canonical state, not merely the stored +publication — names that receipt's snapshot. A successful derived write that +produces no transaction receipt therefore cannot satisfy a dependent step; +the dependent step stays blocked rather than treating success as readiness. +That restriction is deliberate: only receipted writes anchor dependencies. `report_max_bytes` caps the entire stdout report. The `full_report` pointer leads to a private report outside canonical data, with the approved plan, sealed diff --git a/system/procedures/back-up-and-restore.md b/system/procedures/back-up-and-restore.md index 38171e67..bfcdc011 100644 --- a/system/procedures/back-up-and-restore.md +++ b/system/procedures/back-up-and-restore.md @@ -52,20 +52,20 @@ Take the backup: bundle smoke checks. ```scrut {interpolated: true} -$ los backup-manifest --ui-root "$TMPDIR/backup/ui-src" --out "$TMPDIR/backup/manifest.json" > "$TMPDIR/backup/summary.json" && eval "$(cat "$TMPDIR/backup/summary.json" | $H/los-bind BACKUP_AGGREGATE '$.aggregate_sha256')" && cat "$TMPDIR/backup/summary.json" | $LOS_REPO/.venv/bin/python -c 'import json,sys; d = json.load(sys.stdin); print(d["ok"]); print(d["roots"]); print(d["entries"]); print(d["aggregate_sha256"])' +$ los backup-manifest --ui-root "$TMPDIR/backup/ui-src" --out "$TMPDIR/backup/manifest.json" > "$TMPDIR/backup/summary.json" && eval "$(cat "$TMPDIR/backup/summary.json" | $H/los-bind BACKUP_AGGREGATE '$.aggregate_sha256')" && eval "$(cat "$TMPDIR/backup/summary.json" | $H/los-bind BACKUP_ENTRIES '$.entries')" && cat "$TMPDIR/backup/summary.json" | $LOS_REPO/.venv/bin/python -c 'import json,sys; d = json.load(sys.stdin); print(d["ok"]); print(d["roots"]); print(d["entries"]); print(d["aggregate_sha256"])' True ['core', 'materials', 'ui'] -497 +$BACKUP_ENTRIES $BACKUP_AGGREGATE ``` ## The manifest binds data to Core's commit ```scrut {interpolated: true} -$ $LOS_REPO/.venv/bin/python -c 'import json,os; d = json.load(open(os.path.join(os.environ["TMPDIR"], "backup/manifest.json"))); print(len(d["entries"])); print(d["aggregate_sha256"]); print(d["provenance"]["data_contract_version"]); print(d["provenance"]["core"]["commit"] is not None, d["provenance"]["ui"]["commit"])' -497 +$ $LOS_REPO/.venv/bin/python -c 'import json,os; d = json.load(open(os.path.join(os.environ["TMPDIR"], "backup/manifest.json"))); print(len(d["entries"])); print(d["aggregate_sha256"]); import yaml; c = yaml.safe_load(open(os.path.join(os.environ["LOS_REPO"], "system/contracts/data-contract.yaml"))); assert d["provenance"]["data_contract_version"] == c["contract_version"]; print("data contract matches"); print(d["provenance"]["core"]["commit"] is not None, d["provenance"]["ui"]["commit"])' +$BACKUP_ENTRIES $BACKUP_AGGREGATE -61 +data contract matches True None ``` @@ -73,7 +73,7 @@ True None ```scrut {interpolated: true} $ los backup-manifest --ui-root "$TMPDIR/backup/ui-src" --stdout | $LOS_REPO/.venv/bin/python -c 'import json,sys; d = json.load(sys.stdin); print(len(d["entries"])); print(sorted({e["root"] for e in d["entries"]})); print(d["aggregate_sha256"])' -497 +$BACKUP_ENTRIES ['core', 'materials', 'ui'] $BACKUP_AGGREGATE ``` @@ -115,14 +115,14 @@ copies match ## Verify the restore without executing restored code -```scrut +```scrut {interpolated: true} $ los backup-verify --manifest "$TMPDIR/backup/manifest.json" --restored-core "$TMPDIR/backup/restored-core" --restored-ui "$TMPDIR/backup/restored-ui" --restored-materials "$TMPDIR/backup/restored-materials" --checksums-only -{"ok":true,"checked":497,"issues":[]} +{"ok":true,"checked":$BACKUP_ENTRIES,"issues":[]} ``` ## Verify the restore in full -```scrut +```scrut {interpolated: true} $ los backup-verify --manifest "$TMPDIR/backup/manifest.json" --restored-core "$TMPDIR/backup/restored-core" --restored-ui "$TMPDIR/backup/restored-ui" --restored-materials "$TMPDIR/backup/restored-materials" | $LOS_REPO/.venv/bin/python -c 'import json,sys; d = json.load(sys.stdin); print(d["ok"]); [print(c["id"], c["ok"]) for c in d["checks"]]; print(d["manual_ui_open_required"])' True checksums True @@ -139,10 +139,10 @@ True ## A tampered restored byte fails the drill -```scrut +```scrut {interpolated: true} $ printf 'tamper' >> "$TMPDIR/backup/restored-materials/source-demo-book/book.pdf" && los backup-verify --manifest "$TMPDIR/backup/manifest.json" --restored-core "$TMPDIR/backup/restored-core" --restored-ui "$TMPDIR/backup/restored-ui" --restored-materials "$TMPDIR/backup/restored-materials" --checksums-only >"$TMPDIR/backup/tamper-out.txt" 2>&1; echo "exit=$?"; cat "$TMPDIR/backup/tamper-out.txt" exit=1 -{"ok":false,"checked":497,"issues":[{"root":"materials","path":"source-demo-book/book.pdf","issue":"checksum-mismatch"}]} +{"ok":false,"checked":$BACKUP_ENTRIES,"issues":[{"root":"materials","path":"source-demo-book/book.pdf","issue":"checksum-mismatch"}]} ``` ## The fixture itself still validates diff --git a/system/schema/candidate-source-comparison.schema.json b/system/schema/candidate-source-comparison.schema.json index 71ca098f..6348bb7d 100644 --- a/system/schema/candidate-source-comparison.schema.json +++ b/system/schema/candidate-source-comparison.schema.json @@ -47,7 +47,7 @@ }, "allOf": [{ "if": {"properties": {"review_status": {"const": "deep-reviewed"}}, "required": ["review_status"]}, - "then": {"required": ["contribution", "assumptions", "notation", "exercise_value", "best_for", "limitations", "evidence"], "properties": {"evidence": {"minItems": 1}}}, + "then": {"required": ["contribution", "assumptions", "notation", "exercise_value", "best_for", "limitations", "evidence"], "properties": {"evidence": {"type": "array", "minItems": 1}}}, "else": {"required": ["reason"], "not": {"anyOf": [{"required": ["contribution"]}, {"required": ["assumptions"]}, {"required": ["notation"]}, {"required": ["exercise_value"]}, {"required": ["best_for"]}, {"required": ["limitations"]}]}} }] } @@ -66,7 +66,7 @@ "concept_ids": { "allOf": [ {"$ref": "https://learningos.local/schema/material-comparison-defs.schema.json#/$defs/conceptIds"}, - {"minItems": 1} + {"type": "array", "minItems": 1} ] }, "evidence": { diff --git a/system/schema/learning-plan.schema.json b/system/schema/learning-plan.schema.json index fc1e81f4..303c7b2c 100644 --- a/system/schema/learning-plan.schema.json +++ b/system/schema/learning-plan.schema.json @@ -156,8 +156,10 @@ ], "properties": { "material_ref": { + "type": "object", "properties": { "inherit": { + "type": "array", "contains": { "const": "label" } @@ -375,6 +377,7 @@ } }, "curriculumStage": { + "type": "object", "allOf": [ { "$ref": "#/$defs/stageCore" diff --git a/system/schema/study-map.schema.json b/system/schema/study-map.schema.json index 2f9b6475..d02a95da 100644 --- a/system/schema/study-map.schema.json +++ b/system/schema/study-map.schema.json @@ -76,13 +76,14 @@ "then": { "properties": { "stages": { + "type": "array", "items": {"$ref": "https://learningos.local/schema/learning-plan-v1#/$defs/curriculumStage"} } } }, "else": { "properties": { - "stages": {"items": {"$ref": "#/$defs/legacyStage"}} + "stages": {"type": "array", "items": {"$ref": "#/$defs/legacyStage"}} } } } @@ -93,7 +94,7 @@ "allOf": [{"if": {"required": ["angle_review"]}, "then": {"anyOf": [{"required": ["route_id"]}, {"required": ["material_ref"]}]}}], "required": ["kind"], "additionalProperties": false, - "anyOf": [{"required": ["label"]}, {"required": ["material_ref"], "properties": {"material_ref": {"properties": {"inherit": {"contains": {"const": "label"}}}}}}], + "anyOf": [{"required": ["label"]}, {"required": ["material_ref"], "properties": {"material_ref": {"type": "object", "properties": {"inherit": {"type": "array", "contains": {"const": "label"}}}}}}], "properties": { "material_ref": {"type": "object", "additionalProperties": false, "required": ["route_id", "inherit"], "properties": {"route_id": {"type": "string", "pattern": "^route-[a-z0-9]+(?:-[a-z0-9]+)*$"}, "inherit": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"enum": ["label", "source_id", "locator", "angle", "angle_detail", "url", "vault_path"]}}}}, "id": {"type": "string", "pattern": "^resource-[a-z0-9]+(?:-[a-z0-9]+)*$"}, diff --git a/system/schema/unit-material-synthesis.schema.json b/system/schema/unit-material-synthesis.schema.json index 3025b1fe..7f1fd7b2 100644 --- a/system/schema/unit-material-synthesis.schema.json +++ b/system/schema/unit-material-synthesis.schema.json @@ -3,6 +3,7 @@ "$id": "https://learningos.local/schema/unit-material-synthesis.schema.json", "title": "Approved unit material synthesis", "x-governs": "record", + "type": "object", "$ref": "#/$defs/canonicalRecord", "unevaluatedProperties": false, "$defs": { @@ -63,7 +64,7 @@ "concept_ids": { "allOf": [ {"$ref": "https://learningos.local/schema/material-comparison-defs.schema.json#/$defs/conceptIds"}, - {"minItems": 1} + {"type": "array", "minItems": 1} ] }, "contribution": {"type": "string", "minLength": 1}, @@ -96,7 +97,7 @@ "contribution", "assumptions", "notation", "exercise_value", "best_for", "limitations", "scope_of_absence", "evidence" ], - "properties": {"evidence": {"minItems": 1}} + "properties": {"evidence": {"type": "array", "minItems": 1}} }, "else": { "required": ["reason"], @@ -127,7 +128,7 @@ "concept_ids": { "allOf": [ {"$ref": "https://learningos.local/schema/material-comparison-defs.schema.json#/$defs/conceptIds"}, - {"minItems": 1} + {"type": "array", "minItems": 1} ] }, "evidence": { diff --git a/tests/GROUPS.md b/tests/GROUPS.md index c33defc7..1c620b1a 100644 --- a/tests/GROUPS.md +++ b/tests/GROUPS.md @@ -40,6 +40,38 @@ make test # the full suite — still the gate `make system-check` and CI always run the full suite. Groups minimise reruns during development; they never replace the gate. +## Measurements and historical engine evidence + +`make bench` measures loading, offline validation and in-memory generation on +the disposable `synthetic-demo-v1` fixture. Each sample starts a fresh process; +setup and one warmup are excluded. The retained measurements are in +`architecture/runtime-benchmark-baseline.json`. The command prints percentage +changes, environment agreement and exact semantic-output agreement. Timing +never gates acceptance. Different machines or changed semantic output make +the comparison less informative; update the baseline deliberately with +`python tests/benchmark_runtime.py --write-baseline PATH`, after reviewing why +the workload changed. `--root PATH` explicitly selects an existing read-only +tree for a separate measurement. No benchmark is part of `make check` or CI. + +The engine neutrality oracle retains its original effects, including all +2,688 digest comparisons. `architecture/engine-baseline.json` contains stable +digest references; `engine-baseline-hashes.json` holds the 240 exact values. +The test expands those references before comparing the complete record. +Dictionary keys and filesystem traversal are sorted; receipt rows keep their +existing deterministic ordering, and semantic list order remains significant. +The original `074f4717` input archive is unchanged. The oracle's two additional +PR #59 register inputs and contract inventory are retained separately in +`engine-contract-inputs.json`, with provenance at `d3d3b35`; their original +bytes match the existing oracle's content hashes. This prevents later +contracts from changing historical snapshots. Current contracts remain +covered by transaction, gateway, contract and backup tests; this oracle drives +the current transaction engine against its intentionally historical inputs. + +CLI parity keeps parser structure and every diagnostic body, exit status and +argument observation. Its shared recorder normalizes only wrapped usage to +the first line, so the root verb inventory belongs to the structural oracle +instead of being repeated in each error recording. + ## Parallel fast gate `make test-parallel` runs the suite under pytest-xdist (`-n $(WORKERS)`, diff --git a/tests/arch_cli_describe.py b/tests/arch_cli_describe.py index d2de530d..00ba3e51 100644 --- a/tests/arch_cli_describe.py +++ b/tests/arch_cli_describe.py @@ -24,6 +24,22 @@ } +def normalize_usage(text: str) -> str: + """Record the first usage line and preserve the complete diagnostic body. + + Wrapped usage is a rendering of the structural parser oracle above; it + repeats every verb on root errors. Error text and all non-usage output + remain byte-for-byte evidence. + """ + lines = text.splitlines(keepends=True) + if not lines or not lines[0].startswith("usage: "): + return text + end = 1 + while end < len(lines) and lines[end].startswith((" ", "\t")): + end += 1 + return lines[0] + "".join(lines[end:]) + + def _action_name(action: argparse.Action) -> str: return _ACTION_NAMES.get(type(action).__name__, type(action).__name__) diff --git a/tests/arch_effects.py b/tests/arch_effects.py index 318bc45c..03fd629a 100644 --- a/tests/arch_effects.py +++ b/tests/arch_effects.py @@ -25,11 +25,11 @@ def capture_tree(root: Path) -> dict[str, str]: if base.is_symlink() or not base.is_dir(): continue for dirpath, dirnames, filenames in os.walk(base, followlinks=False): - dirnames[:] = [ + dirnames[:] = sorted( d for d in dirnames if not Path(dirpath, d).is_symlink() - ] - for name in filenames: + ) + for name in sorted(filenames): full = Path(dirpath, name) if full.is_symlink() or not full.is_file(): continue diff --git a/tests/arch_engine_cases.py b/tests/arch_engine_cases.py index f0f0d2c6..29d0f221 100644 --- a/tests/arch_engine_cases.py +++ b/tests/arch_engine_cases.py @@ -81,7 +81,7 @@ def norm_obj(self, obj): return { (self.norm_str(k) if isinstance(k, str) else k): self.norm_obj(v) - for k, v in obj.items() + for k, v in sorted(obj.items()) } if isinstance(obj, (list, tuple)): return [self.norm_obj(v) for v in obj] @@ -129,6 +129,15 @@ def _build_root(tmp_path: Path, name: str) -> Path: # build_mini_repo deliberately omits host-local attachment policy. if target.is_file(): target.write_bytes(data) + # PR #59 extended the original oracle with these contracts. Retain those + # exact input bytes too; current contracts are exercised by current cases. + inputs = json.loads((Path(__file__).parent / "architecture" / + "engine-contract-inputs.json").read_text()) + for target in (root / "system/contracts").rglob("*"): + if target.is_file() and target.relative_to(root).as_posix() not in inputs["inventory"]: + target.unlink() + for relpath, text in inputs["files"].items(): + (root / relpath).write_text(text, encoding="utf-8") return root @@ -154,11 +163,11 @@ def _capture_journal(root: Path, normalizer: _Normalizer) -> dict: if inflight.is_dir() and not inflight.is_symlink(): for dirpath, dirnames, filenames in os.walk( inflight, followlinks=False): - dirnames[:] = [ + dirnames[:] = sorted( d for d in dirnames if not Path(dirpath, d).is_symlink() - ] - for name in filenames: + ) + for name in sorted(filenames): full = Path(dirpath, name) if full.is_symlink() or not full.is_file(): continue diff --git a/tests/architecture/cli-parity-corpus.json b/tests/architecture/cli-parity-corpus.json index 8da19041..916580e7 100644 --- a/tests/architecture/cli-parity-corpus.json +++ b/tests/architecture/cli-parity-corpus.json @@ -244,7 +244,7 @@ "error": { "exit": 2, "first_line": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]", - "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\n [--json]\n name\nlos capability: error: the following arguments are required: name, --payload-file\n" + "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\nlos capability: error: the following arguments are required: name, --payload-file\n" } } }, @@ -265,7 +265,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close | --authorize)", - "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\n [--note NOTE] [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json] [--audit-file AUDIT_FILE]\n goal_id [goal_id ...]\nlos goal: error: the following arguments are required: goal_id\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\nlos goal: error: the following arguments are required: goal_id\n" }, "stdout": "" } @@ -365,7 +365,7 @@ "error": { "exit": 2, "first_line": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY", - "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS] [--note NOTE]\n [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES] [--json]\n requirement\nlos observe: error: the following arguments are required: requirement, --activity, --result\n" + "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\nlos observe: error: the following arguments are required: requirement, --activity, --result\n" } } }, @@ -386,7 +386,7 @@ "error": { "exit": 2, "first_line": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-intake: error: one of the arguments --file --record is required\n" + "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\nlos source-intake: error: one of the arguments --file --record is required\n" } } }, @@ -409,7 +409,7 @@ "error": { "exit": 2, "first_line": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-revise: error: one of the arguments --file --record is required\n" + "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\nlos source-revise: error: one of the arguments --file --record is required\n" } } }, @@ -432,7 +432,7 @@ "error": { "exit": 2, "first_line": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\n [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos collection-entry-revise: error: one of the arguments --file --record is required\n" + "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\nlos collection-entry-revise: error: one of the arguments --file --record is required\n" } } }, @@ -506,7 +506,7 @@ "error": { "exit": 2, "first_line": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY", - "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS] [--note NOTE]\n [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES] [--json]\n requirement\nlos observe: error: the following arguments are required: requirement, --activity, --result\n" + "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\nlos observe: error: the following arguments are required: requirement, --activity, --result\n" } } }, @@ -750,11 +750,11 @@ "--manifest", "manifest.json", "--restored-core", - "\u2026", + "…", "--restored-ui", - "\u2026", + "…", "--restored-materials", - "\u2026" + "…" ], "source": { "kind": "doc", @@ -765,11 +765,11 @@ "--manifest", "manifest.json", "--restored-core", - "\u2026", + "…", "--restored-ui", - "\u2026", + "…", "--restored-materials", - "\u2026" + "…" ] }, "substitutions": [], @@ -780,9 +780,9 @@ "command": "backup-verify", "json": false, "manifest": "manifest.json", - "restored_core": "\u2026", - "restored_ui": "\u2026", - "restored_materials": "\u2026", + "restored_core": "…", + "restored_ui": "…", + "restored_materials": "…", "checksums_only": false, "func": "learning_os.commands.vnext.cmd_backup_verify" } @@ -807,7 +807,7 @@ "error": { "exit": 2, "first_line": "usage: los source-feedback [-h] [--note NOTE] [--resource-id RESOURCE_ID]", - "stderr": "usage: los source-feedback [-h] [--note NOTE] [--resource-id RESOURCE_ID]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id source_id\n {helpful,too-advanced,wrong-perspective,useful-for-derivation,useful-for-review,skipped}\nlos source-feedback: error: argument --resource-id: expected one argument\n" + "stderr": "usage: los source-feedback [-h] [--note NOTE] [--resource-id RESOURCE_ID]\nlos source-feedback: error: argument --resource-id: expected one argument\n" } } }, @@ -852,7 +852,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close | --authorize)", - "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\n [--note NOTE] [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json] [--audit-file AUDIT_FILE]\n goal_id [goal_id ...]\nlos goal: error: the following arguments are required: goal_id\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\nlos goal: error: the following arguments are required: goal_id\n" }, "stdout": "" } @@ -874,7 +874,7 @@ "error": { "exit": 2, "first_line": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n note_id\nlos note-revise: error: the following arguments are required: note_id, --file\n" + "stderr": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos note-revise: error: the following arguments are required: note_id, --file\n" } } }, @@ -883,7 +883,7 @@ "status:", "reviewed", "0/50", - "\u00b7", + "·", "evidence", "0/50" ], @@ -895,7 +895,7 @@ "status:", "reviewed", "0/50", - "\u00b7", + "·", "evidence", "0/50" ] @@ -905,7 +905,7 @@ "error": { "exit": 2, "first_line": "usage: los [-h] [--root ROOT] [--lock-timeout SECONDS]", - "stderr": "usage: los [-h] [--root ROOT] [--lock-timeout SECONDS]\n {status,capabilities,bootstrap,material-context,ability-context,material-span,search,intelligence-scan,goal,resume,dossier,semantic,note-read,inbox-read,inbox-list,inspect,projection-observe,related,program-list,plan-template,module-list,unit-list,project-list,project-create,project-update,capability,validate,generate,ai-action-list,ai-action-prepare,ai-action-append-slices,ai-action-import-delivery,ai-action-validate-delivery,ai-action-apply-delivery,ai-action-status,unit-material-synthesis-publish,legacy-archive-inspect,legacy-archive-status,legacy-archive-lock-publish,masters-planning-dashboard,masters-planning-catalog-update,masters-planning-comparison-publish,health-report,backup-manifest,backup-verify,capture,inbox-resolve,garden-seed-create,atlas-context,concept-relations-change,atlas-question-save,note-analysis-save,note-analysis-save-batch,note-analysis-prepare,plan-edit-context,route-patch,module-materials-compact,unit-map-import,module-plan-import,module-attempt,module-sitting,unit-plan-revise,lineage-restamp,note-create,note-revise,note-evidence,runtime-session,observation-append,stage-result,ability-observation-append,ability-candidate-append,observe,unit-note,unit-source-selection,stage-note,stage-progress,stage-attach,source-feedback,source-intake,collection-entry-revise,collection-create,module-create,program-semester-update,source-revise,detour-create,detour-resolve,shelving-prepare,shelving-apply,session-end,path-note,path-progress,coordination-section-revise,workspace-next-action,path-attach,operations} ...\nlos: error: argument command: invalid choice: 'status:' (choose from status, capabilities, bootstrap, material-context, ability-context, material-span, search, intelligence-scan, goal, resume, dossier, semantic, note-read, inbox-read, inbox-list, inspect, projection-observe, related, program-list, plan-template, module-list, unit-list, project-list, project-create, project-update, capability, validate, generate, ai-action-list, ai-action-prepare, ai-action-append-slices, ai-action-import-delivery, ai-action-validate-delivery, ai-action-apply-delivery, ai-action-status, unit-material-synthesis-publish, legacy-archive-inspect, legacy-archive-status, legacy-archive-lock-publish, masters-planning-dashboard, masters-planning-catalog-update, masters-planning-comparison-publish, health-report, backup-manifest, backup-verify, capture, inbox-resolve, garden-seed-create, atlas-context, concept-relations-change, atlas-question-save, note-analysis-save, note-analysis-save-batch, note-analysis-prepare, plan-edit-context, route-patch, module-materials-compact, unit-map-import, module-plan-import, module-attempt, module-sitting, unit-plan-revise, lineage-restamp, note-create, note-revise, note-evidence, runtime-session, observation-append, stage-result, ability-observation-append, ability-candidate-append, observe, unit-note, unit-source-selection, stage-note, stage-progress, stage-attach, source-feedback, source-intake, collection-entry-revise, collection-create, module-create, program-semester-update, source-revise, detour-create, detour-resolve, shelving-prepare, shelving-apply, session-end, path-note, path-progress, coordination-section-revise, workspace-next-action, path-attach, operations)\n" + "stderr": "usage: los [-h] [--root ROOT] [--lock-timeout SECONDS]\nlos: error: argument command: invalid choice: 'status:' (choose from status, capabilities, bootstrap, material-context, ability-context, material-span, search, intelligence-scan, goal, resume, dossier, semantic, note-read, inbox-read, inbox-list, inspect, projection-observe, related, program-list, plan-template, module-list, unit-list, project-list, project-create, project-update, capability, validate, generate, ai-action-list, ai-action-prepare, ai-action-append-slices, ai-action-import-delivery, ai-action-validate-delivery, ai-action-apply-delivery, ai-action-status, unit-material-synthesis-publish, legacy-archive-inspect, legacy-archive-status, legacy-archive-lock-publish, masters-planning-dashboard, masters-planning-catalog-update, masters-planning-comparison-publish, health-report, backup-manifest, backup-verify, capture, inbox-resolve, garden-seed-create, atlas-context, concept-relations-change, atlas-question-save, note-analysis-save, note-analysis-save-batch, note-analysis-prepare, plan-edit-context, route-patch, module-materials-compact, unit-map-import, module-plan-import, module-attempt, module-sitting, unit-plan-revise, lineage-restamp, note-create, note-revise, note-evidence, runtime-session, observation-append, stage-result, ability-observation-append, ability-candidate-append, observe, unit-note, unit-source-selection, stage-note, stage-progress, stage-attach, source-feedback, source-intake, collection-entry-revise, collection-create, module-create, program-semester-update, source-revise, detour-create, detour-resolve, shelving-prepare, shelving-apply, session-end, path-note, path-progress, coordination-section-revise, workspace-next-action, path-attach, operations)\n" }, "stdout": "" } @@ -1863,7 +1863,7 @@ "error": { "exit": 2, "first_line": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]", - "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\n [--json]\n name\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities capture.create --json`\n" + "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities capture.create --json`\n" } } }, @@ -2197,7 +2197,7 @@ "error": { "exit": 2, "first_line": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]", - "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\n [--json]\n name\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities capture.create --json`\n" + "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities capture.create --json`\n" } } }, @@ -5400,7 +5400,7 @@ "error": { "exit": 2, "first_line": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]", - "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\n [--json]\n name\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities review.prepare --json`\n" + "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities review.prepare --json`\n" } } }, @@ -6302,7 +6302,7 @@ "error": { "exit": 2, "first_line": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]", - "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\n [--json]\n name\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities unit.source-selection.set --json`\n" + "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\nlos capability: error: unrecognized arguments: (payload schema: `los capabilities unit.source-selection.set --json`\n" } } }, @@ -6544,7 +6544,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-source-selection [-h] [--purpose PURPOSE]", - "stderr": "usage: los unit-source-selection [-h] [--purpose PURPOSE]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id source_id locator {select,remove}\nlos unit-source-selection: error: the following arguments are required: unit_id, source_id, locator, action\n" + "stderr": "usage: los unit-source-selection [-h] [--purpose PURPOSE]\nlos unit-source-selection: error: the following arguments are required: unit_id, source_id, locator, action\n" } } }, @@ -9806,7 +9806,7 @@ "error": { "exit": 2, "first_line": "usage: los [-h] [--root ROOT] [--lock-timeout SECONDS]", - "stderr": "usage: los [-h] [--root ROOT] [--lock-timeout SECONDS]\n {status,capabilities,bootstrap,material-context,ability-context,material-span,search,intelligence-scan,goal,resume,dossier,semantic,note-read,inbox-read,inbox-list,inspect,projection-observe,related,program-list,plan-template,module-list,unit-list,project-list,project-create,project-update,capability,validate,generate,ai-action-list,ai-action-prepare,ai-action-append-slices,ai-action-import-delivery,ai-action-validate-delivery,ai-action-apply-delivery,ai-action-status,unit-material-synthesis-publish,legacy-archive-inspect,legacy-archive-status,legacy-archive-lock-publish,masters-planning-dashboard,masters-planning-catalog-update,masters-planning-comparison-publish,health-report,backup-manifest,backup-verify,capture,inbox-resolve,garden-seed-create,atlas-context,concept-relations-change,atlas-question-save,note-analysis-save,note-analysis-save-batch,note-analysis-prepare,plan-edit-context,route-patch,module-materials-compact,unit-map-import,module-plan-import,module-attempt,module-sitting,unit-plan-revise,lineage-restamp,note-create,note-revise,note-evidence,runtime-session,observation-append,stage-result,ability-observation-append,ability-candidate-append,observe,unit-note,unit-source-selection,stage-note,stage-progress,stage-attach,source-feedback,source-intake,collection-entry-revise,collection-create,module-create,program-semester-update,source-revise,detour-create,detour-resolve,shelving-prepare,shelving-apply,session-end,path-note,path-progress,coordination-section-revise,workspace-next-action,path-attach,operations} ...\nlos: error: the following arguments are required: command\n" + "stderr": "usage: los [-h] [--root ROOT] [--lock-timeout SECONDS]\nlos: error: the following arguments are required: command\n" }, "stdout": "" } @@ -16282,7 +16282,7 @@ "unit-source-selection", "unit-demo-l1", "source-demo-book", - "\u00a71", + "§1", "select" ], "source": { @@ -16293,7 +16293,7 @@ "unit-source-selection", "unit-demo-l1", "source-demo-book", - "\u00a71", + "§1", "select" ] }, @@ -16305,7 +16305,7 @@ "command": "unit-source-selection", "unit_id": "unit-demo-l1", "source_id": "source-demo-book", - "locator": "\u00a71", + "locator": "§1", "action": "select", "purpose": null, "expected_snapshot": null, @@ -16320,7 +16320,7 @@ "unit-source-selection", "unit-demo-l01", "source-dem", - "\u00a71", + "§1", "select" ], "source": { @@ -16331,7 +16331,7 @@ "unit-source-selection", "unit-demo-l01", "source-dem", - "\u00a71", + "§1", "select" ] }, @@ -16343,7 +16343,7 @@ "command": "unit-source-selection", "unit_id": "unit-demo-l01", "source_id": "source-dem", - "locator": "\u00a71", + "locator": "§1", "action": "select", "purpose": null, "expected_snapshot": null, @@ -34400,7 +34400,7 @@ "error": { "exit": 2, "first_line": "usage: los ability-candidate-append [-h] --from-ability FROM_ABILITY", - "stderr": "usage: los ability-candidate-append [-h] --from-ability FROM_ABILITY\n --to-ability TO_ABILITY\n --kind {equivalence,extension,connection}\n --carries CARRIES --changes CHANGES\n [--condition CONDITION]\n --source-ref SOURCE_REF\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos ability-candidate-append: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los ability-candidate-append [-h] --from-ability FROM_ABILITY\nlos ability-candidate-append: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -34646,7 +34646,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]\n [--brief] [--section {evidence}]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [ability_id]\nlos ability-context: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]\nlos ability-context: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]" } } @@ -35344,7 +35344,7 @@ "error": { "exit": 2, "first_line": "usage: los ability-observation-append [-h] --workspace WORKSPACE", - "stderr": "usage: los ability-observation-append [-h] --workspace WORKSPACE\n --ability ABILITY --claim CLAIM\n --work-ref WORK_REF\n --confirmation-ref CONFIRMATION_REF\n --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n --assistance ASSISTANCE\n [--condition CONDITION]\n [--evidence-tag EVIDENCE_TAG]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos ability-observation-append: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los ability-observation-append [-h] --workspace WORKSPACE\nlos ability-observation-append: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -35644,7 +35644,7 @@ "error": { "exit": 2, "first_line": "usage: los ai-action-append-slices [-h] --request-id REQUEST_ID", - "stderr": "usage: los ai-action-append-slices [-h] --request-id REQUEST_ID\n --route-id ROUTE_ID --start START --end END\n --kind KIND [--concept-id CONCEPT_ID]\n --reason REASON\n [--material-uri MATERIAL_URI]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--json]\nlos ai-action-append-slices: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los ai-action-append-slices [-h] --request-id REQUEST_ID\nlos ai-action-append-slices: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -35838,7 +35838,7 @@ "error": { "exit": 2, "first_line": "usage: los ai-action-apply-delivery [-h] --delivery-sha256 DELIVERY_SHA256", - "stderr": "usage: los ai-action-apply-delivery [-h] --delivery-sha256 DELIVERY_SHA256\n --artifact-sha256 ARTIFACT_SHA256\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n delivery_id\nlos ai-action-apply-delivery: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los ai-action-apply-delivery [-h] --delivery-sha256 DELIVERY_SHA256\nlos ai-action-apply-delivery: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -36189,7 +36189,7 @@ "error": { "exit": 2, "first_line": "usage: los ai-action-prepare [-h] --action-id ACTION_ID", - "stderr": "usage: los ai-action-prepare [-h] --action-id ACTION_ID\n --target-kind TARGET_KIND --target-id TARGET_ID\n [--provider PROVIDER]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--request-id REQUEST_ID] [--json]\nlos ai-action-prepare: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los ai-action-prepare [-h] --action-id ACTION_ID\nlos ai-action-prepare: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -36493,7 +36493,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los atlas-context [-h] [--json] [--expected-snapshot EXPECTED_SNAPSHOT]\n concept_id\nlos atlas-context: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los atlas-context [-h] [--json] [--expected-snapshot EXPECTED_SNAPSHOT]\nlos atlas-context: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los atlas-context [-h] [--json] [--expected-snapshot EXPECTED_SNAPSHOT]" } } @@ -36659,7 +36659,7 @@ "error": { "exit": 2, "first_line": "usage: los atlas-question-save [-h] --question QUESTION", - "stderr": "usage: los atlas-question-save [-h] --question QUESTION\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos atlas-question-save: error: argument --question: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los atlas-question-save [-h] --question QUESTION\nlos atlas-question-save: error: argument --question: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -36681,7 +36681,7 @@ "error": { "exit": 2, "first_line": "usage: los atlas-question-save [-h] --question QUESTION", - "stderr": "usage: los atlas-question-save [-h] --question QUESTION\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos atlas-question-save: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los atlas-question-save [-h] --question QUESTION\nlos atlas-question-save: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -36884,7 +36884,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los backup-manifest [-h] [--ui-root UI_ROOT]\n [--materials-root MATERIALS_ROOT] [--out OUT]\n [--stdout]\nlos backup-manifest: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los backup-manifest [-h] [--ui-root UI_ROOT]\nlos backup-manifest: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los backup-manifest [-h] [--ui-root UI_ROOT]" } } @@ -37085,7 +37085,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los backup-verify [-h] [--json] --manifest MANIFEST\n --restored-core RESTORED_CORE\n --restored-ui RESTORED_UI\n --restored-materials RESTORED_MATERIALS\n [--checksums-only]\nlos backup-verify: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los backup-verify [-h] [--json] --manifest MANIFEST\nlos backup-verify: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los backup-verify [-h] [--json] --manifest MANIFEST" } } @@ -37323,7 +37323,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los bootstrap [-h] [--json] [--brief] [--compact] [--offset OFFSET]\n [--limit LIMIT] [--expected-snapshot EXPECTED_SNAPSHOT]\nlos bootstrap: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los bootstrap [-h] [--json] [--brief] [--compact] [--offset OFFSET]\nlos bootstrap: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los bootstrap [-h] [--json] [--brief] [--compact] [--offset OFFSET]" } } @@ -37576,7 +37576,7 @@ "error": { "exit": 2, "first_line": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]", - "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\n [--json]\n name\nlos capability: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los capability [-h] --payload-file PAYLOAD_FILE [--replay-only]\nlos capability: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -37878,7 +37878,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los capture [-h] [--text TEXT] [--file FILE]\n [--file-sha256 FILE_SHA256] [--title TITLE] [--json]\n [--expected-revision EXPECTED_REVISION]\nlos capture: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los capture [-h] [--text TEXT] [--file FILE]\nlos capture: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los capture [-h] [--text TEXT] [--file FILE]" } } @@ -38092,7 +38092,7 @@ "error": { "exit": 2, "first_line": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\n [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos collection-entry-revise: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\nlos collection-entry-revise: error: argument --record: not allowed with argument --file\n" } } }, @@ -38213,7 +38213,7 @@ "error": { "exit": 2, "first_line": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\n [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos collection-entry-revise: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\nlos collection-entry-revise: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -38235,7 +38235,7 @@ "error": { "exit": 2, "first_line": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\n [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos collection-entry-revise: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\nlos collection-entry-revise: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -38400,7 +38400,7 @@ "error": { "exit": 2, "first_line": "usage: los concept-relations-change [-h] --change CHANGE", - "stderr": "usage: los concept-relations-change [-h] --change CHANGE\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos concept-relations-change: error: argument --change: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los concept-relations-change [-h] --change CHANGE\nlos concept-relations-change: error: argument --change: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -38422,7 +38422,7 @@ "error": { "exit": 2, "first_line": "usage: los concept-relations-change [-h] --change CHANGE", - "stderr": "usage: los concept-relations-change [-h] --change CHANGE\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos concept-relations-change: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los concept-relations-change [-h] --change CHANGE\nlos concept-relations-change: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -38672,7 +38672,7 @@ "error": { "exit": 2, "first_line": "usage: los coordination-section-revise [-h] --text TEXT", - "stderr": "usage: los coordination-section-revise [-h] --text TEXT\n [--expected-content-sha256 EXPECTED_CONTENT_SHA256]\n [--check]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n {Commitments,Priorities,Dependencies,Deferrals}\nlos coordination-section-revise: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los coordination-section-revise [-h] --text TEXT\nlos coordination-section-revise: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -38877,7 +38877,7 @@ "error": { "exit": 2, "first_line": "usage: los detour-create [-h] --title TITLE", - "stderr": "usage: los detour-create [-h] --title TITLE\n --classification {required-now,helpful-now,deferred,reference-only}\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id\nlos detour-create: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los detour-create [-h] --title TITLE\nlos detour-create: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -39083,7 +39083,7 @@ "error": { "exit": 2, "first_line": "usage: los detour-resolve [-h] [--resolution RESOLUTION]", - "stderr": "usage: los detour-resolve [-h] [--resolution RESOLUTION]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id detour_id\nlos detour-resolve: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los detour-resolve [-h] [--resolution RESOLUTION]\nlos detour-resolve: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -39402,7 +39402,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los garden-seed-create [-h] --text TEXT [--title TITLE] [--json]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\nlos garden-seed-create: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los garden-seed-create [-h] --text TEXT [--title TITLE] [--json]\nlos garden-seed-create: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los garden-seed-create [-h] --text TEXT [--title TITLE] [--json]" } } @@ -39716,7 +39716,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close | --authorize)", - "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\n [--note NOTE] [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json] [--audit-file AUDIT_FILE]\n goal_id [goal_id ...]\nlos goal: error: argument --defer: not allowed with argument --reject\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\nlos goal: error: argument --defer: not allowed with argument --reject\n" }, "stdout": "" } @@ -39739,7 +39739,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close | --authorize)", - "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\n [--note NOTE] [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json] [--audit-file AUDIT_FILE]\n goal_id [goal_id ...]\nlos goal: error: argument --close: not allowed with argument --reject\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\nlos goal: error: argument --close: not allowed with argument --reject\n" }, "stdout": "" } @@ -39762,7 +39762,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close | --authorize)", - "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\n [--note NOTE] [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json] [--audit-file AUDIT_FILE]\n goal_id [goal_id ...]\nlos goal: error: argument --close: not allowed with argument --defer\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\nlos goal: error: argument --close: not allowed with argument --defer\n" }, "stdout": "" } @@ -39862,7 +39862,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close | --authorize)", - "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\n [--note NOTE] [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json] [--audit-file AUDIT_FILE]\n goal_id [goal_id ...]\nlos goal: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close | --authorize)\nlos goal: error: unrecognized arguments: --bogus-flag-xyz\n" }, "stdout": "" } @@ -40217,7 +40217,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los inbox-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n name\nlos inbox-read: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los inbox-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\nlos inbox-read: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los inbox-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]" } } @@ -40458,7 +40458,7 @@ "error": { "exit": 2, "first_line": "usage: los inbox-resolve [-h] --drop-sha256 DROP_SHA256 --routed-to ROUTED_TO", - "stderr": "usage: los inbox-resolve [-h] --drop-sha256 DROP_SHA256 --routed-to ROUTED_TO\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n name\nlos inbox-resolve: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los inbox-resolve [-h] --drop-sha256 DROP_SHA256 --routed-to ROUTED_TO\nlos inbox-resolve: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -40752,7 +40752,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los intelligence-scan [-h] [--days DAYS] [--feed FEED] [--json]\n [--brief]\nlos intelligence-scan: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los intelligence-scan [-h] [--days DAYS] [--feed FEED] [--json]\nlos intelligence-scan: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los intelligence-scan [-h] [--days DAYS] [--feed FEED] [--json]" } } @@ -40859,7 +40859,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los legacy-archive-inspect [-h] [--json] --archive-root ARCHIVE_ROOT\n --allowlist ALLOWLIST\nlos legacy-archive-inspect: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los legacy-archive-inspect [-h] [--json] --archive-root ARCHIVE_ROOT\nlos legacy-archive-inspect: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los legacy-archive-inspect [-h] [--json] --archive-root ARCHIVE_ROOT" } } @@ -41002,7 +41002,7 @@ "error": { "exit": 2, "first_line": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos legacy-archive-lock-publish: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\nlos legacy-archive-lock-publish: error: argument --record: not allowed with argument --file\n" } } }, @@ -41117,7 +41117,7 @@ "error": { "exit": 2, "first_line": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos legacy-archive-lock-publish: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\nlos legacy-archive-lock-publish: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -41139,7 +41139,7 @@ "error": { "exit": 2, "first_line": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos legacy-archive-lock-publish: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\nlos legacy-archive-lock-publish: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -41583,7 +41583,7 @@ "error": { "exit": 2, "first_line": "usage: los lineage-restamp [-h] [--claim-ids CLAIM_ID [CLAIM_ID ...]]", - "stderr": "usage: los lineage-restamp [-h] [--claim-ids CLAIM_ID [CLAIM_ID ...]]\n [--claims-sha256 CLAIMS_SHA256] [--check]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--review-report REVIEW_REPORT] [--json]\nlos lineage-restamp: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los lineage-restamp [-h] [--claim-ids CLAIM_ID [CLAIM_ID ...]]\nlos lineage-restamp: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -41725,7 +41725,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-catalog-update [-h] (--file FILE |", - "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos masters-planning-catalog-update: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\nlos masters-planning-catalog-update: error: argument --record: not allowed with argument --file\n" } } }, @@ -41840,7 +41840,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-catalog-update [-h] (--file FILE |", - "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos masters-planning-catalog-update: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\nlos masters-planning-catalog-update: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -41862,7 +41862,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-catalog-update [-h] (--file FILE |", - "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos masters-planning-catalog-update: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\nlos masters-planning-catalog-update: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -42013,7 +42013,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-comparison-publish [-h] (--file FILE |", - "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n candidate_module_id\nlos masters-planning-comparison-publish: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\nlos masters-planning-comparison-publish: error: argument --record: not allowed with argument --file\n" } } }, @@ -42135,7 +42135,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-comparison-publish [-h] (--file FILE |", - "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n candidate_module_id\nlos masters-planning-comparison-publish: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\nlos masters-planning-comparison-publish: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -42158,7 +42158,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-comparison-publish [-h] (--file FILE |", - "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n candidate_module_id\nlos masters-planning-comparison-publish: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\nlos masters-planning-comparison-publish: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -42724,7 +42724,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los material-context [-h] [--json] [--concept CONCEPT]\n [--purpose PURPOSE] [--unit UNIT]\n [--include-related] [--include-anchors]\n [--material REF] [--limit LIMIT] [--offset OFFSET]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-observations EXPECTED_OBSERVATIONS]\n [query]\nlos material-context: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los material-context [-h] [--json] [--concept CONCEPT]\nlos material-context: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los material-context [-h] [--json] [--concept CONCEPT]" } } @@ -42958,7 +42958,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los material-span [-h] [--json] [--stage STAGE_ID]\n [--resource-index RESOURCE_INDEX] [--extract]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n unit_id route_id\nlos material-span: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los material-span [-h] [--json] [--stage STAGE_ID]\nlos material-span: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los material-span [-h] [--json] [--stage STAGE_ID]" } } @@ -43256,7 +43256,7 @@ "error": { "exit": 2, "first_line": "usage: los module-attempt [-h] --termin {1,2,3} --date DATE", - "stderr": "usage: los module-attempt [-h] --termin {1,2,3} --date DATE\n --result {registered,withdrawn,sat,passed,failed}\n [--grade GRADE] [--notes NOTES]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n module_id\nlos module-attempt: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los module-attempt [-h] --termin {1,2,3} --date DATE\nlos module-attempt: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -43396,7 +43396,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los module-list [-h] [--json] [--program-id PROGRAM_ID]\n [--status STATUS]\nlos module-list: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los module-list [-h] [--json] [--program-id PROGRAM_ID]\nlos module-list: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los module-list [-h] [--json] [--program-id PROGRAM_ID]" } } @@ -43624,7 +43624,7 @@ "error": { "exit": 2, "first_line": "usage: los module-materials-compact [-h] [--check] [--plan-sha256 PLAN_SHA256]", - "stderr": "usage: los module-materials-compact [-h] [--check] [--plan-sha256 PLAN_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n module_id\nlos module-materials-compact: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los module-materials-compact [-h] [--check] [--plan-sha256 PLAN_SHA256]\nlos module-materials-compact: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -44036,7 +44036,7 @@ "error": { "exit": 2, "first_line": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)", - "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\n [--file-sha256 FILE_SHA256]\n [--package-sha256 PACKAGE_SHA256] [--approve]\n [--check] [--staged-basis UNIT_ID]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n module_id\nlos module-plan-import: error: argument --promotion: not allowed with argument --file\n" + "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\nlos module-plan-import: error: argument --promotion: not allowed with argument --file\n" } } }, @@ -44217,7 +44217,7 @@ "error": { "exit": 2, "first_line": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)", - "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\n [--file-sha256 FILE_SHA256]\n [--package-sha256 PACKAGE_SHA256] [--approve]\n [--check] [--staged-basis UNIT_ID]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n module_id\nlos module-plan-import: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\nlos module-plan-import: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -44411,7 +44411,7 @@ "error": { "exit": 2, "first_line": "usage: los module-sitting [-h] --termin {1,2,3}", - "stderr": "usage: los module-sitting [-h] --termin {1,2,3}\n --withdrawal-deadline WITHDRAWAL_DEADLINE\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n module_id\nlos module-sitting: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los module-sitting [-h] --termin {1,2,3}\nlos module-sitting: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -44736,7 +44736,7 @@ "error": { "exit": 2, "first_line": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE", - "stderr": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE\n [--body-file-sha256 BODY_FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos note-analysis-save: error: argument --analysis: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE\nlos note-analysis-save: error: argument --analysis: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -44790,7 +44790,7 @@ "error": { "exit": 2, "first_line": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE", - "stderr": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE\n [--body-file-sha256 BODY_FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos note-analysis-save: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE\nlos note-analysis-save: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -44955,7 +44955,7 @@ "error": { "exit": 2, "first_line": "usage: los note-analysis-save-batch [-h] --bundle BUNDLE", - "stderr": "usage: los note-analysis-save-batch [-h] --bundle BUNDLE\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos note-analysis-save-batch: error: argument --bundle: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los note-analysis-save-batch [-h] --bundle BUNDLE\nlos note-analysis-save-batch: error: argument --bundle: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -44977,7 +44977,7 @@ "error": { "exit": 2, "first_line": "usage: los note-analysis-save-batch [-h] --bundle BUNDLE", - "stderr": "usage: los note-analysis-save-batch [-h] --bundle BUNDLE\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos note-analysis-save-batch: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los note-analysis-save-batch [-h] --bundle BUNDLE\nlos note-analysis-save-batch: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -45227,7 +45227,7 @@ "error": { "exit": 2, "first_line": "usage: los note-create [-h] --note NOTE --body-file BODY_FILE", - "stderr": "usage: los note-create [-h] --note NOTE --body-file BODY_FILE\n [--body-file-sha256 BODY_FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos note-create: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los note-create [-h] --note NOTE --body-file BODY_FILE\nlos note-create: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -45409,7 +45409,7 @@ "error": { "exit": 2, "first_line": "usage: los note-evidence [-h] [--expected-snapshot EXPECTED_SNAPSHOT]", - "stderr": "usage: los note-evidence [-h] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n note_id\n {derivation,explanation,implementation,exercise,exam,external}\n ref\nlos note-evidence: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los note-evidence [-h] [--expected-snapshot EXPECTED_SNAPSHOT]\nlos note-evidence: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -45593,7 +45593,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los note-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n note_id\nlos note-read: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los note-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\nlos note-read: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los note-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]" } } @@ -45874,7 +45874,7 @@ "error": { "exit": 2, "first_line": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n note_id\nlos note-revise: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos note-revise: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -46479,7 +46479,7 @@ "error": { "exit": 2, "first_line": "usage: los observation-append [-h] --workspace WORKSPACE", - "stderr": "usage: los observation-append [-h] --workspace WORKSPACE\n --requirement REQUIREMENT --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS]\n [--context CONTEXT] [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos observation-append: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los observation-append [-h] --workspace WORKSPACE\nlos observation-append: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -46933,7 +46933,7 @@ "error": { "exit": 2, "first_line": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY", - "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS] [--note NOTE]\n [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES] [--json]\n requirement\nlos observe: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\nlos observe: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -47372,7 +47372,7 @@ "error": { "exit": 2, "first_line": "usage: los path-attach [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los path-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--label LABEL] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n path_id stage_id\nlos path-attach: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los path-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos path-attach: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -47614,7 +47614,7 @@ "error": { "exit": 2, "first_line": "usage: los path-note [-h] [--text TEXT] [--replace]", - "stderr": "usage: los path-note [-h] [--text TEXT] [--replace]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n path_id stage_id\nlos path-note: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los path-note [-h] [--text TEXT] [--replace]\nlos path-note: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -47796,7 +47796,7 @@ "error": { "exit": 2, "first_line": "usage: los path-progress [-h] [--expected-snapshot EXPECTED_SNAPSHOT]", - "stderr": "usage: los path-progress [-h] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n path_id stage_id {active,complete,skipped}\nlos path-progress: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los path-progress [-h] [--expected-snapshot EXPECTED_SNAPSHOT]\nlos path-progress: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -48144,7 +48144,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\n --route-ids ROUTE_ID [ROUTE_ID ...] |\n --stage-id STAGE_ID] [--audit] [--brief]\n [--include-related] [--include-neighbors]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n unit_id\nlos plan-edit-context: error: argument --route-ids: not allowed with argument --route-id\n", + "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\nlos plan-edit-context: error: argument --route-ids: not allowed with argument --route-id\n", "first_line": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |" } } @@ -48168,7 +48168,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\n --route-ids ROUTE_ID [ROUTE_ID ...] |\n --stage-id STAGE_ID] [--audit] [--brief]\n [--include-related] [--include-neighbors]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n unit_id\nlos plan-edit-context: error: argument --stage-id: not allowed with argument --route-id\n", + "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\nlos plan-edit-context: error: argument --stage-id: not allowed with argument --route-id\n", "first_line": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |" } } @@ -48192,7 +48192,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\n --route-ids ROUTE_ID [ROUTE_ID ...] |\n --stage-id STAGE_ID] [--audit] [--brief]\n [--include-related] [--include-neighbors]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n unit_id\nlos plan-edit-context: error: argument --stage-id: not allowed with argument --route-ids\n", + "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\nlos plan-edit-context: error: argument --stage-id: not allowed with argument --route-ids\n", "first_line": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |" } } @@ -48282,7 +48282,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\n --route-ids ROUTE_ID [ROUTE_ID ...] |\n --stage-id STAGE_ID] [--audit] [--brief]\n [--include-related] [--include-neighbors]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n unit_id\nlos plan-edit-context: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |\nlos plan-edit-context: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los plan-edit-context [-h] [--json] [--route-id ROUTE_ID |" } } @@ -48451,7 +48451,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los plan-template [-h] --title TITLE [--unit-id UNIT_ID]\n [--module-id MODULE_ID] [--json]\n {curriculum}\nlos plan-template: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los plan-template [-h] --title TITLE [--unit-id UNIT_ID]\nlos plan-template: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los plan-template [-h] --title TITLE [--unit-id UNIT_ID]" } } @@ -48680,7 +48680,7 @@ "error": { "exit": 2, "first_line": "usage: los project-create [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos project-create: error: argument --project: not allowed with argument --file\n" + "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\nlos project-create: error: argument --project: not allowed with argument --file\n" } } }, @@ -48795,7 +48795,7 @@ "error": { "exit": 2, "first_line": "usage: los project-create [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos project-create: error: argument --project: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\nlos project-create: error: argument --project: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -48817,7 +48817,7 @@ "error": { "exit": 2, "first_line": "usage: los project-create [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos project-create: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\nlos project-create: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -49081,7 +49081,7 @@ "error": { "exit": 2, "first_line": "usage: los project-update [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n project_id\nlos project-update: error: argument --project: not allowed with argument --file\n" + "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\nlos project-update: error: argument --project: not allowed with argument --file\n" } } }, @@ -49203,7 +49203,7 @@ "error": { "exit": 2, "first_line": "usage: los project-update [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n project_id\nlos project-update: error: argument --project: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\nlos project-update: error: argument --project: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -49226,7 +49226,7 @@ "error": { "exit": 2, "first_line": "usage: los project-update [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n project_id\nlos project-update: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\nlos project-update: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -49695,7 +49695,7 @@ "error": { "exit": 2, "first_line": "usage: los route-patch [-h] --changes CHANGES [--check]", - "stderr": "usage: los route-patch [-h] --changes CHANGES [--check]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n [--claim-evidence CLAIM_EVIDENCE]\n unit_id route_id\nlos route-patch: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los route-patch [-h] --changes CHANGES [--check]\nlos route-patch: error: unrecognized arguments: --bogus-flag-xyz\n" }, "stdout": "" } @@ -49923,7 +49923,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los runtime-session [-h] [--json] --requirement REQUIREMENT\n [--context-json CONTEXT_JSON]\n [--previous-json PREVIOUS_JSON] [--event EVENT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\nlos runtime-session: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los runtime-session [-h] [--json] --requirement REQUIREMENT\nlos runtime-session: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los runtime-session [-h] [--json] --requirement REQUIREMENT" } } @@ -50217,7 +50217,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]\n [--offset OFFSET] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--page]\n query\nlos search: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]\nlos search: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]" } } @@ -50428,7 +50428,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]\n [predicate]\nlos semantic: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]\nlos semantic: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]" } } @@ -50675,7 +50675,7 @@ "error": { "exit": 2, "first_line": "usage: los session-end [-h] [--commit-message COMMIT_MESSAGE] [--close]", - "stderr": "usage: los session-end [-h] [--commit-message COMMIT_MESSAGE] [--close]\n [--push] [--session-id SESSION_ID] [--channel CHANNEL]\n [--include-stale] [--json]\nlos session-end: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los session-end [-h] [--commit-message COMMIT_MESSAGE] [--close]\nlos session-end: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -50932,7 +50932,7 @@ "error": { "exit": 2, "first_line": "usage: los shelving-apply [-h] --selected SELECTED [SELECTED ...] [--approve]", - "stderr": "usage: los shelving-apply [-h] --selected SELECTED [SELECTED ...] [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos shelving-apply: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los shelving-apply [-h] --selected SELECTED [SELECTED ...] [--approve]\nlos shelving-apply: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -51227,7 +51227,7 @@ "error": { "exit": 2, "first_line": "usage: los shelving-prepare [-h] [--items-file ITEMS_FILE]", - "stderr": "usage: los shelving-prepare [-h] [--items-file ITEMS_FILE]\n [--items-file-sha256 ITEMS_FILE_SHA256]\n [--summary SUMMARY]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos shelving-prepare: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los shelving-prepare [-h] [--items-file ITEMS_FILE]\nlos shelving-prepare: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -51500,7 +51500,7 @@ "error": { "exit": 2, "first_line": "usage: los source-feedback [-h] [--note NOTE] [--resource-id RESOURCE_ID]", - "stderr": "usage: los source-feedback [-h] [--note NOTE] [--resource-id RESOURCE_ID]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id source_id\n {helpful,too-advanced,wrong-perspective,useful-for-derivation,useful-for-review,skipped}\nlos source-feedback: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los source-feedback [-h] [--note NOTE] [--resource-id RESOURCE_ID]\nlos source-feedback: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -51713,7 +51713,7 @@ "error": { "exit": 2, "first_line": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-intake: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\nlos source-intake: error: argument --record: not allowed with argument --file\n" } } }, @@ -51834,7 +51834,7 @@ "error": { "exit": 2, "first_line": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-intake: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\nlos source-intake: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -51856,7 +51856,7 @@ "error": { "exit": 2, "first_line": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-intake: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\nlos source-intake: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -52069,7 +52069,7 @@ "error": { "exit": 2, "first_line": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-revise: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\nlos source-revise: error: argument --record: not allowed with argument --file\n" } } }, @@ -52190,7 +52190,7 @@ "error": { "exit": 2, "first_line": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-revise: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\nlos source-revise: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -52212,7 +52212,7 @@ "error": { "exit": 2, "first_line": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-revise: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\nlos source-revise: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -52510,7 +52510,7 @@ "error": { "exit": 2, "first_line": "usage: los stage-attach [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los stage-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--label LABEL]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id\nlos stage-attach: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los stage-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos stage-attach: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -52752,7 +52752,7 @@ "error": { "exit": 2, "first_line": "usage: los stage-note [-h] [--text TEXT] [--replace]", - "stderr": "usage: los stage-note [-h] [--text TEXT] [--replace]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id\nlos stage-note: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los stage-note [-h] [--text TEXT] [--replace]\nlos stage-note: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -53010,7 +53010,7 @@ "error": { "exit": 2, "first_line": "usage: los stage-progress [-h] [--progress-summary PROGRESS_SUMMARY]", - "stderr": "usage: los stage-progress [-h] [--progress-summary PROGRESS_SUMMARY]\n [--progress-next PROGRESS_NEXT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id\n {active,paused,complete,skipped,revisit}\nlos stage-progress: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los stage-progress [-h] [--progress-summary PROGRESS_SUMMARY]\nlos stage-progress: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -53491,7 +53491,7 @@ "error": { "exit": 2, "first_line": "usage: los stage-result [-h] --workspace WORKSPACE --unit UNIT --stage STAGE", - "stderr": "usage: los stage-result [-h] --workspace WORKSPACE --unit UNIT --stage STAGE\n --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--note NOTE]\n [--condition CONDITION] [--supersedes SUPERSEDES]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos stage-result: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los stage-result [-h] --workspace WORKSPACE --unit UNIT --stage STAGE\nlos stage-result: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -53916,7 +53916,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los unit-list [-h] [--json] [--module-id MODULE_ID]\n [--component-id COMPONENT_ID] [--status STATUS]\n [--compact] [--offset OFFSET] [--limit LIMIT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\nlos unit-list: error: unrecognized arguments: --bogus-flag-xyz\n", + "stderr": "usage: los unit-list [-h] [--json] [--module-id MODULE_ID]\nlos unit-list: error: unrecognized arguments: --bogus-flag-xyz\n", "first_line": "usage: los unit-list [-h] [--json] [--module-id MODULE_ID]" } } @@ -54465,7 +54465,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-map-import [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los unit-map-import [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--replace] [--check]\n [--intentional-reorder REASON]\n [--intentional-state-reset REASON]\n [--retire-stage STAGE_ID] [--retire-reason REASON]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos unit-map-import: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los unit-map-import [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos unit-map-import: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -54652,7 +54652,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-material-synthesis-publish [-h] (--file FILE |", - "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\n --record RECORD) [--check]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id\nlos unit-material-synthesis-publish: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\nlos unit-material-synthesis-publish: error: argument --record: not allowed with argument --file\n" } } }, @@ -54777,7 +54777,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-material-synthesis-publish [-h] (--file FILE |", - "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\n --record RECORD) [--check]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id\nlos unit-material-synthesis-publish: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\nlos unit-material-synthesis-publish: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -54800,7 +54800,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-material-synthesis-publish [-h] (--file FILE |", - "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\n --record RECORD) [--check]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id\nlos unit-material-synthesis-publish: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\nlos unit-material-synthesis-publish: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -55262,7 +55262,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-note [-h] [--title TITLE] [--text TEXT] [--stage-id STAGE_ID]", - "stderr": "usage: los unit-note [-h] [--title TITLE] [--text TEXT] [--stage-id STAGE_ID]\n [--attachment ATTACHMENT]\n [--attachment-sha256 ATTACHMENT_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos unit-note: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los unit-note [-h] [--title TITLE] [--text TEXT] [--stage-id STAGE_ID]\nlos unit-note: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -55627,7 +55627,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\n [--file-sha256 FILE_SHA256] [--check]\n [--staged-basis UNIT_ID] [--report-out PATH]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n unit_id\nlos unit-plan-revise: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\nlos unit-plan-revise: error: argument --record: not allowed with argument --file\n" } } }, @@ -55767,7 +55767,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\n [--file-sha256 FILE_SHA256] [--check]\n [--staged-basis UNIT_ID] [--report-out PATH]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n unit_id\nlos unit-plan-revise: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" + "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\nlos unit-plan-revise: error: argument --record: expected a JSON object: Expecting value: line 1 column 1 (char 0)\n" } } }, @@ -55828,7 +55828,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\n [--file-sha256 FILE_SHA256] [--check]\n [--staged-basis UNIT_ID] [--report-out PATH]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n unit_id\nlos unit-plan-revise: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\nlos unit-plan-revise: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -56060,7 +56060,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-source-selection [-h] [--purpose PURPOSE]", - "stderr": "usage: los unit-source-selection [-h] [--purpose PURPOSE]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id source_id locator {select,remove}\nlos unit-source-selection: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los unit-source-selection [-h] [--purpose PURPOSE]\nlos unit-source-selection: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -56320,7 +56320,7 @@ "error": { "exit": 2, "first_line": "usage: los workspace-next-action [-h] --next-action NEXT_ACTION", - "stderr": "usage: los workspace-next-action [-h] --next-action NEXT_ACTION\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n workspace_id\nlos workspace-next-action: error: unrecognized arguments: --bogus-flag-xyz\n" + "stderr": "usage: los workspace-next-action [-h] --next-action NEXT_ACTION\nlos workspace-next-action: error: unrecognized arguments: --bogus-flag-xyz\n" } } }, @@ -56399,5 +56399,6 @@ } } } - ] + ], + "usage_normalization": "first line only; diagnostic bodies and exits preserved" } diff --git a/tests/architecture/cli-parity-supplement.json b/tests/architecture/cli-parity-supplement.json index d4cb7798..694158d1 100644 --- a/tests/architecture/cli-parity-supplement.json +++ b/tests/architecture/cli-parity-supplement.json @@ -765,7 +765,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\n [--file-sha256 FILE_SHA256] [--check]\n [--staged-basis UNIT_ID] [--report-out PATH]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n unit_id\nlos unit-plan-revise: error: argument --apply-reviewed-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\nlos unit-plan-revise: error: argument --apply-reviewed-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -1089,7 +1089,7 @@ "argv": [ "capture", "--text", - "\u2026" + "…" ], "source": { "kind": "doc-missed", @@ -1098,7 +1098,7 @@ "original": [ "capture", "--text", - "\u2026" + "…" ] }, "substitutions": [], @@ -1107,7 +1107,7 @@ "root": null, "lock_timeout": null, "command": "capture", - "text": "\u2026", + "text": "…", "file": null, "file_sha256": null, "title": null, @@ -1679,7 +1679,7 @@ "error": { "exit": 2, "first_line": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY", - "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS] [--note NOTE]\n [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES] [--json]\n requirement\nlos observe: error: unrecognized arguments: --conditions unfamiliar-example\n" + "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\nlos observe: error: unrecognized arguments: --conditions unfamiliar-example\n" }, "stdout": "" } @@ -1764,7 +1764,7 @@ "error": { "exit": 2, "first_line": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY", - "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS] [--note NOTE]\n [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES] [--json]\n requirement\nlos observe: error: the following arguments are required: --result\n" + "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\nlos observe: error: the following arguments are required: --result\n" }, "stdout": "" } @@ -1805,7 +1805,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]\n [predicate]\nlos semantic: error: unrecognized arguments: ... # evaluate one, X out\n", + "stderr": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]\nlos semantic: error: unrecognized arguments: ... # evaluate one, X out\n", "first_line": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]" }, "stdout": "" @@ -1843,7 +1843,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]\n [predicate]\nlos semantic: error: unrecognized arguments: the registry, with inputs and authority\n", + "stderr": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]\nlos semantic: error: unrecognized arguments: the registry, with inputs and authority\n", "first_line": "usage: los semantic [-h] [--json] [--input k=v] [--list] [--recipe CLASS]" }, "stdout": "" @@ -1991,7 +1991,7 @@ "error": { "exit": 2, "first_line": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY", - "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\n --result {correct,incorrect,partial,abandoned}\n [--assistance ASSISTANCE] [--tags TAGS] [--note NOTE]\n [--condition CONDITION]\n [--condition-not-met CONDITION_NOT_MET]\n [--supersedes SUPERSEDES] [--json]\n requirement\nlos observe: error: the following arguments are required: requirement, --activity, --result\n" + "stderr": "usage: los observe [-h] [--workspace WORKSPACE] --activity ACTIVITY\nlos observe: error: the following arguments are required: requirement, --activity, --result\n" }, "stdout": "" } @@ -2225,7 +2225,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]\n [--brief] [--section {evidence}]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [ability_id]\nlos ability-context: error: argument --section: invalid choice: 'NOT-A-DOCUMENTED-CHOICE' (choose from evidence)\n", + "stderr": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]\nlos ability-context: error: argument --section: invalid choice: 'NOT-A-DOCUMENTED-CHOICE' (choose from evidence)\n", "first_line": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]" }, "stdout": "" @@ -2247,7 +2247,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]\n [--brief] [--section {evidence}]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [ability_id]\nlos ability-context: error: argument --limit: invalid int value: 'notanint'\n", + "stderr": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]\nlos ability-context: error: argument --limit: invalid int value: 'notanint'\n", "first_line": "usage: los ability-context [-h] [--json] [--limit LIMIT] [--offset OFFSET]" }, "stdout": "" @@ -2909,7 +2909,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los bootstrap [-h] [--json] [--brief] [--compact] [--offset OFFSET]\n [--limit LIMIT] [--expected-snapshot EXPECTED_SNAPSHOT]\nlos bootstrap: error: argument --offset: invalid int value: 'notanint'\n", + "stderr": "usage: los bootstrap [-h] [--json] [--brief] [--compact] [--offset OFFSET]\nlos bootstrap: error: argument --offset: invalid int value: 'notanint'\n", "first_line": "usage: los bootstrap [-h] [--json] [--brief] [--compact] [--offset OFFSET]" }, "stdout": "" @@ -3019,7 +3019,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los capture [-h] [--text TEXT] [--file FILE]\n [--file-sha256 FILE_SHA256] [--title TITLE] [--json]\n [--expected-revision EXPECTED_REVISION]\nlos capture: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n", + "stderr": "usage: los capture [-h] [--text TEXT] [--file FILE]\nlos capture: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n", "first_line": "usage: los capture [-h] [--text TEXT] [--file FILE]" }, "stdout": "" @@ -3046,7 +3046,7 @@ "error": { "exit": 2, "first_line": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\n [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos collection-entry-revise: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\nlos collection-entry-revise: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -3105,7 +3105,7 @@ "error": { "exit": 2, "first_line": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\n [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos collection-entry-revise: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los collection-entry-revise [-h] (--file FILE | --record RECORD)\nlos collection-entry-revise: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -3469,7 +3469,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close) [--note NOTE]", - "stderr": "usage: los goal [-h] (--reject | --defer | --close) [--note NOTE]\n [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json]\n goal_id [goal_id ...]\nlos goal: error: argument --defer: not allowed with argument --reject\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close) [--note NOTE]\nlos goal: error: argument --defer: not allowed with argument --reject\n" }, "stdout": "" } @@ -3532,7 +3532,7 @@ "error": { "exit": 2, "first_line": "usage: los goal [-h] (--reject | --defer | --close) [--note NOTE]", - "stderr": "usage: los goal [-h] (--reject | --defer | --close) [--note NOTE]\n [--revisit-on REVISIT_ON] [--check]\n [--reviewed-sha256 REVIEWED_SHA256] [--session-id SESSION_ID]\n [--json]\n goal_id [goal_id ...]\nlos goal: error: argument --reviewed-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los goal [-h] (--reject | --defer | --close) [--note NOTE]\nlos goal: error: argument --reviewed-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -3615,7 +3615,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los inbox-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n name\nlos inbox-read: error: argument --offset: invalid int value: 'notanint'\n", + "stderr": "usage: los inbox-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\nlos inbox-read: error: argument --offset: invalid int value: 'notanint'\n", "first_line": "usage: los inbox-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]" }, "stdout": "" @@ -3773,7 +3773,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los intelligence-scan [-h] [--days DAYS] [--feed FEED] [--json]\n [--brief]\nlos intelligence-scan: error: argument --days: invalid int value: 'notanint'\n", + "stderr": "usage: los intelligence-scan [-h] [--days DAYS] [--feed FEED] [--json]\nlos intelligence-scan: error: argument --days: invalid int value: 'notanint'\n", "first_line": "usage: los intelligence-scan [-h] [--days DAYS] [--feed FEED] [--json]" }, "stdout": "" @@ -3800,7 +3800,7 @@ "error": { "exit": 2, "first_line": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos legacy-archive-lock-publish: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\nlos legacy-archive-lock-publish: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -3857,7 +3857,7 @@ "error": { "exit": 2, "first_line": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos legacy-archive-lock-publish: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los legacy-archive-lock-publish [-h] (--file FILE | --record RECORD)\nlos legacy-archive-lock-publish: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -3947,7 +3947,7 @@ "error": { "exit": 2, "first_line": "usage: los lineage-restamp [-h] [--claim-ids CLAIM_ID [CLAIM_ID ...]]", - "stderr": "usage: los lineage-restamp [-h] [--claim-ids CLAIM_ID [CLAIM_ID ...]]\n [--claims-sha256 CLAIMS_SHA256] [--check]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--review-report REVIEW_REPORT] [--json]\nlos lineage-restamp: error: argument --claims-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los lineage-restamp [-h] [--claim-ids CLAIM_ID [CLAIM_ID ...]]\nlos lineage-restamp: error: argument --claims-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -3973,7 +3973,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-catalog-update [-h] (--file FILE |", - "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos masters-planning-catalog-update: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\nlos masters-planning-catalog-update: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -4030,7 +4030,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-catalog-update [-h] (--file FILE |", - "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\nlos masters-planning-catalog-update: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los masters-planning-catalog-update [-h] (--file FILE |\nlos masters-planning-catalog-update: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -4057,7 +4057,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-comparison-publish [-h] (--file FILE |", - "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n candidate_module_id\nlos masters-planning-comparison-publish: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\nlos masters-planning-comparison-publish: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -4117,7 +4117,7 @@ "error": { "exit": 2, "first_line": "usage: los masters-planning-comparison-publish [-h] (--file FILE |", - "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\n --record RECORD) [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n candidate_module_id\nlos masters-planning-comparison-publish: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los masters-planning-comparison-publish [-h] (--file FILE |\nlos masters-planning-comparison-publish: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -4236,7 +4236,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los material-context [-h] [--json] [--concept CONCEPT]\n [--purpose PURPOSE] [--unit UNIT]\n [--include-related] [--include-anchors]\n [--material REF] [--limit LIMIT] [--offset OFFSET]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-observations EXPECTED_OBSERVATIONS]\n [query]\nlos material-context: error: argument --limit: invalid int value: 'notanint'\n", + "stderr": "usage: los material-context [-h] [--json] [--concept CONCEPT]\nlos material-context: error: argument --limit: invalid int value: 'notanint'\n", "first_line": "usage: los material-context [-h] [--json] [--concept CONCEPT]" }, "stdout": "" @@ -4327,7 +4327,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los material-span [-h] [--json] [--stage STAGE_ID]\n [--resource-index RESOURCE_INDEX] [--extract]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n unit_id route_id\nlos material-span: error: argument --resource-index: invalid int value: 'notanint'\n", + "stderr": "usage: los material-span [-h] [--json] [--stage STAGE_ID]\nlos material-span: error: argument --resource-index: invalid int value: 'notanint'\n", "first_line": "usage: los material-span [-h] [--json] [--stage STAGE_ID]" }, "stdout": "" @@ -4439,7 +4439,7 @@ "error": { "exit": 2, "first_line": "usage: los module-attempt [-h] --termin {1,2,3} --date DATE", - "stderr": "usage: los module-attempt [-h] --termin {1,2,3} --date DATE\n --result {registered,withdrawn,sat,passed,failed}\n [--grade GRADE] [--notes NOTES]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n module_id\nlos module-attempt: error: argument --grade: invalid float value: 'notafloat'\n" + "stderr": "usage: los module-attempt [-h] --termin {1,2,3} --date DATE\nlos module-attempt: error: argument --grade: invalid float value: 'notafloat'\n" }, "stdout": "" } @@ -4580,7 +4580,7 @@ "error": { "exit": 2, "first_line": "usage: los module-materials-compact [-h] [--check] [--plan-sha256 PLAN_SHA256]", - "stderr": "usage: los module-materials-compact [-h] [--check] [--plan-sha256 PLAN_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n module_id\nlos module-materials-compact: error: argument --plan-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los module-materials-compact [-h] [--check] [--plan-sha256 PLAN_SHA256]\nlos module-materials-compact: error: argument --plan-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -4607,7 +4607,7 @@ "error": { "exit": 2, "first_line": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)", - "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\n [--file-sha256 FILE_SHA256]\n [--package-sha256 PACKAGE_SHA256] [--approve]\n [--check] [--staged-basis UNIT_ID]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n module_id\nlos module-plan-import: error: argument --promotion: not allowed with argument --file\n" + "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\nlos module-plan-import: error: argument --promotion: not allowed with argument --file\n" }, "stdout": "" } @@ -4674,7 +4674,7 @@ "error": { "exit": 2, "first_line": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)", - "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\n [--file-sha256 FILE_SHA256]\n [--package-sha256 PACKAGE_SHA256] [--approve]\n [--check] [--staged-basis UNIT_ID]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n module_id\nlos module-plan-import: error: argument --promotion: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los module-plan-import [-h] (--file FILE | --promotion PROMOTION)\nlos module-plan-import: error: argument --promotion: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -4844,7 +4844,7 @@ "error": { "exit": 2, "first_line": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE", - "stderr": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE\n [--body-file-sha256 BODY_FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos note-analysis-save: error: argument --body-file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los note-analysis-save [-h] --analysis ANALYSIS --body-file BODY_FILE\nlos note-analysis-save: error: argument --body-file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -5004,7 +5004,7 @@ "error": { "exit": 2, "first_line": "usage: los note-create [-h] --note NOTE --body-file BODY_FILE", - "stderr": "usage: los note-create [-h] --note NOTE --body-file BODY_FILE\n [--body-file-sha256 BODY_FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos note-create: error: argument --body-file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los note-create [-h] --note NOTE --body-file BODY_FILE\nlos note-create: error: argument --body-file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -5157,7 +5157,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los note-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n note_id\nlos note-read: error: argument --offset: invalid int value: 'notanint'\n", + "stderr": "usage: los note-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]\nlos note-read: error: argument --offset: invalid int value: 'notanint'\n", "first_line": "usage: los note-read [-h] [--json] [--offset OFFSET] [--limit LIMIT]" }, "stdout": "" @@ -5252,7 +5252,7 @@ "error": { "exit": 2, "first_line": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n note_id\nlos note-revise: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los note-revise [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos note-revise: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -5603,7 +5603,7 @@ "error": { "exit": 2, "first_line": "usage: los path-attach [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los path-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--label LABEL] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n path_id stage_id\nlos path-attach: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los path-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos path-attach: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -5903,7 +5903,7 @@ "error": { "exit": 2, "first_line": "usage: los project-create [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos project-create: error: argument --project: not allowed with argument --file\n" + "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\nlos project-create: error: argument --project: not allowed with argument --file\n" }, "stdout": "" } @@ -5960,7 +5960,7 @@ "error": { "exit": 2, "first_line": "usage: los project-create [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos project-create: error: argument --project: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los project-create [-h] (--file FILE | --project PROJECT)\nlos project-create: error: argument --project: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -6040,7 +6040,7 @@ "error": { "exit": 2, "first_line": "usage: los project-update [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n project_id\nlos project-update: error: argument --project: not allowed with argument --file\n" + "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\nlos project-update: error: argument --project: not allowed with argument --file\n" }, "stdout": "" } @@ -6100,7 +6100,7 @@ "error": { "exit": 2, "first_line": "usage: los project-update [-h] (--file FILE | --project PROJECT)", - "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\n [--file-sha256 FILE_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n project_id\nlos project-update: error: argument --project: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los project-update [-h] (--file FILE | --project PROJECT)\nlos project-update: error: argument --project: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -6379,7 +6379,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]\n [--offset OFFSET] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--page]\n query\nlos search: error: argument --limit: invalid int value: 'notanint'\n", + "stderr": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]\nlos search: error: argument --limit: invalid int value: 'notanint'\n", "first_line": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]" }, "stdout": "" @@ -6664,7 +6664,7 @@ "error": { "exit": 2, "first_line": "usage: los shelving-prepare [-h] [--items-file ITEMS_FILE]", - "stderr": "usage: los shelving-prepare [-h] [--items-file ITEMS_FILE]\n [--items-file-sha256 ITEMS_FILE_SHA256]\n [--summary SUMMARY]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos shelving-prepare: error: argument --items-file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los shelving-prepare [-h] [--items-file ITEMS_FILE]\nlos shelving-prepare: error: argument --items-file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -6766,7 +6766,7 @@ "error": { "exit": 2, "first_line": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-intake: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\nlos source-intake: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -6825,7 +6825,7 @@ "error": { "exit": 2, "first_line": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-intake: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los source-intake [-h] (--file FILE | --record RECORD) [--check]\nlos source-intake: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -6851,7 +6851,7 @@ "error": { "exit": 2, "first_line": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-revise: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\nlos source-revise: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -6910,7 +6910,7 @@ "error": { "exit": 2, "first_line": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]", - "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\n [--expected-diff-sha256 EXPECTED_DIFF_SHA256]\n [--approve] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\nlos source-revise: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los source-revise [-h] (--file FILE | --record RECORD) [--check]\nlos source-revise: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -7010,7 +7010,7 @@ "error": { "exit": 2, "first_line": "usage: los stage-attach [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los stage-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--label LABEL]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id stage_id\nlos stage-attach: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los stage-attach [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos stage-attach: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -7354,7 +7354,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los unit-list [-h] [--json] [--module-id MODULE_ID]\n [--component-id COMPONENT_ID] [--status STATUS]\n [--compact] [--offset OFFSET] [--limit LIMIT]\n [--expected-snapshot EXPECTED_SNAPSHOT]\nlos unit-list: error: argument --offset: invalid int value: 'notanint'\n", + "stderr": "usage: los unit-list [-h] [--json] [--module-id MODULE_ID]\nlos unit-list: error: argument --offset: invalid int value: 'notanint'\n", "first_line": "usage: los unit-list [-h] [--json] [--module-id MODULE_ID]" }, "stdout": "" @@ -7459,7 +7459,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-map-import [-h] --file FILE [--file-sha256 FILE_SHA256]", - "stderr": "usage: los unit-map-import [-h] --file FILE [--file-sha256 FILE_SHA256]\n [--replace] [--check]\n [--intentional-reorder REASON]\n [--intentional-state-reset REASON]\n [--retire-stage STAGE_ID] [--retire-reason REASON]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos unit-map-import: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los unit-map-import [-h] --file FILE [--file-sha256 FILE_SHA256]\nlos unit-map-import: error: argument --file-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -7486,7 +7486,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-material-synthesis-publish [-h] (--file FILE |", - "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\n --record RECORD) [--check]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id\nlos unit-material-synthesis-publish: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\nlos unit-material-synthesis-publish: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -7547,7 +7547,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-material-synthesis-publish [-h] (--file FILE |", - "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\n --record RECORD) [--check]\n [--approve]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--json]\n unit_id\nlos unit-material-synthesis-publish: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los unit-material-synthesis-publish [-h] (--file FILE |\nlos unit-material-synthesis-publish: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -7640,7 +7640,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-note [-h] [--title TITLE] [--text TEXT] [--stage-id STAGE_ID]", - "stderr": "usage: los unit-note [-h] [--title TITLE] [--text TEXT] [--stage-id STAGE_ID]\n [--attachment ATTACHMENT]\n [--attachment-sha256 ATTACHMENT_SHA256]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION] [--json]\n unit_id\nlos unit-note: error: argument --attachment-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" + "stderr": "usage: los unit-note [-h] [--title TITLE] [--text TEXT] [--stage-id STAGE_ID]\nlos unit-note: error: argument --attachment-sha256: expected SHA-256 as sha256:<64 lowercase hexadecimal digits>\n" }, "stdout": "" } @@ -7667,7 +7667,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\n [--file-sha256 FILE_SHA256] [--check]\n [--staged-basis UNIT_ID] [--report-out PATH]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n unit_id\nlos unit-plan-revise: error: argument --record: not allowed with argument --file\n" + "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\nlos unit-plan-revise: error: argument --record: not allowed with argument --file\n" }, "stdout": "" } @@ -7733,7 +7733,7 @@ "error": { "exit": 2, "first_line": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)", - "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\n [--file-sha256 FILE_SHA256] [--check]\n [--staged-basis UNIT_ID] [--report-out PATH]\n [--expected-snapshot EXPECTED_SNAPSHOT]\n [--expected-revision EXPECTED_REVISION]\n [--apply-reviewed-sha256 SHA256]\n [--review-report REVIEW_REPORT] [--json]\n unit_id\nlos unit-plan-revise: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" + "stderr": "usage: los unit-plan-revise [-h] (--file FILE | --record RECORD)\nlos unit-plan-revise: error: argument --record: expected a JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n" }, "stdout": "" } @@ -8095,7 +8095,7 @@ "result": { "error": { "exit": 2, - "stderr": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]\n [--offset OFFSET] [--expected-snapshot EXPECTED_SNAPSHOT]\n [--page]\n query\nlos search: error: unrecognized arguments: --bogus\n", + "stderr": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]\nlos search: error: unrecognized arguments: --bogus\n", "first_line": "usage: los search [-h] [--json] [--type TYPE] [--limit LIMIT] [--content]" }, "stdout": "" @@ -8613,5 +8613,6 @@ "stdout": "" } } - ] + ], + "usage_normalization": "first line only; diagnostic bodies and exits preserved" } diff --git a/tests/architecture/engine-baseline-hashes.json b/tests/architecture/engine-baseline-hashes.json new file mode 100644 index 00000000..10b07472 --- /dev/null +++ b/tests/architecture/engine-baseline-hashes.json @@ -0,0 +1,242 @@ +{ + "@digest/001": "sha256:02523d54219e7d7835d5cacdbadcdd0cd37397835413bb2c1f495fa46e2e6aeb", + "@digest/002": "sha256:a50f0dfcfcc8894568c8954d308c39a2c087192b44d94e5d38fb1e0513098454", + "@digest/003": "sha256:93af0b18ff244614f142f625a8242a125f41c0f4147f807466a975970fde71de", + "@digest/004": "2ffa70c47f8e1e5f8f5cee161edf209cda22a80319810bb9b31c9b0f057bbd71", + "@digest/005": "4987f99bcfd7033b0fc62bbfdce16e8f174ddeb0f7ba2980bd328a76ca7b91fa", + "@digest/006": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", + "@digest/007": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", + "@digest/008": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "@digest/009": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", + "@digest/010": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", + "@digest/011": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", + "@digest/012": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", + "@digest/013": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", + "@digest/014": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", + "@digest/015": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", + "@digest/016": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", + "@digest/017": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", + "@digest/018": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", + "@digest/019": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", + "@digest/020": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", + "@digest/021": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", + "@digest/022": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", + "@digest/023": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", + "@digest/024": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", + "@digest/025": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", + "@digest/026": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", + "@digest/027": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", + "@digest/028": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", + "@digest/029": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", + "@digest/030": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", + "@digest/031": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", + "@digest/032": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", + "@digest/033": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", + "@digest/034": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", + "@digest/035": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", + "@digest/036": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", + "@digest/037": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", + "@digest/038": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", + "@digest/039": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", + "@digest/040": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", + "@digest/041": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", + "@digest/042": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", + "@digest/043": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", + "@digest/044": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", + "@digest/045": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", + "@digest/046": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", + "@digest/047": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", + "@digest/048": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", + "@digest/049": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", + "@digest/050": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", + "@digest/051": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", + "@digest/052": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", + "@digest/053": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", + "@digest/054": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", + "@digest/055": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", + "@digest/056": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", + "@digest/057": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", + "@digest/058": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", + "@digest/059": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", + "@digest/060": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", + "@digest/061": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", + "@digest/062": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", + "@digest/063": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", + "@digest/064": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", + "@digest/065": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", + "@digest/066": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", + "@digest/067": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", + "@digest/068": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", + "@digest/069": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", + "@digest/070": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", + "@digest/071": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", + "@digest/072": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", + "@digest/073": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", + "@digest/074": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", + "@digest/075": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", + "@digest/076": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", + "@digest/077": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", + "@digest/078": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", + "@digest/079": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", + "@digest/080": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", + "@digest/081": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", + "@digest/082": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", + "@digest/083": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", + "@digest/084": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", + "@digest/085": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", + "@digest/086": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", + "@digest/087": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", + "@digest/088": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", + "@digest/089": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", + "@digest/090": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", + "@digest/091": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", + "@digest/092": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", + "@digest/093": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", + "@digest/094": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", + "@digest/095": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", + "@digest/096": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", + "@digest/097": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", + "@digest/098": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", + "@digest/099": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", + "@digest/100": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", + "@digest/101": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", + "@digest/102": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", + "@digest/103": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", + "@digest/104": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", + "@digest/105": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", + "@digest/106": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", + "@digest/107": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", + "@digest/108": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", + "@digest/109": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", + "@digest/110": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", + "@digest/111": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", + "@digest/112": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", + "@digest/113": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", + "@digest/114": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", + "@digest/115": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", + "@digest/116": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", + "@digest/117": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", + "@digest/118": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", + "@digest/119": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", + "@digest/120": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", + "@digest/121": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", + "@digest/122": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", + "@digest/123": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", + "@digest/124": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", + "@digest/125": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", + "@digest/126": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", + "@digest/127": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", + "@digest/128": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", + "@digest/129": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", + "@digest/130": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", + "@digest/131": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", + "@digest/132": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", + "@digest/133": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", + "@digest/134": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", + "@digest/135": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", + "@digest/136": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", + "@digest/137": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", + "@digest/138": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", + "@digest/139": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", + "@digest/140": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", + "@digest/141": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", + "@digest/142": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", + "@digest/143": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", + "@digest/144": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", + "@digest/145": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", + "@digest/146": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", + "@digest/147": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", + "@digest/148": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", + "@digest/149": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", + "@digest/150": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", + "@digest/151": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", + "@digest/152": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", + "@digest/153": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", + "@digest/154": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", + "@digest/155": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", + "@digest/156": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", + "@digest/157": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", + "@digest/158": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", + "@digest/159": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", + "@digest/160": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", + "@digest/161": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", + "@digest/162": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", + "@digest/163": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", + "@digest/164": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", + "@digest/165": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", + "@digest/166": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", + "@digest/167": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", + "@digest/168": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", + "@digest/169": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", + "@digest/170": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", + "@digest/171": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", + "@digest/172": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", + "@digest/173": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", + "@digest/174": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", + "@digest/175": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", + "@digest/176": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", + "@digest/177": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", + "@digest/178": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", + "@digest/179": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", + "@digest/180": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", + "@digest/181": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", + "@digest/182": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", + "@digest/183": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", + "@digest/184": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", + "@digest/185": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", + "@digest/186": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", + "@digest/187": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", + "@digest/188": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", + "@digest/189": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", + "@digest/190": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", + "@digest/191": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", + "@digest/192": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", + "@digest/193": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", + "@digest/194": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", + "@digest/195": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", + "@digest/196": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", + "@digest/197": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", + "@digest/198": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", + "@digest/199": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", + "@digest/200": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", + "@digest/201": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", + "@digest/202": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", + "@digest/203": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", + "@digest/204": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", + "@digest/205": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", + "@digest/206": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", + "@digest/207": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", + "@digest/208": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", + "@digest/209": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", + "@digest/210": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", + "@digest/211": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", + "@digest/212": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", + "@digest/213": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", + "@digest/214": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", + "@digest/215": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", + "@digest/216": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", + "@digest/217": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", + "@digest/218": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", + "@digest/219": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", + "@digest/220": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", + "@digest/221": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", + "@digest/222": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", + "@digest/223": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", + "@digest/224": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", + "@digest/225": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", + "@digest/226": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", + "@digest/227": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422", + "@digest/228": "cc818e5e5e4f16203962c61149baa1b94c5b13ce42e1ba4d73c406fe45be2418", + "@digest/229": "sha256:cc2e4bb51f522b77c0c3ad04f7a87386a7e06d4fa287c004b6c066410c5c24dc", + "@digest/230": "sha256:755a86e3cb8f41368025c406538c26aa01c7b90a43280b7c4ab5d22da35f77a1", + "@digest/231": "sha256:e076254ece28b79b3657dfe9a4ca626e423a46ed170da6d0ae48a0e241e1e30f", + "@digest/232": "sha256:ed3bc6f14db2982d295112731607f7a433b32a4b6ca8038bf07daead1fed128b", + "@digest/233": "sha256:ec3f840b53d73e9dbedef7b8517cc0a0528e8ffa8e79ca4882b5766509ac01c7", + "@digest/234": "cc2e4bb51f522b77c0c3ad04f7a87386a7e06d4fa287c004b6c066410c5c24dc", + "@digest/235": "01d09d19c2139a46aebfb577780d123d7396e97201bc7ead210a2ebff8239dee", + "@digest/236": "08037ab297ec3e54f6d605b89e01eeb6ba54cca495971b604ed528449b7e4bed", + "@digest/237": "sha256:7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c", + "@digest/238": "sha256:01d09d19c2139a46aebfb577780d123d7396e97201bc7ead210a2ebff8239dee", + "@digest/239": "sha256:52313546c9d415b70d9a0ec9c1b0e434a2c9b0ea0b11c02f8d86320419331993", + "@digest/240": "7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c" +} diff --git a/tests/architecture/engine-baseline.json b/tests/architecture/engine-baseline.json index 662f762e..3e70cc9b 100644 --- a/tests/architecture/engine-baseline.json +++ b/tests/architecture/engine-baseline.json @@ -27,26 +27,26 @@ "expected_revisions": {}, "id": "TX1", "metadata": { - "data_roots_sha256": "sha256:02523d54219e7d7835d5cacdbadcdd0cd37397835413bb2c1f495fa46e2e6aeb", + "data_roots_sha256": "@digest/001", "fingerprint_definition": 2 }, "schema_version": 1, - "snapshot_after": "sha256:a50f0dfcfcc8894568c8954d308c39a2c087192b44d94e5d38fb1e0513098454", - "snapshot_before": "sha256:93af0b18ff244614f142f625a8242a125f41c0f4147f807466a975970fde71de", + "snapshot_after": "@digest/002", + "snapshot_before": "@digest/003", "status": "committed", "type": "transaction-receipt", "writes": [ { "created": true, "path": "work/inbox/new.md", - "sha256_after": "2ffa70c47f8e1e5f8f5cee161edf209cda22a80319810bb9b31c9b0f057bbd71", + "sha256_after": "@digest/004", "sha256_before": null }, { "created": false, "path": "work/inbox/to-delete.md", "sha256_after": null, - "sha256_before": "4987f99bcfd7033b0fc62bbfdce16e8f174ddeb0f7ba2980bd328a76ca7b91fa" + "sha256_before": "@digest/005" } ] } @@ -56,8 +56,8 @@ "revisions": { "arch-apply": 1 }, - "snapshot_after": "sha256:a50f0dfcfcc8894568c8954d308c39a2c087192b44d94e5d38fb1e0513098454", - "snapshot_before": "sha256:93af0b18ff244614f142f625a8242a125f41c0f4147f807466a975970fde71de", + "snapshot_after": "@digest/002", + "snapshot_before": "@digest/003", "transaction_id": "TX1" }, "revisions_after": { @@ -69,454 +69,454 @@ }, "revisions_before": null, "tree_after": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422", - "work/inbox/new.md": "2ffa70c47f8e1e5f8f5cee161edf209cda22a80319810bb9b31c9b0f057bbd71" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227", + "work/inbox/new.md": "@digest/004" }, "tree_before": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422", - "work/inbox/to-delete.md": "4987f99bcfd7033b0fc62bbfdce16e8f174ddeb0f7ba2980bd328a76ca7b91fa" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227", + "work/inbox/to-delete.md": "@digest/005" } }, "crash-recovery": { @@ -539,452 +539,452 @@ "revisions_after": null, "revisions_before": null, "tree_after": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" }, "tree_before": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" } }, "post-receipt-callback-failure": { @@ -997,7 +997,7 @@ "idempotency_before": null, "journal_after": { "files": { - "operations/transactions/.inflight/TX1/intent.json": "cc818e5e5e4f16203962c61149baa1b94c5b13ce42e1ba4d73c406fe45be2418" + "operations/transactions/.inflight/TX1/intent.json": "@digest/228" }, "intents": { "operations/transactions/.inflight/TX1/intent.json": { @@ -1006,7 +1006,7 @@ { "after": { "kind": "file", - "sha256": "sha256:cc2e4bb51f522b77c0c3ad04f7a87386a7e06d4fa287c004b6c066410c5c24dc" + "sha256": "@digest/229" }, "before": { "kind": "absent" @@ -1016,7 +1016,7 @@ { "after": { "kind": "file", - "sha256": "sha256:755a86e3cb8f41368025c406538c26aa01c7b90a43280b7c4ab5d22da35f77a1" + "sha256": "@digest/230" }, "before": { "kind": "absent" @@ -1049,19 +1049,19 @@ "expected_revisions": {}, "id": "TX1", "metadata": { - "data_roots_sha256": "sha256:e076254ece28b79b3657dfe9a4ca626e423a46ed170da6d0ae48a0e241e1e30f", + "data_roots_sha256": "@digest/231", "fingerprint_definition": 2 }, "schema_version": 1, - "snapshot_after": "sha256:ed3bc6f14db2982d295112731607f7a433b32a4b6ca8038bf07daead1fed128b", - "snapshot_before": "sha256:ec3f840b53d73e9dbedef7b8517cc0a0528e8ffa8e79ca4882b5766509ac01c7", + "snapshot_after": "@digest/232", + "snapshot_before": "@digest/233", "status": "committed", "type": "transaction-receipt", "writes": [ { "created": true, "path": "work/inbox/post-receipt.md", - "sha256_after": "cc2e4bb51f522b77c0c3ad04f7a87386a7e06d4fa287c004b6c066410c5c24dc", + "sha256_after": "@digest/234", "sha256_before": null } ] @@ -1077,453 +1077,453 @@ }, "revisions_before": null, "tree_after": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422", - "work/inbox/post-receipt.md": "cc2e4bb51f522b77c0c3ad04f7a87386a7e06d4fa287c004b6c066410c5c24dc" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227", + "work/inbox/post-receipt.md": "@digest/234" }, "tree_before": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" } }, "rollback-complete": { @@ -1549,452 +1549,452 @@ "revisions_after": null, "revisions_before": null, "tree_after": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" }, "tree_before": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" } }, "rollback-incomplete": { @@ -2007,8 +2007,8 @@ "idempotency_before": null, "journal_after": { "files": { - "operations/transactions/.inflight/TX1/BK1": "01d09d19c2139a46aebfb577780d123d7396e97201bc7ead210a2ebff8239dee", - "operations/transactions/.inflight/TX1/intent.json": "08037ab297ec3e54f6d605b89e01eeb6ba54cca495971b604ed528449b7e4bed" + "operations/transactions/.inflight/TX1/BK1": "@digest/235", + "operations/transactions/.inflight/TX1/intent.json": "@digest/236" }, "intents": { "operations/transactions/.inflight/TX1/intent.json": { @@ -2017,19 +2017,19 @@ { "after": { "kind": "file", - "sha256": "sha256:7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c" + "sha256": "@digest/237" }, "before": { "backup_id": "BK1", "kind": "file", - "sha256": "sha256:01d09d19c2139a46aebfb577780d123d7396e97201bc7ead210a2ebff8239dee" + "sha256": "@digest/238" }, "path": "work/inbox/rollback-incomplete.md" }, { "after": { "kind": "file", - "sha256": "sha256:52313546c9d415b70d9a0ec9c1b0e434a2c9b0ea0b11c02f8d86320419331993" + "sha256": "@digest/239" }, "before": { "kind": "absent" @@ -2060,454 +2060,454 @@ }, "revisions_before": null, "tree_after": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422", - "work/inbox/rollback-incomplete.md": "7aa7a5359173d05b63cfd682e3c38487f3cb4f7f1d60659fe59fab1505977d4c" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227", + "work/inbox/rollback-incomplete.md": "@digest/240" }, "tree_before": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422", - "work/inbox/rollback-incomplete.md": "01d09d19c2139a46aebfb577780d123d7396e97201bc7ead210a2ebff8239dee" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227", + "work/inbox/rollback-incomplete.md": "@digest/235" } }, "sink-exception": { @@ -2533,452 +2533,452 @@ "revisions_after": null, "revisions_before": null, "tree_after": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" }, "tree_before": { - "curriculum/modules/module-demo/module.yaml": "2556e00b237fceb738756beea2414c7fd41de6636a6c5b156e82c55b9bc81558", - "curriculum/modules/module-demo/source-map.yaml": "92743a3bd05f170b7e41d1d3586cb842db126bca5889ebf6d5a9216d5a612670", - "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "00fb256110c4944251b979b7d609504d57b85817a57cbc1eff2b793ee6762dca", - "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "5f0319d19b6b5002e4def91f68caf4116b3dbad2621a835eed7b55d23c57e35e", - "curriculum/programs/program-bachelors.yaml": "ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175", - "curriculum/resume.yaml": "b3e17c8cd77e06c92943631c46bb91ef7be14b8eaff2c43c1108f0777ce13f84", - "knowledge/concept-relations.yaml": "931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d", - "knowledge/concepts.yaml": "7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e", - "knowledge/notes/mathematics/note-demo.md": "5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276", - "records/modules.yaml": "5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7", - "sources/sources.yaml": "4994d5aef2fac2087c1dee2197018ef781fe87af021c989d0b92371e50ad1aaa", - "system/contracts/agent-plan-input.schema.json": "593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "system/contracts/agent-plan-report.schema.json": "7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a", - "system/contracts/ai-actions/garden.shelve.yaml": "55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca", - "system/contracts/ai-actions/unit.compare-materials.yaml": "7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085", - "system/contracts/ai-adapters.yaml": "804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56", - "system/contracts/backup-roots.yaml": "72caee13310066ba0525d66f39d25c64b23765e813a434924cbeef7c4bf186d5", - "system/contracts/capabilities.yaml": "348ce5ad72d14bdfb13909cd3cf187a32c1ee0cdcfdcc3de97a79660000f8450", - "system/contracts/cli-operations.yaml": "abd309820d822a97cab842b5d482a743f6f6a83b5458e3c979387613fa3bd34c", - "system/contracts/contract-register.yaml": "a7f3edb6c376412bbb034675b4c0ee640b322e202a52af06a57a3d54db517163", - "system/contracts/data-contract.yaml": "181798453c8e102084632d903623c0d6d8e4afeec4f2ed31e9c9cea4959c90d6", - "system/contracts/manifest-contract.yaml": "92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "system/contracts/manifest-v15.schema.json": "c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", - "system/contracts/normative-corpus.schema.json": "1477536ae0c81968898832204ebb5f1ea2e187ab838b6a5abe8836e2f18f6ed6", - "system/contracts/normative-corpus.yaml": "95a53c228ff7ba369670a5b5e53362a58d2f811321f13a613155b50b8f4181a4", - "system/contracts/perimeter.yaml": "a23dc395bf650b46b7813af07664c1498ce594c444dddfe11f34e59748f350d2", - "system/contracts/release-pair-receipt.schema.json": "4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "system/contracts/review-consolidation.schema.json": "6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "system/contracts/review-consolidation.yaml": "851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "system/contracts/semantic-lineage-ledger.schema.json": "2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf", - "system/contracts/task-scope.yaml": "eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "system/contracts/tree-contract.yaml": "4add2d2cb796b31aae20b4c9fdc4e26d3cbac80e0c8c23dde6167d251fc2c096", - "system/contracts/validation-warning-baseline.schema.json": "0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9", - "system/schema/abilities.schema.json": "06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543", - "system/schema/ability-candidate.schema.json": "7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612", - "system/schema/ability-context.schema.json": "dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5", - "system/schema/ability-observation.schema.json": "1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f", - "system/schema/backup-manifest.schema.json": "96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4", - "system/schema/candidate-source-comparison.schema.json": "2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "system/schema/capabilities/ability.candidate.append.schema.json": "fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625", - "system/schema/capabilities/ai-action.delivery.apply.schema.json": "f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72", - "system/schema/capabilities/atlas.question.save.schema.json": "6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187", - "system/schema/capabilities/capture.create.schema.json": "4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba", - "system/schema/capabilities/collection.entry.revise.schema.json": "35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d", - "system/schema/capabilities/concept.relations.change.schema.json": "f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006", - "system/schema/capabilities/coordination.section.revise.schema.json": "b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae", - "system/schema/capabilities/detour.create.schema.json": "f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe", - "system/schema/capabilities/detour.resolve.schema.json": "0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf", - "system/schema/capabilities/garden.seed.create.schema.json": "7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924", - "system/schema/capabilities/inbox.resolve.schema.json": "be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01", - "system/schema/capabilities/learner.ability-observation.append.schema.json": "a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f", - "system/schema/capabilities/learner.observation.append.schema.json": "e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6", - "system/schema/capabilities/learner.stage-result.append.schema.json": "cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75", - "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34", - "system/schema/capabilities/lineage.restamp.schema.json": "aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7", - "system/schema/capabilities/masters-planning.catalog.update.schema.json": "7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58", - "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede", - "system/schema/capabilities/module.attempt.record.schema.json": "fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15", - "system/schema/capabilities/module.materials.compact.schema.json": "fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923", - "system/schema/capabilities/module.plan.import.schema.json": "f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4", - "system/schema/capabilities/module.sitting.update.schema.json": "6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731", - "system/schema/capabilities/note.analysis.save.schema.json": "8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26", - "system/schema/capabilities/note.analysis.save_batch.schema.json": "e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e", - "system/schema/capabilities/note.create.schema.json": "bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2", - "system/schema/capabilities/note.evidence.add.schema.json": "5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715", - "system/schema/capabilities/note.revise.schema.json": "39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222", - "system/schema/capabilities/path.attachment.add.schema.json": "35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038", - "system/schema/capabilities/path.note.write.schema.json": "2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7", - "system/schema/capabilities/path.progress.update.schema.json": "6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065", - "system/schema/capabilities/project.create.schema.json": "b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc", - "system/schema/capabilities/project.update.schema.json": "aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a", - "system/schema/capabilities/review.apply.schema.json": "16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34", - "system/schema/capabilities/review.prepare.schema.json": "b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1", - "system/schema/capabilities/route.patch.schema.json": "984f85412c16f0ff56ad577d4a98b2511455764ff7f510e6fae92dd7e557b10b", - "system/schema/capabilities/source.feedback.record.schema.json": "fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a", - "system/schema/capabilities/source.intake.record.schema.json": "7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1", - "system/schema/capabilities/source.record.revise.schema.json": "f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5", - "system/schema/capabilities/stage.attachment.add.schema.json": "0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741", - "system/schema/capabilities/stage.note.write.schema.json": "e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd", - "system/schema/capabilities/stage.progress.update.schema.json": "c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b", - "system/schema/capabilities/unit.map.import.schema.json": "956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945", - "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0", - "system/schema/capabilities/unit.note.append.schema.json": "1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14", - "system/schema/capabilities/unit.plan.revise.schema.json": "63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa", - "system/schema/capabilities/unit.source-selection.set.schema.json": "8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228", - "system/schema/capabilities/workspace.next-action.update.schema.json": "2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b", - "system/schema/capability-envelope.schema.json": "2d4d1423452c0466a4d52d93e2ab56faf45606521bad8652f189870011918ab4", - "system/schema/collections.schema.json": "2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec", - "system/schema/concept-relations.schema.json": "83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac", - "system/schema/concepts.schema.json": "98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3", - "system/schema/coordination.schema.json": "935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961", - "system/schema/goal-ledger.schema.json": "856065544b045af2ea3b5a71ba6f38d30eef828344744b53cf5a810a88859a98", - "system/schema/health-report.schema.json": "ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6", - "system/schema/learner-observation.schema.json": "556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1", - "system/schema/learner-stage-result.schema.json": "2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268", - "system/schema/learning-path.schema.json": "37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8", - "system/schema/learning-plan.schema.json": "7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "system/schema/learning-requirement.schema.json": "402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404", - "system/schema/legacy-archive-allowlist.schema.json": "f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae", - "system/schema/legacy-archive-lock.schema.json": "3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6", - "system/schema/legacy-archive-status.schema.json": "50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6", - "system/schema/master-planning-catalog.schema.json": "1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2", - "system/schema/master-planning-promotion-provenance.schema.json": "b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e", - "system/schema/master-planning-promotion.schema.json": "a61f98f32cd2da83c296e4312af0ec8266f4d09a0ae8b9a6464678c4dae92176", - "system/schema/masters-planning-dashboard.schema.json": "f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db", - "system/schema/material-comparison-defs.schema.json": "5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6", - "system/schema/material-span.schema.json": "f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300", - "system/schema/module-source-map.schema.json": "967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539", - "system/schema/module.schema.json": "cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8", - "system/schema/modules.schema.json": "fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b", - "system/schema/note.schema.json": "b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222", - "system/schema/plan-template.schema.json": "6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b", - "system/schema/program.schema.json": "071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e", - "system/schema/project-aliases.schema.json": "97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df", - "system/schema/project-relations.schema.json": "d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18", - "system/schema/project.schema.json": "9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e", - "system/schema/requests/ability.candidate.append.schema.json": "c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba", - "system/schema/requests/ability.context.schema.json": "6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6", - "system/schema/requests/ai-action.append-slices.schema.json": "84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5", - "system/schema/requests/ai-action.delivery.apply.schema.json": "47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2", - "system/schema/requests/ai-action.delivery.import.schema.json": "926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565", - "system/schema/requests/ai-action.delivery.validate.schema.json": "ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6", - "system/schema/requests/ai-action.list.schema.json": "437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560", - "system/schema/requests/ai-action.prepare.schema.json": "a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b", - "system/schema/requests/ai-action.status.schema.json": "d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a", - "system/schema/requests/atlas.context.schema.json": "42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a", - "system/schema/requests/atlas.question.save.schema.json": "745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239", - "system/schema/requests/backup.manifest.schema.json": "b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6", - "system/schema/requests/backup.verify.schema.json": "15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72", - "system/schema/requests/capabilities.read.schema.json": "2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde", - "system/schema/requests/capture.create.schema.json": "4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db", - "system/schema/requests/cli.capability.schema.json": "4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49", - "system/schema/requests/collection.entry.revise.schema.json": "e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846", - "system/schema/requests/concept.relations.change.schema.json": "00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13", - "system/schema/requests/coordination.section.revise.schema.json": "30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd", - "system/schema/requests/detour.create.schema.json": "ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138", - "system/schema/requests/detour.resolve.schema.json": "b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5", - "system/schema/requests/dossier.read.schema.json": "717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5", - "system/schema/requests/garden.seed.create.schema.json": "56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238", - "system/schema/requests/goal.decide.schema.json": "75a7540bbfa50f3f70fc7aeda02732ced72040e34eda6102bd7267c51da5c0da", - "system/schema/requests/health.report.schema.json": "eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e", - "system/schema/requests/inbox.content.schema.json": "b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4", - "system/schema/requests/inbox.list.schema.json": "e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d", - "system/schema/requests/inbox.resolve.schema.json": "1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097", - "system/schema/requests/intelligence.scan.schema.json": "a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196", - "system/schema/requests/learner.ability-observation.append.schema.json": "f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1", - "system/schema/requests/learner.observation.append.schema.json": "99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8", - "system/schema/requests/learner.observe.schema.json": "7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2", - "system/schema/requests/learner.stage-result.append.schema.json": "defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693", - "system/schema/requests/legacy.archive.inspect.schema.json": "157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8", - "system/schema/requests/legacy.archive.lock.publish.schema.json": "c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b", - "system/schema/requests/legacy.archive.status.schema.json": "5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3", - "system/schema/requests/lineage.restamp.schema.json": "7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc", - "system/schema/requests/masters-planning.catalog.update.schema.json": "ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13", - "system/schema/requests/masters-planning.comparison.publish.schema.json": "f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358", - "system/schema/requests/masters-planning.dashboard.schema.json": "12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f", - "system/schema/requests/material.context.schema.json": "bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a", - "system/schema/requests/material.span.schema.json": "15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd", - "system/schema/requests/module.attempt.record.schema.json": "def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56", - "system/schema/requests/module.list.schema.json": "e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8", - "system/schema/requests/module.materials.compact.schema.json": "1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be", - "system/schema/requests/module.plan.import.schema.json": "19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6", - "system/schema/requests/module.sitting.update.schema.json": "853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076", - "system/schema/requests/note.analysis.prepare.schema.json": "c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e", - "system/schema/requests/note.analysis.save.schema.json": "4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81", - "system/schema/requests/note.analysis.save_batch.schema.json": "4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1", - "system/schema/requests/note.content.schema.json": "9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337", - "system/schema/requests/note.create.schema.json": "1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2", - "system/schema/requests/note.evidence.add.schema.json": "09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90", - "system/schema/requests/note.revise.schema.json": "f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7", - "system/schema/requests/note.search.schema.json": "6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5", - "system/schema/requests/operations.read.schema.json": "0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f", - "system/schema/requests/operator.bootstrap.schema.json": "2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27", - "system/schema/requests/path.attachment.add.schema.json": "bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9", - "system/schema/requests/path.note.write.schema.json": "0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308", - "system/schema/requests/path.progress.update.schema.json": "e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b", - "system/schema/requests/plan.edit-context.schema.json": "42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602", - "system/schema/requests/plan.template.schema.json": "1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7", - "system/schema/requests/program.list.schema.json": "1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365", - "system/schema/requests/project.create.schema.json": "5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3", - "system/schema/requests/project.inspect.schema.json": "e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b", - "system/schema/requests/project.list.schema.json": "21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04", - "system/schema/requests/project.update.schema.json": "80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956", - "system/schema/requests/projection.generate.schema.json": "b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce", - "system/schema/requests/related.read.schema.json": "bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e", - "system/schema/requests/repository.validate.schema.json": "ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd", - "system/schema/requests/resume.read.schema.json": "873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e", - "system/schema/requests/review.apply.schema.json": "756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1", - "system/schema/requests/review.prepare.schema.json": "2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4", - "system/schema/requests/route.patch.schema.json": "118048798ae18b22b94515564d9d2bc76d0c9c4103391ef10591101bbc4cc8c5", - "system/schema/requests/runtime.session.schema.json": "3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f", - "system/schema/requests/semantic.query.schema.json": "abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034", - "system/schema/requests/session.end.schema.json": "41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077", - "system/schema/requests/source.feedback.record.schema.json": "112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08", - "system/schema/requests/source.intake.record.schema.json": "0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0", - "system/schema/requests/source.record.revise.schema.json": "7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b", - "system/schema/requests/stage.attachment.add.schema.json": "28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419", - "system/schema/requests/stage.note.write.schema.json": "83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc", - "system/schema/requests/stage.progress.update.schema.json": "50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f", - "system/schema/requests/status.read.schema.json": "3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2", - "system/schema/requests/unit.list.schema.json": "28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478", - "system/schema/requests/unit.map.import.schema.json": "3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697", - "system/schema/requests/unit.material-synthesis.publish.schema.json": "7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247", - "system/schema/requests/unit.note.append.schema.json": "2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52", - "system/schema/requests/unit.plan.revise.schema.json": "06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad", - "system/schema/requests/unit.source-selection.set.schema.json": "8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff", - "system/schema/requests/workspace.next-action.update.schema.json": "ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde", - "system/schema/resume.schema.json": "9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991", - "system/schema/runtime-session.schema.json": "b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c", - "system/schema/session-context.schema.json": "aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e", - "system/schema/session-plan.schema.json": "d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84", - "system/schema/sources.schema.json": "6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4", - "system/schema/study-map.schema.json": "8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "system/schema/thematic-groups.schema.json": "55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159", - "system/schema/transaction-receipt.schema.json": "064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55", - "system/schema/ui-responses.schema.json": "249f620e0a77062bdd0dfdecb1bce6be0091c625f062c40a98c370748eaf45da", - "system/schema/unit-material-synthesis.schema.json": "2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "system/schema/unit.schema.json": "39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b", - "system/schema/workspace.schema.json": "c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96", - "work/COORDINATION.md": "667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655", - "work/active/workspace-demo/CONTEXT.md": "f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422" + "curriculum/modules/module-demo/module.yaml": "@digest/006", + "curriculum/modules/module-demo/source-map.yaml": "@digest/007", + "curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md": "@digest/008", + "curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml": "@digest/009", + "curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml": "@digest/010", + "curriculum/programs/program-bachelors.yaml": "@digest/011", + "curriculum/resume.yaml": "@digest/012", + "knowledge/concept-relations.yaml": "@digest/013", + "knowledge/concepts.yaml": "@digest/014", + "knowledge/notes/mathematics/note-demo.md": "@digest/015", + "records/modules.yaml": "@digest/016", + "sources/sources.yaml": "@digest/017", + "system/contracts/agent-plan-input.schema.json": "@digest/018", + "system/contracts/agent-plan-report.schema.json": "@digest/019", + "system/contracts/ai-actions/garden.shelve.yaml": "@digest/020", + "system/contracts/ai-actions/unit.compare-materials.yaml": "@digest/021", + "system/contracts/ai-adapters.yaml": "@digest/022", + "system/contracts/backup-roots.yaml": "@digest/023", + "system/contracts/capabilities.yaml": "@digest/024", + "system/contracts/cli-operations.yaml": "@digest/025", + "system/contracts/contract-register.yaml": "@digest/026", + "system/contracts/data-contract.yaml": "@digest/027", + "system/contracts/manifest-contract.yaml": "@digest/028", + "system/contracts/manifest-v15.schema.json": "@digest/029", + "system/contracts/normative-corpus.schema.json": "@digest/030", + "system/contracts/normative-corpus.yaml": "@digest/031", + "system/contracts/perimeter.yaml": "@digest/032", + "system/contracts/release-pair-receipt.schema.json": "@digest/033", + "system/contracts/review-consolidation.schema.json": "@digest/034", + "system/contracts/review-consolidation.yaml": "@digest/035", + "system/contracts/semantic-lineage-ledger.schema.json": "@digest/036", + "system/contracts/task-scope.yaml": "@digest/037", + "system/contracts/tree-contract.yaml": "@digest/038", + "system/contracts/validation-warning-baseline.schema.json": "@digest/039", + "system/schema/abilities.schema.json": "@digest/040", + "system/schema/ability-candidate.schema.json": "@digest/041", + "system/schema/ability-context.schema.json": "@digest/042", + "system/schema/ability-observation.schema.json": "@digest/043", + "system/schema/backup-manifest.schema.json": "@digest/044", + "system/schema/candidate-source-comparison.schema.json": "@digest/045", + "system/schema/capabilities/ability.candidate.append.schema.json": "@digest/046", + "system/schema/capabilities/ai-action.delivery.apply.schema.json": "@digest/047", + "system/schema/capabilities/atlas.question.save.schema.json": "@digest/048", + "system/schema/capabilities/capture.create.schema.json": "@digest/049", + "system/schema/capabilities/collection.entry.revise.schema.json": "@digest/050", + "system/schema/capabilities/concept.relations.change.schema.json": "@digest/051", + "system/schema/capabilities/coordination.section.revise.schema.json": "@digest/052", + "system/schema/capabilities/detour.create.schema.json": "@digest/053", + "system/schema/capabilities/detour.resolve.schema.json": "@digest/054", + "system/schema/capabilities/garden.seed.create.schema.json": "@digest/055", + "system/schema/capabilities/inbox.resolve.schema.json": "@digest/056", + "system/schema/capabilities/learner.ability-observation.append.schema.json": "@digest/057", + "system/schema/capabilities/learner.observation.append.schema.json": "@digest/058", + "system/schema/capabilities/learner.stage-result.append.schema.json": "@digest/059", + "system/schema/capabilities/legacy.archive.lock.publish.schema.json": "@digest/060", + "system/schema/capabilities/lineage.restamp.schema.json": "@digest/061", + "system/schema/capabilities/masters-planning.catalog.update.schema.json": "@digest/062", + "system/schema/capabilities/masters-planning.comparison.publish.schema.json": "@digest/063", + "system/schema/capabilities/module.attempt.record.schema.json": "@digest/064", + "system/schema/capabilities/module.materials.compact.schema.json": "@digest/065", + "system/schema/capabilities/module.plan.import.schema.json": "@digest/066", + "system/schema/capabilities/module.sitting.update.schema.json": "@digest/067", + "system/schema/capabilities/note.analysis.save.schema.json": "@digest/068", + "system/schema/capabilities/note.analysis.save_batch.schema.json": "@digest/069", + "system/schema/capabilities/note.create.schema.json": "@digest/070", + "system/schema/capabilities/note.evidence.add.schema.json": "@digest/071", + "system/schema/capabilities/note.revise.schema.json": "@digest/072", + "system/schema/capabilities/path.attachment.add.schema.json": "@digest/073", + "system/schema/capabilities/path.note.write.schema.json": "@digest/074", + "system/schema/capabilities/path.progress.update.schema.json": "@digest/075", + "system/schema/capabilities/project.create.schema.json": "@digest/076", + "system/schema/capabilities/project.update.schema.json": "@digest/077", + "system/schema/capabilities/review.apply.schema.json": "@digest/078", + "system/schema/capabilities/review.prepare.schema.json": "@digest/079", + "system/schema/capabilities/route.patch.schema.json": "@digest/080", + "system/schema/capabilities/source.feedback.record.schema.json": "@digest/081", + "system/schema/capabilities/source.intake.record.schema.json": "@digest/082", + "system/schema/capabilities/source.record.revise.schema.json": "@digest/083", + "system/schema/capabilities/stage.attachment.add.schema.json": "@digest/084", + "system/schema/capabilities/stage.note.write.schema.json": "@digest/085", + "system/schema/capabilities/stage.progress.update.schema.json": "@digest/086", + "system/schema/capabilities/unit.map.import.schema.json": "@digest/087", + "system/schema/capabilities/unit.material-synthesis.publish.schema.json": "@digest/088", + "system/schema/capabilities/unit.note.append.schema.json": "@digest/089", + "system/schema/capabilities/unit.plan.revise.schema.json": "@digest/090", + "system/schema/capabilities/unit.source-selection.set.schema.json": "@digest/091", + "system/schema/capabilities/workspace.next-action.update.schema.json": "@digest/092", + "system/schema/capability-envelope.schema.json": "@digest/093", + "system/schema/collections.schema.json": "@digest/094", + "system/schema/concept-relations.schema.json": "@digest/095", + "system/schema/concepts.schema.json": "@digest/096", + "system/schema/coordination.schema.json": "@digest/097", + "system/schema/goal-ledger.schema.json": "@digest/098", + "system/schema/health-report.schema.json": "@digest/099", + "system/schema/learner-observation.schema.json": "@digest/100", + "system/schema/learner-stage-result.schema.json": "@digest/101", + "system/schema/learning-path.schema.json": "@digest/102", + "system/schema/learning-plan.schema.json": "@digest/103", + "system/schema/learning-requirement.schema.json": "@digest/104", + "system/schema/legacy-archive-allowlist.schema.json": "@digest/105", + "system/schema/legacy-archive-lock.schema.json": "@digest/106", + "system/schema/legacy-archive-status.schema.json": "@digest/107", + "system/schema/master-planning-catalog.schema.json": "@digest/108", + "system/schema/master-planning-promotion-provenance.schema.json": "@digest/109", + "system/schema/master-planning-promotion.schema.json": "@digest/110", + "system/schema/masters-planning-dashboard.schema.json": "@digest/111", + "system/schema/material-comparison-defs.schema.json": "@digest/112", + "system/schema/material-span.schema.json": "@digest/113", + "system/schema/module-source-map.schema.json": "@digest/114", + "system/schema/module.schema.json": "@digest/115", + "system/schema/modules.schema.json": "@digest/116", + "system/schema/note.schema.json": "@digest/117", + "system/schema/plan-template.schema.json": "@digest/118", + "system/schema/program.schema.json": "@digest/119", + "system/schema/project-aliases.schema.json": "@digest/120", + "system/schema/project-relations.schema.json": "@digest/121", + "system/schema/project.schema.json": "@digest/122", + "system/schema/requests/ability.candidate.append.schema.json": "@digest/123", + "system/schema/requests/ability.context.schema.json": "@digest/124", + "system/schema/requests/ai-action.append-slices.schema.json": "@digest/125", + "system/schema/requests/ai-action.delivery.apply.schema.json": "@digest/126", + "system/schema/requests/ai-action.delivery.import.schema.json": "@digest/127", + "system/schema/requests/ai-action.delivery.validate.schema.json": "@digest/128", + "system/schema/requests/ai-action.list.schema.json": "@digest/129", + "system/schema/requests/ai-action.prepare.schema.json": "@digest/130", + "system/schema/requests/ai-action.status.schema.json": "@digest/131", + "system/schema/requests/atlas.context.schema.json": "@digest/132", + "system/schema/requests/atlas.question.save.schema.json": "@digest/133", + "system/schema/requests/backup.manifest.schema.json": "@digest/134", + "system/schema/requests/backup.verify.schema.json": "@digest/135", + "system/schema/requests/capabilities.read.schema.json": "@digest/136", + "system/schema/requests/capture.create.schema.json": "@digest/137", + "system/schema/requests/cli.capability.schema.json": "@digest/138", + "system/schema/requests/collection.entry.revise.schema.json": "@digest/139", + "system/schema/requests/concept.relations.change.schema.json": "@digest/140", + "system/schema/requests/coordination.section.revise.schema.json": "@digest/141", + "system/schema/requests/detour.create.schema.json": "@digest/142", + "system/schema/requests/detour.resolve.schema.json": "@digest/143", + "system/schema/requests/dossier.read.schema.json": "@digest/144", + "system/schema/requests/garden.seed.create.schema.json": "@digest/145", + "system/schema/requests/goal.decide.schema.json": "@digest/146", + "system/schema/requests/health.report.schema.json": "@digest/147", + "system/schema/requests/inbox.content.schema.json": "@digest/148", + "system/schema/requests/inbox.list.schema.json": "@digest/149", + "system/schema/requests/inbox.resolve.schema.json": "@digest/150", + "system/schema/requests/intelligence.scan.schema.json": "@digest/151", + "system/schema/requests/learner.ability-observation.append.schema.json": "@digest/152", + "system/schema/requests/learner.observation.append.schema.json": "@digest/153", + "system/schema/requests/learner.observe.schema.json": "@digest/154", + "system/schema/requests/learner.stage-result.append.schema.json": "@digest/155", + "system/schema/requests/legacy.archive.inspect.schema.json": "@digest/156", + "system/schema/requests/legacy.archive.lock.publish.schema.json": "@digest/157", + "system/schema/requests/legacy.archive.status.schema.json": "@digest/158", + "system/schema/requests/lineage.restamp.schema.json": "@digest/159", + "system/schema/requests/masters-planning.catalog.update.schema.json": "@digest/160", + "system/schema/requests/masters-planning.comparison.publish.schema.json": "@digest/161", + "system/schema/requests/masters-planning.dashboard.schema.json": "@digest/162", + "system/schema/requests/material.context.schema.json": "@digest/163", + "system/schema/requests/material.span.schema.json": "@digest/164", + "system/schema/requests/module.attempt.record.schema.json": "@digest/165", + "system/schema/requests/module.list.schema.json": "@digest/166", + "system/schema/requests/module.materials.compact.schema.json": "@digest/167", + "system/schema/requests/module.plan.import.schema.json": "@digest/168", + "system/schema/requests/module.sitting.update.schema.json": "@digest/169", + "system/schema/requests/note.analysis.prepare.schema.json": "@digest/170", + "system/schema/requests/note.analysis.save.schema.json": "@digest/171", + "system/schema/requests/note.analysis.save_batch.schema.json": "@digest/172", + "system/schema/requests/note.content.schema.json": "@digest/173", + "system/schema/requests/note.create.schema.json": "@digest/174", + "system/schema/requests/note.evidence.add.schema.json": "@digest/175", + "system/schema/requests/note.revise.schema.json": "@digest/176", + "system/schema/requests/note.search.schema.json": "@digest/177", + "system/schema/requests/operations.read.schema.json": "@digest/178", + "system/schema/requests/operator.bootstrap.schema.json": "@digest/179", + "system/schema/requests/path.attachment.add.schema.json": "@digest/180", + "system/schema/requests/path.note.write.schema.json": "@digest/181", + "system/schema/requests/path.progress.update.schema.json": "@digest/182", + "system/schema/requests/plan.edit-context.schema.json": "@digest/183", + "system/schema/requests/plan.template.schema.json": "@digest/184", + "system/schema/requests/program.list.schema.json": "@digest/185", + "system/schema/requests/project.create.schema.json": "@digest/186", + "system/schema/requests/project.inspect.schema.json": "@digest/187", + "system/schema/requests/project.list.schema.json": "@digest/188", + "system/schema/requests/project.update.schema.json": "@digest/189", + "system/schema/requests/projection.generate.schema.json": "@digest/190", + "system/schema/requests/related.read.schema.json": "@digest/191", + "system/schema/requests/repository.validate.schema.json": "@digest/192", + "system/schema/requests/resume.read.schema.json": "@digest/193", + "system/schema/requests/review.apply.schema.json": "@digest/194", + "system/schema/requests/review.prepare.schema.json": "@digest/195", + "system/schema/requests/route.patch.schema.json": "@digest/196", + "system/schema/requests/runtime.session.schema.json": "@digest/197", + "system/schema/requests/semantic.query.schema.json": "@digest/198", + "system/schema/requests/session.end.schema.json": "@digest/199", + "system/schema/requests/source.feedback.record.schema.json": "@digest/200", + "system/schema/requests/source.intake.record.schema.json": "@digest/201", + "system/schema/requests/source.record.revise.schema.json": "@digest/202", + "system/schema/requests/stage.attachment.add.schema.json": "@digest/203", + "system/schema/requests/stage.note.write.schema.json": "@digest/204", + "system/schema/requests/stage.progress.update.schema.json": "@digest/205", + "system/schema/requests/status.read.schema.json": "@digest/206", + "system/schema/requests/unit.list.schema.json": "@digest/207", + "system/schema/requests/unit.map.import.schema.json": "@digest/208", + "system/schema/requests/unit.material-synthesis.publish.schema.json": "@digest/209", + "system/schema/requests/unit.note.append.schema.json": "@digest/210", + "system/schema/requests/unit.plan.revise.schema.json": "@digest/211", + "system/schema/requests/unit.source-selection.set.schema.json": "@digest/212", + "system/schema/requests/workspace.next-action.update.schema.json": "@digest/213", + "system/schema/resume.schema.json": "@digest/214", + "system/schema/runtime-session.schema.json": "@digest/215", + "system/schema/session-context.schema.json": "@digest/216", + "system/schema/session-plan.schema.json": "@digest/217", + "system/schema/sources.schema.json": "@digest/218", + "system/schema/study-map.schema.json": "@digest/219", + "system/schema/thematic-groups.schema.json": "@digest/220", + "system/schema/transaction-receipt.schema.json": "@digest/221", + "system/schema/ui-responses.schema.json": "@digest/222", + "system/schema/unit-material-synthesis.schema.json": "@digest/223", + "system/schema/unit.schema.json": "@digest/224", + "system/schema/workspace.schema.json": "@digest/225", + "work/COORDINATION.md": "@digest/226", + "work/active/workspace-demo/CONTEXT.md": "@digest/227" } } } diff --git a/tests/architecture/engine-contract-inputs.json b/tests/architecture/engine-contract-inputs.json new file mode 100644 index 00000000..3c4ac485 --- /dev/null +++ b/tests/architecture/engine-contract-inputs.json @@ -0,0 +1,33 @@ +{ + "files": { + "system/contracts/review-consolidation.schema.json": "{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"type\":\"object\",\"required\":[\"schema_version\",\"findings\"],\"properties\":{\"schema_version\":{\"const\":1},\"findings\":{\"type\":\"array\",\"minItems\":42,\"items\":{\"type\":\"object\",\"required\":[\"id\",\"source\",\"root_cause\",\"owner\",\"affected_callers\",\"existing_repair\",\"regression_tests\",\"disposition\",\"measured_evidence\",\"source_status\",\"hosted_ci_status\",\"installed_status\"],\"properties\":{\"disposition\":{\"enum\":[\"already-inherited\",\"implemented\",\"implemented-opt-in\",\"rejected-as-unsafe\"]}}}}},\"additionalProperties\":false}\n", + "system/contracts/review-consolidation.yaml": "schema_version: 1\nfindings:\n- id: G30\n source: '#30'\n root_cause: route-wide inspection union\n owner: material slicing / inspection authority (route, URI, pages)\n affected_callers: CLI,gateway,AI delivery,agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_material_slices.py\n disposition: already-inherited\n measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/store/materials/slices.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/materials.py\n - tools/learning_os/app/handlers/ai.py\n- id: G31\n source: '#31'\n root_cause: audit eligibility vs actionability split\n owner: claim audit semantics owner\n affected_callers: CLI,gateway,agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_claim_status_audits.py\n disposition: already-inherited\n measured_evidence: tests/test_claim_status_audits.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/derive/semantics/claim_audits.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/goals.py\n - tools/learning_os/app/handlers/reads.py\n- id: G32\n source: '#32'\n root_cause: reviewed edit/evidence non-atomic\n owner: prospective state commit owner\n affected_callers: gateway,agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_claim_status_audits.py\n disposition: already-inherited\n measured_evidence: tests/test_claim_status_audits.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/claim_admission.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: G33\n source: '#33'\n root_cause: page expression parsed repeatedly\n owner: page-expression parser\n affected_callers: CLI,AI delivery\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_material_slices.py\n disposition: already-inherited\n measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/store/materials/slices.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/materials.py\n - tools/learning_os/app/handlers/ai.py\n- id: G34\n source: '#34'\n root_cause: file resolution identity drift\n owner: locator segmentation owner\n affected_callers: CLI,gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_material_slices.py\n disposition: already-inherited\n measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/store/materials/resolution.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/materials.py\n - tools/learning_os/app/handlers/ai.py\n- id: G35\n source: '#35'\n root_cause: range/path evidence widened\n owner: exact range/path evidence owner\n affected_callers: CLI,gateway,AI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_material_slices.py\n disposition: already-inherited\n measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/store/materials/slices.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/materials.py\n - tools/learning_os/app/handlers/ai.py\n- id: G36\n source: '#36'\n root_cause: state transition drops attributes\n owner: goal transition owner\n affected_callers: CLI,UI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_goal_lifecycle_properties.py\n disposition: already-inherited\n measured_evidence: tests/test_goal_lifecycle_properties.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/goals.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/goals.py\n - tools/learning_os/app/handlers/reads.py\n- id: O37\n source: '#37'\n root_cause: AI delivery accounting split\n owner: session accounting owner\n affected_callers: AI delivery,gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_ai_actions.py\n disposition: already-inherited\n measured_evidence: tests/test_ai_actions.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/ai.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O38\n source: '#38'\n root_cause: backup alias validated after mutation\n owner: backup alias validation\n affected_callers: CLI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_c1e_backup_symlinked_subtree.py\n disposition: already-inherited\n measured_evidence: tests/test_c1e_backup_symlinked_subtree.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/backup_manifest.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O39\n source: '#39'\n root_cause: scaffold self-invalidating pins\n owner: scaffold lineage owner\n affected_callers: gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_phaseB_prospective_lineage.py\n disposition: already-inherited\n measured_evidence: tests/test_phaseB_prospective_lineage.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/plan.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O40\n source: '#40'\n root_cause: compact refs lose identity; one bad resource hides rest\n owner: compact reference owner\n affected_callers: CLI,gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_plan_rigor.py\n disposition: already-inherited\n measured_evidence: tests/test_plan_rigor.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/derive/validation/plan_rigor.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O41\n source: '#41'\n root_cause: metadata ops rewrite body bytes\n owner: note bytes owner\n affected_callers: gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_note_evidence.py\n disposition: already-inherited\n measured_evidence: tests/test_note_evidence.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/notes.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O42\n source: '#42'\n root_cause: transaction invariants ignore effect kind\n owner: transaction recovery owner\n affected_callers: gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_transaction_faults.py\n disposition: already-inherited\n measured_evidence: tests/test_transaction_faults.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/store/transactions.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O43\n source: '#43'\n root_cause: missing refs mutate; reactivation keeps completion\n owner: detour/reactivation owner\n affected_callers: gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_curriculum_v2.py\n disposition: already-inherited\n measured_evidence: tests/test_curriculum_v2.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/maps.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O44\n source: '#44'\n root_cause: legacy route identity inconsistent\n owner: route identity boundary\n affected_callers: CLI,gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_plan_rigor.py\n disposition: already-inherited\n measured_evidence: tests/test_plan_rigor.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/derive/validation/plan_rigor.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n- id: O45\n source: '#45'\n root_cause: derived impact/session/totals disagree\n owner: derived impact owner\n affected_callers: CLI,UI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_intelligence_scan.py\n disposition: already-inherited\n measured_evidence: tests/test_intelligence_scan.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/ranking.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/goals.py\n - tools/learning_os/app/handlers/reads.py\n- id: O46\n source: '#46'\n root_cause: absence claims not per-material\n owner: absence claim owner\n affected_callers: CLI,AI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_material_slices.py\n disposition: already-inherited\n measured_evidence: tests/test_material_slices.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/store/materials/slices.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/materials.py\n - tools/learning_os/app/handlers/ai.py\n- id: O47\n source: '#47'\n root_cause: ranking erases alternative roles\n owner: ranking owner\n affected_callers: CLI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_goal_select.py\n disposition: already-inherited\n measured_evidence: tests/test_goal_select.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/ranking.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - tools/learning_os/app/handlers/goals.py\n - tools/learning_os/app/handlers/reads.py\n- id: I49\n source: '#49'\n root_cause: wire-layout change missed consumers\n owner: compact output consumers\n affected_callers: CLI,procedures,UI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_procedures.py\n disposition: already-inherited\n measured_evidence: tests/test_procedures.py; external promotion record implementation/OUTCOME.md\n source_status: inherited-regression-covered\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/reads.py\n caller_paths:\n - tools/learning_os/app/pipeline.py\n - tools/learning_os/adapters/cli.py\n - system/procedures/start-here.md\n - system/procedures/bootstrap-order.md\n- id: R50\n source: '#50'\n root_cause: write keys not explicit/unique\n owner: tools/agent_run.py plan validation\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/agent_run.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R51\n note: projection.observe is approved under the authorized D07 plan and registered in the generated CLI; agent\n dependencies and UI recovery call the shared authority service with distinct policies\n source: '#51'\n root_cause: dependency readiness weak\n owner: projection readiness service\n affected_callers: agent plan,UI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_projection_readiness.py\n disposition: implemented\n measured_evidence: tests/test_projection_readiness.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/projection_readiness.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n - tools/learning_os/app/handlers/platform.py\n - ../obsidian-ui/src/main.ts\n - ../obsidian-ui/src/gateway-client.ts\n- id: R52\n source: '#52'\n root_cause: failed validation read as clean\n owner: typed diagnostic service\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/validation_service.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n - tools/learning_os/app/validation_service.py\n- id: R53\n source: '#53'\n root_cause: root/code/session conflated\n owner: runner adapter binding\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/agent_run.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R54\n source: '#54'\n root_cause: byte budget ignores wrappers\n owner: report budgeting owner\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/agent_reporting.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R55\n source: '#55'\n root_cause: expansions fictitious\n owner: cluster expansion owner\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/agent_run.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R56\n source: '#56'\n root_cause: nonfinite output loses outcomes\n owner: step outcome handling\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/agent_plans.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R57\n source: '#57'\n root_cause: absent vs null conflated\n owner: summary owner\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/agent_run.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R58\n source: Muse session proposal\n root_cause: writes without stable session\n owner: session binding owner\n affected_callers: agent plan,gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/agent_run.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R59\n source: Muse failure proposal\n root_cause: later writes after failure\n owner: stop policy owner\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/agent_plans.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: R60\n source: integration follow-up\n root_cause: tools bypass parser/vocabulary/typing\n owner: runner extraction owners\n affected_callers: agent plan,CI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/test_agent_run.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/domain/agent_plans.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: E01\n source: efficiency\n root_cause: per-call handler reload\n owner: ReadSession (app/read_session.py)\n affected_callers: CLI,agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_read_session.py\n disposition: implemented\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/read_session.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n - tools/learning_os/app/ranking.py\n - tools/learning_os/derive/semantics/scan.py\n - tools/learning_os/app/context.py\n - tools/learning_os/app/projection.py\n- id: E02\n source: efficiency\n root_cause: serial-only reads\n owner: process workers (adapters/agent_workers.py)\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_read_session.py\n disposition: implemented-opt-in\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented-opt-in\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/adapters/agent_workers.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n - tools/learning_os/adapters/agent_workers.py\n - tools/learning_os/app/lock.py\n- id: E03\n source: efficiency\n root_cause: repeated reads rediscover\n owner: memo under dependency pins\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_read_session.py\n disposition: implemented\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/read_session.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: E04\n source: efficiency\n root_cause: no plan deadline\n owner: deadline admission (app/agent_plans.py)\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/agent_plans.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: E05\n source: efficiency\n root_cause: preflight rescans\n owner: validation cache pins + typed diagnostics\n affected_callers: agent plan,validation tools\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_validation_cache.py\n disposition: implemented\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/validation_service.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n - tools/learning_os/app/validation_service.py\n- id: E06\n source: efficiency\n root_cause: per-step caps unbounded total\n owner: complete report budget (app/agent_reporting.py)\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_agent_run.py\n disposition: implemented\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/agent_reporting.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: E07\n source: efficiency\n root_cause: anecdotal efficiency claims\n owner: benchmark matrix\n affected_callers: agent plan\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/benchmark_agent_plans.py\n disposition: implemented\n measured_evidence: tests/benchmark_agent_plans.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tests/benchmark_agent_plans.py\n caller_paths:\n - tools/agent_run.py\n - tools/learning_os/app/agent_plans.py\n- id: E08\n source: efficiency\n root_cause: runner not default route\n owner: OPERATOR + agent-plans procedure\n affected_callers: agents,UI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_procedures.py\n disposition: implemented\n measured_evidence: tests/test_procedures.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: system/procedures/agent-plans.md\n caller_paths:\n - system/OPERATOR.md\n - system/procedures/agent-plans.md\n- id: E09\n source: efficiency\n root_cause: CI bootstrap ad hoc\n owner: guarded pre-push bootstrap mode\n affected_callers: CI\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_pre_push_hook.py\n disposition: implemented\n measured_evidence: tests/test_pre_push_hook.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/hooks/pre-push\n caller_paths:\n - tools/hooks/pre-push\n - .github/workflows/release-pair.yml\n- id: E10\n source: efficiency\n root_cause: endless review cycles\n owner: this register + fixed budgets\n affected_callers: all\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_review_consolidation.py\n disposition: implemented\n measured_evidence: tests/test_review_consolidation.py; external promotion record implementation/OUTCOME.md\n source_status: implemented\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: system/contracts/review-consolidation.yaml\n caller_paths:\n - tests/test_review_consolidation.py\n- id: E11\n source: Gemini envelope suggestion\n root_cause: file-reference bypass risk\n owner: inline reviewed revision retained\n affected_callers: gateway\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_note_create.py\n disposition: rejected-as-unsafe\n measured_evidence: tests/test_note_create.py; external promotion record implementation/OUTCOME.md\n source_status: rejected-as-unsafe\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/notes.py\n caller_paths:\n - tools/seal_envelope.py\n - tools/learning_os/app/handlers/notes.py\n- id: E12\n source: Gemini evidence suggestion\n root_cause: generated quotation risk\n owner: safe scaffolds retained\n affected_callers: AI delivery\n existing_repair: 'recorded main history through PR #48 / runner 3604c43'\n regression_tests: tests/test_verbatim_anchor_admission.py\n disposition: rejected-as-unsafe\n measured_evidence: tests/test_verbatim_anchor_admission.py; external promotion record implementation/OUTCOME.md\n source_status: rejected-as-unsafe\n hosted_ci_status: external-promotion-record\n installed_status: external-promotion-record\n owner_path: tools/learning_os/app/handlers/synthesis.py\n caller_paths:\n - tools/learning_os/app/handlers/synthesis.py\n - tools/learning_os/app/handlers/ai.py\n", + "system/contracts/agent-plan-input.schema.json": "{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"type\":\"object\",\"properties\":{\"schema_version\":{\"enum\":[1,2]},\"session_id\":{\"type\":\"string\",\"maxLength\":128},\"on_error\":{\"enum\":[\"stop\",\"continue\"]},\"read_workers\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":4},\"deadline_s\":{\"type\":\"number\",\"exclusiveMinimum\":0},\"report_max_bytes\":{\"type\":\"integer\",\"minimum\":1024},\"steps\":{\"type\":\"array\",\"minItems\":1,\"maxItems\":256}},\"required\":[\"steps\"],\"additionalProperties\":false}\n", + "system/contracts/task-scope.yaml": "# The task-scope contract: what binds a task, stated instead of judged.\n#\n# The normative corpus answers what binds. This file answers what binds\n# *this* task: the entry read that starts it, the executable procedure that\n# carries it, and the current binding documents that scope it.\n#\n# system/OPERATOR.md renders its \"Start here\" table from this file, so the\n# operator contract and the machine surface cannot disagree. A scope entry\n# is a whole document or one of its level-2 sections (`path#anchor`), and\n# `capabilities TASK --json` inlines every procedure and scoped section,\n# bounded. Every scoped document must be a current binding document in\n# system/contracts/normative-corpus.yaml; every procedure must name a\n# runnable system/procedures/*.md transcript and a heading that exists in\n# it; every command in an entry read must be a real CLI verb.\ncontract: learningos-task-scope\nschema_version: 1\n\ntasks:\n - id: discover-capabilities\n task: Discover capabilities\n entry_read: '`capabilities --compact --json`, then `capabilities NAME --json`'\n procedures:\n - label: Discover and expand\n target: system/procedures/start-here.md#discover-the-capability-index\n scope:\n - system/OPERATOR.md\n\n - id: log-a-line\n task: Log a line (`log:`)\n entry_read: '`capabilities capture.create --json`, or `capabilities stage.note.write --json` for an identified stage'\n procedures:\n - label: Log to the stage\n target: system/procedures/capture-routing.md#a-logged-line-for-an-identified-stage-is-one-stage-note-write\n - label: log to the inbox\n target: system/procedures/capture-routing.md#a-logged-line-with-no-stage-is-one-inbox-capture\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#2-capture-temporary-material\n - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\n\n - id: record-stage-progress\n task: Record stage progress or end a session\n entry_read: '`capabilities stage.progress.update --json`'\n procedures:\n - label: Read the stage-progress payload\n target: system/procedures/end-a-session.md#read-the-stage-progress-payload-contract\n - label: review the session\n target: system/procedures/end-a-session.md#step-3-review-the-session\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#22-end-a-session\n - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\n\n - id: create-or-revise-a-durable-note\n task: Create or revise a durable note\n entry_read: '`capabilities note.create --json`, or `capabilities note.revise --json` for an existing note'\n procedures:\n - label: Search for an existing note first\n target: system/procedures/create-durable-note.md#search-for-an-existing-note-with-the-same-purpose\n - label: the creation payload\n target: system/procedures/create-durable-note.md#seal-the-creation-with-derived-guards\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#3-create-or-evolve-a-durable-note\n - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\n\n - id: save-source-analyses\n task: Save source analyses\n entry_read: '`capabilities note.analysis.save_batch --json`'\n procedures:\n - label: Draft one batch\n target: system/procedures/save-a-batch-of-source-analyses.md#draft-the-first-batch-two-notes-one-drafts-file\n - label: prepare it\n target: system/procedures/save-a-batch-of-source-analyses.md#prepare-the-first-batch\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25b-save-a-batch-of-source-analyses\n - system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\n\n - id: edit-a-known-material-route\n task: Edit a known material route\n entry_read: '`plan-edit-context UNIT_ID --route-id ROUTE_ID` or `--route-ids A B`'\n procedures:\n - label: Revise a plan\n target: system/procedures/revise-an-existing-plan.md#start-from-the-named-routes-edit-context\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25a-revise-an-existing-plan\n - system/ARCHITECTURE.md#14a-module-first-curriculum-model\n\n - id: edit-a-known-stage\n task: Edit a known stage\n entry_read: '`plan-edit-context UNIT_ID --stage-id STAGE_ID`'\n procedures:\n - label: Enter through the stage\n target: system/procedures/bootstrap-order.md#enter-through-the-named-stage\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25a-revise-an-existing-plan\n - system/ARCHITECTURE.md#14a-module-first-curriculum-model\n\n - id: unit-coverage-and-unknown-ids\n task: Unit coverage, source completeness, or unknown IDs\n entry_read: '`plan-edit-context UNIT_ID --brief`'\n procedures:\n - label: Choose the focused context\n target: system/procedures/start-here.md#follow-one-printed-expansion-with-its-snapshot-pin\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25a-revise-an-existing-plan\n - system/WORKFLOWS.md#26-source-routing-and-feedback\n\n - id: open-work-or-priority-question\n task: Open work or priority question\n entry_read: '`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination'\n procedures:\n - label: Read operational state\n target: system/procedures/retrieval-behavior.md#orient-operational-questions-from-the-brief\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\n - system/CLAUDE.md\n\n - id: known-record-or-stage-note\n task: Known record or stage note\n entry_read: '`inspect ID`, including a batch of known IDs'\n procedures:\n - label: Read one record\n target: system/procedures/start-here.md#read-one-named-record\n - label: read one stage note\n target: system/procedures/start-here.md#read-one-named-stage-with-its-working-note-content\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\n\n - id: note-body-or-saved-reasoning\n task: Note body or saved reasoning\n entry_read: '`note-read NOTE_ID`'\n procedures:\n - label: Read saved reasoning\n target: system/procedures/start-here.md#search-beyond-note-summaries-then-read-the-saved-reasoning\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\n\n - id: material-or-concept-explanation\n task: Material or concept explanation\n entry_read: '`material-context`, then an exact `material-span` when needed'\n procedures:\n - label: Retrieve explanations\n target: system/procedures/retrieval-behavior.md#read-what-explains-it\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#26-source-routing-and-feedback\n\n - id: resume-recorded-study\n task: Resume recorded study\n entry_read: '`resume` or `resume --study`'\n procedures:\n - label: Resume without moving state\n target: system/procedures/start-here.md#the-study-suggestion-never-moves-the-resume-pointer\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\n - system/CLAUDE.md\n\n - id: changes-awaiting-a-decision\n task: Changes awaiting a decision\n entry_read: '`intelligence-scan --brief --json`'\n procedures:\n - label: Read the decision queue\n target: system/procedures/start-here.md#read-what-wants-a-decision\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#30-review-exact-goal-decisions-together\n\n - id: ability-evidence\n task: Ability evidence\n entry_read: '`ability-context` horizon, then a known ability'\n procedures:\n - label: Read a bounded ability\n target: system/procedures/start-here.md#read-one-ability-through-the-bounded-horizon\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#8-record-evidence\n\n - id: governance-question\n task: Governance question\n entry_read: '`semantic --list`, then `semantic PREDICATE --input k=v`'\n procedures:\n - label: Ask the semantic surface\n target: system/procedures/start-here.md#ask-a-governance-question-through-the-semantic-surface\n scope:\n - system/OPERATOR.md\n - system/SEMANTIC-CONTRACT.md\n\n - id: process-a-lecture\n task: Process a lecture (23)\n entry_read: '`capabilities module.plan.import --json`, then `plan-edit-context UNIT_ID --brief`'\n procedures:\n - label: Process a lecture end to end\n target: system/procedures/process-a-lecture.md#materials-in-the-deck-lands-in-the-materials-tree\n - label: Package, preflight and apply the lecture unit\n target: system/procedures/process-a-lecture.md#package-and-preflight-the-lecture-unit\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#23-process-a-lecture\n - system/WORKFLOWS.md#6-add-or-evaluate-a-source\n\n - id: untranscribable-workflows\n task: Turn the semester (24), promote a Master's module (27)\n entry_read: none — stop and ask\n procedures: []\n procedure_text: >-\n none: these two have no executable transcript, and the scope authority\n they need does not exist in a checkout (boundary 18)\n scope:\n - system/OPERATOR.md\n - system/WORKFLOWS.md#24-turn-the-semester\n - system/WORKFLOWS.md#27-promote-a-future-masters-module\n" + }, + "inventory": [ + "system/contracts/agent-plan-input.schema.json", + "system/contracts/agent-plan-report.schema.json", + "system/contracts/ai-actions/garden.shelve.yaml", + "system/contracts/ai-actions/unit.compare-materials.yaml", + "system/contracts/ai-adapters.yaml", + "system/contracts/backup-roots.yaml", + "system/contracts/capabilities.yaml", + "system/contracts/cli-operations.yaml", + "system/contracts/contract-register.yaml", + "system/contracts/data-contract.yaml", + "system/contracts/manifest-contract.yaml", + "system/contracts/manifest-v15.schema.json", + "system/contracts/normative-corpus.schema.json", + "system/contracts/normative-corpus.yaml", + "system/contracts/perimeter.yaml", + "system/contracts/release-pair-receipt.schema.json", + "system/contracts/review-consolidation.schema.json", + "system/contracts/review-consolidation.yaml", + "system/contracts/semantic-lineage-ledger.schema.json", + "system/contracts/task-scope.yaml", + "system/contracts/tree-contract.yaml", + "system/contracts/validation-warning-baseline.schema.json" + ], + "recorded_revision": "d3d3b3510349f84cee2d7aca1b8601330409539d" +} diff --git a/tests/architecture/ratchets.yaml b/tests/architecture/ratchets.yaml index 19aa6d87..9eb2119f 100644 --- a/tests/architecture/ratchets.yaml +++ b/tests/architecture/ratchets.yaml @@ -76,6 +76,18 @@ checks: since: approved approved_by: 'Aram 2026-10-13: take over phase 4 work and finish it as fast as possible' + # Non-canonical writes: an immutable envelope copy inside a temporary + # directory, and retention deleting disposable report directories that + # are required to live outside the data root. Neither touches canonical + # LearningOS files. + - signature: tools/learning_os/adapters/agent_runner.py::_session_bound_envelope::write_bytes + count: 1 + since: approved + approved_by: 'Aram 2026-10-27: take over fixing the found issues' + - signature: tools/learning_os/app/agent_reporting.py::prune_reports::shutil.rmtree + count: 1 + since: approved + approved_by: 'Aram 2026-10-27: take over fixing the found issues' A3-prose: - signature: tools/learning_os/domain/plan_import.py::inventory_block::method::``` count: 1 diff --git a/tests/architecture/runtime-benchmark-baseline.json b/tests/architecture/runtime-benchmark-baseline.json new file mode 100644 index 00000000..81316a0c --- /dev/null +++ b/tests/architecture/runtime-benchmark-baseline.json @@ -0,0 +1,77 @@ +{ + "environment": { + "machine": "arm64", + "python": "3.14.4", + "python_loader": false, + "system": "Darwin" + }, + "measurement_source": { + "dirty": true, + "fixture_builders_sha256": { + "conftest.py": "5e5fd470b75e3beb59b3ac2c350931bd93a2b463b9aaab1275c1f3e43e47023c", + "repo_builders.py": "7397f93cd0317ac3ba6fff92ceb0f28c7e9dd67aeb61ee6af28787abc4605746" + }, + "head": "d4b9054b70924cf17f10a8b6db65bbe2b054602e", + "producer_sha256": "f757c7abd0ff9b9588ebd59862731cdd0cfb0dd4cda698d00f5ded0ebb70a462" + }, + "median_seconds": { + "generate_loaded_repo": 0.09294054203201085, + "load": 0.0024079999420791864, + "total": 0.24572929192800075, + "validate_loaded_repo": 0.1502347500063479 + }, + "sample_seconds": [ + { + "generate_loaded_repo": 0.09294054203201085, + "load": 0.0024079999420791864, + "total": 0.24731670902110636, + "validate_loaded_repo": 0.15196816704701632 + }, + { + "generate_loaded_repo": 0.09312320896424353, + "load": 0.0023713329574093223, + "total": 0.24572929192800075, + "validate_loaded_repo": 0.1502347500063479 + }, + { + "generate_loaded_repo": 0.09053074999246746, + "load": 0.0025986250257119536, + "total": 0.24248108395840973, + "validate_loaded_repo": 0.1493517089402303 + } + ], + "schema_version": 1, + "semantic": { + "issues": [ + "W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '\u00a71' \u2014 the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]", + "W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' \u2014 the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]", + "W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' \u2014 the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]", + "W MATERIALS-MANIFEST: no records/materials-manifest.yaml \u2014 the external materials tree has no durable inventory, so data loss there is undetectable; build it with `.venv/bin/python tools/materials_manifest.py --build` [records/]" + ], + "output_bytes": 33492, + "output_sha256": { + "backlinks.json": "0dedc0a57ee53fd0a20376292c06830010312a987bedc68fc3ae0a4c24a56311", + "concept-canvas.canvas": "82447b86e9785d8d0c44840666207a972aca7e46c6e95e03f81c323d0721796c", + "concept-index.md": "9cedc886558aa14c8df290b61bc5923bca8113ca2e6bcb2a09915b763731f8dc", + "concept-map.md": "1b86564633cbf0577536399ce0053edabef5be0cd1c973258704ce2633d05458", + "coordination-view.md": "2bf35d1cbde4e1f9944e2b48874e62fab631cbdef7dd254fcbbe6b757086149a", + "dependency-report.md": "13f3eba7e554ee161f6bb4ca783a90c1aa58d8abe54a8c54cc93bd6413f3c9d8", + "domain-atlas.md": "d3ef0469a3ce9b71d891118a9fc0101542d73d32f08b443b22e9523fb9d80985", + "learner-interpretations.json": "9be0eea0bb4c72ac66ac063687cbce2977a5dcde233c6cc9d6d1d73455f8e065", + "learner-interpretations.md": "44d79a72d9ce1bc13120a394a0fa9b491d934edd3fd68b812464b5210ab60ae2", + "learning-requirements.json": "ebb6e8a94d81c013116d9ca4000ee8b7ee7fe82978df949266ec429b28aa2378", + "learning-requirements.md": "d88943232f8c50b50b6f9f8ecea722660aaa4855c58d3b0da8a9fcb67bc5bb21", + "library.md": "93f7346ac6a7a784182b22d938ae93dce26d7a6ebe0705ffc5e87d16e1d97dbd", + "manifest.identity.json": "5a04072239c1221ab8bfa101757737fcf675451d2d90006717ffe391926135ee", + "manifest.json": "bd13750eee5185ce397d646251ed8dafa75a7899b99aa85a8cb2bac46cf7a693", + "module-view.md": "8d887b64caa853c2f9e28fea11363a072779c4d707d4946d6972b45ff8797ad0", + "nebula.md": "0f9d575ab6f57e817efd5fbde8e9da58e4e21822087af5910ad34e2f9a24311a", + "reading-room.md": "2cef013b54002c73654a777f22635ce44825eafd7dfbeae5ef12dd5e6e766c6e", + "reports/health.md": "f7fccf69442148e9a5f364d6f3c285df95eadcb6eda5663314e40819103202c8", + "source-index.md": "1f0a084349304c6b337ca88da8e3d029743d30b4d8d38e929b4db8b778c55a5e", + "study-plans.md": "db9cc95429221fb3c8356f82844f7e5e80f38795521ad13c29e2b7851451ba39" + } + }, + "warmup_excluded": 1, + "workload": "synthetic-demo-v1" +} diff --git a/tests/architecture/surface-approvals.yaml b/tests/architecture/surface-approvals.yaml index 98c4aa81..feba6255 100644 --- a/tests/architecture/surface-approvals.yaml +++ b/tests/architecture/surface-approvals.yaml @@ -360,6 +360,15 @@ approvals: # command. Aram told the session to execute that plan on 2026-10-23 and then # approved landing its changes ("approved do as you see fit"). - {key: "tools.seal_envelope.py", change: changed, plan_ref: "AGENT-COST-2026-10-23 D1", pre_approved_by: "Aram 2026-10-23: told the session to execute the agent-cost plan, then 'approved do as you see fit' for landing it"} - - {change: added, key: request_schemas.projection.observe.schema.json, plan_ref: Systemwide consolidation PLAN D07 / Step 3, pre_approved_by: 'Aram 2026-10-26: if not you finish the job to its end; finish up (execution of the supplied plan including projection.observe)'} - - {change: added, key: cli.projection-observe, plan_ref: Systemwide consolidation PLAN D07 / Step 3, pre_approved_by: 'Aram 2026-10-26: if not you finish the job to its end; finish up (execution of the supplied plan including projection.observe)'} - - {change: added, key: catalog.commands.projection.observe, plan_ref: Systemwide consolidation PLAN D07 / Step 3, pre_approved_by: 'Aram 2026-10-26: if not you finish the job to its end; finish up (execution of the supplied plan including projection.observe)'} + # New explicit approval of retaining the public command. This replaces the + # earlier interpreted wording; it does not assert an approval on 2026-10-26. + # Answer to: "Do you approve retaining projection-observe as a public CLI command now?" + - {change: added, key: request_schemas.projection.observe.schema.json, plan_ref: Improvement list item 45, pre_approved_by: 'Aram 2026-10-27: Approve retaining it now'} + - {change: added, key: cli.projection-observe, plan_ref: Improvement list item 45, pre_approved_by: 'Aram 2026-10-27: Approve retaining it now'} + - {change: added, key: catalog.commands.projection.observe, plan_ref: Improvement list item 45, pre_approved_by: 'Aram 2026-10-27: Approve retaining it now'} + # Improvement item 8 added explicit session/lock invocation controls to + # OpContext. Authorized by Aram's instruction to implement the improvement + # list; this records implementation authorization, not merge approval. + # Section 15 exact-head review of this protected file remains Aram's. + - {change: added, key: opcontext.session_id, plan_ref: Improvement list item 8, pre_approved_by: 'Aram 2026-10-27: authorized implementing the improvement list (do all fixes that improve the system from the list)'} + - {change: added, key: opcontext.lock_timeout_s, plan_ref: Improvement list item 8, pre_approved_by: 'Aram 2026-10-27: authorized implementing the improvement list (do all fixes that improve the system from the list)'} diff --git a/tests/architecture/surface.json b/tests/architecture/surface.json index ee10eb5c..8750e712 100644 --- a/tests/architecture/surface.json +++ b/tests/architecture/surface.json @@ -9474,10 +9474,12 @@ "channel": "field: str", "gateway": "field: GatewayRequestContext | None", "invocation": "field: str", + "lock_timeout_s": "field: float | None", "operation": "field: str", "repo": "method: (self) -> 'Repo'", "require_snapshot": "method: (self, expected: 'str | None') -> 'None'", "root": "field: Path", + "session_id": "field: str | None", "snapshot_id": "method: (self) -> 'str'" }, "request_schemas": { diff --git a/tests/benchmark_agent_plans.py b/tests/benchmark_agent_plans.py index 7ed735bd..aa5c8124 100644 --- a/tests/benchmark_agent_plans.py +++ b/tests/benchmark_agent_plans.py @@ -243,8 +243,6 @@ def main(): ("W1-distinct-warm", None, 1, True), ("W2-repeated", 20, 1, True), ("W3-distinct-cold", None, 1, False), - ("W9-workers-2", None, 2, True), - ("W9-workers-4", None, 4, True), ] for label, repeats, workers, warm in definitions: samples = [] diff --git a/tests/benchmark_runtime.py b/tests/benchmark_runtime.py index 926183f0..3cf75b71 100644 --- a/tests/benchmark_runtime.py +++ b/tests/benchmark_runtime.py @@ -1,8 +1,8 @@ -"""Read-only runtime benchmark: python tests/benchmark_runtime.py [--samples 3]. +"""Non-gating runtime measurements on a disposable, deterministic repository. -Each sample uses a fresh process. Generation is computed in memory; neither -canonical data nor live generated files are written. Output digests allow -before/after comparisons to check that faster execution preserves results. +Each timed sample starts a fresh process; fixture setup and warmup are excluded. +Generation stays in memory. --root opts into an existing read-only repository; +make bench always uses the synthetic workload and the committed baseline. """ from __future__ import annotations @@ -10,9 +10,12 @@ import argparse import hashlib import json +import os +import platform import statistics import subprocess import sys +import tempfile import time from pathlib import Path @@ -20,11 +23,10 @@ sys.path.insert(0, str(ROOT / "tools")) -def sample(*, python_loader: bool = False) -> dict: +def sample(root: Path, *, python_loader: bool = False) -> dict: if python_loader: import yaml - # Reproduce the original parser without editing production code. if hasattr(yaml, "CSafeLoader"): del yaml.CSafeLoader @@ -33,7 +35,7 @@ def sample(*, python_loader: bool = False) -> dict: from learning_os.store.loader import load_repo started = time.perf_counter() - repo = load_repo(ROOT) + repo = load_repo(root) loaded = time.perf_counter() issues = validate(repo, online=False) validated = time.perf_counter() @@ -55,35 +57,91 @@ def sample(*, python_loader: bool = False) -> dict: } -def main() -> None: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--samples", type=int, default=3) - parser.add_argument("--python-loader", action="store_true", - help="compare with the original pure-Python safe parser") - parser.add_argument("--sample", action="store_true", help=argparse.SUPPRESS) - args = parser.parse_args() - if args.sample: - print(json.dumps(sample(python_loader=args.python_loader))) - return - if args.samples < 1: - parser.error("--samples must be positive") - command = [sys.executable, __file__, "--sample"] +def _measure(args, root: Path, env: dict) -> dict: + command = [sys.executable, __file__, "--sample", "--root", str(root)] if args.python_loader: command.append("--python-loader") - samples = [json.loads(subprocess.check_output( - command, cwd=ROOT, text=True, - )) for _ in range(args.samples)] + rows = [json.loads(subprocess.check_output(command, cwd=ROOT, text=True, env=env)) + for _ in range(args.warmup + args.samples)] + samples = rows[args.warmup:] first = samples[0] - if any(row["issues"] != first["issues"] - or row["output_sha256"] != first["output_sha256"] for row in samples): - raise SystemExit("repository or output changed between samples; repeat the benchmark") - print(json.dumps({ - "samples": samples, + semantic = {key: first[key] for key in ("issues", "output_sha256", "output_bytes")} + if any(any(row[key] != value for key, value in semantic.items()) for row in rows): + raise SystemExit("output changed between samples; repeat the benchmark") + report = { + "schema_version": 1, + "measurement_source": { + "head": subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=ROOT, text=True).strip(), + "dirty": bool(subprocess.check_output(["git", "status", "--porcelain"], cwd=ROOT)), + "producer_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), + "fixture_builders_sha256": { + name: hashlib.sha256((ROOT / "tests" / name).read_bytes()).hexdigest() + for name in ("conftest.py", "repo_builders.py") + }, + }, + "workload": "existing-repository" if args.root else "synthetic-demo-v1", + "environment": {"python": platform.python_version(), "system": platform.system(), + "machine": platform.machine(), "python_loader": args.python_loader}, + "warmup_excluded": args.warmup, + "sample_seconds": [row["seconds"] for row in samples], "median_seconds": { phase: statistics.median(row["seconds"][phase] for row in samples) for phase in first["seconds"] }, - }, indent=2)) + "semantic": semantic, + } + if args.baseline: + baseline = json.loads(args.baseline.read_text()) + if baseline["workload"] != report["workload"]: + raise SystemExit("baseline uses a different workload") + report["comparison"] = { + "semantic_match": baseline["semantic"] == semantic, + "environment_match": baseline["environment"] == report["environment"], + "percent_change": { + phase: 100 * (seconds / baseline["median_seconds"][phase] - 1) + for phase, seconds in report["median_seconds"].items() + }, + "interpretation": "negative is faster; informational only, no timing threshold", + } + return report + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--samples", type=int, default=3) + parser.add_argument("--warmup", type=int, default=1) + parser.add_argument("--python-loader", action="store_true") + parser.add_argument("--root", type=Path, help="explicit opt-in to an existing read-only tree") + parser.add_argument("--baseline", type=Path, help="print changes against this retained measurement") + parser.add_argument("--write-baseline", type=Path, help="retain these measurements for future comparisons") + parser.add_argument("--sample", action="store_true", help=argparse.SUPPRESS) + args = parser.parse_args() + if args.sample: + print(json.dumps(sample(args.root, python_loader=args.python_loader))) + return + if args.samples < 1 or args.warmup < 0: + parser.error("--samples must be positive and --warmup nonnegative") + with tempfile.TemporaryDirectory(prefix="los-runtime-bench-") as temporary: + env = dict(os.environ) + if args.root: + root = args.root.resolve() + else: + from conftest import build_mini_repo + from repo_builders import add_curriculum + + root = build_mini_repo(Path(temporary) / "fixture").resolve() + add_curriculum(root) + observations = Path(temporary) / "observations.json" + observations.write_text(json.dumps({ + "now": "2026-10-01T09:00:00+02:00", "mtimes": {}, + "git": {"head": None, "head_time": None, "dates": {}, "timestamps": {}}, + })) + env["LOS_OBSERVATIONS"] = str(observations) + report = _measure(args, root, env) + rendered = json.dumps(report, indent=2, sort_keys=True) + "\n" + if args.write_baseline: + args.write_baseline.write_text(rendered) + print(rendered, end="") if __name__ == "__main__": diff --git a/tests/fixtures/formats/README.md b/tests/fixtures/formats/README.md index 28f19b29..f8161453 100644 --- a/tests/fixtures/formats/README.md +++ b/tests/fixtures/formats/README.md @@ -109,3 +109,7 @@ The project family is the only one whose records already carry their own `system/contracts/data-contract.yaml`. `v25` freezes the optional runtime target, bound activity suitability review, named task dependency, solution exposure, and explicitly unmet observation condition. Its example digests are deliberately stale: the shape remains readable without pretending that an old review qualifies a current assessment. Earlier fixtures remain untouched. + +`v62` records explicit array types in source-comparison refinement clauses. +It preserves the already-required array shape; its data is a byte-for-byte copy +of the frozen `v46` compatibility snapshot. No earlier fixture was regenerated. diff --git a/tests/fixtures/formats/v62/curriculum/modules/module-demo/module.yaml b/tests/fixtures/formats/v62/curriculum/modules/module-demo/module.yaml new file mode 100644 index 00000000..e6b594e3 --- /dev/null +++ b/tests/fixtures/formats/v62/curriculum/modules/module-demo/module.yaml @@ -0,0 +1,43 @@ +id: module-demo +type: module +kind: academic +area_id: program-bachelors +institution: HU Berlin +title: Demo Module +semester: sose-2026 +status: enrolled +unit_order: +- unit-demo-l01 +source_map: source-map.yaml +examination: + type: klausur + sittings: + - termin: 3 + date: '2000-01-01' + label: Elapsed unregistered sitting + - termin: 2 + date: '2026-10-09' + time: 13:00-16:00 + label: 2. Termin + registration_windows: + - opens: '2026-08-31' + closes: '2026-09-10' + label: 2.-PZ Anmeldung + action: Register via AGNES. + termins: + - 2 +attempts: +- termin: 1 + date: '2026-07-27' + result: withdrawn +- termin: 2 + date: '2026-10-09' + result: registered +drop: + date: '2026-08-15' + attempt_made: false + semester: sose-2026 + stated_by: Aram + reversible: false + intent: retake-later + notes: Frozen at v6 so the structured drop record is exercised by the fixture. diff --git a/tests/fixtures/formats/v62/curriculum/modules/module-demo/source-map.yaml b/tests/fixtures/formats/v62/curriculum/modules/module-demo/source-map.yaml new file mode 100644 index 00000000..f7f4bf04 --- /dev/null +++ b/tests/fixtures/formats/v62/curriculum/modules/module-demo/source-map.yaml @@ -0,0 +1,59 @@ +type: module-source-map +module_id: module-demo +sources: +- source_id: source-demo-book + role: spine + why: Scoped demo reading. + priority: 0 + unit_routes: + - unit_id: unit-demo-l01 + title: Demo book — expected-value derivation + format: book + angle: Derives the probability-weighted sum and works one discrete example. + angle_detail: The deck states E[X] and moves on; this derives it from the definition + and then works a discrete example to the digit, so the formula can be rebuilt + rather than recalled. + covers: + - knowledge-demo-random-variable + - knowledge-demo-expectation + depth: derivation + scope: current + locator: §1 Erwartungswert + id: route-demo-v25-reading + - unit_id: unit-demo-l01 + title: Demo past paper + format: exam + angle: Spent once under timed conditions; not a problem set. + angle_detail: A past paper is the only artifact that measures speed as well as + knowledge, so it is worth more unopened than as extra practice. + covers: + - knowledge-demo-expectation + depth: practice + scope: complementary + locator: Klausur 2024, Aufgabe 3 + id: route-demo-v25-task + requires_assets: + - name: supplied-data.csv + needed_for: Task 1(b) + obtain_from: the fixture course + - unit_id: unit-demo-l01 + title: Demo model solutions + format: solutions + angle: Read as writing samples rather than solved. + covers: + - knowledge-demo-expectation + depth: practice + scope: complementary + locator: Musterlösung §1 + exposes_solutions_for: + - route-demo-v25-task + - unit_id: unit-demo-l01 + title: Demo unevaluated source + format: book + angle: Routed here but never assessed — no angle can be stated honestly. Visibility + debt, repaid on use (WORKFLOWS §6a). Frozen at v6 to exercise the new enums. + covers: + - knowledge-demo-expectation + depth: unassessed + scope: unevaluated + locator: Not yet located; establish on first use diff --git a/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md b/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml b/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml new file mode 100644 index 00000000..ecd1a765 --- /dev/null +++ b/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml @@ -0,0 +1,100 @@ +id: study-map-demo-l01 +type: study-map +plan_template_version: 1 +unit_id: unit-demo-l01 +status: active +current_stage: stage-demo +source_plan: + path: work/active/workspace-demo/CONTEXT.md + provenance: operator +detours: [] +shelving: + state: none +stages: +- id: stage-demo + number: 1 + exam_critical: false + concepts: + - concept-expected-value + title: Derive expected value + status: active + objective: Derive and explain expected value. + done_when: + - Explain the derivation. + scope_triage: required-now + resources: + - id: resource-demo-book-ch01 + kind: read + label: Demo Book §1 + source_id: source-demo-book + locator: §1 Erwartungswert, pdf pp. 12-19 + angle: Work only the weighted-sum derivation for this stage. + angle_detail: The v12 shape — the angle is a field of its own rather than prose + appended to the locator after an em dash, so an interface can render it, sort + by it, and check that it is there. + scope_triage: required-now + route_id: route-demo-v25-reading + affordance: intervention + angle_review: + kind: refinement + reviewed_by: format-fixture + reviewed_on: '2026-09-30' + rationale: This stage narrows the route to the expectation calculation. + fingerprint: sha256:cb1b2eead5f7db0a983b79f83d372dfbe579e0df4b3a08f1bcf3e1706b6e366e + - kind: practise + label: Synthetic assessment prompt + source_id: source-demo-book + locator: Task 1 + scope_triage: helpful-now + route_id: route-demo-v25-task + affordance: evidence + independent_evidence: + reviewed_by: fixture-author + reviewed_on: '2026-09-13' + verified_conditions: + - unfamiliar-example + requirement_sha256: sha256:0000000000000000000000000000000000000000000000000000000000000000 + activity_sha256: sha256:1111111111111111111111111111111111111111111111111111111111111111 + - id: resource-demo-book-appendix-a + kind: read + label: Demo Book Appendix A — depth, not needed for this stage + source_id: source-demo-book + locator: Appendix A + scope_triage: deferred + - kind: reference + label: Demo Book full bibliography — preserved, do not read for this stage + source_id: source-demo-book + scope_triage: reference-only + - kind: read + label: Demo Book §2 — no id and no rank, as every v1 record is + source_id: source-demo-book + locator: §2 + working_note: curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md + attachments: [] + source_feedback: + - source_id: source-demo-book + resource_id: resource-demo-book-ch01 + feedback: helpful + note: The worked derivation in §1 is what made it click. + recorded: '2026-08-08' + - source_id: source-demo-book + resource_id: resource-demo-book-appendix-a + feedback: too-advanced + recorded: '2026-08-08' + - source_id: source-demo-book + feedback: useful-for-review + recorded: '2026-08-08' + progress: + updated: '2026-09-26' + summary: Worked the §1 derivation; the discrete example still needs a second pass. + next: Re-derive the discrete example closed-book, then run Task 1. + runtime_target: + concept: concept-expected-value + capability: + kind: explain + operands: + - expectation + conditions: + - unfamiliar-example + evidence_spec: + - explain-reason diff --git a/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml b/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml new file mode 100644 index 00000000..5ff75d31 --- /dev/null +++ b/tests/fixtures/formats/v62/curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml @@ -0,0 +1,32 @@ +id: unit-demo-l01 +type: unit +module_id: module-demo +kind: lecture +title: Expected value +order: 1 +scope: The lecture as taught. +status: active +knowledge_map: + summary: The lecture connects a random variable to its probability-weighted long-run average. + nodes: + - id: knowledge-demo-random-variable + title: Random-variable outcomes + summary: A random variable assigns a numerical value to each outcome. + - id: knowledge-demo-expectation + title: Expected value + summary: The expectation is the probability-weighted average of those values. + builds_on: + - knowledge-demo-random-variable +scope_sources: +- source_id: source-demo-book + authority: slides + locator: Lecture 1 +source_selections: +- source_id: source-demo-book + locator: §1 Erwartungswert + purpose: Current derivation +current_study_map: study-map-demo-l01 +artifacts: + ultimate_reference: note-demo +workspace_ids: +- workspace-demo diff --git a/tests/fixtures/formats/v62/curriculum/programs/program-bachelors.yaml b/tests/fixtures/formats/v62/curriculum/programs/program-bachelors.yaml new file mode 100644 index 00000000..dc689601 --- /dev/null +++ b/tests/fixtures/formats/v62/curriculum/programs/program-bachelors.yaml @@ -0,0 +1,12 @@ +id: program-bachelors +type: program +title: Bachelor’s +kind: academic +status: active +default: true +semester_bound: true +semesters: +- id: semester-sose-2026 + title: SoSe 2026 + status: current + order: 1 diff --git a/tests/fixtures/formats/v62/curriculum/resume.yaml b/tests/fixtures/formats/v62/curriculum/resume.yaml new file mode 100644 index 00000000..3e02a035 --- /dev/null +++ b/tests/fixtures/formats/v62/curriculum/resume.yaml @@ -0,0 +1,6 @@ +type: resume-pointer +module_id: module-demo +unit_id: unit-demo-l01 +study_map_id: study-map-demo-l01 +stage_id: stage-demo +updated: '2026-08-03' diff --git a/tests/fixtures/formats/v62/knowledge/concept-relations.yaml b/tests/fixtures/formats/v62/knowledge/concept-relations.yaml new file mode 100644 index 00000000..285951f6 --- /dev/null +++ b/tests/fixtures/formats/v62/knowledge/concept-relations.yaml @@ -0,0 +1,4 @@ +relations: +- from: concept-variance + to: concept-expected-value + type: builds-on diff --git a/tests/fixtures/formats/v62/knowledge/concepts.yaml b/tests/fixtures/formats/v62/knowledge/concepts.yaml new file mode 100644 index 00000000..f4858c3e --- /dev/null +++ b/tests/fixtures/formats/v62/knowledge/concepts.yaml @@ -0,0 +1,9 @@ +concepts: +- aliases: + - Erwartungswert + id: concept-expected-value + label: Expected value +- aliases: + - Varianz + id: concept-variance + label: Variance diff --git a/tests/fixtures/formats/v62/knowledge/notes/mathematics/note-demo-operator.md b/tests/fixtures/formats/v62/knowledge/notes/mathematics/note-demo-operator.md new file mode 100644 index 00000000..060b403f --- /dev/null +++ b/tests/fixtures/formats/v62/knowledge/notes/mathematics/note-demo-operator.md @@ -0,0 +1,14 @@ +--- +id: note-demo-operator +type: note +title: Demo operator-drafted reference +created: 2026-08-15 +role: reference +state: evolving +authorship: operator-drafted +concepts: [concept-expected-value] +sources: [source-demo-book] +--- + +Built by the operator from the scope source, not yet reasoned through by the +learner. Present in this fixture so v6's authorship value is frozen as data. diff --git a/tests/fixtures/formats/v62/knowledge/notes/mathematics/note-demo.md b/tests/fixtures/formats/v62/knowledge/notes/mathematics/note-demo.md new file mode 100644 index 00000000..ed501190 --- /dev/null +++ b/tests/fixtures/formats/v62/knowledge/notes/mathematics/note-demo.md @@ -0,0 +1,11 @@ +--- +id: note-demo +type: note +title: Demo note +created: 2026-07-16 +role: synthesis +concepts: [concept-expected-value] +sources: [source-demo-book] +--- + +Body prose. diff --git a/tests/fixtures/formats/v62/projects/aliases.yaml b/tests/fixtures/formats/v62/projects/aliases.yaml new file mode 100644 index 00000000..e3677a7b --- /dev/null +++ b/tests/fixtures/formats/v62/projects/aliases.yaml @@ -0,0 +1 @@ +aliases: {} diff --git a/tests/fixtures/formats/v62/projects/registry/project-demo.yaml b/tests/fixtures/formats/v62/projects/registry/project-demo.yaml new file mode 100644 index 00000000..cc4e6ec4 --- /dev/null +++ b/tests/fixtures/formats/v62/projects/registry/project-demo.yaml @@ -0,0 +1,21 @@ +schema_version: 1 +id: project-demo +type: project +revision: 0 +title: Demo project +project_type: thesis +status: active +root_uri: github://example/demo +objective: A minimal first-class project, wired only to records this fixture contains. +milestone_ids: [] +linked_module_ids: +- module-demo +unit_ids: +- unit-demo-l01 +workspace_ids: +- workspace-demo +thematic_group_ids: [] +boundaries: + confidentiality: private + external_code_access: none + notes: Fixture record; references nothing outside this tree. diff --git a/tests/fixtures/formats/v62/projects/relations/project-relations.yaml b/tests/fixtures/formats/v62/projects/relations/project-relations.yaml new file mode 100644 index 00000000..76ef923f --- /dev/null +++ b/tests/fixtures/formats/v62/projects/relations/project-relations.yaml @@ -0,0 +1 @@ +relations: [] diff --git a/tests/fixtures/formats/v62/records/modules.yaml b/tests/fixtures/formats/v62/records/modules.yaml new file mode 100644 index 00000000..165a59ee --- /dev/null +++ b/tests/fixtures/formats/v62/records/modules.yaml @@ -0,0 +1,12 @@ +modules: +- attempts: + - date: '2026-07-27' + result: withdrawn + termin: 1 + - date: '2026-10-09' + result: registered + termin: 2 + id: module-demo + institution: HU Berlin + status: enrolled + title: Demo Module diff --git a/tests/fixtures/formats/v62/sources/sources.yaml b/tests/fixtures/formats/v62/sources/sources.yaml new file mode 100644 index 00000000..1972bbe6 --- /dev/null +++ b/tests/fixtures/formats/v62/sources/sources.yaml @@ -0,0 +1,29 @@ +sources: +- authors: + - A. Author + evaluations: + - concepts: + - concept-expected-value + level: introductory + roles: + - first-learning + strengths: + - clear intuition + id: source-demo-book + title: Demo Book + type: book + # Two topics from different display domains on ONE source — the polyhierarchy + # the facet exists for. A source is not "in" a topic; it participates in + # several. + topics: + - topic-probability + - topic-statistical-learning +- authors: + - B. Author + id: source-demo-unclassified + title: Demo Unclassified Source + type: paper + # No `topics` at all. Absent means NOT YET CLASSIFIED, which is what every + # v1–v3 record carries and what most of the live Library will carry for a long + # time under on-use population (ADR-005). A fixture where everything was + # classified would stop proving the field is optional. diff --git a/tests/fixtures/formats/v62/sources/topics.yaml b/tests/fixtures/formats/v62/sources/topics.yaml new file mode 100644 index 00000000..bcd1a841 --- /dev/null +++ b/tests/fixtures/formats/v62/sources/topics.yaml @@ -0,0 +1,12 @@ +# Minimal frozen topic vocabulary for the v5 format fixture. +# +# Deliberately small: a fixture proves the FORMAT still loads, not that the live +# vocabulary is complete. It carries no `domain` on purpose — the field is +# optional, and this fixture has no curriculum/thematic-groups.yaml, so a domain +# here would reference a group that does not exist and fail REF-TOPIC-DOMAIN for +# reasons that have nothing to do with the format. +topics: + - id: topic-probability + title: Probability + - id: topic-statistical-learning + title: Statistical & Classical ML diff --git a/tests/fixtures/formats/v62/work/COORDINATION.md b/tests/fixtures/formats/v62/work/COORDINATION.md new file mode 100644 index 00000000..b0a79a2c --- /dev/null +++ b/tests/fixtures/formats/v62/work/COORDINATION.md @@ -0,0 +1,22 @@ +--- +id: coordination +type: coordination +--- + +# Coordination + +## Commitments + +(none) + +## Priorities + +(none) + +## Dependencies + +(none) + +## Deferrals + +- Demo module deferred to 2. Termin (date lives in records/modules.yaml) diff --git a/tests/fixtures/formats/v62/work/active/workspace-demo/CONTEXT.md b/tests/fixtures/formats/v62/work/active/workspace-demo/CONTEXT.md new file mode 100644 index 00000000..5d84a24a --- /dev/null +++ b/tests/fixtures/formats/v62/work/active/workspace-demo/CONTEXT.md @@ -0,0 +1,33 @@ +--- +id: workspace-demo +type: workspace +title: Demo workspace +created: '2026-07-16' +status: active +concepts: +- concept-expected-value +notes: +- note-demo +program_ids: +- program-bachelors +module_ids: +- module-demo +unit_ids: +- unit-demo-l01 +--- + +## Objective + +Demo. + +## Current Scope + +Small. + +## Open Questions + +None. + +## Next Action + +Do the demo thing. diff --git a/tests/fixtures/formats/v62/work/active/workspace-demo/observations.jsonl b/tests/fixtures/formats/v62/work/active/workspace-demo/observations.jsonl new file mode 100644 index 00000000..7d41548a --- /dev/null +++ b/tests/fixtures/formats/v62/work/active/workspace-demo/observations.jsonl @@ -0,0 +1 @@ +{"id": "observation-v25-familiar", "requirement": "req-demo-l01-demo", "activity": "route-demo-v25-task", "result": "partial", "assistance": "none", "conditions": [], "conditions_not_met": ["unfamiliar-example"], "evidence_tags": [], "timestamp": "2026-09-13T10:00:00Z"} diff --git a/tests/group_map.py b/tests/group_map.py index bc63cf86..bf55c7ab 100644 --- a/tests/group_map.py +++ b/tests/group_map.py @@ -127,6 +127,7 @@ # diagnostics, and the write path they exercise. "gateway": [ "test_agent_efficiency.py", + "test_agent_reporting.py", "test_agent_run.py", "test_projection_readiness.py", "test_read_session.py", diff --git a/tests/scenarios/recorded/ai-action.delivery.apply/apply-garden-shelve.json b/tests/scenarios/recorded/ai-action.delivery.apply/apply-garden-shelve.json index f5996a32..69401412 100644 --- a/tests/scenarios/recorded/ai-action.delivery.apply/apply-garden-shelve.json +++ b/tests/scenarios/recorded/ai-action.delivery.apply/apply-garden-shelve.json @@ -264,8 +264,8 @@ { "created": false, "path": "operations/ai-actions/requests/KEY1/request.yaml", - "sha256_after": "6ad937f3581feffdc4e13f14478b5e2949d8d9cabc6d2302f9fdbcb19d035727", - "sha256_before": "41aa98d5ded7d06a3e24a6a14ac9439309a26b9cb246d53f9159b8bd4f71699e" + "sha256_after": "a2596735b09bdbc97a635e70d1d10a406854c00dd59c5e27d3672e033bd37b2c", + "sha256_before": "ea7a19d51bb2b32190c29c05ad82b2be3884a675a33bdbcfdc465e3173bf2afe" } ] } @@ -345,7 +345,7 @@ "before": null }, "stderr": "", - "stdout": "{\"schema_version\":2,\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"capability\":\"ai-action.delivery.apply\",\"ok\":true,\"replayed\":false,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"result\":{\"ok\":true,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"artifact_revisions\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"replayed\":false,\"receipt\":{\"schema_version\":2,\"id\":\"TX1\",\"type\":\"transaction-receipt\",\"status\":\"committed\",\"capability\":\"ai-action.delivery.apply\",\"committed_at\":\"2026-10-01T09:00:00+02:00\",\"snapshot_before\":\"\",\"snapshot_after\":\"SNAP1\",\"expected_revisions\":{\"garden-note-seed\":0,\"relationship-garden-module-demo\":0,\"transcription-garden-note-seed\":0},\"artifact_revisions\":{\"garden-note-seed\":{\"before\":0,\"after\":1},\"relationship-garden-module-demo\":{\"before\":0,\"after\":1},\"transcription-garden-note-seed\":{\"before\":0,\"after\":1}},\"writes\":[{\"path\":\"knowledge/garden/transcriptions/garden-note-seed.md\",\"sha256_before\":null,\"sha256_after\":\"0eeba45730664ce19f3c227603a1d3693a0794777a4cc1f1b91e8b3fc3c29ff3\",\"created\":true},{\"path\":\"operations/ai-actions/garden-state/garden-note-seed.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER1\",\"created\":true},{\"path\":\"operations/ai-actions/relationships.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER2\",\"created\":true},{\"path\":\"operations/ai-actions/requests/KEY1/request.yaml\",\"sha256_before\":\"41aa98d5ded7d06a3e24a6a14ac9439309a26b9cb246d53f9159b8bd4f71699e\",\"sha256_after\":\"LEDGER3\",\"created\":false}],\"metadata\":{\"request_id\":\"KEY1\",\"delivery_id\":\"ai-delivery-scenario-shelve\",\"action_id\":\"garden.shelve\",\"approved_delivery\":{\"delivery_sha256\":\"\",\"artifact_sha256\":{\"artifacts/transcription.md\":\"sha256:42342ec59b9678fc49988192137259c2286db26b18d32123c67a3ceb7a386157\"}},\"created_ids\":[\"transcription-garden-note-seed\",\"relationship-garden-module-demo\"],\"updated_ids\":[\"garden-note-seed\"],\"deleted_ids\":[],\"superseded_ids\":[],\"validation\":{\"schemas\":\"passed\",\"references\":\"passed\",\"boundaries\":\"passed\",\"projection\":\"passed\"},\"data_roots_sha256\":\"sha256:9d975f3523832935e3578c0f86012cb05d4b80252a3cfcfc7e56f63f18f71b23\",\"fingerprint_definition\":2},\"authority\":{\"capability_contract_version\":2,\"enforced\":true,\"grants\":[{\"capability\":\"ai-action.delivery.apply\",\"declared_writes\":[\"operations/ai-actions/requests/**\"]},{\"capability\":\"garden.add-transcription\",\"declared_writes\":[\"knowledge/garden/transcriptions/\"]},{\"capability\":\"garden.update\",\"declared_writes\":[\"operations/ai-actions/garden-state/\"]},{\"capability\":\"relationship.create\",\"declared_writes\":[\"operations/ai-actions/relationships.yaml\"]}]},\"request\":{\"channel\":\"operator\",\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"intent_sha256\":\"INTENT1\",\"approval\":{\"kind\":\"approved-delivery\",\"subject_sha256\":\"INTENT1\"}},\"transaction_id\":\"TX1\",\"revision_updates\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"receipt_path\":\"operations/transactions/TX1.yaml\",\"replayed\":false}},\"error\":null}\n", + "stdout": "{\"schema_version\":2,\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"capability\":\"ai-action.delivery.apply\",\"ok\":true,\"replayed\":false,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"result\":{\"ok\":true,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"artifact_revisions\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"replayed\":false,\"receipt\":{\"schema_version\":2,\"id\":\"TX1\",\"type\":\"transaction-receipt\",\"status\":\"committed\",\"capability\":\"ai-action.delivery.apply\",\"committed_at\":\"2026-10-01T09:00:00+02:00\",\"snapshot_before\":\"\",\"snapshot_after\":\"SNAP1\",\"expected_revisions\":{\"garden-note-seed\":0,\"relationship-garden-module-demo\":0,\"transcription-garden-note-seed\":0},\"artifact_revisions\":{\"garden-note-seed\":{\"before\":0,\"after\":1},\"relationship-garden-module-demo\":{\"before\":0,\"after\":1},\"transcription-garden-note-seed\":{\"before\":0,\"after\":1}},\"writes\":[{\"path\":\"knowledge/garden/transcriptions/garden-note-seed.md\",\"sha256_before\":null,\"sha256_after\":\"0eeba45730664ce19f3c227603a1d3693a0794777a4cc1f1b91e8b3fc3c29ff3\",\"created\":true},{\"path\":\"operations/ai-actions/garden-state/garden-note-seed.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER1\",\"created\":true},{\"path\":\"operations/ai-actions/relationships.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER2\",\"created\":true},{\"path\":\"operations/ai-actions/requests/KEY1/request.yaml\",\"sha256_before\":\"ea7a19d51bb2b32190c29c05ad82b2be3884a675a33bdbcfdc465e3173bf2afe\",\"sha256_after\":\"LEDGER3\",\"created\":false}],\"metadata\":{\"request_id\":\"KEY1\",\"delivery_id\":\"ai-delivery-scenario-shelve\",\"action_id\":\"garden.shelve\",\"approved_delivery\":{\"delivery_sha256\":\"\",\"artifact_sha256\":{\"artifacts/transcription.md\":\"sha256:42342ec59b9678fc49988192137259c2286db26b18d32123c67a3ceb7a386157\"}},\"created_ids\":[\"transcription-garden-note-seed\",\"relationship-garden-module-demo\"],\"updated_ids\":[\"garden-note-seed\"],\"deleted_ids\":[],\"superseded_ids\":[],\"validation\":{\"schemas\":\"passed\",\"references\":\"passed\",\"boundaries\":\"passed\",\"projection\":\"passed\"},\"data_roots_sha256\":\"sha256:9d975f3523832935e3578c0f86012cb05d4b80252a3cfcfc7e56f63f18f71b23\",\"fingerprint_definition\":2},\"authority\":{\"capability_contract_version\":2,\"enforced\":true,\"grants\":[{\"capability\":\"ai-action.delivery.apply\",\"declared_writes\":[\"operations/ai-actions/requests/**\"]},{\"capability\":\"garden.add-transcription\",\"declared_writes\":[\"knowledge/garden/transcriptions/\"]},{\"capability\":\"garden.update\",\"declared_writes\":[\"operations/ai-actions/garden-state/\"]},{\"capability\":\"relationship.create\",\"declared_writes\":[\"operations/ai-actions/relationships.yaml\"]}]},\"request\":{\"channel\":\"operator\",\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"intent_sha256\":\"INTENT1\",\"approval\":{\"kind\":\"approved-delivery\",\"subject_sha256\":\"INTENT1\"}},\"transaction_id\":\"TX1\",\"revision_updates\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"receipt_path\":\"operations/transactions/TX1.yaml\",\"replayed\":false}},\"error\":null}\n", "stdout_json": { "capability": "ai-action.delivery.apply", "error": null, @@ -487,8 +487,8 @@ { "created": false, "path": "operations/ai-actions/requests/KEY1/request.yaml", - "sha256_after": "6ad937f3581feffdc4e13f14478b5e2949d8d9cabc6d2302f9fdbcb19d035727", - "sha256_before": "41aa98d5ded7d06a3e24a6a14ac9439309a26b9cb246d53f9159b8bd4f71699e" + "sha256_after": "a2596735b09bdbc97a635e70d1d10a406854c00dd59c5e27d3672e033bd37b2c", + "sha256_before": "ea7a19d51bb2b32190c29c05ad82b2be3884a675a33bdbcfdc465e3173bf2afe" } ] }, diff --git a/tests/scenarios/recorded/ai-action.delivery.apply/exact-replay.json b/tests/scenarios/recorded/ai-action.delivery.apply/exact-replay.json index d45f0d24..5eeba4c0 100644 --- a/tests/scenarios/recorded/ai-action.delivery.apply/exact-replay.json +++ b/tests/scenarios/recorded/ai-action.delivery.apply/exact-replay.json @@ -264,8 +264,8 @@ { "created": false, "path": "operations/ai-actions/requests/KEY1/request.yaml", - "sha256_after": "6ad937f3581feffdc4e13f14478b5e2949d8d9cabc6d2302f9fdbcb19d035727", - "sha256_before": "41aa98d5ded7d06a3e24a6a14ac9439309a26b9cb246d53f9159b8bd4f71699e" + "sha256_after": "a2596735b09bdbc97a635e70d1d10a406854c00dd59c5e27d3672e033bd37b2c", + "sha256_before": "ea7a19d51bb2b32190c29c05ad82b2be3884a675a33bdbcfdc465e3173bf2afe" } ] } @@ -345,7 +345,7 @@ "before": null }, "stderr": "", - "stdout": "{\"schema_version\":2,\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"capability\":\"ai-action.delivery.apply\",\"ok\":true,\"replayed\":false,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"result\":{\"ok\":true,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"artifact_revisions\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"replayed\":false,\"receipt\":{\"schema_version\":2,\"id\":\"TX1\",\"type\":\"transaction-receipt\",\"status\":\"committed\",\"capability\":\"ai-action.delivery.apply\",\"committed_at\":\"2026-10-01T09:00:00+02:00\",\"snapshot_before\":\"\",\"snapshot_after\":\"SNAP1\",\"expected_revisions\":{\"garden-note-seed\":0,\"relationship-garden-module-demo\":0,\"transcription-garden-note-seed\":0},\"artifact_revisions\":{\"garden-note-seed\":{\"before\":0,\"after\":1},\"relationship-garden-module-demo\":{\"before\":0,\"after\":1},\"transcription-garden-note-seed\":{\"before\":0,\"after\":1}},\"writes\":[{\"path\":\"knowledge/garden/transcriptions/garden-note-seed.md\",\"sha256_before\":null,\"sha256_after\":\"0eeba45730664ce19f3c227603a1d3693a0794777a4cc1f1b91e8b3fc3c29ff3\",\"created\":true},{\"path\":\"operations/ai-actions/garden-state/garden-note-seed.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER1\",\"created\":true},{\"path\":\"operations/ai-actions/relationships.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER2\",\"created\":true},{\"path\":\"operations/ai-actions/requests/KEY1/request.yaml\",\"sha256_before\":\"41aa98d5ded7d06a3e24a6a14ac9439309a26b9cb246d53f9159b8bd4f71699e\",\"sha256_after\":\"LEDGER3\",\"created\":false}],\"metadata\":{\"request_id\":\"KEY1\",\"delivery_id\":\"ai-delivery-scenario-shelve\",\"action_id\":\"garden.shelve\",\"approved_delivery\":{\"delivery_sha256\":\"\",\"artifact_sha256\":{\"artifacts/transcription.md\":\"sha256:42342ec59b9678fc49988192137259c2286db26b18d32123c67a3ceb7a386157\"}},\"created_ids\":[\"transcription-garden-note-seed\",\"relationship-garden-module-demo\"],\"updated_ids\":[\"garden-note-seed\"],\"deleted_ids\":[],\"superseded_ids\":[],\"validation\":{\"schemas\":\"passed\",\"references\":\"passed\",\"boundaries\":\"passed\",\"projection\":\"passed\"},\"data_roots_sha256\":\"sha256:9d975f3523832935e3578c0f86012cb05d4b80252a3cfcfc7e56f63f18f71b23\",\"fingerprint_definition\":2},\"authority\":{\"capability_contract_version\":2,\"enforced\":true,\"grants\":[{\"capability\":\"ai-action.delivery.apply\",\"declared_writes\":[\"operations/ai-actions/requests/**\"]},{\"capability\":\"garden.add-transcription\",\"declared_writes\":[\"knowledge/garden/transcriptions/\"]},{\"capability\":\"garden.update\",\"declared_writes\":[\"operations/ai-actions/garden-state/\"]},{\"capability\":\"relationship.create\",\"declared_writes\":[\"operations/ai-actions/relationships.yaml\"]}]},\"request\":{\"channel\":\"operator\",\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"intent_sha256\":\"INTENT1\",\"approval\":{\"kind\":\"approved-delivery\",\"subject_sha256\":\"INTENT1\"}},\"transaction_id\":\"TX1\",\"revision_updates\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"receipt_path\":\"operations/transactions/TX1.yaml\",\"replayed\":false}},\"error\":null}\n", + "stdout": "{\"schema_version\":2,\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"capability\":\"ai-action.delivery.apply\",\"ok\":true,\"replayed\":false,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"result\":{\"ok\":true,\"transaction_id\":\"TX1\",\"receipt_path\":\"operations/transactions/TX1.yaml\",\"snapshot_after\":\"SNAP1\",\"artifact_revisions\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"replayed\":false,\"receipt\":{\"schema_version\":2,\"id\":\"TX1\",\"type\":\"transaction-receipt\",\"status\":\"committed\",\"capability\":\"ai-action.delivery.apply\",\"committed_at\":\"2026-10-01T09:00:00+02:00\",\"snapshot_before\":\"\",\"snapshot_after\":\"SNAP1\",\"expected_revisions\":{\"garden-note-seed\":0,\"relationship-garden-module-demo\":0,\"transcription-garden-note-seed\":0},\"artifact_revisions\":{\"garden-note-seed\":{\"before\":0,\"after\":1},\"relationship-garden-module-demo\":{\"before\":0,\"after\":1},\"transcription-garden-note-seed\":{\"before\":0,\"after\":1}},\"writes\":[{\"path\":\"knowledge/garden/transcriptions/garden-note-seed.md\",\"sha256_before\":null,\"sha256_after\":\"0eeba45730664ce19f3c227603a1d3693a0794777a4cc1f1b91e8b3fc3c29ff3\",\"created\":true},{\"path\":\"operations/ai-actions/garden-state/garden-note-seed.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER1\",\"created\":true},{\"path\":\"operations/ai-actions/relationships.yaml\",\"sha256_before\":null,\"sha256_after\":\"LEDGER2\",\"created\":true},{\"path\":\"operations/ai-actions/requests/KEY1/request.yaml\",\"sha256_before\":\"ea7a19d51bb2b32190c29c05ad82b2be3884a675a33bdbcfdc465e3173bf2afe\",\"sha256_after\":\"LEDGER3\",\"created\":false}],\"metadata\":{\"request_id\":\"KEY1\",\"delivery_id\":\"ai-delivery-scenario-shelve\",\"action_id\":\"garden.shelve\",\"approved_delivery\":{\"delivery_sha256\":\"\",\"artifact_sha256\":{\"artifacts/transcription.md\":\"sha256:42342ec59b9678fc49988192137259c2286db26b18d32123c67a3ceb7a386157\"}},\"created_ids\":[\"transcription-garden-note-seed\",\"relationship-garden-module-demo\"],\"updated_ids\":[\"garden-note-seed\"],\"deleted_ids\":[],\"superseded_ids\":[],\"validation\":{\"schemas\":\"passed\",\"references\":\"passed\",\"boundaries\":\"passed\",\"projection\":\"passed\"},\"data_roots_sha256\":\"sha256:9d975f3523832935e3578c0f86012cb05d4b80252a3cfcfc7e56f63f18f71b23\",\"fingerprint_definition\":2},\"authority\":{\"capability_contract_version\":2,\"enforced\":true,\"grants\":[{\"capability\":\"ai-action.delivery.apply\",\"declared_writes\":[\"operations/ai-actions/requests/**\"]},{\"capability\":\"garden.add-transcription\",\"declared_writes\":[\"knowledge/garden/transcriptions/\"]},{\"capability\":\"garden.update\",\"declared_writes\":[\"operations/ai-actions/garden-state/\"]},{\"capability\":\"relationship.create\",\"declared_writes\":[\"operations/ai-actions/relationships.yaml\"]}]},\"request\":{\"channel\":\"operator\",\"request_id\":\"KEY2\",\"idempotency_key\":\"KEY3\",\"intent_sha256\":\"INTENT1\",\"approval\":{\"kind\":\"approved-delivery\",\"subject_sha256\":\"INTENT1\"}},\"transaction_id\":\"TX1\",\"revision_updates\":{\"garden-note-seed\":1,\"relationship-garden-module-demo\":1,\"transcription-garden-note-seed\":1},\"receipt_path\":\"operations/transactions/TX1.yaml\",\"replayed\":false}},\"error\":null}\n", "stdout_json": { "capability": "ai-action.delivery.apply", "error": null, @@ -487,8 +487,8 @@ { "created": false, "path": "operations/ai-actions/requests/KEY1/request.yaml", - "sha256_after": "6ad937f3581feffdc4e13f14478b5e2949d8d9cabc6d2302f9fdbcb19d035727", - "sha256_before": "41aa98d5ded7d06a3e24a6a14ac9439309a26b9cb246d53f9159b8bd4f71699e" + "sha256_after": "a2596735b09bdbc97a635e70d1d10a406854c00dd59c5e27d3672e033bd37b2c", + "sha256_before": "ea7a19d51bb2b32190c29c05ad82b2be3884a675a33bdbcfdc465e3173bf2afe" } ] }, diff --git a/tests/scenarios/recorded/backup.manifest/cli-default-silent.json b/tests/scenarios/recorded/backup.manifest/cli-default-silent.json index 44cf04a2..202d9c60 100644 --- a/tests/scenarios/recorded/backup.manifest/cli-default-silent.json +++ b/tests/scenarios/recorded/backup.manifest/cli-default-silent.json @@ -6,7 +6,7 @@ "receipts": [], "revisions_changed": {}, "session_ledger_changed": null, - "stderr": "los: backup-manifest prints nothing by default: the manifest holds 256 entries (~45 KB). Write it with --out PATH (outside every backed-up root) or print it with --stdout\n", + "stderr": "los: backup-manifest prints nothing by default: the manifest holds 257 entries (~45 KB). Write it with --out PATH (outside every backed-up root) or print it with --stdout\n", "stdout": "", "stdout_json": null } diff --git a/tests/scenarios/recorded/backup.manifest/cli-manifest-stdout.json b/tests/scenarios/recorded/backup.manifest/cli-manifest-stdout.json index 05736d09..9ce44c92 100644 --- a/tests/scenarios/recorded/backup.manifest/cli-manifest-stdout.json +++ b/tests/scenarios/recorded/backup.manifest/cli-manifest-stdout.json @@ -7,9 +7,9 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"backup-manifest\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"roots\":[\"core\",\"materials\",\"ui\"],\"entries\":[{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"size\":693,\"sha256\":\"sha256:4ae2ad31254f0d470993f4566c83a4f4056b20fc19c4317bd57c52b0ea809e19\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/source-map.yaml\",\"size\":759,\"sha256\":\"sha256:bc7e0a53304d1e916e03c7a69bc5a0746f522a8a3bc610653ec8c44b97b0a730\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"size\":1819,\"sha256\":\"sha256:506b0fdd350e11960069e09ffd099e7ac616076a8b3425557614e9167bbfe141\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"size\":941,\"sha256\":\"sha256:02dd8b658f2eceeb04ae9405f545f95ac719226a52f6d1690985403647476dc1\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"size\":676,\"sha256\":\"sha256:3972911e1580b4afb0f23a0df306b5fbd5073996aae31895a49ce6363d9fa235\"},{\"root\":\"core\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"size\":205,\"sha256\":\"sha256:ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175\"},{\"root\":\"core\",\"path\":\"curriculum/resume.yaml\",\"size\":143,\"sha256\":\"sha256:1360307adc4f3cf81ae20860966e3e53d87eb779bfed8284ca970314c58fd858\"},{\"root\":\"core\",\"path\":\"knowledge/abilities.yaml\",\"size\":812,\"sha256\":\"sha256:1fc5719eb8e7bb60c6c77bccd020189502eb3efd38fa3e8d5bf988bc08a3ef0a\"},{\"root\":\"core\",\"path\":\"knowledge/concept-relations.yaml\",\"size\":83,\"sha256\":\"sha256:931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d\"},{\"root\":\"core\",\"path\":\"knowledge/concepts.yaml\",\"size\":157,\"sha256\":\"sha256:7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e\"},{\"root\":\"core\",\"path\":\"knowledge/garden/seed.md\",\"size\":17,\"sha256\":\"sha256:2fa0d5901df7142374cd36288533e6d84f11df0370a087cdb50d000794dfd169\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo-analysis.md\",\"size\":753,\"sha256\":\"sha256:ecd673fe86ebb2952d5efaf15ee8c4dc49f2f10c3710b795f3b8b0cafd23330c\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo.md\",\"size\":162,\"sha256\":\"sha256:5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276\"},{\"root\":\"core\",\"path\":\"operations/ai-actions/requests/ai-request-demo/request.yaml\",\"size\":189,\"sha256\":\"sha256:4024838e1f48e7f5d7a0f7dba5c374f35c3a9c0255fe4906b7ab4b376e126fd9\"},{\"root\":\"core\",\"path\":\"operations/goal-ledger.yaml\",\"size\":189,\"sha256\":\"sha256:eb3d9638be9378e8254a9848d56f844cb0d4ce4213ce31bcfc6053db35c6a1b5\"},{\"root\":\"core\",\"path\":\"operations/transactions/lineage.yaml\",\"size\":618,\"sha256\":\"sha256:9064555ce2bb0004dbeb396ec138b6eac83c130f2ac7207c55e387562e68dcbe\"},{\"root\":\"core\",\"path\":\"operations/transactions/revisions.yaml\",\"size\":79,\"sha256\":\"sha256:95af59729f0817655d3237e3acd64cc4025c60e53c016a82ed1ba90757115a3a\"},{\"root\":\"core\",\"path\":\"operations/transactions/transaction-20200102-000000-001.yaml\",\"size\":1355,\"sha256\":\"sha256:8c07311aa87a315f0e7400a731445b85f04ed6dc0594a61612ff6430510df3ac\"},{\"root\":\"core\",\"path\":\"projects/registry/project-demo.yaml\",\"size\":377,\"sha256\":\"sha256:1deec83d86d3ec33d96d07de4313acbf46fcef15bd87ee7dd7918d41ed5a75bc\"},{\"root\":\"core\",\"path\":\"projects/relations/project-relations.yaml\",\"size\":175,\"sha256\":\"sha256:22463f43ea8cf79074fb7dddfe3563abb10eacb5897115e45140e818df2f6740\"},{\"root\":\"core\",\"path\":\"records/materials-manifest.yaml\",\"size\":984,\"sha256\":\"sha256:893c316744777bda54e0feed32bd6e25be7ba5cd6eb86f7589a931fea1cbd74a\"},{\"root\":\"core\",\"path\":\"records/modules.yaml\",\"size\":223,\"sha256\":\"sha256:5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7\"},{\"root\":\"core\",\"path\":\"sources/collections/shelf.yaml\",\"size\":129,\"sha256\":\"sha256:5cc34276b241dd75fd1fa8345e65ef89924b6b422b1287b6d8cfe5b5704cce9c\"},{\"root\":\"core\",\"path\":\"sources/sources.yaml\",\"size\":289,\"sha256\":\"sha256:03e8c76818ced582638f18e1cb41b3bac2403f0ba0da20a04932851ed4461087\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-input.schema.json\",\"size\":475,\"sha256\":\"sha256:593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-report.schema.json\",\"size\":2495,\"sha256\":\"sha256:7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/garden.shelve.yaml\",\"size\":808,\"sha256\":\"sha256:55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/unit.compare-materials.yaml\",\"size\":654,\"sha256\":\"sha256:7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-adapters.yaml\",\"size\":853,\"sha256\":\"sha256:804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56\"},{\"root\":\"core\",\"path\":\"system/contracts/backup-roots.yaml\",\"size\":3878,\"sha256\":\"sha256:5dc4d1c40a872c0b432822c04db39091b035e6c7d8959961cb6a92c9371cc59a\"},{\"root\":\"core\",\"path\":\"system/contracts/capabilities.yaml\",\"size\":44149,\"sha256\":\"sha256:9f3a060d396925db7e66f23703dbe392ac40b3b44f2b5b59b704f97b2c645dfa\"},{\"root\":\"core\",\"path\":\"system/contracts/cli-operations.yaml\",\"size\":2875,\"sha256\":\"sha256:f4ba996c3c2d7bd02406d2ba6efd5ce3fceded5c0ec66348758cde7a56a73292\"},{\"root\":\"core\",\"path\":\"system/contracts/contract-register.yaml\",\"size\":11187,\"sha256\":\"sha256:3d6f21d3827871fd0747b1c8a4b07656afe9e1bc0b96506aae51280ed9aaa220\"},{\"root\":\"core\",\"path\":\"system/contracts/data-contract.yaml\",\"size\":20544,\"sha256\":\"sha256:97e5976c26a2924d73aa9b6a3b4c1a908590d35c01c0b594077811c925a74f9b\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-contract.yaml\",\"size\":8779,\"sha256\":\"sha256:92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-v15.schema.json\",\"size\":87416,\"sha256\":\"sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.schema.json\",\"size\":4941,\"sha256\":\"sha256:9e76ff6a56116c4a20f6af5fd296be1ff4cadbcc984acaba552daaabf53fba34\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.yaml\",\"size\":42645,\"sha256\":\"sha256:3191bf5ffb3fcbc0b0a6754200c2f1cd26213281845b52fdf340212193477d4a\"},{\"root\":\"core\",\"path\":\"system/contracts/perimeter.yaml\",\"size\":10603,\"sha256\":\"sha256:1cebe28ced51f556d6d33d372a7b383744a83b3668675a9f59ec26f479d4fb1b\"},{\"root\":\"core\",\"path\":\"system/contracts/release-pair-receipt.schema.json\",\"size\":3380,\"sha256\":\"sha256:4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.schema.json\",\"size\":565,\"sha256\":\"sha256:6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.yaml\",\"size\":29564,\"sha256\":\"sha256:851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4\"},{\"root\":\"core\",\"path\":\"system/contracts/semantic-lineage-ledger.schema.json\",\"size\":3086,\"sha256\":\"sha256:2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf\"},{\"root\":\"core\",\"path\":\"system/contracts/task-scope.yaml\",\"size\":9335,\"sha256\":\"sha256:eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18\"},{\"root\":\"core\",\"path\":\"system/contracts/tree-contract.yaml\",\"size\":8809,\"sha256\":\"sha256:2e8588a08a3a1565a9b09a1b0839ed84bfe9892e2a87a5d50f7893f2c4aa6cfa\"},{\"root\":\"core\",\"path\":\"system/contracts/validation-warning-baseline.schema.json\",\"size\":2227,\"sha256\":\"sha256:0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9\"},{\"root\":\"core\",\"path\":\"system/schema/abilities.schema.json\",\"size\":3331,\"sha256\":\"sha256:06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543\"},{\"root\":\"core\",\"path\":\"system/schema/ability-candidate.schema.json\",\"size\":1110,\"sha256\":\"sha256:7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612\"},{\"root\":\"core\",\"path\":\"system/schema/ability-context.schema.json\",\"size\":3283,\"sha256\":\"sha256:dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5\"},{\"root\":\"core\",\"path\":\"system/schema/ability-observation.schema.json\",\"size\":1603,\"sha256\":\"sha256:1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f\"},{\"root\":\"core\",\"path\":\"system/schema/backup-manifest.schema.json\",\"size\":2381,\"sha256\":\"sha256:96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4\"},{\"root\":\"core\",\"path\":\"system/schema/candidate-source-comparison.schema.json\",\"size\":4794,\"sha256\":\"sha256:2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ability.candidate.append.schema.json\",\"size\":1801,\"sha256\":\"sha256:fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ai-action.delivery.apply.schema.json\",\"size\":905,\"sha256\":\"sha256:f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/atlas.question.save.schema.json\",\"size\":1948,\"sha256\":\"sha256:6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/capture.create.schema.json\",\"size\":1282,\"sha256\":\"sha256:4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.create.schema.json\",\"size\":942,\"sha256\":\"sha256:3dd9d13af993a5542c445b49f3ce52015f2766e0a9ddf92845fee3ecf117fd3d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.entry.revise.schema.json\",\"size\":1469,\"sha256\":\"sha256:35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/concept.relations.change.schema.json\",\"size\":1277,\"sha256\":\"sha256:f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/coordination.section.revise.schema.json\",\"size\":1183,\"sha256\":\"sha256:b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.create.schema.json\",\"size\":1108,\"sha256\":\"sha256:f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.resolve.schema.json\",\"size\":786,\"sha256\":\"sha256:0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/garden.seed.create.schema.json\",\"size\":693,\"sha256\":\"sha256:7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/inbox.resolve.schema.json\",\"size\":1120,\"sha256\":\"sha256:be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.ability-observation.append.schema.json\",\"size\":2401,\"sha256\":\"sha256:a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.observation.append.schema.json\",\"size\":2019,\"sha256\":\"sha256:e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.stage-result.append.schema.json\",\"size\":1871,\"sha256\":\"sha256:cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/legacy.archive.lock.publish.schema.json\",\"size\":1274,\"sha256\":\"sha256:f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/lineage.restamp.schema.json\",\"size\":941,\"sha256\":\"sha256:aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.catalog.update.schema.json\",\"size\":1373,\"sha256\":\"sha256:7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.comparison.publish.schema.json\",\"size\":1546,\"sha256\":\"sha256:0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.attempt.record.schema.json\",\"size\":1414,\"sha256\":\"sha256:fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.create.schema.json\",\"size\":987,\"sha256\":\"sha256:e2c1846b04f5b68cde2773d0a487a8bb1b791fa6f427b01672e23acc758ad2e8\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.materials.compact.schema.json\",\"size\":941,\"sha256\":\"sha256:fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.plan.import.schema.json\",\"size\":2413,\"sha256\":\"sha256:f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.sitting.update.schema.json\",\"size\":951,\"sha256\":\"sha256:6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save.schema.json\",\"size\":1772,\"sha256\":\"sha256:8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save_batch.schema.json\",\"size\":2302,\"sha256\":\"sha256:e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.create.schema.json\",\"size\":1938,\"sha256\":\"sha256:bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.evidence.add.schema.json\",\"size\":1054,\"sha256\":\"sha256:5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.revise.schema.json\",\"size\":972,\"sha256\":\"sha256:39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.attachment.add.schema.json\",\"size\":1277,\"sha256\":\"sha256:35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.note.write.schema.json\",\"size\":886,\"sha256\":\"sha256:2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.progress.update.schema.json\",\"size\":919,\"sha256\":\"sha256:6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/program.semester.update.schema.json\",\"size\":991,\"sha256\":\"sha256:cedc9db7305d6478954013dd555462e44c3558a5a9f8f243875c6633a145f17f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.create.schema.json\",\"size\":2070,\"sha256\":\"sha256:b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.update.schema.json\",\"size\":2224,\"sha256\":\"sha256:aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.apply.schema.json\",\"size\":767,\"sha256\":\"sha256:16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.prepare.schema.json\",\"size\":1193,\"sha256\":\"sha256:b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/route.patch.schema.json\",\"size\":2942,\"sha256\":\"sha256:a434bcdad97ff0d5b26a5ac6ee8db25db33d354703eeeba35020452a422dc7e2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.feedback.record.schema.json\",\"size\":1483,\"sha256\":\"sha256:fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.intake.record.schema.json\",\"size\":2878,\"sha256\":\"sha256:7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.record.revise.schema.json\",\"size\":1588,\"sha256\":\"sha256:f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.attachment.add.schema.json\",\"size\":1283,\"sha256\":\"sha256:0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.note.write.schema.json\",\"size\":1028,\"sha256\":\"sha256:e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.progress.update.schema.json\",\"size\":1280,\"sha256\":\"sha256:c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.map.import.schema.json\",\"size\":1928,\"sha256\":\"sha256:956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.material-synthesis.publish.schema.json\",\"size\":1643,\"sha256\":\"sha256:f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.note.append.schema.json\",\"size\":1595,\"sha256\":\"sha256:1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.plan.revise.schema.json\",\"size\":2461,\"sha256\":\"sha256:63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.source-selection.set.schema.json\",\"size\":1185,\"sha256\":\"sha256:8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/workspace.next-action.update.schema.json\",\"size\":806,\"sha256\":\"sha256:2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b\"},{\"root\":\"core\",\"path\":\"system/schema/capability-envelope.schema.json\",\"size\":8153,\"sha256\":\"sha256:8b3c8e0c7542668ba6f15a72d5af5290b7139a82f55850633b0d264dedea6c2b\"},{\"root\":\"core\",\"path\":\"system/schema/collections.schema.json\",\"size\":2381,\"sha256\":\"sha256:2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec\"},{\"root\":\"core\",\"path\":\"system/schema/concept-relations.schema.json\",\"size\":1398,\"sha256\":\"sha256:83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac\"},{\"root\":\"core\",\"path\":\"system/schema/concepts.schema.json\",\"size\":1400,\"sha256\":\"sha256:98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3\"},{\"root\":\"core\",\"path\":\"system/schema/coordination.schema.json\",\"size\":708,\"sha256\":\"sha256:935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961\"},{\"root\":\"core\",\"path\":\"system/schema/goal-ledger.schema.json\",\"size\":4412,\"sha256\":\"sha256:8b56b76ce3576c36b8e426a184018162ac624dbce22762bb527408a83a324f45\"},{\"root\":\"core\",\"path\":\"system/schema/health-report.schema.json\",\"size\":1118,\"sha256\":\"sha256:ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6\"},{\"root\":\"core\",\"path\":\"system/schema/learner-observation.schema.json\",\"size\":2260,\"sha256\":\"sha256:556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1\"},{\"root\":\"core\",\"path\":\"system/schema/learner-stage-result.schema.json\",\"size\":1820,\"sha256\":\"sha256:2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268\"},{\"root\":\"core\",\"path\":\"system/schema/learning-path.schema.json\",\"size\":4726,\"sha256\":\"sha256:37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8\"},{\"root\":\"core\",\"path\":\"system/schema/learning-plan.schema.json\",\"size\":16830,\"sha256\":\"sha256:7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8\"},{\"root\":\"core\",\"path\":\"system/schema/learning-requirement.schema.json\",\"size\":2087,\"sha256\":\"sha256:402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-allowlist.schema.json\",\"size\":1302,\"sha256\":\"sha256:f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-lock.schema.json\",\"size\":2535,\"sha256\":\"sha256:3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-status.schema.json\",\"size\":599,\"sha256\":\"sha256:50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-catalog.schema.json\",\"size\":3728,\"sha256\":\"sha256:1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion-provenance.schema.json\",\"size\":3586,\"sha256\":\"sha256:b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion.schema.json\",\"size\":6778,\"sha256\":\"sha256:adc1a9ebf86bb47da51d5a5a9e0ce2fd54fd552b29ba4e9cf3f7e99ae6b20c1d\"},{\"root\":\"core\",\"path\":\"system/schema/masters-planning-dashboard.schema.json\",\"size\":1355,\"sha256\":\"sha256:f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db\"},{\"root\":\"core\",\"path\":\"system/schema/material-comparison-defs.schema.json\",\"size\":1081,\"sha256\":\"sha256:5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6\"},{\"root\":\"core\",\"path\":\"system/schema/material-span.schema.json\",\"size\":1016,\"sha256\":\"sha256:f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300\"},{\"root\":\"core\",\"path\":\"system/schema/module-source-map.schema.json\",\"size\":7543,\"sha256\":\"sha256:967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539\"},{\"root\":\"core\",\"path\":\"system/schema/module.schema.json\",\"size\":8431,\"sha256\":\"sha256:cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8\"},{\"root\":\"core\",\"path\":\"system/schema/modules.schema.json\",\"size\":7662,\"sha256\":\"sha256:fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b\"},{\"root\":\"core\",\"path\":\"system/schema/note.schema.json\",\"size\":9311,\"sha256\":\"sha256:b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222\"},{\"root\":\"core\",\"path\":\"system/schema/plan-template.schema.json\",\"size\":2162,\"sha256\":\"sha256:6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b\"},{\"root\":\"core\",\"path\":\"system/schema/program.schema.json\",\"size\":1365,\"sha256\":\"sha256:071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e\"},{\"root\":\"core\",\"path\":\"system/schema/project-aliases.schema.json\",\"size\":530,\"sha256\":\"sha256:97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df\"},{\"root\":\"core\",\"path\":\"system/schema/project-relations.schema.json\",\"size\":1694,\"sha256\":\"sha256:d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18\"},{\"root\":\"core\",\"path\":\"system/schema/project.schema.json\",\"size\":5953,\"sha256\":\"sha256:9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.candidate.append.schema.json\",\"size\":6415,\"sha256\":\"sha256:c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.context.schema.json\",\"size\":4422,\"sha256\":\"sha256:6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.append-slices.schema.json\",\"size\":6257,\"sha256\":\"sha256:84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.apply.schema.json\",\"size\":4077,\"sha256\":\"sha256:47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.import.schema.json\",\"size\":1612,\"sha256\":\"sha256:926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.validate.schema.json\",\"size\":1683,\"sha256\":\"sha256:ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.list.schema.json\",\"size\":1032,\"sha256\":\"sha256:437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.prepare.schema.json\",\"size\":4775,\"sha256\":\"sha256:a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.status.schema.json\",\"size\":1624,\"sha256\":\"sha256:d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.context.schema.json\",\"size\":2240,\"sha256\":\"sha256:42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.question.save.schema.json\",\"size\":2833,\"sha256\":\"sha256:745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.manifest.schema.json\",\"size\":3430,\"sha256\":\"sha256:b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.verify.schema.json\",\"size\":4147,\"sha256\":\"sha256:15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capabilities.read.schema.json\",\"size\":2038,\"sha256\":\"sha256:2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capture.create.schema.json\",\"size\":3779,\"sha256\":\"sha256:4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db\"},{\"root\":\"core\",\"path\":\"system/schema/requests/cli.capability.schema.json\",\"size\":2655,\"sha256\":\"sha256:4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.create.schema.json\",\"size\":3860,\"sha256\":\"sha256:e99fac17baaa64f1e29622dc58f6ba9c36b9061cd9b5fb7be48de84da027c1a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.entry.revise.schema.json\",\"size\":5102,\"sha256\":\"sha256:e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846\"},{\"root\":\"core\",\"path\":\"system/schema/requests/concept.relations.change.schema.json\",\"size\":2815,\"sha256\":\"sha256:00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/coordination.section.revise.schema.json\",\"size\":4691,\"sha256\":\"sha256:30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.create.schema.json\",\"size\":4617,\"sha256\":\"sha256:ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.resolve.schema.json\",\"size\":3800,\"sha256\":\"sha256:b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/dossier.read.schema.json\",\"size\":1575,\"sha256\":\"sha256:717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/garden.seed.create.schema.json\",\"size\":3286,\"sha256\":\"sha256:56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238\"},{\"root\":\"core\",\"path\":\"system/schema/requests/goal.decide.schema.json\",\"size\":7303,\"sha256\":\"sha256:153d5ec6ea2358ec84af5df7cb2469c0fd7445bc4c62492f773fb753ee5df3f0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/health.report.schema.json\",\"size\":1035,\"sha256\":\"sha256:eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.content.schema.json\",\"size\":3095,\"sha256\":\"sha256:b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.list.schema.json\",\"size\":1036,\"sha256\":\"sha256:e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.resolve.schema.json\",\"size\":4142,\"sha256\":\"sha256:1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097\"},{\"root\":\"core\",\"path\":\"system/schema/requests/intelligence.scan.schema.json\",\"size\":2664,\"sha256\":\"sha256:a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.ability-observation.append.schema.json\",\"size\":9026,\"sha256\":\"sha256:f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observation.append.schema.json\",\"size\":7838,\"sha256\":\"sha256:99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observe.schema.json\",\"size\":6621,\"sha256\":\"sha256:7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.stage-result.append.schema.json\",\"size\":7300,\"sha256\":\"sha256:defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.inspect.schema.json\",\"size\":2182,\"sha256\":\"sha256:157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.lock.publish.schema.json\",\"size\":3922,\"sha256\":\"sha256:c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.status.schema.json\",\"size\":1082,\"sha256\":\"sha256:5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/lineage.restamp.schema.json\",\"size\":4540,\"sha256\":\"sha256:7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.catalog.update.schema.json\",\"size\":3938,\"sha256\":\"sha256:ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.comparison.publish.schema.json\",\"size\":4569,\"sha256\":\"sha256:f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.dashboard.schema.json\",\"size\":1659,\"sha256\":\"sha256:12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.context.schema.json\",\"size\":6935,\"sha256\":\"sha256:bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.span.schema.json\",\"size\":4423,\"sha256\":\"sha256:15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.attempt.record.schema.json\",\"size\":5727,\"sha256\":\"sha256:def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.create.schema.json\",\"size\":3916,\"sha256\":\"sha256:02b73b8c4600f234426dfb360dd9d3a2676a71d6c7ee55a7f6c8cbceb6b6b18f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.list.schema.json\",\"size\":2127,\"sha256\":\"sha256:e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.materials.compact.schema.json\",\"size\":4010,\"sha256\":\"sha256:1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.plan.import.schema.json\",\"size\":8126,\"sha256\":\"sha256:19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.sitting.update.schema.json\",\"size\":4006,\"sha256\":\"sha256:853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.prepare.schema.json\",\"size\":2291,\"sha256\":\"sha256:c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save.schema.json\",\"size\":4032,\"sha256\":\"sha256:4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save_batch.schema.json\",\"size\":2879,\"sha256\":\"sha256:4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.content.schema.json\",\"size\":3184,\"sha256\":\"sha256:9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.create.schema.json\",\"size\":3943,\"sha256\":\"sha256:1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.evidence.add.schema.json\",\"size\":4132,\"sha256\":\"sha256:09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.revise.schema.json\",\"size\":4463,\"sha256\":\"sha256:f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.search.schema.json\",\"size\":4796,\"sha256\":\"sha256:6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operations.read.schema.json\",\"size\":2157,\"sha256\":\"sha256:0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operator.bootstrap.schema.json\",\"size\":3732,\"sha256\":\"sha256:2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.attachment.add.schema.json\",\"size\":5038,\"sha256\":\"sha256:bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.note.write.schema.json\",\"size\":4268,\"sha256\":\"sha256:0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.progress.update.schema.json\",\"size\":3951,\"sha256\":\"sha256:e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.edit-context.schema.json\",\"size\":6343,\"sha256\":\"sha256:42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.template.schema.json\",\"size\":3471,\"sha256\":\"sha256:1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.list.schema.json\",\"size\":1022,\"sha256\":\"sha256:1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.semester.update.schema.json\",\"size\":3922,\"sha256\":\"sha256:fc100aa9cbfce8c13ac5a4f288d22e4bdff17ee1237bfbd382b14db832857526\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.create.schema.json\",\"size\":3962,\"sha256\":\"sha256:5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.inspect.schema.json\",\"size\":2236,\"sha256\":\"sha256:e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.list.schema.json\",\"size\":1528,\"sha256\":\"sha256:21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.update.schema.json\",\"size\":4535,\"sha256\":\"sha256:80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.generate.schema.json\",\"size\":1003,\"sha256\":\"sha256:b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.observe.schema.json\",\"size\":2081,\"sha256\":\"sha256:6c846a118a81d9bbb7f8153007542f3587b50ef90ee23b80cd0d59e837c8abe6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/related.read.schema.json\",\"size\":1650,\"sha256\":\"sha256:bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/repository.validate.schema.json\",\"size\":1495,\"sha256\":\"sha256:ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/resume.read.schema.json\",\"size\":2123,\"sha256\":\"sha256:873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.apply.schema.json\",\"size\":3891,\"sha256\":\"sha256:756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.prepare.schema.json\",\"size\":4528,\"sha256\":\"sha256:2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/route.patch.schema.json\",\"size\":5167,\"sha256\":\"sha256:04cf04b1b48c8132f8a61b63be2cd65c7338844438f4ef118d50e39131c4a19d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/runtime.session.schema.json\",\"size\":3774,\"sha256\":\"sha256:3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/semantic.query.schema.json\",\"size\":3136,\"sha256\":\"sha256:abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034\"},{\"root\":\"core\",\"path\":\"system/schema/requests/session.end.schema.json\",\"size\":4363,\"sha256\":\"sha256:41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.feedback.record.schema.json\",\"size\":5901,\"sha256\":\"sha256:112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.intake.record.schema.json\",\"size\":5091,\"sha256\":\"sha256:0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.record.revise.schema.json\",\"size\":5074,\"sha256\":\"sha256:7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.attachment.add.schema.json\",\"size\":5019,\"sha256\":\"sha256:28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.note.write.schema.json\",\"size\":4404,\"sha256\":\"sha256:83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.progress.update.schema.json\",\"size\":5088,\"sha256\":\"sha256:50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/status.read.schema.json\",\"size\":1538,\"sha256\":\"sha256:3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.list.schema.json\",\"size\":4981,\"sha256\":\"sha256:28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.map.import.schema.json\",\"size\":7302,\"sha256\":\"sha256:3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.material-synthesis.publish.schema.json\",\"size\":5019,\"sha256\":\"sha256:7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.note.append.schema.json\",\"size\":5759,\"sha256\":\"sha256:2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.plan.revise.schema.json\",\"size\":7544,\"sha256\":\"sha256:06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.source-selection.set.schema.json\",\"size\":4979,\"sha256\":\"sha256:8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff\"},{\"root\":\"core\",\"path\":\"system/schema/requests/workspace.next-action.update.schema.json\",\"size\":3410,\"sha256\":\"sha256:ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde\"},{\"root\":\"core\",\"path\":\"system/schema/resume.schema.json\",\"size\":765,\"sha256\":\"sha256:9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991\"},{\"root\":\"core\",\"path\":\"system/schema/runtime-session.schema.json\",\"size\":629,\"sha256\":\"sha256:b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c\"},{\"root\":\"core\",\"path\":\"system/schema/session-context.schema.json\",\"size\":2009,\"sha256\":\"sha256:aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e\"},{\"root\":\"core\",\"path\":\"system/schema/session-plan.schema.json\",\"size\":4161,\"sha256\":\"sha256:d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84\"},{\"root\":\"core\",\"path\":\"system/schema/sources.schema.json\",\"size\":8025,\"sha256\":\"sha256:6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4\"},{\"root\":\"core\",\"path\":\"system/schema/study-map.schema.json\",\"size\":10349,\"sha256\":\"sha256:8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772\"},{\"root\":\"core\",\"path\":\"system/schema/thematic-groups.schema.json\",\"size\":1121,\"sha256\":\"sha256:55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159\"},{\"root\":\"core\",\"path\":\"system/schema/transaction-receipt.schema.json\",\"size\":10258,\"sha256\":\"sha256:064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55\"},{\"root\":\"core\",\"path\":\"system/schema/ui-responses.schema.json\",\"size\":38800,\"sha256\":\"sha256:dab0b6f04218e2bd724304efa43320768a17f833732b1aa8576bd31222cf9b27\"},{\"root\":\"core\",\"path\":\"system/schema/unit-material-synthesis.schema.json\",\"size\":8987,\"sha256\":\"sha256:2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37\"},{\"root\":\"core\",\"path\":\"system/schema/unit.schema.json\",\"size\":5271,\"sha256\":\"sha256:39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b\"},{\"root\":\"core\",\"path\":\"system/schema/workspace.schema.json\",\"size\":1939,\"sha256\":\"sha256:c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96\"},{\"root\":\"core\",\"path\":\"work/COORDINATION.md\",\"size\":220,\"sha256\":\"sha256:667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"size\":350,\"sha256\":\"sha256:f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/ability-observations.jsonl\",\"size\":573,\"sha256\":\"sha256:1c8eb39cfb4345f0848479cee57081109ca59fefc19e81ea3b39f63c774499f8\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/outputs/demo-coverage-audit.md\",\"size\":202,\"sha256\":\"sha256:12042cb1d559ec41ae54303706ddb6314f37adc58d0a592092d8b108ea091fff\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/path-demo.yaml\",\"size\":476,\"sha256\":\"sha256:c383f7acfd609dc321b2edf7b361c0fa441d214eee8fc1a379d7c205e09e5890\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/stage-demo-path-notes.md\",\"size\":36,\"sha256\":\"sha256:105f863cae25c40a6f48917be30307880ce4ff3f0d83b9b9116a04363170d413\"},{\"root\":\"core\",\"path\":\"work/active/workspace-second/CONTEXT.md\",\"size\":271,\"sha256\":\"sha256:447501ac5d8fb8fcb40f4daeb8de500c97abd933b7af20a0dea814d9ae7f9040\"},{\"root\":\"core\",\"path\":\"work/inbox/note-drop.md\",\"size\":26,\"sha256\":\"sha256:cff485a0c38476920bff529d70a47c19fddb0380750b9a0152521d7eb9b6c81d\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/one.md\",\"size\":4,\"sha256\":\"sha256:2c8b08da5ce60398e1f19af0e5dccc744df274b826abe585eaba68c525434806\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/two.md\",\"size\":4,\"sha256\":\"sha256:27dd8ed44a83ff94d557f9fd0412ed5a8cbca69ea04922d88c01184a07300a5a\"},{\"root\":\"materials\",\"path\":\"source-demo-book/book.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"materials\",\"path\":\"source-demo-book/lecture-01.pdf\",\"size\":10191,\"sha256\":\"sha256:395ded80ff4a721e2a91f400a3c6a3abd1f8d37e3c7f70b5ef42fa30d5264ea5\"},{\"root\":\"materials\",\"path\":\"source-scenario-bare/attached.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"ui\",\"path\":\"plugin-assets.json\",\"size\":115,\"sha256\":\"sha256:61421f5649b9648ad0fd87bbd7dd267fb2371f15fb72652f69a87156f8e45f4d\"},{\"root\":\"ui\",\"path\":\"plugin/main.js\",\"size\":30,\"sha256\":\"sha256:6c2835936c311f016909937b412e19a2b44c71fda4baa5e49bfd672187823cd0\"}],\"materials_aliases\":{},\"provenance\":{\"core\":{\"commit\":\"001177fc67a90948242c1ea970252862fe793333\",\"dirty\":false},\"ui\":{\"commit\":null,\"dirty\":null},\"data_contract_version\":61},\"aggregate_sha256\":\"sha256:f0f1aa75db4047881176f0bd6b9dd0e91f6cee97ef7bf9225fd87f49a5e943aa\"}\n", + "stdout": "{\"schema_version\":1,\"type\":\"backup-manifest\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"roots\":[\"core\",\"materials\",\"ui\"],\"entries\":[{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"size\":693,\"sha256\":\"sha256:4ae2ad31254f0d470993f4566c83a4f4056b20fc19c4317bd57c52b0ea809e19\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/source-map.yaml\",\"size\":759,\"sha256\":\"sha256:bc7e0a53304d1e916e03c7a69bc5a0746f522a8a3bc610653ec8c44b97b0a730\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"size\":1819,\"sha256\":\"sha256:506b0fdd350e11960069e09ffd099e7ac616076a8b3425557614e9167bbfe141\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"size\":941,\"sha256\":\"sha256:02dd8b658f2eceeb04ae9405f545f95ac719226a52f6d1690985403647476dc1\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"size\":676,\"sha256\":\"sha256:3972911e1580b4afb0f23a0df306b5fbd5073996aae31895a49ce6363d9fa235\"},{\"root\":\"core\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"size\":205,\"sha256\":\"sha256:ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175\"},{\"root\":\"core\",\"path\":\"curriculum/resume.yaml\",\"size\":143,\"sha256\":\"sha256:1360307adc4f3cf81ae20860966e3e53d87eb779bfed8284ca970314c58fd858\"},{\"root\":\"core\",\"path\":\"knowledge/abilities.yaml\",\"size\":812,\"sha256\":\"sha256:1fc5719eb8e7bb60c6c77bccd020189502eb3efd38fa3e8d5bf988bc08a3ef0a\"},{\"root\":\"core\",\"path\":\"knowledge/concept-relations.yaml\",\"size\":83,\"sha256\":\"sha256:931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d\"},{\"root\":\"core\",\"path\":\"knowledge/concepts.yaml\",\"size\":157,\"sha256\":\"sha256:7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e\"},{\"root\":\"core\",\"path\":\"knowledge/garden/seed.md\",\"size\":17,\"sha256\":\"sha256:2fa0d5901df7142374cd36288533e6d84f11df0370a087cdb50d000794dfd169\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo-analysis.md\",\"size\":753,\"sha256\":\"sha256:ecd673fe86ebb2952d5efaf15ee8c4dc49f2f10c3710b795f3b8b0cafd23330c\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo.md\",\"size\":162,\"sha256\":\"sha256:5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276\"},{\"root\":\"core\",\"path\":\"operations/ai-actions/requests/ai-request-demo/request.yaml\",\"size\":189,\"sha256\":\"sha256:4024838e1f48e7f5d7a0f7dba5c374f35c3a9c0255fe4906b7ab4b376e126fd9\"},{\"root\":\"core\",\"path\":\"operations/goal-ledger.yaml\",\"size\":189,\"sha256\":\"sha256:eb3d9638be9378e8254a9848d56f844cb0d4ce4213ce31bcfc6053db35c6a1b5\"},{\"root\":\"core\",\"path\":\"operations/transactions/lineage.yaml\",\"size\":618,\"sha256\":\"sha256:9064555ce2bb0004dbeb396ec138b6eac83c130f2ac7207c55e387562e68dcbe\"},{\"root\":\"core\",\"path\":\"operations/transactions/revisions.yaml\",\"size\":79,\"sha256\":\"sha256:95af59729f0817655d3237e3acd64cc4025c60e53c016a82ed1ba90757115a3a\"},{\"root\":\"core\",\"path\":\"operations/transactions/transaction-20200102-000000-001.yaml\",\"size\":1355,\"sha256\":\"sha256:8c07311aa87a315f0e7400a731445b85f04ed6dc0594a61612ff6430510df3ac\"},{\"root\":\"core\",\"path\":\"projects/registry/project-demo.yaml\",\"size\":377,\"sha256\":\"sha256:1deec83d86d3ec33d96d07de4313acbf46fcef15bd87ee7dd7918d41ed5a75bc\"},{\"root\":\"core\",\"path\":\"projects/relations/project-relations.yaml\",\"size\":175,\"sha256\":\"sha256:22463f43ea8cf79074fb7dddfe3563abb10eacb5897115e45140e818df2f6740\"},{\"root\":\"core\",\"path\":\"records/materials-manifest.yaml\",\"size\":984,\"sha256\":\"sha256:893c316744777bda54e0feed32bd6e25be7ba5cd6eb86f7589a931fea1cbd74a\"},{\"root\":\"core\",\"path\":\"records/modules.yaml\",\"size\":223,\"sha256\":\"sha256:5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7\"},{\"root\":\"core\",\"path\":\"sources/collections/shelf.yaml\",\"size\":129,\"sha256\":\"sha256:5cc34276b241dd75fd1fa8345e65ef89924b6b422b1287b6d8cfe5b5704cce9c\"},{\"root\":\"core\",\"path\":\"sources/sources.yaml\",\"size\":289,\"sha256\":\"sha256:03e8c76818ced582638f18e1cb41b3bac2403f0ba0da20a04932851ed4461087\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-input.schema.json\",\"size\":5599,\"sha256\":\"sha256:2916d1a5155301469f4ad433410d808c264de8e74bc05e55586b7da70c88ab84\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-report.schema.json\",\"size\":2495,\"sha256\":\"sha256:7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/garden.shelve.yaml\",\"size\":808,\"sha256\":\"sha256:55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/unit.compare-materials.yaml\",\"size\":654,\"sha256\":\"sha256:7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-adapters.yaml\",\"size\":853,\"sha256\":\"sha256:804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56\"},{\"root\":\"core\",\"path\":\"system/contracts/backup-roots.yaml\",\"size\":3878,\"sha256\":\"sha256:5dc4d1c40a872c0b432822c04db39091b035e6c7d8959961cb6a92c9371cc59a\"},{\"root\":\"core\",\"path\":\"system/contracts/capabilities.yaml\",\"size\":44149,\"sha256\":\"sha256:9f3a060d396925db7e66f23703dbe392ac40b3b44f2b5b59b704f97b2c645dfa\"},{\"root\":\"core\",\"path\":\"system/contracts/cli-operations.yaml\",\"size\":2875,\"sha256\":\"sha256:f4ba996c3c2d7bd02406d2ba6efd5ce3fceded5c0ec66348758cde7a56a73292\"},{\"root\":\"core\",\"path\":\"system/contracts/contract-register.yaml\",\"size\":11195,\"sha256\":\"sha256:df98578f254c261109aa1cc9d76e53c64d675e0df0ab2c10f9593b76be2d79e4\"},{\"root\":\"core\",\"path\":\"system/contracts/data-contract.yaml\",\"size\":20772,\"sha256\":\"sha256:2954088c266a21807d2fefdbad6326e9f6c0d989b46c15c88c1e353494c37333\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-contract.yaml\",\"size\":8977,\"sha256\":\"sha256:d9ca03f62ca990a9557e8c35bd1bc09967fe9e47d4b1d43441f58989c39019c2\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-v15.schema.json\",\"size\":87416,\"sha256\":\"sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-v16.schema.json\",\"size\":87524,\"sha256\":\"sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.schema.json\",\"size\":4941,\"sha256\":\"sha256:9e76ff6a56116c4a20f6af5fd296be1ff4cadbcc984acaba552daaabf53fba34\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.yaml\",\"size\":42648,\"sha256\":\"sha256:858f13552ae3d1921b03d2ebc93b80f4a2a5ef14690c5130bdb037452af89114\"},{\"root\":\"core\",\"path\":\"system/contracts/perimeter.yaml\",\"size\":10603,\"sha256\":\"sha256:1cebe28ced51f556d6d33d372a7b383744a83b3668675a9f59ec26f479d4fb1b\"},{\"root\":\"core\",\"path\":\"system/contracts/release-pair-receipt.schema.json\",\"size\":3384,\"sha256\":\"sha256:fded162b92379ea9e353bcbdb5e21e8bbcf880e9bad8ddf60e61eb48b2c430c6\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.schema.json\",\"size\":2731,\"sha256\":\"sha256:44e489cef663dbc886ab50932aea3d7ff6ffc8840a5f663d6dbe2b73bb45ea63\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.yaml\",\"size\":25098,\"sha256\":\"sha256:9e359870e9c85a0c0439d0101325f0ef36402848f8ddf1fad0a84a008061a4ed\"},{\"root\":\"core\",\"path\":\"system/contracts/semantic-lineage-ledger.schema.json\",\"size\":3086,\"sha256\":\"sha256:2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf\"},{\"root\":\"core\",\"path\":\"system/contracts/task-scope.yaml\",\"size\":9869,\"sha256\":\"sha256:84ef07507f98c96b7d7223a3d7c84602cf68013e2771f4776527b25260615413\"},{\"root\":\"core\",\"path\":\"system/contracts/tree-contract.yaml\",\"size\":8809,\"sha256\":\"sha256:2e8588a08a3a1565a9b09a1b0839ed84bfe9892e2a87a5d50f7893f2c4aa6cfa\"},{\"root\":\"core\",\"path\":\"system/contracts/validation-warning-baseline.schema.json\",\"size\":2227,\"sha256\":\"sha256:0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9\"},{\"root\":\"core\",\"path\":\"system/schema/abilities.schema.json\",\"size\":3331,\"sha256\":\"sha256:06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543\"},{\"root\":\"core\",\"path\":\"system/schema/ability-candidate.schema.json\",\"size\":1110,\"sha256\":\"sha256:7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612\"},{\"root\":\"core\",\"path\":\"system/schema/ability-context.schema.json\",\"size\":3283,\"sha256\":\"sha256:dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5\"},{\"root\":\"core\",\"path\":\"system/schema/ability-observation.schema.json\",\"size\":1603,\"sha256\":\"sha256:1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f\"},{\"root\":\"core\",\"path\":\"system/schema/backup-manifest.schema.json\",\"size\":2381,\"sha256\":\"sha256:96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4\"},{\"root\":\"core\",\"path\":\"system/schema/candidate-source-comparison.schema.json\",\"size\":4828,\"sha256\":\"sha256:ae9933a6033c2b55895aac98c074ed774cab2a3284b364dafdd2bb0b5a379568\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ability.candidate.append.schema.json\",\"size\":1801,\"sha256\":\"sha256:fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ai-action.delivery.apply.schema.json\",\"size\":905,\"sha256\":\"sha256:f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/atlas.question.save.schema.json\",\"size\":1948,\"sha256\":\"sha256:6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/capture.create.schema.json\",\"size\":1282,\"sha256\":\"sha256:4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.create.schema.json\",\"size\":942,\"sha256\":\"sha256:3dd9d13af993a5542c445b49f3ce52015f2766e0a9ddf92845fee3ecf117fd3d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.entry.revise.schema.json\",\"size\":1469,\"sha256\":\"sha256:35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/concept.relations.change.schema.json\",\"size\":1277,\"sha256\":\"sha256:f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/coordination.section.revise.schema.json\",\"size\":1183,\"sha256\":\"sha256:b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.create.schema.json\",\"size\":1108,\"sha256\":\"sha256:f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.resolve.schema.json\",\"size\":786,\"sha256\":\"sha256:0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/garden.seed.create.schema.json\",\"size\":693,\"sha256\":\"sha256:7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/inbox.resolve.schema.json\",\"size\":1120,\"sha256\":\"sha256:be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.ability-observation.append.schema.json\",\"size\":2401,\"sha256\":\"sha256:a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.observation.append.schema.json\",\"size\":2019,\"sha256\":\"sha256:e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.stage-result.append.schema.json\",\"size\":1871,\"sha256\":\"sha256:cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/legacy.archive.lock.publish.schema.json\",\"size\":1274,\"sha256\":\"sha256:f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/lineage.restamp.schema.json\",\"size\":941,\"sha256\":\"sha256:aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.catalog.update.schema.json\",\"size\":1373,\"sha256\":\"sha256:7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.comparison.publish.schema.json\",\"size\":1546,\"sha256\":\"sha256:0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.attempt.record.schema.json\",\"size\":1414,\"sha256\":\"sha256:fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.create.schema.json\",\"size\":987,\"sha256\":\"sha256:e2c1846b04f5b68cde2773d0a487a8bb1b791fa6f427b01672e23acc758ad2e8\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.materials.compact.schema.json\",\"size\":941,\"sha256\":\"sha256:fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.plan.import.schema.json\",\"size\":2413,\"sha256\":\"sha256:f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.sitting.update.schema.json\",\"size\":951,\"sha256\":\"sha256:6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save.schema.json\",\"size\":1772,\"sha256\":\"sha256:8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save_batch.schema.json\",\"size\":2302,\"sha256\":\"sha256:e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.create.schema.json\",\"size\":1938,\"sha256\":\"sha256:bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.evidence.add.schema.json\",\"size\":1054,\"sha256\":\"sha256:5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.revise.schema.json\",\"size\":972,\"sha256\":\"sha256:39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.attachment.add.schema.json\",\"size\":1277,\"sha256\":\"sha256:35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.note.write.schema.json\",\"size\":886,\"sha256\":\"sha256:2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.progress.update.schema.json\",\"size\":919,\"sha256\":\"sha256:6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/program.semester.update.schema.json\",\"size\":991,\"sha256\":\"sha256:cedc9db7305d6478954013dd555462e44c3558a5a9f8f243875c6633a145f17f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.create.schema.json\",\"size\":2070,\"sha256\":\"sha256:b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.update.schema.json\",\"size\":2224,\"sha256\":\"sha256:aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.apply.schema.json\",\"size\":767,\"sha256\":\"sha256:16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.prepare.schema.json\",\"size\":1193,\"sha256\":\"sha256:b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/route.patch.schema.json\",\"size\":2942,\"sha256\":\"sha256:a434bcdad97ff0d5b26a5ac6ee8db25db33d354703eeeba35020452a422dc7e2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.feedback.record.schema.json\",\"size\":1483,\"sha256\":\"sha256:fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.intake.record.schema.json\",\"size\":2878,\"sha256\":\"sha256:7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.record.revise.schema.json\",\"size\":1588,\"sha256\":\"sha256:f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.attachment.add.schema.json\",\"size\":1283,\"sha256\":\"sha256:0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.note.write.schema.json\",\"size\":1028,\"sha256\":\"sha256:e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.progress.update.schema.json\",\"size\":1280,\"sha256\":\"sha256:c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.map.import.schema.json\",\"size\":1928,\"sha256\":\"sha256:956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.material-synthesis.publish.schema.json\",\"size\":1643,\"sha256\":\"sha256:f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.note.append.schema.json\",\"size\":1595,\"sha256\":\"sha256:1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.plan.revise.schema.json\",\"size\":2461,\"sha256\":\"sha256:63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.source-selection.set.schema.json\",\"size\":1185,\"sha256\":\"sha256:8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/workspace.next-action.update.schema.json\",\"size\":806,\"sha256\":\"sha256:2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b\"},{\"root\":\"core\",\"path\":\"system/schema/capability-envelope.schema.json\",\"size\":8153,\"sha256\":\"sha256:8b3c8e0c7542668ba6f15a72d5af5290b7139a82f55850633b0d264dedea6c2b\"},{\"root\":\"core\",\"path\":\"system/schema/collections.schema.json\",\"size\":2381,\"sha256\":\"sha256:2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec\"},{\"root\":\"core\",\"path\":\"system/schema/concept-relations.schema.json\",\"size\":1398,\"sha256\":\"sha256:83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac\"},{\"root\":\"core\",\"path\":\"system/schema/concepts.schema.json\",\"size\":1400,\"sha256\":\"sha256:98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3\"},{\"root\":\"core\",\"path\":\"system/schema/coordination.schema.json\",\"size\":708,\"sha256\":\"sha256:935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961\"},{\"root\":\"core\",\"path\":\"system/schema/goal-ledger.schema.json\",\"size\":4412,\"sha256\":\"sha256:8b56b76ce3576c36b8e426a184018162ac624dbce22762bb527408a83a324f45\"},{\"root\":\"core\",\"path\":\"system/schema/health-report.schema.json\",\"size\":1118,\"sha256\":\"sha256:ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6\"},{\"root\":\"core\",\"path\":\"system/schema/learner-observation.schema.json\",\"size\":2260,\"sha256\":\"sha256:556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1\"},{\"root\":\"core\",\"path\":\"system/schema/learner-stage-result.schema.json\",\"size\":1820,\"sha256\":\"sha256:2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268\"},{\"root\":\"core\",\"path\":\"system/schema/learning-path.schema.json\",\"size\":4726,\"sha256\":\"sha256:37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8\"},{\"root\":\"core\",\"path\":\"system/schema/learning-plan.schema.json\",\"size\":16921,\"sha256\":\"sha256:1967bc3daaaff023d91457e61000d33604e4febe1dc6483e143096ee8e324254\"},{\"root\":\"core\",\"path\":\"system/schema/learning-requirement.schema.json\",\"size\":2087,\"sha256\":\"sha256:402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-allowlist.schema.json\",\"size\":1302,\"sha256\":\"sha256:f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-lock.schema.json\",\"size\":2535,\"sha256\":\"sha256:3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-status.schema.json\",\"size\":599,\"sha256\":\"sha256:50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-catalog.schema.json\",\"size\":3728,\"sha256\":\"sha256:1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion-provenance.schema.json\",\"size\":3586,\"sha256\":\"sha256:b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion.schema.json\",\"size\":6778,\"sha256\":\"sha256:adc1a9ebf86bb47da51d5a5a9e0ce2fd54fd552b29ba4e9cf3f7e99ae6b20c1d\"},{\"root\":\"core\",\"path\":\"system/schema/masters-planning-dashboard.schema.json\",\"size\":1355,\"sha256\":\"sha256:f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db\"},{\"root\":\"core\",\"path\":\"system/schema/material-comparison-defs.schema.json\",\"size\":1081,\"sha256\":\"sha256:5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6\"},{\"root\":\"core\",\"path\":\"system/schema/material-span.schema.json\",\"size\":1016,\"sha256\":\"sha256:f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300\"},{\"root\":\"core\",\"path\":\"system/schema/module-source-map.schema.json\",\"size\":7543,\"sha256\":\"sha256:967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539\"},{\"root\":\"core\",\"path\":\"system/schema/module.schema.json\",\"size\":8431,\"sha256\":\"sha256:cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8\"},{\"root\":\"core\",\"path\":\"system/schema/modules.schema.json\",\"size\":7662,\"sha256\":\"sha256:fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b\"},{\"root\":\"core\",\"path\":\"system/schema/note.schema.json\",\"size\":9311,\"sha256\":\"sha256:b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222\"},{\"root\":\"core\",\"path\":\"system/schema/plan-template.schema.json\",\"size\":2162,\"sha256\":\"sha256:6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b\"},{\"root\":\"core\",\"path\":\"system/schema/program.schema.json\",\"size\":1365,\"sha256\":\"sha256:071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e\"},{\"root\":\"core\",\"path\":\"system/schema/project-aliases.schema.json\",\"size\":530,\"sha256\":\"sha256:97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df\"},{\"root\":\"core\",\"path\":\"system/schema/project-relations.schema.json\",\"size\":1694,\"sha256\":\"sha256:d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18\"},{\"root\":\"core\",\"path\":\"system/schema/project.schema.json\",\"size\":5953,\"sha256\":\"sha256:9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.candidate.append.schema.json\",\"size\":6415,\"sha256\":\"sha256:c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.context.schema.json\",\"size\":4422,\"sha256\":\"sha256:6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.append-slices.schema.json\",\"size\":6257,\"sha256\":\"sha256:84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.apply.schema.json\",\"size\":4077,\"sha256\":\"sha256:47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.import.schema.json\",\"size\":1612,\"sha256\":\"sha256:926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.validate.schema.json\",\"size\":1683,\"sha256\":\"sha256:ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.list.schema.json\",\"size\":1032,\"sha256\":\"sha256:437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.prepare.schema.json\",\"size\":4775,\"sha256\":\"sha256:a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.status.schema.json\",\"size\":1624,\"sha256\":\"sha256:d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.context.schema.json\",\"size\":2240,\"sha256\":\"sha256:42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.question.save.schema.json\",\"size\":2833,\"sha256\":\"sha256:745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.manifest.schema.json\",\"size\":3430,\"sha256\":\"sha256:b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.verify.schema.json\",\"size\":4147,\"sha256\":\"sha256:15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capabilities.read.schema.json\",\"size\":2038,\"sha256\":\"sha256:2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capture.create.schema.json\",\"size\":3779,\"sha256\":\"sha256:4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db\"},{\"root\":\"core\",\"path\":\"system/schema/requests/cli.capability.schema.json\",\"size\":2655,\"sha256\":\"sha256:4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.create.schema.json\",\"size\":3860,\"sha256\":\"sha256:e99fac17baaa64f1e29622dc58f6ba9c36b9061cd9b5fb7be48de84da027c1a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.entry.revise.schema.json\",\"size\":5102,\"sha256\":\"sha256:e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846\"},{\"root\":\"core\",\"path\":\"system/schema/requests/concept.relations.change.schema.json\",\"size\":2815,\"sha256\":\"sha256:00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/coordination.section.revise.schema.json\",\"size\":4691,\"sha256\":\"sha256:30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.create.schema.json\",\"size\":4617,\"sha256\":\"sha256:ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.resolve.schema.json\",\"size\":3800,\"sha256\":\"sha256:b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/dossier.read.schema.json\",\"size\":1575,\"sha256\":\"sha256:717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/garden.seed.create.schema.json\",\"size\":3286,\"sha256\":\"sha256:56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238\"},{\"root\":\"core\",\"path\":\"system/schema/requests/goal.decide.schema.json\",\"size\":7303,\"sha256\":\"sha256:153d5ec6ea2358ec84af5df7cb2469c0fd7445bc4c62492f773fb753ee5df3f0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/health.report.schema.json\",\"size\":1035,\"sha256\":\"sha256:eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.content.schema.json\",\"size\":3095,\"sha256\":\"sha256:b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.list.schema.json\",\"size\":1036,\"sha256\":\"sha256:e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.resolve.schema.json\",\"size\":4142,\"sha256\":\"sha256:1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097\"},{\"root\":\"core\",\"path\":\"system/schema/requests/intelligence.scan.schema.json\",\"size\":2664,\"sha256\":\"sha256:a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.ability-observation.append.schema.json\",\"size\":9026,\"sha256\":\"sha256:f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observation.append.schema.json\",\"size\":7838,\"sha256\":\"sha256:99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observe.schema.json\",\"size\":6621,\"sha256\":\"sha256:7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.stage-result.append.schema.json\",\"size\":7300,\"sha256\":\"sha256:defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.inspect.schema.json\",\"size\":2182,\"sha256\":\"sha256:157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.lock.publish.schema.json\",\"size\":3922,\"sha256\":\"sha256:c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.status.schema.json\",\"size\":1082,\"sha256\":\"sha256:5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/lineage.restamp.schema.json\",\"size\":4540,\"sha256\":\"sha256:7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.catalog.update.schema.json\",\"size\":3938,\"sha256\":\"sha256:ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.comparison.publish.schema.json\",\"size\":4569,\"sha256\":\"sha256:f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.dashboard.schema.json\",\"size\":1659,\"sha256\":\"sha256:12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.context.schema.json\",\"size\":6935,\"sha256\":\"sha256:bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.span.schema.json\",\"size\":4423,\"sha256\":\"sha256:15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.attempt.record.schema.json\",\"size\":5727,\"sha256\":\"sha256:def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.create.schema.json\",\"size\":3916,\"sha256\":\"sha256:02b73b8c4600f234426dfb360dd9d3a2676a71d6c7ee55a7f6c8cbceb6b6b18f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.list.schema.json\",\"size\":2127,\"sha256\":\"sha256:e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.materials.compact.schema.json\",\"size\":4010,\"sha256\":\"sha256:1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.plan.import.schema.json\",\"size\":8126,\"sha256\":\"sha256:19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.sitting.update.schema.json\",\"size\":4006,\"sha256\":\"sha256:853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.prepare.schema.json\",\"size\":2291,\"sha256\":\"sha256:c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save.schema.json\",\"size\":4032,\"sha256\":\"sha256:4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save_batch.schema.json\",\"size\":2879,\"sha256\":\"sha256:4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.content.schema.json\",\"size\":3184,\"sha256\":\"sha256:9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.create.schema.json\",\"size\":3943,\"sha256\":\"sha256:1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.evidence.add.schema.json\",\"size\":4132,\"sha256\":\"sha256:09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.revise.schema.json\",\"size\":4463,\"sha256\":\"sha256:f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.search.schema.json\",\"size\":4796,\"sha256\":\"sha256:6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operations.read.schema.json\",\"size\":2157,\"sha256\":\"sha256:0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operator.bootstrap.schema.json\",\"size\":3732,\"sha256\":\"sha256:2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.attachment.add.schema.json\",\"size\":5038,\"sha256\":\"sha256:bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.note.write.schema.json\",\"size\":4268,\"sha256\":\"sha256:0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.progress.update.schema.json\",\"size\":3951,\"sha256\":\"sha256:e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.edit-context.schema.json\",\"size\":6343,\"sha256\":\"sha256:42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.template.schema.json\",\"size\":3471,\"sha256\":\"sha256:1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.list.schema.json\",\"size\":1022,\"sha256\":\"sha256:1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.semester.update.schema.json\",\"size\":3922,\"sha256\":\"sha256:fc100aa9cbfce8c13ac5a4f288d22e4bdff17ee1237bfbd382b14db832857526\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.create.schema.json\",\"size\":3962,\"sha256\":\"sha256:5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.inspect.schema.json\",\"size\":2236,\"sha256\":\"sha256:e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.list.schema.json\",\"size\":1528,\"sha256\":\"sha256:21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.update.schema.json\",\"size\":4535,\"sha256\":\"sha256:80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.generate.schema.json\",\"size\":1003,\"sha256\":\"sha256:b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.observe.schema.json\",\"size\":2081,\"sha256\":\"sha256:6c846a118a81d9bbb7f8153007542f3587b50ef90ee23b80cd0d59e837c8abe6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/related.read.schema.json\",\"size\":1650,\"sha256\":\"sha256:bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/repository.validate.schema.json\",\"size\":1495,\"sha256\":\"sha256:ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/resume.read.schema.json\",\"size\":2123,\"sha256\":\"sha256:873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.apply.schema.json\",\"size\":3891,\"sha256\":\"sha256:756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.prepare.schema.json\",\"size\":4528,\"sha256\":\"sha256:2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/route.patch.schema.json\",\"size\":5167,\"sha256\":\"sha256:04cf04b1b48c8132f8a61b63be2cd65c7338844438f4ef118d50e39131c4a19d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/runtime.session.schema.json\",\"size\":3774,\"sha256\":\"sha256:3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/semantic.query.schema.json\",\"size\":3136,\"sha256\":\"sha256:abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034\"},{\"root\":\"core\",\"path\":\"system/schema/requests/session.end.schema.json\",\"size\":4363,\"sha256\":\"sha256:41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.feedback.record.schema.json\",\"size\":5901,\"sha256\":\"sha256:112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.intake.record.schema.json\",\"size\":5091,\"sha256\":\"sha256:0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.record.revise.schema.json\",\"size\":5074,\"sha256\":\"sha256:7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.attachment.add.schema.json\",\"size\":5019,\"sha256\":\"sha256:28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.note.write.schema.json\",\"size\":4404,\"sha256\":\"sha256:83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.progress.update.schema.json\",\"size\":5088,\"sha256\":\"sha256:50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/status.read.schema.json\",\"size\":1538,\"sha256\":\"sha256:3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.list.schema.json\",\"size\":4981,\"sha256\":\"sha256:28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.map.import.schema.json\",\"size\":7302,\"sha256\":\"sha256:3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.material-synthesis.publish.schema.json\",\"size\":5019,\"sha256\":\"sha256:7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.note.append.schema.json\",\"size\":5759,\"sha256\":\"sha256:2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.plan.revise.schema.json\",\"size\":7544,\"sha256\":\"sha256:06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.source-selection.set.schema.json\",\"size\":4979,\"sha256\":\"sha256:8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff\"},{\"root\":\"core\",\"path\":\"system/schema/requests/workspace.next-action.update.schema.json\",\"size\":3410,\"sha256\":\"sha256:ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde\"},{\"root\":\"core\",\"path\":\"system/schema/resume.schema.json\",\"size\":765,\"sha256\":\"sha256:9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991\"},{\"root\":\"core\",\"path\":\"system/schema/runtime-session.schema.json\",\"size\":629,\"sha256\":\"sha256:b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c\"},{\"root\":\"core\",\"path\":\"system/schema/session-context.schema.json\",\"size\":2009,\"sha256\":\"sha256:aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e\"},{\"root\":\"core\",\"path\":\"system/schema/session-plan.schema.json\",\"size\":4161,\"sha256\":\"sha256:d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84\"},{\"root\":\"core\",\"path\":\"system/schema/sources.schema.json\",\"size\":8025,\"sha256\":\"sha256:6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4\"},{\"root\":\"core\",\"path\":\"system/schema/study-map.schema.json\",\"size\":10430,\"sha256\":\"sha256:318ecc3d306c6814f7d8b1285e5bf6153fbb6ee178048cec4a29da3842275644\"},{\"root\":\"core\",\"path\":\"system/schema/thematic-groups.schema.json\",\"size\":1121,\"sha256\":\"sha256:55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159\"},{\"root\":\"core\",\"path\":\"system/schema/transaction-receipt.schema.json\",\"size\":10258,\"sha256\":\"sha256:064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55\"},{\"root\":\"core\",\"path\":\"system/schema/ui-responses.schema.json\",\"size\":38800,\"sha256\":\"sha256:dab0b6f04218e2bd724304efa43320768a17f833732b1aa8576bd31222cf9b27\"},{\"root\":\"core\",\"path\":\"system/schema/unit-material-synthesis.schema.json\",\"size\":9058,\"sha256\":\"sha256:5604270206414e23d20330f3d37186f5a6a01f87a3c2900b1e480867c638b615\"},{\"root\":\"core\",\"path\":\"system/schema/unit.schema.json\",\"size\":5271,\"sha256\":\"sha256:39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b\"},{\"root\":\"core\",\"path\":\"system/schema/workspace.schema.json\",\"size\":1939,\"sha256\":\"sha256:c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96\"},{\"root\":\"core\",\"path\":\"work/COORDINATION.md\",\"size\":220,\"sha256\":\"sha256:667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"size\":350,\"sha256\":\"sha256:f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/ability-observations.jsonl\",\"size\":573,\"sha256\":\"sha256:1c8eb39cfb4345f0848479cee57081109ca59fefc19e81ea3b39f63c774499f8\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/outputs/demo-coverage-audit.md\",\"size\":202,\"sha256\":\"sha256:12042cb1d559ec41ae54303706ddb6314f37adc58d0a592092d8b108ea091fff\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/path-demo.yaml\",\"size\":476,\"sha256\":\"sha256:c383f7acfd609dc321b2edf7b361c0fa441d214eee8fc1a379d7c205e09e5890\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/stage-demo-path-notes.md\",\"size\":36,\"sha256\":\"sha256:105f863cae25c40a6f48917be30307880ce4ff3f0d83b9b9116a04363170d413\"},{\"root\":\"core\",\"path\":\"work/active/workspace-second/CONTEXT.md\",\"size\":271,\"sha256\":\"sha256:447501ac5d8fb8fcb40f4daeb8de500c97abd933b7af20a0dea814d9ae7f9040\"},{\"root\":\"core\",\"path\":\"work/inbox/note-drop.md\",\"size\":26,\"sha256\":\"sha256:cff485a0c38476920bff529d70a47c19fddb0380750b9a0152521d7eb9b6c81d\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/one.md\",\"size\":4,\"sha256\":\"sha256:2c8b08da5ce60398e1f19af0e5dccc744df274b826abe585eaba68c525434806\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/two.md\",\"size\":4,\"sha256\":\"sha256:27dd8ed44a83ff94d557f9fd0412ed5a8cbca69ea04922d88c01184a07300a5a\"},{\"root\":\"materials\",\"path\":\"source-demo-book/book.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"materials\",\"path\":\"source-demo-book/lecture-01.pdf\",\"size\":10191,\"sha256\":\"sha256:395ded80ff4a721e2a91f400a3c6a3abd1f8d37e3c7f70b5ef42fa30d5264ea5\"},{\"root\":\"materials\",\"path\":\"source-scenario-bare/attached.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"ui\",\"path\":\"plugin-assets.json\",\"size\":115,\"sha256\":\"sha256:61421f5649b9648ad0fd87bbd7dd267fb2371f15fb72652f69a87156f8e45f4d\"},{\"root\":\"ui\",\"path\":\"plugin/main.js\",\"size\":30,\"sha256\":\"sha256:6c2835936c311f016909937b412e19a2b44c71fda4baa5e49bfd672187823cd0\"}],\"materials_aliases\":{},\"provenance\":{\"core\":{\"commit\":\"48d1ef477e94d707184f67e7ab24e23acd1ca28d\",\"dirty\":false},\"ui\":{\"commit\":null,\"dirty\":null},\"data_contract_version\":62},\"aggregate_sha256\":\"sha256:6bf967a2dec777d9fdb5dfd1fe1c44e219caf93c7b64552c2c6889b8c2d3209b\"}\n", "stdout_json": { - "aggregate_sha256": "sha256:f0f1aa75db4047881176f0bd6b9dd0e91f6cee97ef7bf9225fd87f49a5e943aa", + "aggregate_sha256": "sha256:6bf967a2dec777d9fdb5dfd1fe1c44e219caf93c7b64552c2c6889b8c2d3209b", "entries": [ { "path": "curriculum/modules/module-demo/module.yaml", @@ -170,8 +170,8 @@ { "path": "system/contracts/agent-plan-input.schema.json", "root": "core", - "sha256": "sha256:593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "size": 475 + "sha256": "sha256:2916d1a5155301469f4ad433410d808c264de8e74bc05e55586b7da70c88ab84", + "size": 5599 }, { "path": "system/contracts/agent-plan-report.schema.json", @@ -218,20 +218,20 @@ { "path": "system/contracts/contract-register.yaml", "root": "core", - "sha256": "sha256:3d6f21d3827871fd0747b1c8a4b07656afe9e1bc0b96506aae51280ed9aaa220", - "size": 11187 + "sha256": "sha256:df98578f254c261109aa1cc9d76e53c64d675e0df0ab2c10f9593b76be2d79e4", + "size": 11195 }, { "path": "system/contracts/data-contract.yaml", "root": "core", - "sha256": "sha256:97e5976c26a2924d73aa9b6a3b4c1a908590d35c01c0b594077811c925a74f9b", - "size": 20544 + "sha256": "sha256:2954088c266a21807d2fefdbad6326e9f6c0d989b46c15c88c1e353494c37333", + "size": 20772 }, { "path": "system/contracts/manifest-contract.yaml", "root": "core", - "sha256": "sha256:92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "size": 8779 + "sha256": "sha256:d9ca03f62ca990a9557e8c35bd1bc09967fe9e47d4b1d43441f58989c39019c2", + "size": 8977 }, { "path": "system/contracts/manifest-v15.schema.json", @@ -239,6 +239,12 @@ "sha256": "sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", "size": 87416 }, + { + "path": "system/contracts/manifest-v16.schema.json", + "root": "core", + "sha256": "sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55", + "size": 87524 + }, { "path": "system/contracts/normative-corpus.schema.json", "root": "core", @@ -248,8 +254,8 @@ { "path": "system/contracts/normative-corpus.yaml", "root": "core", - "sha256": "sha256:3191bf5ffb3fcbc0b0a6754200c2f1cd26213281845b52fdf340212193477d4a", - "size": 42645 + "sha256": "sha256:858f13552ae3d1921b03d2ebc93b80f4a2a5ef14690c5130bdb037452af89114", + "size": 42648 }, { "path": "system/contracts/perimeter.yaml", @@ -260,20 +266,20 @@ { "path": "system/contracts/release-pair-receipt.schema.json", "root": "core", - "sha256": "sha256:4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "size": 3380 + "sha256": "sha256:fded162b92379ea9e353bcbdb5e21e8bbcf880e9bad8ddf60e61eb48b2c430c6", + "size": 3384 }, { "path": "system/contracts/review-consolidation.schema.json", "root": "core", - "sha256": "sha256:6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "size": 565 + "sha256": "sha256:44e489cef663dbc886ab50932aea3d7ff6ffc8840a5f663d6dbe2b73bb45ea63", + "size": 2731 }, { "path": "system/contracts/review-consolidation.yaml", "root": "core", - "sha256": "sha256:851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "size": 29564 + "sha256": "sha256:9e359870e9c85a0c0439d0101325f0ef36402848f8ddf1fad0a84a008061a4ed", + "size": 25098 }, { "path": "system/contracts/semantic-lineage-ledger.schema.json", @@ -284,8 +290,8 @@ { "path": "system/contracts/task-scope.yaml", "root": "core", - "sha256": "sha256:eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "size": 9335 + "sha256": "sha256:84ef07507f98c96b7d7223a3d7c84602cf68013e2771f4776527b25260615413", + "size": 9869 }, { "path": "system/contracts/tree-contract.yaml", @@ -332,8 +338,8 @@ { "path": "system/schema/candidate-source-comparison.schema.json", "root": "core", - "sha256": "sha256:2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "size": 4794 + "sha256": "sha256:ae9933a6033c2b55895aac98c074ed774cab2a3284b364dafdd2bb0b5a379568", + "size": 4828 }, { "path": "system/schema/capabilities/ability.candidate.append.schema.json", @@ -698,8 +704,8 @@ { "path": "system/schema/learning-plan.schema.json", "root": "core", - "sha256": "sha256:7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "size": 16830 + "sha256": "sha256:1967bc3daaaff023d91457e61000d33604e4febe1dc6483e143096ee8e324254", + "size": 16921 }, { "path": "system/schema/learning-requirement.schema.json", @@ -1418,8 +1424,8 @@ { "path": "system/schema/study-map.schema.json", "root": "core", - "sha256": "sha256:8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "size": 10349 + "sha256": "sha256:318ecc3d306c6814f7d8b1285e5bf6153fbb6ee178048cec4a29da3842275644", + "size": 10430 }, { "path": "system/schema/thematic-groups.schema.json", @@ -1442,8 +1448,8 @@ { "path": "system/schema/unit-material-synthesis.schema.json", "root": "core", - "sha256": "sha256:2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "size": 8987 + "sha256": "sha256:5604270206414e23d20330f3d37186f5a6a01f87a3c2900b1e480867c638b615", + "size": 9058 }, { "path": "system/schema/unit.schema.json", @@ -1552,10 +1558,10 @@ "materials_aliases": {}, "provenance": { "core": { - "commit": "001177fc67a90948242c1ea970252862fe793333", + "commit": "48d1ef477e94d707184f67e7ab24e23acd1ca28d", "dirty": false }, - "data_contract_version": 61, + "data_contract_version": 62, "ui": { "commit": null, "dirty": null diff --git a/tests/scenarios/recorded/backup.manifest/default-silent.json b/tests/scenarios/recorded/backup.manifest/default-silent.json index 44cf04a2..202d9c60 100644 --- a/tests/scenarios/recorded/backup.manifest/default-silent.json +++ b/tests/scenarios/recorded/backup.manifest/default-silent.json @@ -6,7 +6,7 @@ "receipts": [], "revisions_changed": {}, "session_ledger_changed": null, - "stderr": "los: backup-manifest prints nothing by default: the manifest holds 256 entries (~45 KB). Write it with --out PATH (outside every backed-up root) or print it with --stdout\n", + "stderr": "los: backup-manifest prints nothing by default: the manifest holds 257 entries (~45 KB). Write it with --out PATH (outside every backed-up root) or print it with --stdout\n", "stdout": "", "stdout_json": null } diff --git a/tests/scenarios/recorded/backup.manifest/manifest-stdout.json b/tests/scenarios/recorded/backup.manifest/manifest-stdout.json index 05736d09..9ce44c92 100644 --- a/tests/scenarios/recorded/backup.manifest/manifest-stdout.json +++ b/tests/scenarios/recorded/backup.manifest/manifest-stdout.json @@ -7,9 +7,9 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"backup-manifest\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"roots\":[\"core\",\"materials\",\"ui\"],\"entries\":[{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"size\":693,\"sha256\":\"sha256:4ae2ad31254f0d470993f4566c83a4f4056b20fc19c4317bd57c52b0ea809e19\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/source-map.yaml\",\"size\":759,\"sha256\":\"sha256:bc7e0a53304d1e916e03c7a69bc5a0746f522a8a3bc610653ec8c44b97b0a730\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"size\":1819,\"sha256\":\"sha256:506b0fdd350e11960069e09ffd099e7ac616076a8b3425557614e9167bbfe141\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"size\":941,\"sha256\":\"sha256:02dd8b658f2eceeb04ae9405f545f95ac719226a52f6d1690985403647476dc1\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"size\":676,\"sha256\":\"sha256:3972911e1580b4afb0f23a0df306b5fbd5073996aae31895a49ce6363d9fa235\"},{\"root\":\"core\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"size\":205,\"sha256\":\"sha256:ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175\"},{\"root\":\"core\",\"path\":\"curriculum/resume.yaml\",\"size\":143,\"sha256\":\"sha256:1360307adc4f3cf81ae20860966e3e53d87eb779bfed8284ca970314c58fd858\"},{\"root\":\"core\",\"path\":\"knowledge/abilities.yaml\",\"size\":812,\"sha256\":\"sha256:1fc5719eb8e7bb60c6c77bccd020189502eb3efd38fa3e8d5bf988bc08a3ef0a\"},{\"root\":\"core\",\"path\":\"knowledge/concept-relations.yaml\",\"size\":83,\"sha256\":\"sha256:931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d\"},{\"root\":\"core\",\"path\":\"knowledge/concepts.yaml\",\"size\":157,\"sha256\":\"sha256:7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e\"},{\"root\":\"core\",\"path\":\"knowledge/garden/seed.md\",\"size\":17,\"sha256\":\"sha256:2fa0d5901df7142374cd36288533e6d84f11df0370a087cdb50d000794dfd169\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo-analysis.md\",\"size\":753,\"sha256\":\"sha256:ecd673fe86ebb2952d5efaf15ee8c4dc49f2f10c3710b795f3b8b0cafd23330c\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo.md\",\"size\":162,\"sha256\":\"sha256:5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276\"},{\"root\":\"core\",\"path\":\"operations/ai-actions/requests/ai-request-demo/request.yaml\",\"size\":189,\"sha256\":\"sha256:4024838e1f48e7f5d7a0f7dba5c374f35c3a9c0255fe4906b7ab4b376e126fd9\"},{\"root\":\"core\",\"path\":\"operations/goal-ledger.yaml\",\"size\":189,\"sha256\":\"sha256:eb3d9638be9378e8254a9848d56f844cb0d4ce4213ce31bcfc6053db35c6a1b5\"},{\"root\":\"core\",\"path\":\"operations/transactions/lineage.yaml\",\"size\":618,\"sha256\":\"sha256:9064555ce2bb0004dbeb396ec138b6eac83c130f2ac7207c55e387562e68dcbe\"},{\"root\":\"core\",\"path\":\"operations/transactions/revisions.yaml\",\"size\":79,\"sha256\":\"sha256:95af59729f0817655d3237e3acd64cc4025c60e53c016a82ed1ba90757115a3a\"},{\"root\":\"core\",\"path\":\"operations/transactions/transaction-20200102-000000-001.yaml\",\"size\":1355,\"sha256\":\"sha256:8c07311aa87a315f0e7400a731445b85f04ed6dc0594a61612ff6430510df3ac\"},{\"root\":\"core\",\"path\":\"projects/registry/project-demo.yaml\",\"size\":377,\"sha256\":\"sha256:1deec83d86d3ec33d96d07de4313acbf46fcef15bd87ee7dd7918d41ed5a75bc\"},{\"root\":\"core\",\"path\":\"projects/relations/project-relations.yaml\",\"size\":175,\"sha256\":\"sha256:22463f43ea8cf79074fb7dddfe3563abb10eacb5897115e45140e818df2f6740\"},{\"root\":\"core\",\"path\":\"records/materials-manifest.yaml\",\"size\":984,\"sha256\":\"sha256:893c316744777bda54e0feed32bd6e25be7ba5cd6eb86f7589a931fea1cbd74a\"},{\"root\":\"core\",\"path\":\"records/modules.yaml\",\"size\":223,\"sha256\":\"sha256:5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7\"},{\"root\":\"core\",\"path\":\"sources/collections/shelf.yaml\",\"size\":129,\"sha256\":\"sha256:5cc34276b241dd75fd1fa8345e65ef89924b6b422b1287b6d8cfe5b5704cce9c\"},{\"root\":\"core\",\"path\":\"sources/sources.yaml\",\"size\":289,\"sha256\":\"sha256:03e8c76818ced582638f18e1cb41b3bac2403f0ba0da20a04932851ed4461087\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-input.schema.json\",\"size\":475,\"sha256\":\"sha256:593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-report.schema.json\",\"size\":2495,\"sha256\":\"sha256:7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/garden.shelve.yaml\",\"size\":808,\"sha256\":\"sha256:55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/unit.compare-materials.yaml\",\"size\":654,\"sha256\":\"sha256:7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-adapters.yaml\",\"size\":853,\"sha256\":\"sha256:804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56\"},{\"root\":\"core\",\"path\":\"system/contracts/backup-roots.yaml\",\"size\":3878,\"sha256\":\"sha256:5dc4d1c40a872c0b432822c04db39091b035e6c7d8959961cb6a92c9371cc59a\"},{\"root\":\"core\",\"path\":\"system/contracts/capabilities.yaml\",\"size\":44149,\"sha256\":\"sha256:9f3a060d396925db7e66f23703dbe392ac40b3b44f2b5b59b704f97b2c645dfa\"},{\"root\":\"core\",\"path\":\"system/contracts/cli-operations.yaml\",\"size\":2875,\"sha256\":\"sha256:f4ba996c3c2d7bd02406d2ba6efd5ce3fceded5c0ec66348758cde7a56a73292\"},{\"root\":\"core\",\"path\":\"system/contracts/contract-register.yaml\",\"size\":11187,\"sha256\":\"sha256:3d6f21d3827871fd0747b1c8a4b07656afe9e1bc0b96506aae51280ed9aaa220\"},{\"root\":\"core\",\"path\":\"system/contracts/data-contract.yaml\",\"size\":20544,\"sha256\":\"sha256:97e5976c26a2924d73aa9b6a3b4c1a908590d35c01c0b594077811c925a74f9b\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-contract.yaml\",\"size\":8779,\"sha256\":\"sha256:92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-v15.schema.json\",\"size\":87416,\"sha256\":\"sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.schema.json\",\"size\":4941,\"sha256\":\"sha256:9e76ff6a56116c4a20f6af5fd296be1ff4cadbcc984acaba552daaabf53fba34\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.yaml\",\"size\":42645,\"sha256\":\"sha256:3191bf5ffb3fcbc0b0a6754200c2f1cd26213281845b52fdf340212193477d4a\"},{\"root\":\"core\",\"path\":\"system/contracts/perimeter.yaml\",\"size\":10603,\"sha256\":\"sha256:1cebe28ced51f556d6d33d372a7b383744a83b3668675a9f59ec26f479d4fb1b\"},{\"root\":\"core\",\"path\":\"system/contracts/release-pair-receipt.schema.json\",\"size\":3380,\"sha256\":\"sha256:4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.schema.json\",\"size\":565,\"sha256\":\"sha256:6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.yaml\",\"size\":29564,\"sha256\":\"sha256:851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4\"},{\"root\":\"core\",\"path\":\"system/contracts/semantic-lineage-ledger.schema.json\",\"size\":3086,\"sha256\":\"sha256:2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf\"},{\"root\":\"core\",\"path\":\"system/contracts/task-scope.yaml\",\"size\":9335,\"sha256\":\"sha256:eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18\"},{\"root\":\"core\",\"path\":\"system/contracts/tree-contract.yaml\",\"size\":8809,\"sha256\":\"sha256:2e8588a08a3a1565a9b09a1b0839ed84bfe9892e2a87a5d50f7893f2c4aa6cfa\"},{\"root\":\"core\",\"path\":\"system/contracts/validation-warning-baseline.schema.json\",\"size\":2227,\"sha256\":\"sha256:0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9\"},{\"root\":\"core\",\"path\":\"system/schema/abilities.schema.json\",\"size\":3331,\"sha256\":\"sha256:06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543\"},{\"root\":\"core\",\"path\":\"system/schema/ability-candidate.schema.json\",\"size\":1110,\"sha256\":\"sha256:7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612\"},{\"root\":\"core\",\"path\":\"system/schema/ability-context.schema.json\",\"size\":3283,\"sha256\":\"sha256:dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5\"},{\"root\":\"core\",\"path\":\"system/schema/ability-observation.schema.json\",\"size\":1603,\"sha256\":\"sha256:1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f\"},{\"root\":\"core\",\"path\":\"system/schema/backup-manifest.schema.json\",\"size\":2381,\"sha256\":\"sha256:96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4\"},{\"root\":\"core\",\"path\":\"system/schema/candidate-source-comparison.schema.json\",\"size\":4794,\"sha256\":\"sha256:2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ability.candidate.append.schema.json\",\"size\":1801,\"sha256\":\"sha256:fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ai-action.delivery.apply.schema.json\",\"size\":905,\"sha256\":\"sha256:f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/atlas.question.save.schema.json\",\"size\":1948,\"sha256\":\"sha256:6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/capture.create.schema.json\",\"size\":1282,\"sha256\":\"sha256:4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.create.schema.json\",\"size\":942,\"sha256\":\"sha256:3dd9d13af993a5542c445b49f3ce52015f2766e0a9ddf92845fee3ecf117fd3d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.entry.revise.schema.json\",\"size\":1469,\"sha256\":\"sha256:35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/concept.relations.change.schema.json\",\"size\":1277,\"sha256\":\"sha256:f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/coordination.section.revise.schema.json\",\"size\":1183,\"sha256\":\"sha256:b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.create.schema.json\",\"size\":1108,\"sha256\":\"sha256:f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.resolve.schema.json\",\"size\":786,\"sha256\":\"sha256:0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/garden.seed.create.schema.json\",\"size\":693,\"sha256\":\"sha256:7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/inbox.resolve.schema.json\",\"size\":1120,\"sha256\":\"sha256:be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.ability-observation.append.schema.json\",\"size\":2401,\"sha256\":\"sha256:a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.observation.append.schema.json\",\"size\":2019,\"sha256\":\"sha256:e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.stage-result.append.schema.json\",\"size\":1871,\"sha256\":\"sha256:cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/legacy.archive.lock.publish.schema.json\",\"size\":1274,\"sha256\":\"sha256:f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/lineage.restamp.schema.json\",\"size\":941,\"sha256\":\"sha256:aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.catalog.update.schema.json\",\"size\":1373,\"sha256\":\"sha256:7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.comparison.publish.schema.json\",\"size\":1546,\"sha256\":\"sha256:0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.attempt.record.schema.json\",\"size\":1414,\"sha256\":\"sha256:fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.create.schema.json\",\"size\":987,\"sha256\":\"sha256:e2c1846b04f5b68cde2773d0a487a8bb1b791fa6f427b01672e23acc758ad2e8\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.materials.compact.schema.json\",\"size\":941,\"sha256\":\"sha256:fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.plan.import.schema.json\",\"size\":2413,\"sha256\":\"sha256:f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.sitting.update.schema.json\",\"size\":951,\"sha256\":\"sha256:6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save.schema.json\",\"size\":1772,\"sha256\":\"sha256:8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save_batch.schema.json\",\"size\":2302,\"sha256\":\"sha256:e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.create.schema.json\",\"size\":1938,\"sha256\":\"sha256:bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.evidence.add.schema.json\",\"size\":1054,\"sha256\":\"sha256:5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.revise.schema.json\",\"size\":972,\"sha256\":\"sha256:39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.attachment.add.schema.json\",\"size\":1277,\"sha256\":\"sha256:35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.note.write.schema.json\",\"size\":886,\"sha256\":\"sha256:2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.progress.update.schema.json\",\"size\":919,\"sha256\":\"sha256:6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/program.semester.update.schema.json\",\"size\":991,\"sha256\":\"sha256:cedc9db7305d6478954013dd555462e44c3558a5a9f8f243875c6633a145f17f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.create.schema.json\",\"size\":2070,\"sha256\":\"sha256:b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.update.schema.json\",\"size\":2224,\"sha256\":\"sha256:aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.apply.schema.json\",\"size\":767,\"sha256\":\"sha256:16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.prepare.schema.json\",\"size\":1193,\"sha256\":\"sha256:b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/route.patch.schema.json\",\"size\":2942,\"sha256\":\"sha256:a434bcdad97ff0d5b26a5ac6ee8db25db33d354703eeeba35020452a422dc7e2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.feedback.record.schema.json\",\"size\":1483,\"sha256\":\"sha256:fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.intake.record.schema.json\",\"size\":2878,\"sha256\":\"sha256:7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.record.revise.schema.json\",\"size\":1588,\"sha256\":\"sha256:f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.attachment.add.schema.json\",\"size\":1283,\"sha256\":\"sha256:0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.note.write.schema.json\",\"size\":1028,\"sha256\":\"sha256:e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.progress.update.schema.json\",\"size\":1280,\"sha256\":\"sha256:c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.map.import.schema.json\",\"size\":1928,\"sha256\":\"sha256:956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.material-synthesis.publish.schema.json\",\"size\":1643,\"sha256\":\"sha256:f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.note.append.schema.json\",\"size\":1595,\"sha256\":\"sha256:1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.plan.revise.schema.json\",\"size\":2461,\"sha256\":\"sha256:63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.source-selection.set.schema.json\",\"size\":1185,\"sha256\":\"sha256:8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/workspace.next-action.update.schema.json\",\"size\":806,\"sha256\":\"sha256:2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b\"},{\"root\":\"core\",\"path\":\"system/schema/capability-envelope.schema.json\",\"size\":8153,\"sha256\":\"sha256:8b3c8e0c7542668ba6f15a72d5af5290b7139a82f55850633b0d264dedea6c2b\"},{\"root\":\"core\",\"path\":\"system/schema/collections.schema.json\",\"size\":2381,\"sha256\":\"sha256:2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec\"},{\"root\":\"core\",\"path\":\"system/schema/concept-relations.schema.json\",\"size\":1398,\"sha256\":\"sha256:83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac\"},{\"root\":\"core\",\"path\":\"system/schema/concepts.schema.json\",\"size\":1400,\"sha256\":\"sha256:98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3\"},{\"root\":\"core\",\"path\":\"system/schema/coordination.schema.json\",\"size\":708,\"sha256\":\"sha256:935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961\"},{\"root\":\"core\",\"path\":\"system/schema/goal-ledger.schema.json\",\"size\":4412,\"sha256\":\"sha256:8b56b76ce3576c36b8e426a184018162ac624dbce22762bb527408a83a324f45\"},{\"root\":\"core\",\"path\":\"system/schema/health-report.schema.json\",\"size\":1118,\"sha256\":\"sha256:ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6\"},{\"root\":\"core\",\"path\":\"system/schema/learner-observation.schema.json\",\"size\":2260,\"sha256\":\"sha256:556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1\"},{\"root\":\"core\",\"path\":\"system/schema/learner-stage-result.schema.json\",\"size\":1820,\"sha256\":\"sha256:2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268\"},{\"root\":\"core\",\"path\":\"system/schema/learning-path.schema.json\",\"size\":4726,\"sha256\":\"sha256:37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8\"},{\"root\":\"core\",\"path\":\"system/schema/learning-plan.schema.json\",\"size\":16830,\"sha256\":\"sha256:7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8\"},{\"root\":\"core\",\"path\":\"system/schema/learning-requirement.schema.json\",\"size\":2087,\"sha256\":\"sha256:402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-allowlist.schema.json\",\"size\":1302,\"sha256\":\"sha256:f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-lock.schema.json\",\"size\":2535,\"sha256\":\"sha256:3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-status.schema.json\",\"size\":599,\"sha256\":\"sha256:50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-catalog.schema.json\",\"size\":3728,\"sha256\":\"sha256:1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion-provenance.schema.json\",\"size\":3586,\"sha256\":\"sha256:b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion.schema.json\",\"size\":6778,\"sha256\":\"sha256:adc1a9ebf86bb47da51d5a5a9e0ce2fd54fd552b29ba4e9cf3f7e99ae6b20c1d\"},{\"root\":\"core\",\"path\":\"system/schema/masters-planning-dashboard.schema.json\",\"size\":1355,\"sha256\":\"sha256:f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db\"},{\"root\":\"core\",\"path\":\"system/schema/material-comparison-defs.schema.json\",\"size\":1081,\"sha256\":\"sha256:5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6\"},{\"root\":\"core\",\"path\":\"system/schema/material-span.schema.json\",\"size\":1016,\"sha256\":\"sha256:f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300\"},{\"root\":\"core\",\"path\":\"system/schema/module-source-map.schema.json\",\"size\":7543,\"sha256\":\"sha256:967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539\"},{\"root\":\"core\",\"path\":\"system/schema/module.schema.json\",\"size\":8431,\"sha256\":\"sha256:cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8\"},{\"root\":\"core\",\"path\":\"system/schema/modules.schema.json\",\"size\":7662,\"sha256\":\"sha256:fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b\"},{\"root\":\"core\",\"path\":\"system/schema/note.schema.json\",\"size\":9311,\"sha256\":\"sha256:b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222\"},{\"root\":\"core\",\"path\":\"system/schema/plan-template.schema.json\",\"size\":2162,\"sha256\":\"sha256:6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b\"},{\"root\":\"core\",\"path\":\"system/schema/program.schema.json\",\"size\":1365,\"sha256\":\"sha256:071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e\"},{\"root\":\"core\",\"path\":\"system/schema/project-aliases.schema.json\",\"size\":530,\"sha256\":\"sha256:97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df\"},{\"root\":\"core\",\"path\":\"system/schema/project-relations.schema.json\",\"size\":1694,\"sha256\":\"sha256:d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18\"},{\"root\":\"core\",\"path\":\"system/schema/project.schema.json\",\"size\":5953,\"sha256\":\"sha256:9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.candidate.append.schema.json\",\"size\":6415,\"sha256\":\"sha256:c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.context.schema.json\",\"size\":4422,\"sha256\":\"sha256:6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.append-slices.schema.json\",\"size\":6257,\"sha256\":\"sha256:84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.apply.schema.json\",\"size\":4077,\"sha256\":\"sha256:47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.import.schema.json\",\"size\":1612,\"sha256\":\"sha256:926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.validate.schema.json\",\"size\":1683,\"sha256\":\"sha256:ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.list.schema.json\",\"size\":1032,\"sha256\":\"sha256:437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.prepare.schema.json\",\"size\":4775,\"sha256\":\"sha256:a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.status.schema.json\",\"size\":1624,\"sha256\":\"sha256:d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.context.schema.json\",\"size\":2240,\"sha256\":\"sha256:42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.question.save.schema.json\",\"size\":2833,\"sha256\":\"sha256:745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.manifest.schema.json\",\"size\":3430,\"sha256\":\"sha256:b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.verify.schema.json\",\"size\":4147,\"sha256\":\"sha256:15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capabilities.read.schema.json\",\"size\":2038,\"sha256\":\"sha256:2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capture.create.schema.json\",\"size\":3779,\"sha256\":\"sha256:4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db\"},{\"root\":\"core\",\"path\":\"system/schema/requests/cli.capability.schema.json\",\"size\":2655,\"sha256\":\"sha256:4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.create.schema.json\",\"size\":3860,\"sha256\":\"sha256:e99fac17baaa64f1e29622dc58f6ba9c36b9061cd9b5fb7be48de84da027c1a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.entry.revise.schema.json\",\"size\":5102,\"sha256\":\"sha256:e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846\"},{\"root\":\"core\",\"path\":\"system/schema/requests/concept.relations.change.schema.json\",\"size\":2815,\"sha256\":\"sha256:00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/coordination.section.revise.schema.json\",\"size\":4691,\"sha256\":\"sha256:30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.create.schema.json\",\"size\":4617,\"sha256\":\"sha256:ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.resolve.schema.json\",\"size\":3800,\"sha256\":\"sha256:b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/dossier.read.schema.json\",\"size\":1575,\"sha256\":\"sha256:717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/garden.seed.create.schema.json\",\"size\":3286,\"sha256\":\"sha256:56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238\"},{\"root\":\"core\",\"path\":\"system/schema/requests/goal.decide.schema.json\",\"size\":7303,\"sha256\":\"sha256:153d5ec6ea2358ec84af5df7cb2469c0fd7445bc4c62492f773fb753ee5df3f0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/health.report.schema.json\",\"size\":1035,\"sha256\":\"sha256:eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.content.schema.json\",\"size\":3095,\"sha256\":\"sha256:b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.list.schema.json\",\"size\":1036,\"sha256\":\"sha256:e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.resolve.schema.json\",\"size\":4142,\"sha256\":\"sha256:1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097\"},{\"root\":\"core\",\"path\":\"system/schema/requests/intelligence.scan.schema.json\",\"size\":2664,\"sha256\":\"sha256:a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.ability-observation.append.schema.json\",\"size\":9026,\"sha256\":\"sha256:f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observation.append.schema.json\",\"size\":7838,\"sha256\":\"sha256:99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observe.schema.json\",\"size\":6621,\"sha256\":\"sha256:7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.stage-result.append.schema.json\",\"size\":7300,\"sha256\":\"sha256:defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.inspect.schema.json\",\"size\":2182,\"sha256\":\"sha256:157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.lock.publish.schema.json\",\"size\":3922,\"sha256\":\"sha256:c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.status.schema.json\",\"size\":1082,\"sha256\":\"sha256:5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/lineage.restamp.schema.json\",\"size\":4540,\"sha256\":\"sha256:7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.catalog.update.schema.json\",\"size\":3938,\"sha256\":\"sha256:ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.comparison.publish.schema.json\",\"size\":4569,\"sha256\":\"sha256:f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.dashboard.schema.json\",\"size\":1659,\"sha256\":\"sha256:12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.context.schema.json\",\"size\":6935,\"sha256\":\"sha256:bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.span.schema.json\",\"size\":4423,\"sha256\":\"sha256:15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.attempt.record.schema.json\",\"size\":5727,\"sha256\":\"sha256:def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.create.schema.json\",\"size\":3916,\"sha256\":\"sha256:02b73b8c4600f234426dfb360dd9d3a2676a71d6c7ee55a7f6c8cbceb6b6b18f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.list.schema.json\",\"size\":2127,\"sha256\":\"sha256:e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.materials.compact.schema.json\",\"size\":4010,\"sha256\":\"sha256:1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.plan.import.schema.json\",\"size\":8126,\"sha256\":\"sha256:19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.sitting.update.schema.json\",\"size\":4006,\"sha256\":\"sha256:853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.prepare.schema.json\",\"size\":2291,\"sha256\":\"sha256:c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save.schema.json\",\"size\":4032,\"sha256\":\"sha256:4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save_batch.schema.json\",\"size\":2879,\"sha256\":\"sha256:4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.content.schema.json\",\"size\":3184,\"sha256\":\"sha256:9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.create.schema.json\",\"size\":3943,\"sha256\":\"sha256:1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.evidence.add.schema.json\",\"size\":4132,\"sha256\":\"sha256:09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.revise.schema.json\",\"size\":4463,\"sha256\":\"sha256:f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.search.schema.json\",\"size\":4796,\"sha256\":\"sha256:6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operations.read.schema.json\",\"size\":2157,\"sha256\":\"sha256:0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operator.bootstrap.schema.json\",\"size\":3732,\"sha256\":\"sha256:2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.attachment.add.schema.json\",\"size\":5038,\"sha256\":\"sha256:bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.note.write.schema.json\",\"size\":4268,\"sha256\":\"sha256:0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.progress.update.schema.json\",\"size\":3951,\"sha256\":\"sha256:e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.edit-context.schema.json\",\"size\":6343,\"sha256\":\"sha256:42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.template.schema.json\",\"size\":3471,\"sha256\":\"sha256:1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.list.schema.json\",\"size\":1022,\"sha256\":\"sha256:1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.semester.update.schema.json\",\"size\":3922,\"sha256\":\"sha256:fc100aa9cbfce8c13ac5a4f288d22e4bdff17ee1237bfbd382b14db832857526\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.create.schema.json\",\"size\":3962,\"sha256\":\"sha256:5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.inspect.schema.json\",\"size\":2236,\"sha256\":\"sha256:e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.list.schema.json\",\"size\":1528,\"sha256\":\"sha256:21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.update.schema.json\",\"size\":4535,\"sha256\":\"sha256:80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.generate.schema.json\",\"size\":1003,\"sha256\":\"sha256:b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.observe.schema.json\",\"size\":2081,\"sha256\":\"sha256:6c846a118a81d9bbb7f8153007542f3587b50ef90ee23b80cd0d59e837c8abe6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/related.read.schema.json\",\"size\":1650,\"sha256\":\"sha256:bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/repository.validate.schema.json\",\"size\":1495,\"sha256\":\"sha256:ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/resume.read.schema.json\",\"size\":2123,\"sha256\":\"sha256:873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.apply.schema.json\",\"size\":3891,\"sha256\":\"sha256:756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.prepare.schema.json\",\"size\":4528,\"sha256\":\"sha256:2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/route.patch.schema.json\",\"size\":5167,\"sha256\":\"sha256:04cf04b1b48c8132f8a61b63be2cd65c7338844438f4ef118d50e39131c4a19d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/runtime.session.schema.json\",\"size\":3774,\"sha256\":\"sha256:3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/semantic.query.schema.json\",\"size\":3136,\"sha256\":\"sha256:abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034\"},{\"root\":\"core\",\"path\":\"system/schema/requests/session.end.schema.json\",\"size\":4363,\"sha256\":\"sha256:41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.feedback.record.schema.json\",\"size\":5901,\"sha256\":\"sha256:112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.intake.record.schema.json\",\"size\":5091,\"sha256\":\"sha256:0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.record.revise.schema.json\",\"size\":5074,\"sha256\":\"sha256:7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.attachment.add.schema.json\",\"size\":5019,\"sha256\":\"sha256:28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.note.write.schema.json\",\"size\":4404,\"sha256\":\"sha256:83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.progress.update.schema.json\",\"size\":5088,\"sha256\":\"sha256:50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/status.read.schema.json\",\"size\":1538,\"sha256\":\"sha256:3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.list.schema.json\",\"size\":4981,\"sha256\":\"sha256:28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.map.import.schema.json\",\"size\":7302,\"sha256\":\"sha256:3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.material-synthesis.publish.schema.json\",\"size\":5019,\"sha256\":\"sha256:7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.note.append.schema.json\",\"size\":5759,\"sha256\":\"sha256:2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.plan.revise.schema.json\",\"size\":7544,\"sha256\":\"sha256:06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.source-selection.set.schema.json\",\"size\":4979,\"sha256\":\"sha256:8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff\"},{\"root\":\"core\",\"path\":\"system/schema/requests/workspace.next-action.update.schema.json\",\"size\":3410,\"sha256\":\"sha256:ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde\"},{\"root\":\"core\",\"path\":\"system/schema/resume.schema.json\",\"size\":765,\"sha256\":\"sha256:9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991\"},{\"root\":\"core\",\"path\":\"system/schema/runtime-session.schema.json\",\"size\":629,\"sha256\":\"sha256:b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c\"},{\"root\":\"core\",\"path\":\"system/schema/session-context.schema.json\",\"size\":2009,\"sha256\":\"sha256:aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e\"},{\"root\":\"core\",\"path\":\"system/schema/session-plan.schema.json\",\"size\":4161,\"sha256\":\"sha256:d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84\"},{\"root\":\"core\",\"path\":\"system/schema/sources.schema.json\",\"size\":8025,\"sha256\":\"sha256:6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4\"},{\"root\":\"core\",\"path\":\"system/schema/study-map.schema.json\",\"size\":10349,\"sha256\":\"sha256:8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772\"},{\"root\":\"core\",\"path\":\"system/schema/thematic-groups.schema.json\",\"size\":1121,\"sha256\":\"sha256:55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159\"},{\"root\":\"core\",\"path\":\"system/schema/transaction-receipt.schema.json\",\"size\":10258,\"sha256\":\"sha256:064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55\"},{\"root\":\"core\",\"path\":\"system/schema/ui-responses.schema.json\",\"size\":38800,\"sha256\":\"sha256:dab0b6f04218e2bd724304efa43320768a17f833732b1aa8576bd31222cf9b27\"},{\"root\":\"core\",\"path\":\"system/schema/unit-material-synthesis.schema.json\",\"size\":8987,\"sha256\":\"sha256:2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37\"},{\"root\":\"core\",\"path\":\"system/schema/unit.schema.json\",\"size\":5271,\"sha256\":\"sha256:39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b\"},{\"root\":\"core\",\"path\":\"system/schema/workspace.schema.json\",\"size\":1939,\"sha256\":\"sha256:c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96\"},{\"root\":\"core\",\"path\":\"work/COORDINATION.md\",\"size\":220,\"sha256\":\"sha256:667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"size\":350,\"sha256\":\"sha256:f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/ability-observations.jsonl\",\"size\":573,\"sha256\":\"sha256:1c8eb39cfb4345f0848479cee57081109ca59fefc19e81ea3b39f63c774499f8\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/outputs/demo-coverage-audit.md\",\"size\":202,\"sha256\":\"sha256:12042cb1d559ec41ae54303706ddb6314f37adc58d0a592092d8b108ea091fff\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/path-demo.yaml\",\"size\":476,\"sha256\":\"sha256:c383f7acfd609dc321b2edf7b361c0fa441d214eee8fc1a379d7c205e09e5890\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/stage-demo-path-notes.md\",\"size\":36,\"sha256\":\"sha256:105f863cae25c40a6f48917be30307880ce4ff3f0d83b9b9116a04363170d413\"},{\"root\":\"core\",\"path\":\"work/active/workspace-second/CONTEXT.md\",\"size\":271,\"sha256\":\"sha256:447501ac5d8fb8fcb40f4daeb8de500c97abd933b7af20a0dea814d9ae7f9040\"},{\"root\":\"core\",\"path\":\"work/inbox/note-drop.md\",\"size\":26,\"sha256\":\"sha256:cff485a0c38476920bff529d70a47c19fddb0380750b9a0152521d7eb9b6c81d\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/one.md\",\"size\":4,\"sha256\":\"sha256:2c8b08da5ce60398e1f19af0e5dccc744df274b826abe585eaba68c525434806\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/two.md\",\"size\":4,\"sha256\":\"sha256:27dd8ed44a83ff94d557f9fd0412ed5a8cbca69ea04922d88c01184a07300a5a\"},{\"root\":\"materials\",\"path\":\"source-demo-book/book.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"materials\",\"path\":\"source-demo-book/lecture-01.pdf\",\"size\":10191,\"sha256\":\"sha256:395ded80ff4a721e2a91f400a3c6a3abd1f8d37e3c7f70b5ef42fa30d5264ea5\"},{\"root\":\"materials\",\"path\":\"source-scenario-bare/attached.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"ui\",\"path\":\"plugin-assets.json\",\"size\":115,\"sha256\":\"sha256:61421f5649b9648ad0fd87bbd7dd267fb2371f15fb72652f69a87156f8e45f4d\"},{\"root\":\"ui\",\"path\":\"plugin/main.js\",\"size\":30,\"sha256\":\"sha256:6c2835936c311f016909937b412e19a2b44c71fda4baa5e49bfd672187823cd0\"}],\"materials_aliases\":{},\"provenance\":{\"core\":{\"commit\":\"001177fc67a90948242c1ea970252862fe793333\",\"dirty\":false},\"ui\":{\"commit\":null,\"dirty\":null},\"data_contract_version\":61},\"aggregate_sha256\":\"sha256:f0f1aa75db4047881176f0bd6b9dd0e91f6cee97ef7bf9225fd87f49a5e943aa\"}\n", + "stdout": "{\"schema_version\":1,\"type\":\"backup-manifest\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"roots\":[\"core\",\"materials\",\"ui\"],\"entries\":[{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"size\":693,\"sha256\":\"sha256:4ae2ad31254f0d470993f4566c83a4f4056b20fc19c4317bd57c52b0ea809e19\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/source-map.yaml\",\"size\":759,\"sha256\":\"sha256:bc7e0a53304d1e916e03c7a69bc5a0746f522a8a3bc610653ec8c44b97b0a730\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\",\"size\":0,\"sha256\":\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"size\":1819,\"sha256\":\"sha256:506b0fdd350e11960069e09ffd099e7ac616076a8b3425557614e9167bbfe141\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"size\":941,\"sha256\":\"sha256:02dd8b658f2eceeb04ae9405f545f95ac719226a52f6d1690985403647476dc1\"},{\"root\":\"core\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"size\":676,\"sha256\":\"sha256:3972911e1580b4afb0f23a0df306b5fbd5073996aae31895a49ce6363d9fa235\"},{\"root\":\"core\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"size\":205,\"sha256\":\"sha256:ac37c2cd16ece5366eab9daee24177e0ad959cc32514370364fab1fe967da175\"},{\"root\":\"core\",\"path\":\"curriculum/resume.yaml\",\"size\":143,\"sha256\":\"sha256:1360307adc4f3cf81ae20860966e3e53d87eb779bfed8284ca970314c58fd858\"},{\"root\":\"core\",\"path\":\"knowledge/abilities.yaml\",\"size\":812,\"sha256\":\"sha256:1fc5719eb8e7bb60c6c77bccd020189502eb3efd38fa3e8d5bf988bc08a3ef0a\"},{\"root\":\"core\",\"path\":\"knowledge/concept-relations.yaml\",\"size\":83,\"sha256\":\"sha256:931f4d1265651f884a6c0d6e2a57f7246ba676ab68326277fad6aa6dbb67298d\"},{\"root\":\"core\",\"path\":\"knowledge/concepts.yaml\",\"size\":157,\"sha256\":\"sha256:7698e8a5b9bc0cbdd2fb6d9e5803d8de47241bf50930109d902da20a2640412e\"},{\"root\":\"core\",\"path\":\"knowledge/garden/seed.md\",\"size\":17,\"sha256\":\"sha256:2fa0d5901df7142374cd36288533e6d84f11df0370a087cdb50d000794dfd169\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo-analysis.md\",\"size\":753,\"sha256\":\"sha256:ecd673fe86ebb2952d5efaf15ee8c4dc49f2f10c3710b795f3b8b0cafd23330c\"},{\"root\":\"core\",\"path\":\"knowledge/notes/mathematics/note-demo.md\",\"size\":162,\"sha256\":\"sha256:5bfb18040cdeba3b47d06700b13c0edf6ebcac90d085e6fc78cfe8565261d276\"},{\"root\":\"core\",\"path\":\"operations/ai-actions/requests/ai-request-demo/request.yaml\",\"size\":189,\"sha256\":\"sha256:4024838e1f48e7f5d7a0f7dba5c374f35c3a9c0255fe4906b7ab4b376e126fd9\"},{\"root\":\"core\",\"path\":\"operations/goal-ledger.yaml\",\"size\":189,\"sha256\":\"sha256:eb3d9638be9378e8254a9848d56f844cb0d4ce4213ce31bcfc6053db35c6a1b5\"},{\"root\":\"core\",\"path\":\"operations/transactions/lineage.yaml\",\"size\":618,\"sha256\":\"sha256:9064555ce2bb0004dbeb396ec138b6eac83c130f2ac7207c55e387562e68dcbe\"},{\"root\":\"core\",\"path\":\"operations/transactions/revisions.yaml\",\"size\":79,\"sha256\":\"sha256:95af59729f0817655d3237e3acd64cc4025c60e53c016a82ed1ba90757115a3a\"},{\"root\":\"core\",\"path\":\"operations/transactions/transaction-20200102-000000-001.yaml\",\"size\":1355,\"sha256\":\"sha256:8c07311aa87a315f0e7400a731445b85f04ed6dc0594a61612ff6430510df3ac\"},{\"root\":\"core\",\"path\":\"projects/registry/project-demo.yaml\",\"size\":377,\"sha256\":\"sha256:1deec83d86d3ec33d96d07de4313acbf46fcef15bd87ee7dd7918d41ed5a75bc\"},{\"root\":\"core\",\"path\":\"projects/relations/project-relations.yaml\",\"size\":175,\"sha256\":\"sha256:22463f43ea8cf79074fb7dddfe3563abb10eacb5897115e45140e818df2f6740\"},{\"root\":\"core\",\"path\":\"records/materials-manifest.yaml\",\"size\":984,\"sha256\":\"sha256:893c316744777bda54e0feed32bd6e25be7ba5cd6eb86f7589a931fea1cbd74a\"},{\"root\":\"core\",\"path\":\"records/modules.yaml\",\"size\":223,\"sha256\":\"sha256:5961abb7497694280eb0f7f2134dd38a7266284f2349348f49ee4e699d9ec0e7\"},{\"root\":\"core\",\"path\":\"sources/collections/shelf.yaml\",\"size\":129,\"sha256\":\"sha256:5cc34276b241dd75fd1fa8345e65ef89924b6b422b1287b6d8cfe5b5704cce9c\"},{\"root\":\"core\",\"path\":\"sources/sources.yaml\",\"size\":289,\"sha256\":\"sha256:03e8c76818ced582638f18e1cb41b3bac2403f0ba0da20a04932851ed4461087\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-input.schema.json\",\"size\":5599,\"sha256\":\"sha256:2916d1a5155301469f4ad433410d808c264de8e74bc05e55586b7da70c88ab84\"},{\"root\":\"core\",\"path\":\"system/contracts/agent-plan-report.schema.json\",\"size\":2495,\"sha256\":\"sha256:7fbab2dc0c9923bbba5371394518ca4febd6e7dbe5fc922b0c4bafe03f94968a\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/garden.shelve.yaml\",\"size\":808,\"sha256\":\"sha256:55cc2a03bdc491c6b3d1432f36e3048f401ef33892dae599446ea5373e9631ca\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-actions/unit.compare-materials.yaml\",\"size\":654,\"sha256\":\"sha256:7e3ef7c26b0470bae6c3b048a0b917e50b929bf09f6c60ad303971e9f3a3e085\"},{\"root\":\"core\",\"path\":\"system/contracts/ai-adapters.yaml\",\"size\":853,\"sha256\":\"sha256:804474de7b18e7d0bffe0bd42d86802d58a8fa806b1bd8005f7043b124a22b56\"},{\"root\":\"core\",\"path\":\"system/contracts/backup-roots.yaml\",\"size\":3878,\"sha256\":\"sha256:5dc4d1c40a872c0b432822c04db39091b035e6c7d8959961cb6a92c9371cc59a\"},{\"root\":\"core\",\"path\":\"system/contracts/capabilities.yaml\",\"size\":44149,\"sha256\":\"sha256:9f3a060d396925db7e66f23703dbe392ac40b3b44f2b5b59b704f97b2c645dfa\"},{\"root\":\"core\",\"path\":\"system/contracts/cli-operations.yaml\",\"size\":2875,\"sha256\":\"sha256:f4ba996c3c2d7bd02406d2ba6efd5ce3fceded5c0ec66348758cde7a56a73292\"},{\"root\":\"core\",\"path\":\"system/contracts/contract-register.yaml\",\"size\":11195,\"sha256\":\"sha256:df98578f254c261109aa1cc9d76e53c64d675e0df0ab2c10f9593b76be2d79e4\"},{\"root\":\"core\",\"path\":\"system/contracts/data-contract.yaml\",\"size\":20772,\"sha256\":\"sha256:2954088c266a21807d2fefdbad6326e9f6c0d989b46c15c88c1e353494c37333\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-contract.yaml\",\"size\":8977,\"sha256\":\"sha256:d9ca03f62ca990a9557e8c35bd1bc09967fe9e47d4b1d43441f58989c39019c2\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-v15.schema.json\",\"size\":87416,\"sha256\":\"sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f\"},{\"root\":\"core\",\"path\":\"system/contracts/manifest-v16.schema.json\",\"size\":87524,\"sha256\":\"sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.schema.json\",\"size\":4941,\"sha256\":\"sha256:9e76ff6a56116c4a20f6af5fd296be1ff4cadbcc984acaba552daaabf53fba34\"},{\"root\":\"core\",\"path\":\"system/contracts/normative-corpus.yaml\",\"size\":42648,\"sha256\":\"sha256:858f13552ae3d1921b03d2ebc93b80f4a2a5ef14690c5130bdb037452af89114\"},{\"root\":\"core\",\"path\":\"system/contracts/perimeter.yaml\",\"size\":10603,\"sha256\":\"sha256:1cebe28ced51f556d6d33d372a7b383744a83b3668675a9f59ec26f479d4fb1b\"},{\"root\":\"core\",\"path\":\"system/contracts/release-pair-receipt.schema.json\",\"size\":3384,\"sha256\":\"sha256:fded162b92379ea9e353bcbdb5e21e8bbcf880e9bad8ddf60e61eb48b2c430c6\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.schema.json\",\"size\":2731,\"sha256\":\"sha256:44e489cef663dbc886ab50932aea3d7ff6ffc8840a5f663d6dbe2b73bb45ea63\"},{\"root\":\"core\",\"path\":\"system/contracts/review-consolidation.yaml\",\"size\":25098,\"sha256\":\"sha256:9e359870e9c85a0c0439d0101325f0ef36402848f8ddf1fad0a84a008061a4ed\"},{\"root\":\"core\",\"path\":\"system/contracts/semantic-lineage-ledger.schema.json\",\"size\":3086,\"sha256\":\"sha256:2eb7c70d4c43b58a23421158f8c836d3fb9e3ba59d856d2273a55c333438b5bf\"},{\"root\":\"core\",\"path\":\"system/contracts/task-scope.yaml\",\"size\":9869,\"sha256\":\"sha256:84ef07507f98c96b7d7223a3d7c84602cf68013e2771f4776527b25260615413\"},{\"root\":\"core\",\"path\":\"system/contracts/tree-contract.yaml\",\"size\":8809,\"sha256\":\"sha256:2e8588a08a3a1565a9b09a1b0839ed84bfe9892e2a87a5d50f7893f2c4aa6cfa\"},{\"root\":\"core\",\"path\":\"system/contracts/validation-warning-baseline.schema.json\",\"size\":2227,\"sha256\":\"sha256:0015fef4f94114dd0c5d5edd801475ed9e54efcb90c6455e0a115edd7cf081a9\"},{\"root\":\"core\",\"path\":\"system/schema/abilities.schema.json\",\"size\":3331,\"sha256\":\"sha256:06a0bf8ca4c378c93e45d74553e8f17dc7264d9821adfc317861b0f20e60e543\"},{\"root\":\"core\",\"path\":\"system/schema/ability-candidate.schema.json\",\"size\":1110,\"sha256\":\"sha256:7e7c36c54d17f814b68091c13fc377ba38d33d9dc539b528e7bce13f30043612\"},{\"root\":\"core\",\"path\":\"system/schema/ability-context.schema.json\",\"size\":3283,\"sha256\":\"sha256:dd053a8747f768978fe106d83293dbb7b1ad7fb0552fe597aa1f14f33cd9f0b5\"},{\"root\":\"core\",\"path\":\"system/schema/ability-observation.schema.json\",\"size\":1603,\"sha256\":\"sha256:1c0b094cf54f3141d4ff184a662aaa9afb206904fd7d9e947f47af0e5e55db8f\"},{\"root\":\"core\",\"path\":\"system/schema/backup-manifest.schema.json\",\"size\":2381,\"sha256\":\"sha256:96845bbf33a597377961e16b4f8233fee90886ef6465a7d151e247b2d93e28d4\"},{\"root\":\"core\",\"path\":\"system/schema/candidate-source-comparison.schema.json\",\"size\":4828,\"sha256\":\"sha256:ae9933a6033c2b55895aac98c074ed774cab2a3284b364dafdd2bb0b5a379568\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ability.candidate.append.schema.json\",\"size\":1801,\"sha256\":\"sha256:fe68d00fbc650601afcf80d40ff896a0066539f279f5c439269787ce2538a625\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/ai-action.delivery.apply.schema.json\",\"size\":905,\"sha256\":\"sha256:f2adfae3275acabe2c6ac3936579a6b13856d97f25e1e6bb99244ba5fe98ac72\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/atlas.question.save.schema.json\",\"size\":1948,\"sha256\":\"sha256:6f08ad501a8809d5154df7ce78991be795d0c02bfdfcfca5d5dec9aa4a95a187\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/capture.create.schema.json\",\"size\":1282,\"sha256\":\"sha256:4ed3094ce88895e7159537f9766e4b8f11328d833a466f2ff68187e39eede3ba\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.create.schema.json\",\"size\":942,\"sha256\":\"sha256:3dd9d13af993a5542c445b49f3ce52015f2766e0a9ddf92845fee3ecf117fd3d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/collection.entry.revise.schema.json\",\"size\":1469,\"sha256\":\"sha256:35a71500a4421c1177b518faef9e953f042d93066921cfda14cce7197d6bc38d\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/concept.relations.change.schema.json\",\"size\":1277,\"sha256\":\"sha256:f01e35fdd4a53dd139c36a782cb9bd3e5f21eb5da37d1bf5deb52c180b80c006\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/coordination.section.revise.schema.json\",\"size\":1183,\"sha256\":\"sha256:b2f5d722a7009a52217c7dd784c1f91bff53d20f91a553d486b44ad0f82207ae\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.create.schema.json\",\"size\":1108,\"sha256\":\"sha256:f5d74382380c814e7cd8a9b95548516b8b369abe42ef6582987a72960e2debbe\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/detour.resolve.schema.json\",\"size\":786,\"sha256\":\"sha256:0003990eb0fdf9287703d7d0873ab346a73049fc10998495be137da9ba08bbbf\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/garden.seed.create.schema.json\",\"size\":693,\"sha256\":\"sha256:7d9f62e27d09b733ca1671cbf71c164b94903be72fea689e0039bbaffc5e0924\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/inbox.resolve.schema.json\",\"size\":1120,\"sha256\":\"sha256:be68bc9640974af3a8acaf5cd8d9e5e2da114519f56cc2ee0b87c39b3fedab01\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.ability-observation.append.schema.json\",\"size\":2401,\"sha256\":\"sha256:a69ad25fdd8a8a263ce5aaa353f3a56287d57139690030f20636bbffc447a85f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.observation.append.schema.json\",\"size\":2019,\"sha256\":\"sha256:e1cbcedf018d4c1b95c61bfa75c836d59b2c347d2b89f275bd9e32b5e58a12c6\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/learner.stage-result.append.schema.json\",\"size\":1871,\"sha256\":\"sha256:cd7ff4fe1ace520a3b06f59e3c76b020a2288cf6c29cd2e8c79c89515f6f6e75\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/legacy.archive.lock.publish.schema.json\",\"size\":1274,\"sha256\":\"sha256:f90b5c41d66dd79707b9c7a2f50f667969243a535a7a143b268f79c674f51e34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/lineage.restamp.schema.json\",\"size\":941,\"sha256\":\"sha256:aed2ed9e3db74a880d19947c06e2af3b12a4339c16b2d7e6d193892835b3bbb7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.catalog.update.schema.json\",\"size\":1373,\"sha256\":\"sha256:7270f6c3b4b858a6bfbab28fc8d920be77a7ca25b54da8d6d36c532d45a24f58\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/masters-planning.comparison.publish.schema.json\",\"size\":1546,\"sha256\":\"sha256:0109bb0c6c0e7d8688ae01ed7b5a2736e0de65eab97b797f759c3d418cbb6ede\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.attempt.record.schema.json\",\"size\":1414,\"sha256\":\"sha256:fd65809ff5c93327cd566dec7a11cce53df8723e0b2b12bc01ac05656a2e6b15\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.create.schema.json\",\"size\":987,\"sha256\":\"sha256:e2c1846b04f5b68cde2773d0a487a8bb1b791fa6f427b01672e23acc758ad2e8\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.materials.compact.schema.json\",\"size\":941,\"sha256\":\"sha256:fdc5ebab2172e613aba74db1be4616e1183d52956d5b4319276d7d510cc93923\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.plan.import.schema.json\",\"size\":2413,\"sha256\":\"sha256:f9e0a08e79bcfe40bfca1e56cb46ccf808770dbc8acf6de11a2f340f08c4f0a4\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/module.sitting.update.schema.json\",\"size\":951,\"sha256\":\"sha256:6238b120b78f14e92de4c0cfb522f636daf92161a684a7696a77a60ecc56b731\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save.schema.json\",\"size\":1772,\"sha256\":\"sha256:8289fa2f38cd610cd0c8f37b7cb9241ce6df5e733a285ae1e0cfbe6b8f788e26\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.analysis.save_batch.schema.json\",\"size\":2302,\"sha256\":\"sha256:e893974a25798635bee68dc731508103fe6308590f893e26adcff82336d6121e\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.create.schema.json\",\"size\":1938,\"sha256\":\"sha256:bf31d786818d421bb485fb08c646135861fa95ff81175ded91fbfb307c64b5d2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.evidence.add.schema.json\",\"size\":1054,\"sha256\":\"sha256:5bf40d451e5e1ca33d939103d497ae205302317072268859454376767fcbe715\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/note.revise.schema.json\",\"size\":972,\"sha256\":\"sha256:39f08e2b542b2d48d5fba41b030ff1f892884d976569e9ddf85afca6140f6222\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.attachment.add.schema.json\",\"size\":1277,\"sha256\":\"sha256:35a5c4d5094052f2e61c0be591955cedd19bb3afbcec1e9f6fdb9b75a013a038\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.note.write.schema.json\",\"size\":886,\"sha256\":\"sha256:2b3729b9340451985131d428f1ac03d76cdbe80233a36e3524dbf49a777122c7\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/path.progress.update.schema.json\",\"size\":919,\"sha256\":\"sha256:6b520cae016dab6b05ffced1fd219eab9dfeabf07712831fbb20e3a9475e9065\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/program.semester.update.schema.json\",\"size\":991,\"sha256\":\"sha256:cedc9db7305d6478954013dd555462e44c3558a5a9f8f243875c6633a145f17f\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.create.schema.json\",\"size\":2070,\"sha256\":\"sha256:b61e66ea2bc8010207954978b38e98b75db456e93e7b6cedd5efa1f5b82af0fc\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/project.update.schema.json\",\"size\":2224,\"sha256\":\"sha256:aa47bad8e91d5496797d0b07e1431c8b9d4303f7f7c91020026e0df2f1f0ac2a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.apply.schema.json\",\"size\":767,\"sha256\":\"sha256:16b5014283741ff450f0e63ead9154ed534f5a4429e9325d0067a811a6c6ba34\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/review.prepare.schema.json\",\"size\":1193,\"sha256\":\"sha256:b6db214ded95c2117091f941adbfb2244bb16c440222f0c1691beb760911c4b1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/route.patch.schema.json\",\"size\":2942,\"sha256\":\"sha256:a434bcdad97ff0d5b26a5ac6ee8db25db33d354703eeeba35020452a422dc7e2\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.feedback.record.schema.json\",\"size\":1483,\"sha256\":\"sha256:fea3a8bb8ddfdd35883a6450fc93c50f7d6b606235dd83984dec2b7b2688132a\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.intake.record.schema.json\",\"size\":2878,\"sha256\":\"sha256:7b339caf68e1f49efbbe933d083052938108f73ba4c16e1e7b11a5ebd44071c1\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/source.record.revise.schema.json\",\"size\":1588,\"sha256\":\"sha256:f63399ceae51194092771e7ed74ad49e3813d19f2add953e6f44c573d05430c5\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.attachment.add.schema.json\",\"size\":1283,\"sha256\":\"sha256:0fe62730357e2458d1d75bd47d757f9bd31b6b06b5680b5ffaa9c86d17bbe741\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.note.write.schema.json\",\"size\":1028,\"sha256\":\"sha256:e6ace4388346593da40844e398a79f93eb2240fba7856e79061689344dbd00dd\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/stage.progress.update.schema.json\",\"size\":1280,\"sha256\":\"sha256:c6bd1aaeb280266141b1ab371c63af765bff3b83ae42b58b139bfbfccc70776b\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.map.import.schema.json\",\"size\":1928,\"sha256\":\"sha256:956f50fa210c53417ed925626dc9e137577971164c5e13f7579e387d5b1fc945\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.material-synthesis.publish.schema.json\",\"size\":1643,\"sha256\":\"sha256:f395b4cfe8c4d976b6bc8eddb6f482cc26142b1d646f600aee1db40663b859e0\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.note.append.schema.json\",\"size\":1595,\"sha256\":\"sha256:1a6ddc4870e3949f5c75184d50dabb4ffeee66e30683468ec90dc9149f6d1b14\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.plan.revise.schema.json\",\"size\":2461,\"sha256\":\"sha256:63b8d60ce69ad0774dfa987874552c9d4e78be59f6b293dd264476825aea9caa\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/unit.source-selection.set.schema.json\",\"size\":1185,\"sha256\":\"sha256:8be2b23ec2ac061e0c9536d476798efa99c4422b43b27efe46d577cd84492228\"},{\"root\":\"core\",\"path\":\"system/schema/capabilities/workspace.next-action.update.schema.json\",\"size\":806,\"sha256\":\"sha256:2648bc1894378cdd493034a58bda1868a406ed944d4bde93a07bbd1b4821260b\"},{\"root\":\"core\",\"path\":\"system/schema/capability-envelope.schema.json\",\"size\":8153,\"sha256\":\"sha256:8b3c8e0c7542668ba6f15a72d5af5290b7139a82f55850633b0d264dedea6c2b\"},{\"root\":\"core\",\"path\":\"system/schema/collections.schema.json\",\"size\":2381,\"sha256\":\"sha256:2534b6a54a6ef09c2b8ee8875a629ee321eb1008bced57ab4a955c713e24b5ec\"},{\"root\":\"core\",\"path\":\"system/schema/concept-relations.schema.json\",\"size\":1398,\"sha256\":\"sha256:83d422a4c6c4ea22d5cf13a4e65824c9283440e946cae3154d9cfec171d850ac\"},{\"root\":\"core\",\"path\":\"system/schema/concepts.schema.json\",\"size\":1400,\"sha256\":\"sha256:98dfc896c1eedabfeaf9b410554e1f589cb7d50bd896358006d8b19bfb4d2bb3\"},{\"root\":\"core\",\"path\":\"system/schema/coordination.schema.json\",\"size\":708,\"sha256\":\"sha256:935876047a168ab5677a6919b5822542b12f2033e76bcdb330a11202daac8961\"},{\"root\":\"core\",\"path\":\"system/schema/goal-ledger.schema.json\",\"size\":4412,\"sha256\":\"sha256:8b56b76ce3576c36b8e426a184018162ac624dbce22762bb527408a83a324f45\"},{\"root\":\"core\",\"path\":\"system/schema/health-report.schema.json\",\"size\":1118,\"sha256\":\"sha256:ab05931e3f05909fc63a8e42ba17b10c0cd961cad3151d4cd8d284fa4d3500b6\"},{\"root\":\"core\",\"path\":\"system/schema/learner-observation.schema.json\",\"size\":2260,\"sha256\":\"sha256:556d818f00be19aa65c9148c489e0ae333eb931c3046e656dd9727c2c99b07c1\"},{\"root\":\"core\",\"path\":\"system/schema/learner-stage-result.schema.json\",\"size\":1820,\"sha256\":\"sha256:2472d396e0cc539ce2ee797c7f9d560b551c474f1505aaded885dd1e06b15268\"},{\"root\":\"core\",\"path\":\"system/schema/learning-path.schema.json\",\"size\":4726,\"sha256\":\"sha256:37ca9999193ca98d183fa85a499e8be37c8f89e7eac23885c9b21ec629be0ab8\"},{\"root\":\"core\",\"path\":\"system/schema/learning-plan.schema.json\",\"size\":16921,\"sha256\":\"sha256:1967bc3daaaff023d91457e61000d33604e4febe1dc6483e143096ee8e324254\"},{\"root\":\"core\",\"path\":\"system/schema/learning-requirement.schema.json\",\"size\":2087,\"sha256\":\"sha256:402d0f7c3c0fb98a3277ac3b9597b95573d67564af8a9aeb9d3a7525677ab404\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-allowlist.schema.json\",\"size\":1302,\"sha256\":\"sha256:f3b093fc6d62ae06973e9273485a909e1e55b9a01b08a7f0cb479d419dca7cae\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-lock.schema.json\",\"size\":2535,\"sha256\":\"sha256:3c1d3b1f4f964fce96d0a6945fc446da0ef1b9e7bf68ee5b25d613da23c9add6\"},{\"root\":\"core\",\"path\":\"system/schema/legacy-archive-status.schema.json\",\"size\":599,\"sha256\":\"sha256:50cc8944501f538a804090453dc1d1664f2569120d6458da9d1514b5a60de6c6\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-catalog.schema.json\",\"size\":3728,\"sha256\":\"sha256:1c3b8d136b86f12a4c737129ce8d1fa167b3b68c311ec07cab7b0c04649859b2\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion-provenance.schema.json\",\"size\":3586,\"sha256\":\"sha256:b9dbbd5bba3f61621d962889190ad27408bc3438433a8b5f180ed8a78cd1c38e\"},{\"root\":\"core\",\"path\":\"system/schema/master-planning-promotion.schema.json\",\"size\":6778,\"sha256\":\"sha256:adc1a9ebf86bb47da51d5a5a9e0ce2fd54fd552b29ba4e9cf3f7e99ae6b20c1d\"},{\"root\":\"core\",\"path\":\"system/schema/masters-planning-dashboard.schema.json\",\"size\":1355,\"sha256\":\"sha256:f6f71071b759f51b0c3b9968fb2a86256c0bcaa1885a328a75e89281f60645db\"},{\"root\":\"core\",\"path\":\"system/schema/material-comparison-defs.schema.json\",\"size\":1081,\"sha256\":\"sha256:5fb48243a7a761fc251efa56db2ffb51558764327b3c425bdb54ac1546d8b6b6\"},{\"root\":\"core\",\"path\":\"system/schema/material-span.schema.json\",\"size\":1016,\"sha256\":\"sha256:f95f4bfedd226b2dfe7b1a8a24920979122b79cba95d3750378097418b7e0300\"},{\"root\":\"core\",\"path\":\"system/schema/module-source-map.schema.json\",\"size\":7543,\"sha256\":\"sha256:967376d8de2ce1947977b9bab4f5b7d746d1ff6cb059cbaa2a2e424d689ee539\"},{\"root\":\"core\",\"path\":\"system/schema/module.schema.json\",\"size\":8431,\"sha256\":\"sha256:cecf1d53f0e5e12a0ae8a8e99fdf4cf8c66cdb8e65b3451475960215f06f5bc8\"},{\"root\":\"core\",\"path\":\"system/schema/modules.schema.json\",\"size\":7662,\"sha256\":\"sha256:fd6666fc0d83f8b9b7c45105dc608fa8f8c79da8f157b926d23e95c17a0d704b\"},{\"root\":\"core\",\"path\":\"system/schema/note.schema.json\",\"size\":9311,\"sha256\":\"sha256:b4df35fa465ba041adc3cd91aa46baa9b9c6ecdcdffbefaa8488395fda5d8222\"},{\"root\":\"core\",\"path\":\"system/schema/plan-template.schema.json\",\"size\":2162,\"sha256\":\"sha256:6e16c7d7a5119ffdffdd1d5963a7eda31e1e2d7a05ddc7e49f5fe49880f78e0b\"},{\"root\":\"core\",\"path\":\"system/schema/program.schema.json\",\"size\":1365,\"sha256\":\"sha256:071a5bc1ad7c474915e727c27e5942cab2fc54893a2bcb65b918452e8d44d27e\"},{\"root\":\"core\",\"path\":\"system/schema/project-aliases.schema.json\",\"size\":530,\"sha256\":\"sha256:97a6c49b5c84c62482c837e75680ca25b2370102c3e96d3c0edc8de423b890df\"},{\"root\":\"core\",\"path\":\"system/schema/project-relations.schema.json\",\"size\":1694,\"sha256\":\"sha256:d5d91f03f840a31f5eb972273eba85e4493f283fe0745d22296b1940e7068c18\"},{\"root\":\"core\",\"path\":\"system/schema/project.schema.json\",\"size\":5953,\"sha256\":\"sha256:9a691ece8c2bccda055487e48aa501a0b657eaa6e9e01da2b91c49d06eeae91e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.candidate.append.schema.json\",\"size\":6415,\"sha256\":\"sha256:c64cf4f0fdbfaba706b55487d1cc26d47ec76fe4086b09213e6d1849bf36ddba\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ability.context.schema.json\",\"size\":4422,\"sha256\":\"sha256:6f49e5a53878ac23a467e074412a40fa8f475ca388d386b483793754d2c14fb6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.append-slices.schema.json\",\"size\":6257,\"sha256\":\"sha256:84efed13c9d2e41bd53b25de7d0c72c7a035e94dedfb59667386c188426cb0c5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.apply.schema.json\",\"size\":4077,\"sha256\":\"sha256:47a8e09bd766ca37cc1fe07727bc58839265ad97c8902ca1ee49ce3936c5c2e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.import.schema.json\",\"size\":1612,\"sha256\":\"sha256:926bea2b93f2cdc4fa2d28768da9d7929422ea0fbf9a39b524b9670255e18565\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.delivery.validate.schema.json\",\"size\":1683,\"sha256\":\"sha256:ea6fc0fbe53f5d8fccc4c6a668d46638e9b83ba4ddd193f650e6e70eb20795a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.list.schema.json\",\"size\":1032,\"sha256\":\"sha256:437deb2672d1b197430a84df0a4c6f271465bb2cf0c82be13c21fbfb1fe64560\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.prepare.schema.json\",\"size\":4775,\"sha256\":\"sha256:a1e26f8561bb1e6e31638e00747ab6d55da98b4b37d686a06d8a9ed36e4d134b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/ai-action.status.schema.json\",\"size\":1624,\"sha256\":\"sha256:d565688b9d17bb9edae8ccbd33b2ed861888b11d58620e50714fcdecf4badc7a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.context.schema.json\",\"size\":2240,\"sha256\":\"sha256:42b246c8802a6b368c2f85227a9e421429bcc3baaac8163dea8f4d32b5d42c0a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/atlas.question.save.schema.json\",\"size\":2833,\"sha256\":\"sha256:745f0ed33c7e8750bfdd11b81546ecf584138b4f9ba5b7ff3411d03f581d6239\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.manifest.schema.json\",\"size\":3430,\"sha256\":\"sha256:b87b6cc870dd902051b08848ca5fdefcf4a6a3cbf9fd1f34546ec8d52b2746f6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/backup.verify.schema.json\",\"size\":4147,\"sha256\":\"sha256:15e2ded47137de8145490c2999a68a7419d0f980942972685b848fde6d718a72\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capabilities.read.schema.json\",\"size\":2038,\"sha256\":\"sha256:2f5954b260d02f93171aec8dbddfdb0521a352a0cea7519e06050048a0c78bde\"},{\"root\":\"core\",\"path\":\"system/schema/requests/capture.create.schema.json\",\"size\":3779,\"sha256\":\"sha256:4d9e18d7a336c8d50d25d2a531c6906fe4bb5ba3706bcc04473b2a000e0f41db\"},{\"root\":\"core\",\"path\":\"system/schema/requests/cli.capability.schema.json\",\"size\":2655,\"sha256\":\"sha256:4880b312714e424cd0166679ed729b457a2f79b34eb5c61d066369aec9979e49\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.create.schema.json\",\"size\":3860,\"sha256\":\"sha256:e99fac17baaa64f1e29622dc58f6ba9c36b9061cd9b5fb7be48de84da027c1a6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/collection.entry.revise.schema.json\",\"size\":5102,\"sha256\":\"sha256:e0fe8fdd6fbf6b21e798ba764165535779d86660523d6b8d345e447061a0c846\"},{\"root\":\"core\",\"path\":\"system/schema/requests/concept.relations.change.schema.json\",\"size\":2815,\"sha256\":\"sha256:00397570f92919dafd35d69f3201edb6352b323a91fb40249648eb4b2023ff13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/coordination.section.revise.schema.json\",\"size\":4691,\"sha256\":\"sha256:30f747a4b6f117f2c189d3bdfa45860a7377b0272512781165d448b6ac6e3acd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.create.schema.json\",\"size\":4617,\"sha256\":\"sha256:ec048f6b22268fe62202f33bfe2cfdedd40f87b6941a9da23c595a630ecc8138\"},{\"root\":\"core\",\"path\":\"system/schema/requests/detour.resolve.schema.json\",\"size\":3800,\"sha256\":\"sha256:b542ecf3965f7231ee01e8c2d1810a8aaaa5265c70fc99291d9865b192210fd5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/dossier.read.schema.json\",\"size\":1575,\"sha256\":\"sha256:717b9d631fe689b747698ea6d9cb6eb67bf85beb6fa915d131141a00a34db0d5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/garden.seed.create.schema.json\",\"size\":3286,\"sha256\":\"sha256:56ac1bac97ea847e27b591aa21ab802126ba482f2f403bf42c0d1c895d428238\"},{\"root\":\"core\",\"path\":\"system/schema/requests/goal.decide.schema.json\",\"size\":7303,\"sha256\":\"sha256:153d5ec6ea2358ec84af5df7cb2469c0fd7445bc4c62492f773fb753ee5df3f0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/health.report.schema.json\",\"size\":1035,\"sha256\":\"sha256:eeb16526fc97b6560c2f32bd3fabce12b1b0a7e1e762c1a7f4b6b60e392b259e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.content.schema.json\",\"size\":3095,\"sha256\":\"sha256:b956e7822531c67d13d4143b2c50cce2ff22e0e86bbbab5f63af18aaf4f998f4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.list.schema.json\",\"size\":1036,\"sha256\":\"sha256:e7c01475bec27d2a5cd1e957a41b899a218c79ecb0e7099bb26c1f191ec8f55d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/inbox.resolve.schema.json\",\"size\":4142,\"sha256\":\"sha256:1ffa96d3077615e4ec86e4c942af946fb65f454dd903b16dc2a7a58c61855097\"},{\"root\":\"core\",\"path\":\"system/schema/requests/intelligence.scan.schema.json\",\"size\":2664,\"sha256\":\"sha256:a86e0aeaee6f8219e0271f085f7349cd20084e8635ffaaaef694a8bf1f04a196\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.ability-observation.append.schema.json\",\"size\":9026,\"sha256\":\"sha256:f716a721bbc6e780ea21e535b19748b45b9ba165c8cadfb64115480bcf02eba1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observation.append.schema.json\",\"size\":7838,\"sha256\":\"sha256:99eeaee15866beeb246139c36549e614239b43934cc2050d9033294740c63ca8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.observe.schema.json\",\"size\":6621,\"sha256\":\"sha256:7974093e87e62642f2b3999ee3be1d1762daa03d0248806f0c475f0b478ed9f2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/learner.stage-result.append.schema.json\",\"size\":7300,\"sha256\":\"sha256:defd35bb458142b093c68e2685f3cff748b890270380cc108094ea289f4c8693\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.inspect.schema.json\",\"size\":2182,\"sha256\":\"sha256:157ae50dfae4d70d6a334db79593d4e4c675cef709f102638568af85b05755e8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.lock.publish.schema.json\",\"size\":3922,\"sha256\":\"sha256:c260608e5c2c93a0081d7338a9b761d872e4fb007a4ea4fcaaee25208dd75a8b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/legacy.archive.status.schema.json\",\"size\":1082,\"sha256\":\"sha256:5fccbc4aa4b2d1ccc15cb19a7bb004804a47c9395c0fb85cf595ac9efbcbb3a3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/lineage.restamp.schema.json\",\"size\":4540,\"sha256\":\"sha256:7b1ad7a236674074f6543bfc71e0091abcfc79db5d4fe4ff09e5ca05291c28cc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.catalog.update.schema.json\",\"size\":3938,\"sha256\":\"sha256:ba9aabed3b802b3d6f4bc99f5df9d08443f2bec3e5a4c59b613a6809e2991a13\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.comparison.publish.schema.json\",\"size\":4569,\"sha256\":\"sha256:f5829d2b7e99a965092bc41b6028e483a88aa108a002250321de4efbc78c6358\"},{\"root\":\"core\",\"path\":\"system/schema/requests/masters-planning.dashboard.schema.json\",\"size\":1659,\"sha256\":\"sha256:12d94e731b549690282ab6baec772a0409fb9badb7aabe7b167967d3f484c35f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.context.schema.json\",\"size\":6935,\"sha256\":\"sha256:bd0d7e1155045d0b225dceea79cf75ffc65757333620699a5875789ab951cd3a\"},{\"root\":\"core\",\"path\":\"system/schema/requests/material.span.schema.json\",\"size\":4423,\"sha256\":\"sha256:15d21bba4426afe334cbd26a5337e60625137beb518e743d044f0960101c6ecd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.attempt.record.schema.json\",\"size\":5727,\"sha256\":\"sha256:def44a95750a94e5fa986aa5eda0922daccf56be5e41651b6cbc29d0a1af0c56\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.create.schema.json\",\"size\":3916,\"sha256\":\"sha256:02b73b8c4600f234426dfb360dd9d3a2676a71d6c7ee55a7f6c8cbceb6b6b18f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.list.schema.json\",\"size\":2127,\"sha256\":\"sha256:e0bdb5628bffe00d0d37b004de890566a5faf8616aae657fd0421631731fddd8\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.materials.compact.schema.json\",\"size\":4010,\"sha256\":\"sha256:1bdd0efeb2eed2eae79448ddd0e2f2ae5d763dd7469b08980b16ad5527dd61be\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.plan.import.schema.json\",\"size\":8126,\"sha256\":\"sha256:19fea12cc4989f43d8ace4d82bb778e41aa87452b98e2eaa2777f70ba322f9e6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/module.sitting.update.schema.json\",\"size\":4006,\"sha256\":\"sha256:853ee3c8cb75a6c3de8a83f65ee306495f105b242ac2d3118e6ca56428e05076\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.prepare.schema.json\",\"size\":2291,\"sha256\":\"sha256:c0bba25db6730422ce1c9bf7fc5e30ae272b397dbc1c3dff0e231166437feb4e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save.schema.json\",\"size\":4032,\"sha256\":\"sha256:4a4242ac01aaa407dcba358910b72f80dae8bd9aa76f2bc0e649f99a4cc96f81\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.analysis.save_batch.schema.json\",\"size\":2879,\"sha256\":\"sha256:4332e7bfe2be823efd5c0b757f13304e1ef46524da1c8cd2f8bd611d8264f2e1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.content.schema.json\",\"size\":3184,\"sha256\":\"sha256:9bc9d43f182d575d7d1810c4c9cddb70238ae0b592cb5f2f6519647271bd0337\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.create.schema.json\",\"size\":3943,\"sha256\":\"sha256:1286d6e9becf1f27db94b48fec7b862f938b03994b6e6b24e31edf6dd9bc08e2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.evidence.add.schema.json\",\"size\":4132,\"sha256\":\"sha256:09aa203dcdac2e48009d35775efbfa8fbd1445bdabc57335d870f8919add5c90\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.revise.schema.json\",\"size\":4463,\"sha256\":\"sha256:f4c7030b241b464c82702801ce00f54000c5d51dc1781c131c3582c57d62e2e7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/note.search.schema.json\",\"size\":4796,\"sha256\":\"sha256:6759422fa9493501961f528a1b996d819505655903e1ee79c229ba8b51de16b5\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operations.read.schema.json\",\"size\":2157,\"sha256\":\"sha256:0860328c5ba0012f63e0572a160b623a11e4bbabd1e2bbaaa2ccde8e18c3483f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/operator.bootstrap.schema.json\",\"size\":3732,\"sha256\":\"sha256:2f858fc476164b3ff56eb95ea2fff5bb9bf8f03c7986aa1289af112858bb7e27\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.attachment.add.schema.json\",\"size\":5038,\"sha256\":\"sha256:bd0b88c9af93b5529f83dd8ddc74a1f580b33d8de4bd229668c0c131aef6caf9\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.note.write.schema.json\",\"size\":4268,\"sha256\":\"sha256:0028a6bc3097dda853326d9f92ff2f4c4921adb109959372d218a6b85e311308\"},{\"root\":\"core\",\"path\":\"system/schema/requests/path.progress.update.schema.json\",\"size\":3951,\"sha256\":\"sha256:e3b41826488d41dfadec61a037847a915583404ca4d7487bdf507bc36d19821b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.edit-context.schema.json\",\"size\":6343,\"sha256\":\"sha256:42e249f897c5b3cf2fad884c2260f5c37ba207e352079e6910321fc7fd020602\"},{\"root\":\"core\",\"path\":\"system/schema/requests/plan.template.schema.json\",\"size\":3471,\"sha256\":\"sha256:1c532b6ed114dbfd914a206019055da000eaf2d356d299fa28146d0c1dba5bf7\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.list.schema.json\",\"size\":1022,\"sha256\":\"sha256:1c6989676b267ba1c4b5d70c58c5099a4a2af841211d8e01af6574c59c80b365\"},{\"root\":\"core\",\"path\":\"system/schema/requests/program.semester.update.schema.json\",\"size\":3922,\"sha256\":\"sha256:fc100aa9cbfce8c13ac5a4f288d22e4bdff17ee1237bfbd382b14db832857526\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.create.schema.json\",\"size\":3962,\"sha256\":\"sha256:5c997ab044e343104516dec512e8f385fc943c2b5a40cd415903e322a7fc25d3\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.inspect.schema.json\",\"size\":2236,\"sha256\":\"sha256:e402d151940ad6ef46140bf7f6367bb78b804dde9f03cb77d46ce8711002314b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.list.schema.json\",\"size\":1528,\"sha256\":\"sha256:21515ab76275ae9c009f014e72b2ed5ebc4546467b8ae65e839b01a1d9011c04\"},{\"root\":\"core\",\"path\":\"system/schema/requests/project.update.schema.json\",\"size\":4535,\"sha256\":\"sha256:80bb64f356b256f86abb9d4e29a189025af70b9e71b4e70332c571c41db85956\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.generate.schema.json\",\"size\":1003,\"sha256\":\"sha256:b2fc48a34025bf4306eca85ccafe93e81692a9b865b354d150c5c8cb776d08ce\"},{\"root\":\"core\",\"path\":\"system/schema/requests/projection.observe.schema.json\",\"size\":2081,\"sha256\":\"sha256:6c846a118a81d9bbb7f8153007542f3587b50ef90ee23b80cd0d59e837c8abe6\"},{\"root\":\"core\",\"path\":\"system/schema/requests/related.read.schema.json\",\"size\":1650,\"sha256\":\"sha256:bed0d80d693eaa35143226b0da7849f1c0e2620fdb17216e86842b06c0ce994e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/repository.validate.schema.json\",\"size\":1495,\"sha256\":\"sha256:ae2e47618d9bd5229f6bedeb2a6b45db14b15fb8e71fe117e7ac8f94278f03bd\"},{\"root\":\"core\",\"path\":\"system/schema/requests/resume.read.schema.json\",\"size\":2123,\"sha256\":\"sha256:873cd342a30c7e35416eb7f62688de7a3c2df3e5848b000aa100a2cbfb97460e\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.apply.schema.json\",\"size\":3891,\"sha256\":\"sha256:756fa765f842b035c3818fe32f0132d7a1a7bf7708ed48459576046188cd61b1\"},{\"root\":\"core\",\"path\":\"system/schema/requests/review.prepare.schema.json\",\"size\":4528,\"sha256\":\"sha256:2981bf0a3879aeda9253b905b637abcc3b2fab631459e6d50ebdb8f538290fa4\"},{\"root\":\"core\",\"path\":\"system/schema/requests/route.patch.schema.json\",\"size\":5167,\"sha256\":\"sha256:04cf04b1b48c8132f8a61b63be2cd65c7338844438f4ef118d50e39131c4a19d\"},{\"root\":\"core\",\"path\":\"system/schema/requests/runtime.session.schema.json\",\"size\":3774,\"sha256\":\"sha256:3591ad91b76913f0160fbb054d24dc60f2d03e246b37c3a62b1cf55b2545af1f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/semantic.query.schema.json\",\"size\":3136,\"sha256\":\"sha256:abd9beff1af58fe29e81fe58e7c7efb34ba3c8f42b72fe9c63991926e7a73034\"},{\"root\":\"core\",\"path\":\"system/schema/requests/session.end.schema.json\",\"size\":4363,\"sha256\":\"sha256:41356cfd7cc9b603c45f68e93483c6f5e3a6acea05d9065003e163c8f6f94077\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.feedback.record.schema.json\",\"size\":5901,\"sha256\":\"sha256:112347c021903070830dc1f78bc723ce4ddc643d2dc14acd2817fee98837eb08\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.intake.record.schema.json\",\"size\":5091,\"sha256\":\"sha256:0c68bc91ab2efee8a4e3fbe1faf4b64c42fa927d1e4cea5f35fd25f687e03fc0\"},{\"root\":\"core\",\"path\":\"system/schema/requests/source.record.revise.schema.json\",\"size\":5074,\"sha256\":\"sha256:7132ed2287f0289eaa7d5ad956e60db1ac255f08460fa4cd42477a3ee330877b\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.attachment.add.schema.json\",\"size\":5019,\"sha256\":\"sha256:28246abedd3841ddc70899cc1742e698f95a5318a9cbbf39245f4b218eec3419\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.note.write.schema.json\",\"size\":4404,\"sha256\":\"sha256:83f18cb5fb35af4a4674021a33f343d013b0252f00deaad8874415ae9beeb0fc\"},{\"root\":\"core\",\"path\":\"system/schema/requests/stage.progress.update.schema.json\",\"size\":5088,\"sha256\":\"sha256:50f7d840666f6c5db501fe23c239bf7ce20d7883e0b9d2888bbb44b954c61c2f\"},{\"root\":\"core\",\"path\":\"system/schema/requests/status.read.schema.json\",\"size\":1538,\"sha256\":\"sha256:3583d0fb76db5a39f2c7818a9844eb5b8ac1471ad409788db38fb4e6590d3ff2\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.list.schema.json\",\"size\":4981,\"sha256\":\"sha256:28ed9af83321e0b9e995e9964b7bafeb83dd173fd54dac9b6cbfee6268745478\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.map.import.schema.json\",\"size\":7302,\"sha256\":\"sha256:3420133d42337c0de70c49e5a0a67fe94623b1ae214fd050147d9adaf1a9a697\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.material-synthesis.publish.schema.json\",\"size\":5019,\"sha256\":\"sha256:7a48b189959f817278122775987799e65751f6f39b120351d1017000ab01a247\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.note.append.schema.json\",\"size\":5759,\"sha256\":\"sha256:2af772166fcb0b33744c84b4e24cbb5890115dcfa89a7f0c10f868d54034fc52\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.plan.revise.schema.json\",\"size\":7544,\"sha256\":\"sha256:06f46ccf33939298865a5917b7d7f6c612bfce4d84e02a3d1537f0cd13a1f2ad\"},{\"root\":\"core\",\"path\":\"system/schema/requests/unit.source-selection.set.schema.json\",\"size\":4979,\"sha256\":\"sha256:8f7b570768812eccb25f689ae94affeb15bfbd3eda738da19fba4a14841fefff\"},{\"root\":\"core\",\"path\":\"system/schema/requests/workspace.next-action.update.schema.json\",\"size\":3410,\"sha256\":\"sha256:ddc71f623d2b720cd66c6b7bb9d0279c65a1f9c6af27591dcf40b0c4e662dbde\"},{\"root\":\"core\",\"path\":\"system/schema/resume.schema.json\",\"size\":765,\"sha256\":\"sha256:9fe0d2f92087918ae86aada1de051f05b2959ca526ecebbf1765c1a120abe991\"},{\"root\":\"core\",\"path\":\"system/schema/runtime-session.schema.json\",\"size\":629,\"sha256\":\"sha256:b563f3617682e74b829bd38d72c1e1057600a7c384d7f0f565bc8ac7275a138c\"},{\"root\":\"core\",\"path\":\"system/schema/session-context.schema.json\",\"size\":2009,\"sha256\":\"sha256:aff64b8eeef82d536a7478459e746b92667588fafc3235e9b3ea10de4d8c418e\"},{\"root\":\"core\",\"path\":\"system/schema/session-plan.schema.json\",\"size\":4161,\"sha256\":\"sha256:d96870d79b8beee329eb044ff9c5c01c684bb89c6f8fad66514b9d02c0ba9b84\"},{\"root\":\"core\",\"path\":\"system/schema/sources.schema.json\",\"size\":8025,\"sha256\":\"sha256:6780ae4b3e7c53cb91fe4d51f52e1b3ee2a6c7e2e1e169443e03e976951de8a4\"},{\"root\":\"core\",\"path\":\"system/schema/study-map.schema.json\",\"size\":10430,\"sha256\":\"sha256:318ecc3d306c6814f7d8b1285e5bf6153fbb6ee178048cec4a29da3842275644\"},{\"root\":\"core\",\"path\":\"system/schema/thematic-groups.schema.json\",\"size\":1121,\"sha256\":\"sha256:55217e158fe8fad4c9ec713f8bd699388243f5310b7e40c94eb4d843d419f159\"},{\"root\":\"core\",\"path\":\"system/schema/transaction-receipt.schema.json\",\"size\":10258,\"sha256\":\"sha256:064eedb82fca997c3d5b6e4089578ee8205da15c9630796fd84a8bbaf87c0d55\"},{\"root\":\"core\",\"path\":\"system/schema/ui-responses.schema.json\",\"size\":38800,\"sha256\":\"sha256:dab0b6f04218e2bd724304efa43320768a17f833732b1aa8576bd31222cf9b27\"},{\"root\":\"core\",\"path\":\"system/schema/unit-material-synthesis.schema.json\",\"size\":9058,\"sha256\":\"sha256:5604270206414e23d20330f3d37186f5a6a01f87a3c2900b1e480867c638b615\"},{\"root\":\"core\",\"path\":\"system/schema/unit.schema.json\",\"size\":5271,\"sha256\":\"sha256:39e30b14ad6dd199b00f7fbc210d5a1d33d362228ccd2b214f00c056e7fd127b\"},{\"root\":\"core\",\"path\":\"system/schema/workspace.schema.json\",\"size\":1939,\"sha256\":\"sha256:c87596a90db6fb052fc2d7b065b19805cdeb18c56243b24497619377cd8bad96\"},{\"root\":\"core\",\"path\":\"work/COORDINATION.md\",\"size\":220,\"sha256\":\"sha256:667bbd75392b1acdc610aa249aa5f2fe3d7659603901f415b36eda30fe2b4655\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"size\":350,\"sha256\":\"sha256:f7f0a5ad8934e7a2f86c1c91f304954bf07c58899aa0c98d98394076097a3422\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/ability-observations.jsonl\",\"size\":573,\"sha256\":\"sha256:1c8eb39cfb4345f0848479cee57081109ca59fefc19e81ea3b39f63c774499f8\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/outputs/demo-coverage-audit.md\",\"size\":202,\"sha256\":\"sha256:12042cb1d559ec41ae54303706ddb6314f37adc58d0a592092d8b108ea091fff\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/path-demo.yaml\",\"size\":476,\"sha256\":\"sha256:c383f7acfd609dc321b2edf7b361c0fa441d214eee8fc1a379d7c205e09e5890\"},{\"root\":\"core\",\"path\":\"work/active/workspace-demo/paths/stage-demo-path-notes.md\",\"size\":36,\"sha256\":\"sha256:105f863cae25c40a6f48917be30307880ce4ff3f0d83b9b9116a04363170d413\"},{\"root\":\"core\",\"path\":\"work/active/workspace-second/CONTEXT.md\",\"size\":271,\"sha256\":\"sha256:447501ac5d8fb8fcb40f4daeb8de500c97abd933b7af20a0dea814d9ae7f9040\"},{\"root\":\"core\",\"path\":\"work/inbox/note-drop.md\",\"size\":26,\"sha256\":\"sha256:cff485a0c38476920bff529d70a47c19fddb0380750b9a0152521d7eb9b6c81d\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/one.md\",\"size\":4,\"sha256\":\"sha256:2c8b08da5ce60398e1f19af0e5dccc744df274b826abe585eaba68c525434806\"},{\"root\":\"core\",\"path\":\"work/inbox/pack/two.md\",\"size\":4,\"sha256\":\"sha256:27dd8ed44a83ff94d557f9fd0412ed5a8cbca69ea04922d88c01184a07300a5a\"},{\"root\":\"materials\",\"path\":\"source-demo-book/book.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"materials\",\"path\":\"source-demo-book/lecture-01.pdf\",\"size\":10191,\"sha256\":\"sha256:395ded80ff4a721e2a91f400a3c6a3abd1f8d37e3c7f70b5ef42fa30d5264ea5\"},{\"root\":\"materials\",\"path\":\"source-scenario-bare/attached.pdf\",\"size\":608,\"sha256\":\"sha256:61b4d4e33f928a4f6801ae74b3e940e0cfac1285aa4a958d46ce0ae142b49ed6\"},{\"root\":\"ui\",\"path\":\"plugin-assets.json\",\"size\":115,\"sha256\":\"sha256:61421f5649b9648ad0fd87bbd7dd267fb2371f15fb72652f69a87156f8e45f4d\"},{\"root\":\"ui\",\"path\":\"plugin/main.js\",\"size\":30,\"sha256\":\"sha256:6c2835936c311f016909937b412e19a2b44c71fda4baa5e49bfd672187823cd0\"}],\"materials_aliases\":{},\"provenance\":{\"core\":{\"commit\":\"48d1ef477e94d707184f67e7ab24e23acd1ca28d\",\"dirty\":false},\"ui\":{\"commit\":null,\"dirty\":null},\"data_contract_version\":62},\"aggregate_sha256\":\"sha256:6bf967a2dec777d9fdb5dfd1fe1c44e219caf93c7b64552c2c6889b8c2d3209b\"}\n", "stdout_json": { - "aggregate_sha256": "sha256:f0f1aa75db4047881176f0bd6b9dd0e91f6cee97ef7bf9225fd87f49a5e943aa", + "aggregate_sha256": "sha256:6bf967a2dec777d9fdb5dfd1fe1c44e219caf93c7b64552c2c6889b8c2d3209b", "entries": [ { "path": "curriculum/modules/module-demo/module.yaml", @@ -170,8 +170,8 @@ { "path": "system/contracts/agent-plan-input.schema.json", "root": "core", - "sha256": "sha256:593c60a7de47be1770c660d5b8102237068b27e15b9469acf7cc1d3377e28284", - "size": 475 + "sha256": "sha256:2916d1a5155301469f4ad433410d808c264de8e74bc05e55586b7da70c88ab84", + "size": 5599 }, { "path": "system/contracts/agent-plan-report.schema.json", @@ -218,20 +218,20 @@ { "path": "system/contracts/contract-register.yaml", "root": "core", - "sha256": "sha256:3d6f21d3827871fd0747b1c8a4b07656afe9e1bc0b96506aae51280ed9aaa220", - "size": 11187 + "sha256": "sha256:df98578f254c261109aa1cc9d76e53c64d675e0df0ab2c10f9593b76be2d79e4", + "size": 11195 }, { "path": "system/contracts/data-contract.yaml", "root": "core", - "sha256": "sha256:97e5976c26a2924d73aa9b6a3b4c1a908590d35c01c0b594077811c925a74f9b", - "size": 20544 + "sha256": "sha256:2954088c266a21807d2fefdbad6326e9f6c0d989b46c15c88c1e353494c37333", + "size": 20772 }, { "path": "system/contracts/manifest-contract.yaml", "root": "core", - "sha256": "sha256:92b0d3997c4701491102e6c73479e38fc514872d09a7040b4d3ded636df17eee", - "size": 8779 + "sha256": "sha256:d9ca03f62ca990a9557e8c35bd1bc09967fe9e47d4b1d43441f58989c39019c2", + "size": 8977 }, { "path": "system/contracts/manifest-v15.schema.json", @@ -239,6 +239,12 @@ "sha256": "sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", "size": 87416 }, + { + "path": "system/contracts/manifest-v16.schema.json", + "root": "core", + "sha256": "sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55", + "size": 87524 + }, { "path": "system/contracts/normative-corpus.schema.json", "root": "core", @@ -248,8 +254,8 @@ { "path": "system/contracts/normative-corpus.yaml", "root": "core", - "sha256": "sha256:3191bf5ffb3fcbc0b0a6754200c2f1cd26213281845b52fdf340212193477d4a", - "size": 42645 + "sha256": "sha256:858f13552ae3d1921b03d2ebc93b80f4a2a5ef14690c5130bdb037452af89114", + "size": 42648 }, { "path": "system/contracts/perimeter.yaml", @@ -260,20 +266,20 @@ { "path": "system/contracts/release-pair-receipt.schema.json", "root": "core", - "sha256": "sha256:4628e457288ed98701ad54568e822b8f3906471e329eea3e036710ab3f7a30b7", - "size": 3380 + "sha256": "sha256:fded162b92379ea9e353bcbdb5e21e8bbcf880e9bad8ddf60e61eb48b2c430c6", + "size": 3384 }, { "path": "system/contracts/review-consolidation.schema.json", "root": "core", - "sha256": "sha256:6651deaa8c23da9b133388b8b3d5c1c3ca1a831090dff81cdac7d89a4a4ea348", - "size": 565 + "sha256": "sha256:44e489cef663dbc886ab50932aea3d7ff6ffc8840a5f663d6dbe2b73bb45ea63", + "size": 2731 }, { "path": "system/contracts/review-consolidation.yaml", "root": "core", - "sha256": "sha256:851a3264b990c78388292c09d416c49c317fc02c236dfd2d88c8cc1b50472bb4", - "size": 29564 + "sha256": "sha256:9e359870e9c85a0c0439d0101325f0ef36402848f8ddf1fad0a84a008061a4ed", + "size": 25098 }, { "path": "system/contracts/semantic-lineage-ledger.schema.json", @@ -284,8 +290,8 @@ { "path": "system/contracts/task-scope.yaml", "root": "core", - "sha256": "sha256:eee063f6efe4c9df1f6678a14175773e39c80658e86ec645ce4af0b9b1dbae18", - "size": 9335 + "sha256": "sha256:84ef07507f98c96b7d7223a3d7c84602cf68013e2771f4776527b25260615413", + "size": 9869 }, { "path": "system/contracts/tree-contract.yaml", @@ -332,8 +338,8 @@ { "path": "system/schema/candidate-source-comparison.schema.json", "root": "core", - "sha256": "sha256:2fb6578020f09025e2203756c1d1187b26c06b1e9cfcf2e8ec033838db90c41e", - "size": 4794 + "sha256": "sha256:ae9933a6033c2b55895aac98c074ed774cab2a3284b364dafdd2bb0b5a379568", + "size": 4828 }, { "path": "system/schema/capabilities/ability.candidate.append.schema.json", @@ -698,8 +704,8 @@ { "path": "system/schema/learning-plan.schema.json", "root": "core", - "sha256": "sha256:7a9eff984604d7a7eb5991c7cb677f41473b2d02864a4766f4e0d00a6c311fa8", - "size": 16830 + "sha256": "sha256:1967bc3daaaff023d91457e61000d33604e4febe1dc6483e143096ee8e324254", + "size": 16921 }, { "path": "system/schema/learning-requirement.schema.json", @@ -1418,8 +1424,8 @@ { "path": "system/schema/study-map.schema.json", "root": "core", - "sha256": "sha256:8b60dc80fcf6e903f97e01df8b88ece826572181b44ba82a80fbca04022e6772", - "size": 10349 + "sha256": "sha256:318ecc3d306c6814f7d8b1285e5bf6153fbb6ee178048cec4a29da3842275644", + "size": 10430 }, { "path": "system/schema/thematic-groups.schema.json", @@ -1442,8 +1448,8 @@ { "path": "system/schema/unit-material-synthesis.schema.json", "root": "core", - "sha256": "sha256:2118f175d602b761ec2333cab4cf3f4a964e7b92129e8743f0ab3d37bcceab37", - "size": 8987 + "sha256": "sha256:5604270206414e23d20330f3d37186f5a6a01f87a3c2900b1e480867c638b615", + "size": 9058 }, { "path": "system/schema/unit.schema.json", @@ -1552,10 +1558,10 @@ "materials_aliases": {}, "provenance": { "core": { - "commit": "001177fc67a90948242c1ea970252862fe793333", + "commit": "48d1ef477e94d707184f67e7ab24e23acd1ca28d", "dirty": false }, - "data_contract_version": 61, + "data_contract_version": 62, "ui": { "commit": null, "dirty": null diff --git a/tests/scenarios/recorded/capabilities.read/one-command.json b/tests/scenarios/recorded/capabilities.read/one-command.json index 4dfa4889..a09e2382 100644 --- a/tests/scenarios/recorded/capabilities.read/one-command.json +++ b/tests/scenarios/recorded/capabilities.read/one-command.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{},\"commands\":{\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\",\"payload_schema_path\":\"system/schema/capabilities/stage.progress.update.schema.json\",\"payload_schema\":{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"$id\":\"capabilities/stage.progress.update.schema.json\",\"title\":\"payload for capability stage.progress.update\",\"description\":\"Derived from the los CLI parser for this capability's named command. Do not hand-edit; regenerate with tools/generate_capability_schemas.py.\",\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"stage_id\",\"status\",\"unit_id\"],\"properties\":{\"progress_next\":{\"type\":\"string\",\"description\":\"record what comes next (requires --progress-summary)\"},\"progress_summary\":{\"type\":\"string\",\"description\":\"record where work stopped (stored on the stage row, surfaced by resume)\"},\"stage_id\":{\"type\":\"string\",\"description\":\"stage of the unit's current study map to update\"},\"status\":{\"type\":\"string\",\"enum\":[\"active\",\"paused\",\"complete\",\"skipped\",\"revisit\"],\"description\":\"new status for the stage\"},\"unit_id\":{\"type\":\"string\",\"description\":\"unit whose stage to update\"}},\"dependentRequired\":{\"progress_next\":[\"progress_summary\"]}},\"verb\":{\"verb\":\"stage-progress\",\"operation\":\"stage.progress.update\",\"capability\":\"stage.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"record-stage-progress\"]},\"verbs\":[{\"verb\":\"stage-progress\",\"operation\":\"stage.progress.update\",\"capability\":\"stage.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"record-stage-progress\"]}],\"tasks\":[{\"id\":\"record-stage-progress\",\"task\":\"Record stage progress or end a session\",\"entry_read\":\"`capabilities stage.progress.update --json`\",\"procedures\":[\"system/procedures/end-a-session.md#read-the-stage-progress-payload-contract\",\"system/procedures/end-a-session.md#step-3-review-the-session\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#22-end-a-session\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]}],\"read\":[]}\n", + "stdout": "{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{},\"commands\":{\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\",\"payload_schema_path\":\"system/schema/capabilities/stage.progress.update.schema.json\",\"payload_schema\":{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"$id\":\"capabilities/stage.progress.update.schema.json\",\"title\":\"payload for capability stage.progress.update\",\"description\":\"Derived from the los CLI parser for this capability's named command. Do not hand-edit; regenerate with tools/generate_capability_schemas.py.\",\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"stage_id\",\"status\",\"unit_id\"],\"properties\":{\"progress_next\":{\"type\":\"string\",\"description\":\"record what comes next (requires --progress-summary)\"},\"progress_summary\":{\"type\":\"string\",\"description\":\"record where work stopped (stored on the stage row, surfaced by resume)\"},\"stage_id\":{\"type\":\"string\",\"description\":\"stage of the unit's current study map to update\"},\"status\":{\"type\":\"string\",\"enum\":[\"active\",\"paused\",\"complete\",\"skipped\",\"revisit\"],\"description\":\"new status for the stage\"},\"unit_id\":{\"type\":\"string\",\"description\":\"unit whose stage to update\"}},\"dependentRequired\":{\"progress_next\":[\"progress_summary\"]}},\"verb\":{\"verb\":\"stage-progress\",\"operation\":\"stage.progress.update\",\"capability\":\"stage.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"record-stage-progress\"]},\"verbs\":[{\"verb\":\"stage-progress\",\"operation\":\"stage.progress.update\",\"capability\":\"stage.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"record-stage-progress\"]}],\"tasks\":[{\"id\":\"record-stage-progress\",\"task\":\"Record stage progress or end a session\",\"entry_read\":\"`capabilities stage.progress.update --json`\",\"entry_verb\":\"stage-progress\",\"procedures\":[\"system/procedures/end-a-session.md#read-the-stage-progress-payload-contract\",\"system/procedures/end-a-session.md#step-3-review-the-session\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#22-end-a-session\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]}],\"read\":[]}\n", "stdout_json": { "capability_contract_version": 2, "cli_protocol": 6, @@ -97,6 +97,7 @@ "tasks": [ { "entry_read": "`capabilities stage.progress.update --json`", + "entry_verb": "stage-progress", "id": "record-stage-progress", "procedure_text": null, "procedures": [ diff --git a/tests/scenarios/recorded/capabilities.read/one-query.json b/tests/scenarios/recorded/capabilities.read/one-query.json index 56a48414..644f63b1 100644 --- a/tests/scenarios/recorded/capabilities.read/one-query.json +++ b/tests/scenarios/recorded/capabilities.read/one-query.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]}},\"commands\":{},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\",\"verb\":{\"verb\":\"bootstrap\",\"operation\":\"operator.bootstrap\",\"capability\":\"operator.bootstrap\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"open-work-or-priority-question\"]},\"verbs\":[{\"verb\":\"bootstrap\",\"operation\":\"operator.bootstrap\",\"capability\":\"operator.bootstrap\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"open-work-or-priority-question\"]}],\"tasks\":[{\"id\":\"open-work-or-priority-question\",\"task\":\"Open work or priority question\",\"entry_read\":\"`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination\",\"procedures\":[\"system/procedures/retrieval-behavior.md#orient-operational-questions-from-the-brief\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\",\"system/CLAUDE.md\"]}]}\n", + "stdout": "{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]}},\"commands\":{},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\",\"verb\":{\"verb\":\"bootstrap\",\"operation\":\"operator.bootstrap\",\"capability\":\"operator.bootstrap\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"open-work-or-priority-question\"]},\"verbs\":[{\"verb\":\"bootstrap\",\"operation\":\"operator.bootstrap\",\"capability\":\"operator.bootstrap\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"open-work-or-priority-question\"]}],\"tasks\":[{\"id\":\"open-work-or-priority-question\",\"task\":\"Open work or priority question\",\"entry_read\":\"`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination\",\"entry_verb\":\"bootstrap\",\"procedures\":[\"system/procedures/retrieval-behavior.md#orient-operational-questions-from-the-brief\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\",\"system/CLAUDE.md\"]}]}\n", "stdout_json": { "capability_contract_version": 2, "cli_protocol": 6, @@ -41,6 +41,7 @@ "tasks": [ { "entry_read": "`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination", + "entry_verb": "bootstrap", "id": "open-work-or-priority-question", "procedure_text": null, "procedures": [ diff --git a/tests/scenarios/recorded/capabilities.read/screen-json.json b/tests/scenarios/recorded/capabilities.read/screen-json.json index 9bf284b3..fc664de6 100644 --- a/tests/scenarios/recorded/capabilities.read/screen-json.json +++ b/tests/scenarios/recorded/capabilities.read/screen-json.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"ability.context\":{\"handler\":\"ability_context\",\"cli_command\":\"ability-context\",\"kind\":\"porcelain\",\"result\":\"ability-context-v1\",\"schema\":\"system/schema/ability-context.schema.json\",\"invariants\":[\"snapshot-bound bounded global horizon with focused expansion\",\"the horizon pages at one snapshot (--offset carries the previous snapshot); every ability appears exactly once across pages, page-local edges only, off-page incident counts per row\",\"a focused --brief carries state, totals, and bounded provenance pointers (correction/conflict previews at most 20 with exact totals) without raw observation bodies or stage material rows; the paged evidence section is the complete audit history\",\"--section evidence pages complete observations in ledger order at one snapshot\",\"candidate abilities and bridges never affect readiness or evidence transfer\",\"only reviewed equivalence with a current source digest can transfer confirmed evidence under stated conditions\",\"contradictory and corrected work remains inspectable; stage completion grants nothing\",\"ability rows carry reason_codes parallel to reasons; decisions consume the structured codes, never the display prose\"]},\"material.span\":{\"handler\":\"material_span\",\"cli_command\":\"material-span\",\"kind\":\"query\",\"result\":\"material-span-v1\",\"schema\":\"system/schema/material-span.schema.json\",\"invariants\":[\"one exact registered route yields common source identity, locator, type, availability, and observed digest\",\"local extraction is on demand and bounded; remote sources are never fetched implicitly\",\"unreadable or changed bytes remain explicit and no semantic judgment is inferred\"]},\"runtime.session\":{\"handler\":\"runtime_session\",\"result\":\"runtime-session-v1\",\"schema\":\"system/schema/runtime-session.schema.json\",\"invariants\":[\"read-only snapshot-bound proposal for one explicit requirement\",\"sticky repair requires an explicit material event and the previous runtime packet, bound to its snapshot\",\"target evidence and feasibility failures stay visible\"]},\"plan.edit-context\":{\"handler\":\"plan_edit_context\",\"result\":\"plan-edit-context\",\"invariants\":[\"one unit's compact authored plan or one exact route and its stage overrides\",\"snapshot-bound; shared descriptions occur once and expected revisions are explicit\",\"an ordered batch of 1 to 20 distinct routes of one unit shares the unit snapshot and revision guards, preserves request order, and refuses atomically without a partial payload\",\"the brief lists direct analysis refs plus a related count and expansion hint; same-source-only refs list only via --include-related\",\"the brief reports a neighboring-unit source-reuse count with an explicit expansion; the full neighbor map lists only via --include-neighbors\"]},\"atlas.context\":{\"handler\":\"atlas_context\",\"result\":\"atlas-context\"},\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]},\"semantic.query\":{\"handler\":\"semantic\",\"result\":\"semantic-query\",\"invariants\":[\"one registered predicate evaluates against explicit --input k=v bindings; --list names the registry and --recipe shows the worked procedure for one class\",\"an unknown predicate names the registry instead of failing without a way forward\"]},\"note.content\":{\"handler\":\"note_read\",\"result\":\"note-content\",\"invariants\":[\"reads registered durable notes and garden seeds by stable id, without following symlinks\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.content\":{\"handler\":\"inbox_read\",\"result\":\"inbox-content\",\"invariants\":[\"reads one work/inbox file by inbox-relative name, without following symlinks\",\"non-UTF-8 drops refuse with no text read; dot-files read by exact name only\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.list\":{\"handler\":\"inbox_list\",\"result\":\"inbox-list\",\"invariants\":[\"lists work/inbox files by inbox-relative name, without reading bytes\",\"dot-files excluded; a missing inbox is empty\",\"each row reports its own age in days (age_days)\"]},\"note.search\":{\"handler\":\"search\",\"result\":\"note-content-search\",\"invariants\":[\"content mode searches complete registered durable notes and returns bounded line snippets\",\"content mode requires a nonempty query; empty-query listing is the CLI metadata search, not this capability\"]},\"material.context\":{\"handler\":\"material_context\",\"cli_command\":\"material-context\",\"kind\":\"query\",\"result\":\"material-context\",\"invariants\":[\"read-only; touches no repository file\",\"searches durable analysis notes plus the route assessments of approved unit syntheses\",\"deterministic lexical AND matching over explanation text (note title plus body); provenance frontmatter never matches; concept filter resolves declared ids and aliases; purpose, unit, and exact material narrow\",\"ranked by recorded stage use-evidence per source (positive feedback first, mismatch feedback last); ties keep stable order (notes by id, then assessments by unit and route); --include-related appends related notes under the same ranking\",\"use evidence is canonical study-map data under the snapshot guard; skipped is reported, never ranking\",\"unit-scoped analysis notes follow current source-map routes, independently of synthesis approval; direct notes share a routed file (and overlap its single stated page range when it states one); same-source-only notes are related, listed only via --include-related\",\"excerpts are bounded (8 note snippets — a title label or true file line numbers — 3 assessment fields); default 5 items, at most 20\",\"analysis-note anchors preview at most 8 per note with exact totals and clipping flags (purpose matches first); the complete index lists only via --include-anchors\",\"source freshness is observed live per result; review state and resolution are reported, never inferred\",\"empty results describe the searched records only, never the absence of an explanation\",\"continuation requires the snapshot and observations_sha256 guards; changed canonical data, observed material bytes, or normalized filters refuse mixed pages, even when an assessment remains stale\"]},\"plan.template\":{\"handler\":\"plan_template\",\"result\":\"plan-template-v1\",\"schema\":\"system/schema/plan-template.schema.json\",\"invariants\":[\"read-only; generates a record and touches no repository file\",\"always the current plan-template version, never a copy of an existing plan\",\"the generated record is validated against its own domain schema before it is answered\",\"curriculum requires unit_id and module_id\"]},\"project.list\":{\"handler\":\"project_list\",\"result\":\"project-list\"},\"project.inspect\":{\"handler\":\"inspect\",\"result\":\"record\"},\"health.report\":{\"handler\":\"health_report\",\"result\":\"health-report-v1\",\"schema\":\"system/schema/health-report.schema.json\",\"invariants\":[\"read-only and on demand; no watcher or daemon\",\"reports owner and remedy for every check\"]},\"backup.manifest\":{\"handler\":\"backup_manifest\",\"result\":\"backup-manifest-v1\",\"schema\":\"system/schema/backup-manifest.schema.json\",\"invariants\":[\"hashes only producer-declared allowlisted roots\",\"never follows symlinks or includes sibling directories implicitly\",\"read-only and does not configure Time Machine\"]},\"legacy.archive.inspect\":{\"handler\":\"legacy_archive_inspect\",\"result\":\"legacy-archive-lock-v1\",\"schema\":\"system/schema/legacy-archive-lock.schema.json\",\"invariants\":[\"reads only exact reviewed safe paths; there is no recursive discovery\",\"boundary-sensitive items are represented only by an aggregate count\",\"read-only and deliberately invoked\"]},\"legacy.archive.status\":{\"handler\":\"legacy_archive_status\",\"result\":\"legacy-archive-status-v1\",\"schema\":\"system/schema/legacy-archive-status.schema.json\",\"invariants\":[\"reads the last approved lock without rescanning Legacy\",\"absent from normal manifest and search\"]},\"masters-planning.dashboard\":{\"handler\":\"masters_planning_dashboard\",\"result\":\"masters-planning-dashboard-v1\",\"schema\":\"system/schema/masters-planning-dashboard.schema.json\",\"invariants\":[\"requires an explicit planning access gesture\",\"reads only the sanitized catalog and approved comparisons\",\"absent from normal manifest, search, workload, deadlines, recommendations, and ordinary AI\"]}},\"commands\":{\"ability.candidate.append\":{\"handler\":\"ability_candidate_append\",\"cli_command\":\"ability-candidate-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/ability-candidates.jsonl\"],\"invariants\":[\"appends a provenance-linked tentative connection between known abilities\",\"never changes a reviewed bridge or contributes to readiness or evidence transfer\",\"snapshot and candidate-ledger revision are guarded by a V2 receipt\"]},\"learner.ability-observation.append\":{\"handler\":\"ability_observation_append\",\"cli_command\":\"ability-observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"work/active/*/ability-observations.jsonl\"],\"invariants\":[\"appends only a learner-confirmed precise claim linked to actual work and a confirmation pointer\",\"ability identity must be active and reviewed; evidence binds to its claim, conditions, and criteria hash\",\"corrections preserve prior observations and conflicting work stays visible\",\"snapshot and workspace revision are guarded by a V2 receipt\"]},\"learner.observation.append\":{\"handler\":\"observation_append\",\"cli_command\":\"observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/active/*/observations.jsonl\"],\"invariants\":[\"append only to the registered active workspace's evidence ledger\",\"requirement resolves within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve historical evidence\",\"learner observations never update concept or source semantics\"]},\"learner.stage-result.append\":{\"handler\":\"stage_result\",\"cli_command\":\"stage-result\",\"kind\":\"command\",\"writes\":[\"work/active/*/stage-results.jsonl\"],\"invariants\":[\"append only to the registered active workspace's untargeted-result ledger\",\"unit and stage resolve to the unit's current study map within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve history\",\"untargeted rows never grant requirement, ability, or concept credit and are never retro-credited\"]},\"route.patch\":{\"handler\":\"route_patch\",\"cli_command\":\"route-patch\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/unit.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"one exact route in one owning unit; only declared descriptive material fields\",\"source selections and identical legacy mirrors synchronize; stage overrides are preserved\",\"snapshot and all affected logical revisions are guarded, including maps changed by inheritance\",\"full validation and the warning policy are enforced inside the receipt-producing transaction, on the staged state, refusing before anything commits\",\"changing a covered route's material identity or explicitly re-judging a stale or disputed claim uses shared evidence admission and the shared lineage file revision\"],\"payload_records\":{\"claim_evidence\":{\"description\":\"One reviewed covers claim for exactly the patched route; local readable material requires a matching excerpt at an explicit page or transcript window. Excerpts remain outside tracked output.\",\"accepted\":[\"claim_id\",\"evidence\",\"reads\"],\"required\":[\"claim_id\",\"evidence\"],\"types\":{\"claim_id\":\"string\",\"evidence\":\"array\",\"reads\":\"object\"},\"fields\":{\"evidence\":{\"type\":\"array\",\"min_items\":1,\"items\":{\"type\":\"object\",\"accepted\":[\"kind\",\"ref\",\"text\",\"page\",\"page_end\",\"window\",\"node\",\"note\"],\"required\":[\"kind\",\"ref\"],\"types\":{\"kind\":\"string\",\"ref\":\"string\",\"text\":\"string\",\"page\":\"integer\",\"page_end\":\"integer\",\"window\":\"string\",\"node\":\"string\",\"note\":\"string\"}}}}},\"changes\":{\"description\":\"A nonempty map of declared descriptive material fields to their new text; keys outside this list refuse, and empty text refuses.\",\"accepted\":[\"title\",\"locator\",\"angle\",\"angle_detail\",\"url\",\"vault_path\"],\"min_properties\":1,\"types\":{\"title\":\"string\",\"locator\":\"string\",\"angle\":\"string\",\"angle_detail\":\"string\",\"url\":\"string\",\"vault_path\":\"string\"}}}},\"module.materials.compact\":{\"handler\":\"module_materials_compact\",\"cli_command\":\"module-materials-compact\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\"],\"invariants\":[\"one module; exact route identity or unambiguous source/title/locator guards only\",\"identical fields become explicit references; every expanded study map is unchanged\",\"persisted route identities and compact maps commit together under the reviewed plan hash\",\"ambiguous or independent resources remain inline; no ordering, progress or teaching judgment changes\"]},\"concept.relations.change\":{\"handler\":\"concept_relations_change\",\"cli_command\":\"concept-relations-change\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/concept-relations.yaml\",\"knowledge/concept-relations/**\"],\"invariants\":[\"only explicitly supplied add, replace or remove operations; no inferred relations\",\"exact previous rows, snapshot and registry revision guard changes\",\"duplicates, unknown endpoints and prerequisite cycles fail atomically\"],\"payload_records\":{\"change\":{\"description\":\"Exactly one operations list of 1 to 50 explicit operations; each names its action and carries the exact old/new rows that action needs (add: new; replace: old and new; remove: old).\",\"accepted\":[\"operations\"],\"required\":[\"operations\"],\"fields\":{\"operations\":{\"type\":\"array\",\"min_items\":1,\"max_items\":50,\"items\":{\"accepted\":[\"action\",\"old\",\"new\"],\"required\":[\"action\"],\"types\":{\"action\":\"string\"}}}}}}},\"atlas.question.save\":{\"handler\":\"atlas_question_save\",\"cli_command\":\"atlas-question-save\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"learner wording and original target are preserved\",\"open and resolved describe a personal question, never mastery or task completion\"]},\"capture.create\":{\"handler\":\"capture\",\"cli_command\":\"capture\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/inbox/**\"],\"invariants\":[\"no automatic routing\",\"original input is preserved\",\"external file input is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 content is inline or hash-bound and never comes from stdin\"]},\"inbox.resolve\":{\"handler\":\"inbox_resolve\",\"cli_command\":\"inbox-resolve\",\"kind\":\"command\",\"writes\":[\"work/inbox/**\",\"archive/inbox/**\"],\"invariants\":[\"moves one named drop, or one file inside a drop folder, to archive/inbox/YYYY/ byte-identical\",\"the drop's SHA-256 must match the bytes read; a changed drop refuses\",\"routed_to names every destination that received the drop and is recorded on the receipt\",\"snapshot and touched-path revisions guarded; the archive never overwrites\"]},\"ai-action.delivery.apply\":{\"handler\":\"ai_action_apply_delivery\",\"cli_command\":\"ai-action-apply-delivery\",\"kind\":\"command\",\"writes\":[\"operations/ai-actions/requests/**\"],\"invariants\":[\"GatewayEnvelopeV2 with approved-delivery authority is required\",\"approval binds the imported delivery record and every referenced artifact by SHA-256\",\"canonical destinations retain their narrow domain-capability write authorities\",\"request completion and canonical writes commit atomically with one ReceiptV2\"],\"payload_records\":{\"artifact_sha256\":{\"description\":\"Free-form map of every artifact_ref to its exact SHA-256 digest.\",\"freeform\":true}}},\"garden.seed.create\":{\"handler\":\"garden_seed_create\",\"cli_command\":\"garden-seed-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/garden/**\"],\"invariants\":[\"no automatic classification or routing\",\"original seed text is preserved\",\"no AI is required\"]},\"module.attempt.record\":{\"handler\":\"module_attempt\",\"cli_command\":\"module-attempt\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; appends a new attempts row or updates the row for the same termin\",\"termin, date, result and optional grade/notes record Aram's stated exam fact; no plan contract or source map\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.sitting.update\":{\"handler\":\"module_sitting\",\"cli_command\":\"module-sitting\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; sets the examination sitting's withdrawal_deadline for one termin, nothing else\",\"the termin must already have a sitting; notes, attempts and every other sitting field are untouched\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.create\":{\"handler\":\"module_create\",\"cli_command\":\"module-create\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\"],\"invariants\":[\"creates one module record and its source map; it never edits an existing module\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the module's artifact revision is registered from birth\"]},\"collection.create\":{\"handler\":\"collection_create\",\"cli_command\":\"collection-create\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"creates one source collection file; it never edits an existing collection\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed file bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the collection's artifact revision is registered from birth\"]},\"program.semester.update\":{\"handler\":\"program_semester_update\",\"cli_command\":\"program-semester-update\",\"kind\":\"command\",\"writes\":[\"curriculum/programs/**\"],\"invariants\":[\"turns one semester-bound program's current semester; it never rolls the term forward on its own\",\"the reviewed package names the semester that becomes current; the previous one becomes previous, and no semester record is dropped\",\"only the program record is written — exam outcomes, registrations, learner state and study work are untouched\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"snapshot and program revision guarded, with one V2 receipt\"]},\"module.plan.import\":{\"handler\":\"module_plan_import\",\"cli_command\":\"module-plan-import\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/quarantine/masters-planning/catalog.yaml\",\"curriculum/quarantine/masters-planning/promotions/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one module\",\"preflight required\",\"external plan files are bound to their exact bytes by SHA-256 before use\",\"changed route-covers edges carry admitted evidence or refuse; admitted records persist atomically\"],\"payload_records\":{\"promotion\":{\"description\":\"Inline MasterPlanning promotion package; the accepted fields are the full promotion record governed by system/schema/master-planning-promotion.schema.json.\",\"record_schema\":\"system/schema/master-planning-promotion.schema.json\"}}},\"lineage.restamp\":{\"handler\":\"lineage_restamp\",\"cli_command\":\"lineage-restamp\",\"kind\":\"command\",\"writes\":[\"operations/transactions/lineage.yaml\"],\"invariants\":[\"only supported old-shape route-covers claims; withdrawn, contested and already-narrowed claims refuse\",\"every listed claim re-verified stampable against fresh analysis at apply; a claim whose route row or covered nodes differ from the judged state refuses, listed or not\",\"evidence, judge, admission, status and review state pass through untouched; the prior record rides as supersedes with restamped_by/restamped_on\",\"the approval binds the exact claim list by SHA-256 plus the snapshot and ledger guards\",\"the narrowed ledger commits atomically with one receipt\"]},\"note.analysis.save\":{\"handler\":\"note_analysis_save\",\"cli_command\":\"note-analysis-save\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical requests replay without a second note; id collision with different analysis refuses\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"analysis\":{\"description\":\"Accepted analysis input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"binding\"],\"required\":[\"id\",\"title\",\"path\",\"binding\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\"},\"fields\":{\"binding\":{\"type\":\"object\",\"description\":\"Provenance binding per the material_analysis record in system/schema/note.schema.json (frozen_input_sha256/bytes are derived by note-analysis-prepare, never drafted).\"}}}}},\"note.analysis.save_batch\":{\"handler\":\"note_analysis_save_batch\",\"cli_command\":\"note-analysis-save-batch\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"bounded to 1 to 20 notes per batch; every item carries an analysis record and a SHA-256-bound body file\",\"every item is validated before any note is written; one failure refuses the whole batch\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical notes replay without a second write; id collision with different analysis refuses the batch\",\"one transaction and one receipt cover the complete batch\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"]},\"note.revise\":{\"handler\":\"note_revise\",\"cli_command\":\"note-revise\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"id and role remain stable\",\"explicit approval\",\"external replacement files are bound to their exact bytes by SHA-256 before use\"]},\"note.evidence.add\":{\"handler\":\"note_evidence\",\"cli_command\":\"note-evidence\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"note body is never modified\",\"evidence is append-only\",\"existing entries are never rewritten or removed\"]},\"note.create\":{\"handler\":\"note_create\",\"cli_command\":\"note-create\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match the approved SHA-256\",\"filename is always the note id; id collision refuses and updates go through note.revise\",\"reference and question roles keep their dedicated capabilities and refuse here\",\"superseded notes must exist and are marked deprecated in the same transaction\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"note\":{\"description\":\"Accepted note input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"role\",\"concepts\",\"sources\",\"contexts\",\"supersedes\"],\"required\":[\"id\",\"title\",\"path\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\",\"role\":\"string\",\"concepts\":[\"array\",\"null\"],\"sources\":[\"array\",\"null\"],\"contexts\":[\"array\",\"null\"],\"supersedes\":[\"array\",\"null\"]}}}},\"unit.plan.revise\":{\"handler\":\"unit_plan_revise\",\"cli_command\":\"unit-plan-revise\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one existing unit\",\"compact patch names only what changes; unrelated routes are carried forward internally\",\"route add/update/remove operations use stable IDs and reject ambiguity\",\"when the unit already has a material-synthesis dossier, route additions, removals and evidential changes require a replacement dossier validated against staged state; without an existing dossier no replacement is required\",\"context-dependent changes require documented acknowledgments\",\"artifact IDs cover exactly the semantic owners the revision touches\",\"external revision files are bound to their exact bytes by SHA-256 before use\",\"one transaction and one receipt cover the complete revision\"],\"payload_records\":{\"record\":{\"description\":\"Compact revision naming only what changes: the v1 plan_contract coverage audit, route add/update/remove ops, the reviewed final study map, and an optional replacement dossier.\",\"accepted\":[\"unit_id\",\"plan_contract\",\"route_changes\",\"study_map\",\"material_synthesis\",\"claim_evidence\",\"acknowledgments\"],\"required\":[\"plan_contract\"],\"types\":{\"unit_id\":\"string\",\"plan_contract\":\"object\",\"route_changes\":[\"object\",\"null\"],\"study_map\":[\"object\",\"null\"],\"material_synthesis\":[\"object\",\"null\"],\"claim_evidence\":[\"array\",\"null\"],\"acknowledgments\":[\"array\",\"null\"]}}}},\"unit.map.import\":{\"handler\":\"unit_map_import\",\"cli_command\":\"unit-map-import\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"bounded to one unit\",\"external map files are bound to their exact bytes by SHA-256 before use\"]},\"unit.note.append\":{\"handler\":\"unit_note\",\"cli_command\":\"unit-note\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"session-level append\",\"failed save preserves caller draft\",\"every external attachment is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"unit.source-selection.set\":{\"handler\":\"unit_source_selection\",\"cli_command\":\"unit-source-selection\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**/unit.yaml\"],\"invariants\":[\"selection must match a rich route on the same unit\",\"complete material menu is unchanged\",\"a selection used by a study path cannot be removed implicitly\"]},\"unit.material-synthesis.publish\":{\"handler\":\"unit_material_synthesis_publish\",\"cli_command\":\"unit-material-synthesis-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"every current rich route is assessed exactly once\",\"current and prerequisite routes are deep-reviewed\",\"whole-dossier approval and revision guards are required\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full dossier record governed by system/schema/unit-material-synthesis.schema.json.\",\"record_schema\":\"system/schema/unit-material-synthesis.schema.json\"}}},\"legacy.archive.lock.publish\":{\"handler\":\"legacy_archive_lock_publish\",\"cli_command\":\"legacy-archive-lock-publish\",\"kind\":\"command\",\"writes\":[\"operations/legacy/archive-lock.yaml\"],\"invariants\":[\"reviewed allowlist-only evidence\",\"excluded boundary entries contain no paths or hashes\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full lock record governed by system/schema/legacy-archive-lock.schema.json.\",\"record_schema\":\"system/schema/legacy-archive-lock.schema.json\"}}},\"masters-planning.catalog.update\":{\"handler\":\"masters_planning_catalog_update\",\"cli_command\":\"masters-planning-catalog-update\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/catalog.yaml\"],\"invariants\":[\"academic-only sanitized input\",\"prospective ids never masquerade as canonical ids\",\"revision guarded and explicitly approved\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full catalog record governed by system/schema/master-planning-catalog.schema.json.\",\"record_schema\":\"system/schema/master-planning-catalog.schema.json\"}}},\"masters-planning.comparison.publish\":{\"handler\":\"masters_planning_comparison_publish\",\"cli_command\":\"masters-planning-comparison-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/comparisons/**\"],\"invariants\":[\"bounded to one selected candidate module\",\"all selected sources are assessed exactly once\",\"no scores, schedules, or time recommendations\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full comparison record governed by system/schema/candidate-source-comparison.schema.json.\",\"record_schema\":\"system/schema/candidate-source-comparison.schema.json\"}}},\"stage.note.write\":{\"handler\":\"stage_note\",\"cli_command\":\"stage-note\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/stages/**\"],\"invariants\":[\"one stage's working note; OPERATOR \\\"Capture routing\\\" uses it for log: captures\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]},\"stage.attachment.add\":{\"handler\":\"stage_attach\",\"cli_command\":\"stage-attach\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"source.feedback.record\":{\"handler\":\"source_feedback\",\"cli_command\":\"source-feedback\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"feedback is contextual\",\"source identity is unchanged\"]},\"source.intake.record\":{\"handler\":\"source_intake_record\",\"cli_command\":\"source-intake\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\"],\"invariants\":[\"creates a metadata-only source or corrects intake-owned fields of an existing one\",\"source identity is stable; evaluations, topics, material and every route, selection, note, feedback and observation are unchanged\",\"a check run returns the field-level diff; apply is bound to that diff's hash, the snapshot and each record's revision\",\"explicitly approved; one transaction and one receipt cover the batch\"],\"payload_records\":{\"record\":{\"description\":\"Batch of 1 to 20 intake rows; each row is a create or a correct carrying only its action's allowlisted fields, and the handler refuses a create-only field on a correct.\",\"accepted\":[\"records\"],\"required\":[\"records\"],\"fields\":{\"records\":{\"type\":\"array\",\"min_items\":1,\"max_items\":20,\"items\":{\"accepted\":[\"action\",\"id\",\"partition\",\"title\",\"type\",\"authors\",\"organization\",\"year\",\"url\",\"identifiers\",\"discovery\",\"thematic_group_ids\",\"remove_url\",\"remove_identifiers\"],\"required\":[\"action\",\"id\"],\"types\":{\"action\":\"string\",\"id\":\"string\",\"partition\":\"string\",\"type\":\"string\",\"title\":[\"string\",\"null\"],\"discovery\":[\"object\",\"null\"],\"thematic_group_ids\":[\"array\",\"null\"],\"remove_url\":[\"boolean\",\"null\"],\"remove_identifiers\":\"array\",\"identifiers\":[\"object\",\"null\"]}}}}}}},\"collection.entry.revise\":{\"handler\":\"collection_entry_revise\",\"cli_command\":\"collection-entry-revise\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"revises the why of one existing entry in one existing collection, addressed by filename stem and source id\",\"entry order, groups, sources and all other content are unchanged; empty, multi-line and no-op lines are refused\",\"a check run returns the old and proposed line; apply is bound to that diff's hash, the snapshot and the collection's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Revises one entry's why line, addressed by collection stem and source id; only why is written here.\",\"accepted\":[\"collection\",\"source\",\"why\"],\"required\":[\"collection\",\"source\",\"why\"],\"types\":{\"collection\":\"string\",\"source\":\"string\",\"why\":\"string\"}}}},\"source.record.revise\":{\"handler\":\"source_record_revise\",\"cli_command\":\"source-revise\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"attaches verified local material to one existing source, with an optional explicit evaluation replacement\",\"source identity and intake-owned fields are stable; topics, routes, selections, notes, feedback and observations are unchanged\",\"live bytes must match both the request hash and the materials manifest; the URI authority must be the source id and resolve through the runtime root; a held different material is never silently replaced\",\"when the attach moves an approved dossier's material basis, a reviewed replacement validated against the staged state ships in the same transaction; affected units join the diff and the revision guards\",\"replacement and rebased dossiers carry prospective freshness lineage bound to their new bytes and staged basis in the same transaction; existing lineage is retained as superseded provenance\",\"a reviewed rebase shortcut exists only when every moved route is screened, evidence-free, analysis-free and outside every comparison, and only material_checksums moves; it replays basis plus new provenance without echoing unchanged assessments, and every other case keeps the full replacement\",\"a check run returns the field-level diff with referring routes, bound dossiers, affected units and referring collection entries; apply is bound to that diff's hash, the snapshot and each touched record's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Attaches verified local material and/or replaces evaluations; identity and every intake-owned field stay with source.intake.record.\",\"accepted\":[\"id\",\"material\",\"material_sha256\",\"evaluations\",\"material_syntheses\",\"dossier_rebases\"],\"required\":[\"id\"],\"types\":{\"id\":\"string\",\"material\":\"string\",\"material_sha256\":[\"string\",\"null\"]}}}},\"detour.create\":{\"handler\":\"detour_create\",\"cli_command\":\"detour-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"return stage is explicit\"]},\"detour.resolve\":{\"handler\":\"detour_resolve\",\"cli_command\":\"detour-resolve\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"returns to originating stage\"]},\"review.prepare\":{\"handler\":\"shelving_prepare\",\"cli_command\":\"shelving-prepare\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"preparation never applies proposed canonical changes\",\"external proposal items are bound to their exact bytes by SHA-256 before use\"]},\"review.apply\":{\"handler\":\"shelving_apply\",\"cli_command\":\"shelving-apply\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/notes/**\",\"knowledge/garden/**\",\"curriculum/modules/**/units/**\"],\"invariants\":[\"explicit approval\",\"selected proposal is atomic\"]},\"path.note.write\":{\"handler\":\"path_note\",\"cli_command\":\"path-note\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"workspace-owned scratch only\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"path.progress.update\":{\"handler\":\"path_progress\",\"cli_command\":\"path-progress\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active stage\"]},\"path.attachment.add\":{\"handler\":\"path_attach\",\"cli_command\":\"path-attach\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"coordination.section.revise\":{\"handler\":\"coordination_section_revise\",\"cli_command\":\"coordination-section-revise\",\"kind\":\"command\",\"writes\":[\"work/COORDINATION.md\"],\"invariants\":[\"one existing coordination section; frontmatter and other section content are preserved\",\"reviewed text is envelope-inline and bound to the exact previous file SHA-256, snapshot and coordination revision\",\"preflight exposes before and after text; blank replacements, ambiguous sections and new section headings refuse\",\"no academic administrative record or learner evidence is changed\"]},\"workspace.next-action.update\":{\"handler\":\"workspace_next_action\",\"cli_command\":\"workspace-next-action\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active workspace; archived or non-active workspaces refuse\",\"only the Next Action section content changes; section editing is fence-aware and frontmatter is preserved\",\"GatewayEnvelopeV2 carries the action text inline and never reads it from stdin\"]},\"project.create\":{\"handler\":\"project_create\",\"cli_command\":\"project-create\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"new id only\",\"project schema v1\",\"no module mutation\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}},\"project.update\":{\"handler\":\"project_update\",\"cli_command\":\"project-update\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"id and type remain stable\",\"revision guarded\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\",\"verbs\":[{\"verb\":\"ability-candidate-append\",\"operation\":\"ability.candidate.append\",\"capability\":\"ability.candidate.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"ability-context\",\"operation\":\"ability.context\",\"capability\":\"ability.context\",\"kind\":\"porcelain\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"ability-evidence\"]},{\"verb\":\"ability-observation-append\",\"operation\":\"learner.ability-observation.append\",\"capability\":\"learner.ability-observation.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"ai-action-append-slices\",\"operation\":\"ai-action.append-slices\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-apply-delivery\",\"operation\":\"ai-action.delivery.apply\",\"capability\":\"ai-action.delivery.apply\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"ai-action-import-delivery\",\"operation\":\"ai-action.delivery.import\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-list\",\"operation\":\"ai-action.list\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-prepare\",\"operation\":\"ai-action.prepare\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-status\",\"operation\":\"ai-action.status\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-validate-delivery\",\"operation\":\"ai-action.delivery.validate\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"atlas-context\",\"operation\":\"atlas.context\",\"capability\":\"atlas.context\",\"kind\":\"porcelain\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"atlas-question-save\",\"operation\":\"atlas.question.save\",\"capability\":\"atlas.question.save\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"backup-manifest\",\"operation\":\"backup.manifest\",\"capability\":\"backup.manifest\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"backup-verify\",\"operation\":\"backup.verify\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"bootstrap\",\"operation\":\"operator.bootstrap\",\"capability\":\"operator.bootstrap\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"open-work-or-priority-question\"]},{\"verb\":\"capabilities\",\"operation\":\"capabilities.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[\"create-or-revise-a-durable-note\",\"discover-capabilities\",\"log-a-line\",\"process-a-lecture\",\"record-stage-progress\",\"save-source-analyses\"]},{\"verb\":\"capability\",\"operation\":\"cli.capability\",\"capability\":null,\"kind\":\"command\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"capture\",\"operation\":\"capture.create\",\"capability\":\"capture.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"log-a-line\"]},{\"verb\":\"collection-create\",\"operation\":\"collection.create\",\"capability\":\"collection.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"collection-entry-revise\",\"operation\":\"collection.entry.revise\",\"capability\":\"collection.entry.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"concept-relations-change\",\"operation\":\"concept.relations.change\",\"capability\":\"concept.relations.change\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"coordination-section-revise\",\"operation\":\"coordination.section.revise\",\"capability\":\"coordination.section.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"detour-create\",\"operation\":\"detour.create\",\"capability\":\"detour.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"detour-resolve\",\"operation\":\"detour.resolve\",\"capability\":\"detour.resolve\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"dossier\",\"operation\":\"dossier.read\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"garden-seed-create\",\"operation\":\"garden.seed.create\",\"capability\":\"garden.seed.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"generate\",\"operation\":\"projection.generate\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"goal\",\"operation\":\"goal.decide\",\"capability\":\"goal.decision.record\",\"kind\":\"command\",\"surface\":\"internal\",\"writes\":true,\"tasks\":[]},{\"verb\":\"health-report\",\"operation\":\"health.report\",\"capability\":\"health.report\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"inbox-list\",\"operation\":\"inbox.list\",\"capability\":\"inbox.list\",\"kind\":\"tool\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"inbox-read\",\"operation\":\"inbox.content\",\"capability\":\"inbox.content\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"inbox-resolve\",\"operation\":\"inbox.resolve\",\"capability\":\"inbox.resolve\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"inspect\",\"operation\":\"project.inspect\",\"capability\":\"project.inspect\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"known-record-or-stage-note\",\"open-work-or-priority-question\"]},{\"verb\":\"intelligence-scan\",\"operation\":\"intelligence.scan\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[\"changes-awaiting-a-decision\"]},{\"verb\":\"legacy-archive-inspect\",\"operation\":\"legacy.archive.inspect\",\"capability\":\"legacy.archive.inspect\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"legacy-archive-lock-publish\",\"operation\":\"legacy.archive.lock.publish\",\"capability\":\"legacy.archive.lock.publish\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"legacy-archive-status\",\"operation\":\"legacy.archive.status\",\"capability\":\"legacy.archive.status\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"lineage-restamp\",\"operation\":\"lineage.restamp\",\"capability\":\"lineage.restamp\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"masters-planning-catalog-update\",\"operation\":\"masters-planning.catalog.update\",\"capability\":\"masters-planning.catalog.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"masters-planning-comparison-publish\",\"operation\":\"masters-planning.comparison.publish\",\"capability\":\"masters-planning.comparison.publish\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"masters-planning-dashboard\",\"operation\":\"masters-planning.dashboard\",\"capability\":\"masters-planning.dashboard\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"material-context\",\"operation\":\"material.context\",\"capability\":\"material.context\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"material-or-concept-explanation\"]},{\"verb\":\"material-span\",\"operation\":\"material.span\",\"capability\":\"material.span\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"material-or-concept-explanation\"]},{\"verb\":\"module-attempt\",\"operation\":\"module.attempt.record\",\"capability\":\"module.attempt.record\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"module-create\",\"operation\":\"module.create\",\"capability\":\"module.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"module-list\",\"operation\":\"module.list\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"module-materials-compact\",\"operation\":\"module.materials.compact\",\"capability\":\"module.materials.compact\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"module-plan-import\",\"operation\":\"module.plan.import\",\"capability\":\"module.plan.import\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"process-a-lecture\"]},{\"verb\":\"module-sitting\",\"operation\":\"module.sitting.update\",\"capability\":\"module.sitting.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"note-analysis-prepare\",\"operation\":\"note.analysis.prepare\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"note-analysis-save\",\"operation\":\"note.analysis.save\",\"capability\":\"note.analysis.save\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"note-analysis-save-batch\",\"operation\":\"note.analysis.save_batch\",\"capability\":\"note.analysis.save_batch\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"save-source-analyses\"]},{\"verb\":\"note-create\",\"operation\":\"note.create\",\"capability\":\"note.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"create-or-revise-a-durable-note\"]},{\"verb\":\"note-evidence\",\"operation\":\"note.evidence.add\",\"capability\":\"note.evidence.add\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"note-read\",\"operation\":\"note.content\",\"capability\":\"note.content\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"note-body-or-saved-reasoning\"]},{\"verb\":\"note-revise\",\"operation\":\"note.revise\",\"capability\":\"note.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"create-or-revise-a-durable-note\"]},{\"verb\":\"observation-append\",\"operation\":\"learner.observation.append\",\"capability\":\"learner.observation.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"observe\",\"operation\":\"learner.observe\",\"capability\":null,\"kind\":\"command\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"operations\",\"operation\":\"operations.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"path-attach\",\"operation\":\"path.attachment.add\",\"capability\":\"path.attachment.add\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"path-note\",\"operation\":\"path.note.write\",\"capability\":\"path.note.write\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"path-progress\",\"operation\":\"path.progress.update\",\"capability\":\"path.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"plan-edit-context\",\"operation\":\"plan.edit-context\",\"capability\":\"plan.edit-context\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"edit-a-known-material-route\",\"edit-a-known-stage\",\"process-a-lecture\",\"unit-coverage-and-unknown-ids\"]},{\"verb\":\"plan-template\",\"operation\":\"plan.template\",\"capability\":\"plan.template\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"program-list\",\"operation\":\"program.list\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"program-semester-update\",\"operation\":\"program.semester.update\",\"capability\":\"program.semester.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"project-create\",\"operation\":\"project.create\",\"capability\":\"project.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"project-list\",\"operation\":\"project.list\",\"capability\":\"project.list\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"project-update\",\"operation\":\"project.update\",\"capability\":\"project.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"projection-observe\",\"operation\":\"projection.observe\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"related\",\"operation\":\"related.read\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"resume\",\"operation\":\"resume.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[\"resume-recorded-study\"]},{\"verb\":\"route-patch\",\"operation\":\"route.patch\",\"capability\":\"route.patch\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"runtime-session\",\"operation\":\"runtime.session\",\"capability\":\"runtime.session\",\"kind\":\"porcelain\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"search\",\"operation\":\"note.search\",\"capability\":\"note.search\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"semantic\",\"operation\":\"semantic.query\",\"capability\":\"semantic.query\",\"kind\":\"tool\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"governance-question\"]},{\"verb\":\"session-end\",\"operation\":\"session.end\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"shelving-apply\",\"operation\":\"review.apply\",\"capability\":\"review.apply\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"shelving-prepare\",\"operation\":\"review.prepare\",\"capability\":\"review.prepare\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"source-feedback\",\"operation\":\"source.feedback.record\",\"capability\":\"source.feedback.record\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"source-intake\",\"operation\":\"source.intake.record\",\"capability\":\"source.intake.record\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"source-revise\",\"operation\":\"source.record.revise\",\"capability\":\"source.record.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"stage-attach\",\"operation\":\"stage.attachment.add\",\"capability\":\"stage.attachment.add\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"stage-note\",\"operation\":\"stage.note.write\",\"capability\":\"stage.note.write\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"log-a-line\"]},{\"verb\":\"stage-progress\",\"operation\":\"stage.progress.update\",\"capability\":\"stage.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"record-stage-progress\"]},{\"verb\":\"stage-result\",\"operation\":\"learner.stage-result.append\",\"capability\":\"learner.stage-result.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"status\",\"operation\":\"status.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"unit-list\",\"operation\":\"unit.list\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"unit-map-import\",\"operation\":\"unit.map.import\",\"capability\":\"unit.map.import\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-material-synthesis-publish\",\"operation\":\"unit.material-synthesis.publish\",\"capability\":\"unit.material-synthesis.publish\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-note\",\"operation\":\"unit.note.append\",\"capability\":\"unit.note.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-plan-revise\",\"operation\":\"unit.plan.revise\",\"capability\":\"unit.plan.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-source-selection\",\"operation\":\"unit.source-selection.set\",\"capability\":\"unit.source-selection.set\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"validate\",\"operation\":\"repository.validate\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"workspace-next-action\",\"operation\":\"workspace.next-action.update\",\"capability\":\"workspace.next-action.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]}],\"tasks\":[{\"id\":\"discover-capabilities\",\"task\":\"Discover capabilities\",\"entry_read\":\"`capabilities --compact --json`, then `capabilities NAME --json`\",\"procedures\":[\"system/procedures/start-here.md#discover-the-capability-index\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\"]},{\"id\":\"log-a-line\",\"task\":\"Log a line (`log:`)\",\"entry_read\":\"`capabilities capture.create --json`, or `capabilities stage.note.write --json` for an identified stage\",\"procedures\":[\"system/procedures/capture-routing.md#a-logged-line-for-an-identified-stage-is-one-stage-note-write\",\"system/procedures/capture-routing.md#a-logged-line-with-no-stage-is-one-inbox-capture\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#2-capture-temporary-material\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"record-stage-progress\",\"task\":\"Record stage progress or end a session\",\"entry_read\":\"`capabilities stage.progress.update --json`\",\"procedures\":[\"system/procedures/end-a-session.md#read-the-stage-progress-payload-contract\",\"system/procedures/end-a-session.md#step-3-review-the-session\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#22-end-a-session\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"create-or-revise-a-durable-note\",\"task\":\"Create or revise a durable note\",\"entry_read\":\"`capabilities note.create --json`, or `capabilities note.revise --json` for an existing note\",\"procedures\":[\"system/procedures/create-durable-note.md#search-for-an-existing-note-with-the-same-purpose\",\"system/procedures/create-durable-note.md#seal-the-creation-with-derived-guards\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#3-create-or-evolve-a-durable-note\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"save-source-analyses\",\"task\":\"Save source analyses\",\"entry_read\":\"`capabilities note.analysis.save_batch --json`\",\"procedures\":[\"system/procedures/save-a-batch-of-source-analyses.md#draft-the-first-batch-two-notes-one-drafts-file\",\"system/procedures/save-a-batch-of-source-analyses.md#prepare-the-first-batch\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25b-save-a-batch-of-source-analyses\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"edit-a-known-material-route\",\"task\":\"Edit a known material route\",\"entry_read\":\"`plan-edit-context UNIT_ID --route-id ROUTE_ID` or `--route-ids A B`\",\"procedures\":[\"system/procedures/revise-an-existing-plan.md#start-from-the-named-routes-edit-context\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25a-revise-an-existing-plan\",\"system/ARCHITECTURE.md#14a-module-first-curriculum-model\"]},{\"id\":\"edit-a-known-stage\",\"task\":\"Edit a known stage\",\"entry_read\":\"`plan-edit-context UNIT_ID --stage-id STAGE_ID`\",\"procedures\":[\"system/procedures/bootstrap-order.md#enter-through-the-named-stage\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25a-revise-an-existing-plan\",\"system/ARCHITECTURE.md#14a-module-first-curriculum-model\"]},{\"id\":\"unit-coverage-and-unknown-ids\",\"task\":\"Unit coverage, source completeness, or unknown IDs\",\"entry_read\":\"`plan-edit-context UNIT_ID --brief`\",\"procedures\":[\"system/procedures/start-here.md#follow-one-printed-expansion-with-its-snapshot-pin\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25a-revise-an-existing-plan\",\"system/WORKFLOWS.md#26-source-routing-and-feedback\"]},{\"id\":\"open-work-or-priority-question\",\"task\":\"Open work or priority question\",\"entry_read\":\"`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination\",\"procedures\":[\"system/procedures/retrieval-behavior.md#orient-operational-questions-from-the-brief\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\",\"system/CLAUDE.md\"]},{\"id\":\"known-record-or-stage-note\",\"task\":\"Known record or stage note\",\"entry_read\":\"`inspect ID`, including a batch of known IDs\",\"procedures\":[\"system/procedures/start-here.md#read-one-named-record\",\"system/procedures/start-here.md#read-one-named-stage-with-its-working-note-content\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\"]},{\"id\":\"note-body-or-saved-reasoning\",\"task\":\"Note body or saved reasoning\",\"entry_read\":\"`note-read NOTE_ID`\",\"procedures\":[\"system/procedures/start-here.md#search-beyond-note-summaries-then-read-the-saved-reasoning\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\"]},{\"id\":\"material-or-concept-explanation\",\"task\":\"Material or concept explanation\",\"entry_read\":\"`material-context`, then an exact `material-span` when needed\",\"procedures\":[\"system/procedures/retrieval-behavior.md#read-what-explains-it\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#26-source-routing-and-feedback\"]},{\"id\":\"resume-recorded-study\",\"task\":\"Resume recorded study\",\"entry_read\":\"`resume` or `resume --study`\",\"procedures\":[\"system/procedures/start-here.md#the-study-suggestion-never-moves-the-resume-pointer\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\",\"system/CLAUDE.md\"]},{\"id\":\"changes-awaiting-a-decision\",\"task\":\"Changes awaiting a decision\",\"entry_read\":\"`intelligence-scan --brief --json`\",\"procedures\":[\"system/procedures/start-here.md#read-what-wants-a-decision\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#30-review-exact-goal-decisions-together\"]},{\"id\":\"ability-evidence\",\"task\":\"Ability evidence\",\"entry_read\":\"`ability-context` horizon, then a known ability\",\"procedures\":[\"system/procedures/start-here.md#read-one-ability-through-the-bounded-horizon\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#8-record-evidence\"]},{\"id\":\"governance-question\",\"task\":\"Governance question\",\"entry_read\":\"`semantic --list`, then `semantic PREDICATE --input k=v`\",\"procedures\":[\"system/procedures/start-here.md#ask-a-governance-question-through-the-semantic-surface\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/SEMANTIC-CONTRACT.md\"]},{\"id\":\"process-a-lecture\",\"task\":\"Process a lecture (23)\",\"entry_read\":\"`capabilities module.plan.import --json`, then `plan-edit-context UNIT_ID --brief`\",\"procedures\":[\"system/procedures/process-a-lecture.md#materials-in-the-deck-lands-in-the-materials-tree\",\"system/procedures/process-a-lecture.md#package-and-preflight-the-lecture-unit\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#23-process-a-lecture\",\"system/WORKFLOWS.md#6-add-or-evaluate-a-source\"]},{\"id\":\"untranscribable-workflows\",\"task\":\"Turn the semester (24), promote a Master's module (27)\",\"entry_read\":\"none — stop and ask\",\"procedures\":[],\"procedure_text\":\"none: these two have no executable transcript, and the scope authority they need does not exist in a checkout (boundary 18)\",\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#24-turn-the-semester\",\"system/WORKFLOWS.md#27-promote-a-future-masters-module\"]}]}\n", + "stdout": "{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"ability.context\":{\"handler\":\"ability_context\",\"cli_command\":\"ability-context\",\"kind\":\"porcelain\",\"result\":\"ability-context-v1\",\"schema\":\"system/schema/ability-context.schema.json\",\"invariants\":[\"snapshot-bound bounded global horizon with focused expansion\",\"the horizon pages at one snapshot (--offset carries the previous snapshot); every ability appears exactly once across pages, page-local edges only, off-page incident counts per row\",\"a focused --brief carries state, totals, and bounded provenance pointers (correction/conflict previews at most 20 with exact totals) without raw observation bodies or stage material rows; the paged evidence section is the complete audit history\",\"--section evidence pages complete observations in ledger order at one snapshot\",\"candidate abilities and bridges never affect readiness or evidence transfer\",\"only reviewed equivalence with a current source digest can transfer confirmed evidence under stated conditions\",\"contradictory and corrected work remains inspectable; stage completion grants nothing\",\"ability rows carry reason_codes parallel to reasons; decisions consume the structured codes, never the display prose\"]},\"material.span\":{\"handler\":\"material_span\",\"cli_command\":\"material-span\",\"kind\":\"query\",\"result\":\"material-span-v1\",\"schema\":\"system/schema/material-span.schema.json\",\"invariants\":[\"one exact registered route yields common source identity, locator, type, availability, and observed digest\",\"local extraction is on demand and bounded; remote sources are never fetched implicitly\",\"unreadable or changed bytes remain explicit and no semantic judgment is inferred\"]},\"runtime.session\":{\"handler\":\"runtime_session\",\"result\":\"runtime-session-v1\",\"schema\":\"system/schema/runtime-session.schema.json\",\"invariants\":[\"read-only snapshot-bound proposal for one explicit requirement\",\"sticky repair requires an explicit material event and the previous runtime packet, bound to its snapshot\",\"target evidence and feasibility failures stay visible\"]},\"plan.edit-context\":{\"handler\":\"plan_edit_context\",\"result\":\"plan-edit-context\",\"invariants\":[\"one unit's compact authored plan or one exact route and its stage overrides\",\"snapshot-bound; shared descriptions occur once and expected revisions are explicit\",\"an ordered batch of 1 to 20 distinct routes of one unit shares the unit snapshot and revision guards, preserves request order, and refuses atomically without a partial payload\",\"the brief lists direct analysis refs plus a related count and expansion hint; same-source-only refs list only via --include-related\",\"the brief reports a neighboring-unit source-reuse count with an explicit expansion; the full neighbor map lists only via --include-neighbors\"]},\"atlas.context\":{\"handler\":\"atlas_context\",\"result\":\"atlas-context\"},\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]},\"semantic.query\":{\"handler\":\"semantic\",\"result\":\"semantic-query\",\"invariants\":[\"one registered predicate evaluates against explicit --input k=v bindings; --list names the registry and --recipe shows the worked procedure for one class\",\"an unknown predicate names the registry instead of failing without a way forward\"]},\"note.content\":{\"handler\":\"note_read\",\"result\":\"note-content\",\"invariants\":[\"reads registered durable notes and garden seeds by stable id, without following symlinks\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.content\":{\"handler\":\"inbox_read\",\"result\":\"inbox-content\",\"invariants\":[\"reads one work/inbox file by inbox-relative name, without following symlinks\",\"non-UTF-8 drops refuse with no text read; dot-files read by exact name only\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.list\":{\"handler\":\"inbox_list\",\"result\":\"inbox-list\",\"invariants\":[\"lists work/inbox files by inbox-relative name, without reading bytes\",\"dot-files excluded; a missing inbox is empty\",\"each row reports its own age in days (age_days)\"]},\"note.search\":{\"handler\":\"search\",\"result\":\"note-content-search\",\"invariants\":[\"content mode searches complete registered durable notes and returns bounded line snippets\",\"content mode requires a nonempty query; empty-query listing is the CLI metadata search, not this capability\"]},\"material.context\":{\"handler\":\"material_context\",\"cli_command\":\"material-context\",\"kind\":\"query\",\"result\":\"material-context\",\"invariants\":[\"read-only; touches no repository file\",\"searches durable analysis notes plus the route assessments of approved unit syntheses\",\"deterministic lexical AND matching over explanation text (note title plus body); provenance frontmatter never matches; concept filter resolves declared ids and aliases; purpose, unit, and exact material narrow\",\"ranked by recorded stage use-evidence per source (positive feedback first, mismatch feedback last); ties keep stable order (notes by id, then assessments by unit and route); --include-related appends related notes under the same ranking\",\"use evidence is canonical study-map data under the snapshot guard; skipped is reported, never ranking\",\"unit-scoped analysis notes follow current source-map routes, independently of synthesis approval; direct notes share a routed file (and overlap its single stated page range when it states one); same-source-only notes are related, listed only via --include-related\",\"excerpts are bounded (8 note snippets — a title label or true file line numbers — 3 assessment fields); default 5 items, at most 20\",\"analysis-note anchors preview at most 8 per note with exact totals and clipping flags (purpose matches first); the complete index lists only via --include-anchors\",\"source freshness is observed live per result; review state and resolution are reported, never inferred\",\"empty results describe the searched records only, never the absence of an explanation\",\"continuation requires the snapshot and observations_sha256 guards; changed canonical data, observed material bytes, or normalized filters refuse mixed pages, even when an assessment remains stale\"]},\"plan.template\":{\"handler\":\"plan_template\",\"result\":\"plan-template-v1\",\"schema\":\"system/schema/plan-template.schema.json\",\"invariants\":[\"read-only; generates a record and touches no repository file\",\"always the current plan-template version, never a copy of an existing plan\",\"the generated record is validated against its own domain schema before it is answered\",\"curriculum requires unit_id and module_id\"]},\"project.list\":{\"handler\":\"project_list\",\"result\":\"project-list\"},\"project.inspect\":{\"handler\":\"inspect\",\"result\":\"record\"},\"health.report\":{\"handler\":\"health_report\",\"result\":\"health-report-v1\",\"schema\":\"system/schema/health-report.schema.json\",\"invariants\":[\"read-only and on demand; no watcher or daemon\",\"reports owner and remedy for every check\"]},\"backup.manifest\":{\"handler\":\"backup_manifest\",\"result\":\"backup-manifest-v1\",\"schema\":\"system/schema/backup-manifest.schema.json\",\"invariants\":[\"hashes only producer-declared allowlisted roots\",\"never follows symlinks or includes sibling directories implicitly\",\"read-only and does not configure Time Machine\"]},\"legacy.archive.inspect\":{\"handler\":\"legacy_archive_inspect\",\"result\":\"legacy-archive-lock-v1\",\"schema\":\"system/schema/legacy-archive-lock.schema.json\",\"invariants\":[\"reads only exact reviewed safe paths; there is no recursive discovery\",\"boundary-sensitive items are represented only by an aggregate count\",\"read-only and deliberately invoked\"]},\"legacy.archive.status\":{\"handler\":\"legacy_archive_status\",\"result\":\"legacy-archive-status-v1\",\"schema\":\"system/schema/legacy-archive-status.schema.json\",\"invariants\":[\"reads the last approved lock without rescanning Legacy\",\"absent from normal manifest and search\"]},\"masters-planning.dashboard\":{\"handler\":\"masters_planning_dashboard\",\"result\":\"masters-planning-dashboard-v1\",\"schema\":\"system/schema/masters-planning-dashboard.schema.json\",\"invariants\":[\"requires an explicit planning access gesture\",\"reads only the sanitized catalog and approved comparisons\",\"absent from normal manifest, search, workload, deadlines, recommendations, and ordinary AI\"]}},\"commands\":{\"ability.candidate.append\":{\"handler\":\"ability_candidate_append\",\"cli_command\":\"ability-candidate-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/ability-candidates.jsonl\"],\"invariants\":[\"appends a provenance-linked tentative connection between known abilities\",\"never changes a reviewed bridge or contributes to readiness or evidence transfer\",\"snapshot and candidate-ledger revision are guarded by a V2 receipt\"]},\"learner.ability-observation.append\":{\"handler\":\"ability_observation_append\",\"cli_command\":\"ability-observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"work/active/*/ability-observations.jsonl\"],\"invariants\":[\"appends only a learner-confirmed precise claim linked to actual work and a confirmation pointer\",\"ability identity must be active and reviewed; evidence binds to its claim, conditions, and criteria hash\",\"corrections preserve prior observations and conflicting work stays visible\",\"snapshot and workspace revision are guarded by a V2 receipt\"]},\"learner.observation.append\":{\"handler\":\"observation_append\",\"cli_command\":\"observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/active/*/observations.jsonl\"],\"invariants\":[\"append only to the registered active workspace's evidence ledger\",\"requirement resolves within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve historical evidence\",\"learner observations never update concept or source semantics\"]},\"learner.stage-result.append\":{\"handler\":\"stage_result\",\"cli_command\":\"stage-result\",\"kind\":\"command\",\"writes\":[\"work/active/*/stage-results.jsonl\"],\"invariants\":[\"append only to the registered active workspace's untargeted-result ledger\",\"unit and stage resolve to the unit's current study map within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve history\",\"untargeted rows never grant requirement, ability, or concept credit and are never retro-credited\"]},\"route.patch\":{\"handler\":\"route_patch\",\"cli_command\":\"route-patch\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/unit.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"one exact route in one owning unit; only declared descriptive material fields\",\"source selections and identical legacy mirrors synchronize; stage overrides are preserved\",\"snapshot and all affected logical revisions are guarded, including maps changed by inheritance\",\"full validation and the warning policy are enforced inside the receipt-producing transaction, on the staged state, refusing before anything commits\",\"changing a covered route's material identity or explicitly re-judging a stale or disputed claim uses shared evidence admission and the shared lineage file revision\"],\"payload_records\":{\"claim_evidence\":{\"description\":\"One reviewed covers claim for exactly the patched route; local readable material requires a matching excerpt at an explicit page or transcript window. Excerpts remain outside tracked output.\",\"accepted\":[\"claim_id\",\"evidence\",\"reads\"],\"required\":[\"claim_id\",\"evidence\"],\"types\":{\"claim_id\":\"string\",\"evidence\":\"array\",\"reads\":\"object\"},\"fields\":{\"evidence\":{\"type\":\"array\",\"min_items\":1,\"items\":{\"type\":\"object\",\"accepted\":[\"kind\",\"ref\",\"text\",\"page\",\"page_end\",\"window\",\"node\",\"note\"],\"required\":[\"kind\",\"ref\"],\"types\":{\"kind\":\"string\",\"ref\":\"string\",\"text\":\"string\",\"page\":\"integer\",\"page_end\":\"integer\",\"window\":\"string\",\"node\":\"string\",\"note\":\"string\"}}}}},\"changes\":{\"description\":\"A nonempty map of declared descriptive material fields to their new text; keys outside this list refuse, and empty text refuses.\",\"accepted\":[\"title\",\"locator\",\"angle\",\"angle_detail\",\"url\",\"vault_path\"],\"min_properties\":1,\"types\":{\"title\":\"string\",\"locator\":\"string\",\"angle\":\"string\",\"angle_detail\":\"string\",\"url\":\"string\",\"vault_path\":\"string\"}}}},\"module.materials.compact\":{\"handler\":\"module_materials_compact\",\"cli_command\":\"module-materials-compact\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\"],\"invariants\":[\"one module; exact route identity or unambiguous source/title/locator guards only\",\"identical fields become explicit references; every expanded study map is unchanged\",\"persisted route identities and compact maps commit together under the reviewed plan hash\",\"ambiguous or independent resources remain inline; no ordering, progress or teaching judgment changes\"]},\"concept.relations.change\":{\"handler\":\"concept_relations_change\",\"cli_command\":\"concept-relations-change\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/concept-relations.yaml\",\"knowledge/concept-relations/**\"],\"invariants\":[\"only explicitly supplied add, replace or remove operations; no inferred relations\",\"exact previous rows, snapshot and registry revision guard changes\",\"duplicates, unknown endpoints and prerequisite cycles fail atomically\"],\"payload_records\":{\"change\":{\"description\":\"Exactly one operations list of 1 to 50 explicit operations; each names its action and carries the exact old/new rows that action needs (add: new; replace: old and new; remove: old).\",\"accepted\":[\"operations\"],\"required\":[\"operations\"],\"fields\":{\"operations\":{\"type\":\"array\",\"min_items\":1,\"max_items\":50,\"items\":{\"accepted\":[\"action\",\"old\",\"new\"],\"required\":[\"action\"],\"types\":{\"action\":\"string\"}}}}}}},\"atlas.question.save\":{\"handler\":\"atlas_question_save\",\"cli_command\":\"atlas-question-save\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"learner wording and original target are preserved\",\"open and resolved describe a personal question, never mastery or task completion\"]},\"capture.create\":{\"handler\":\"capture\",\"cli_command\":\"capture\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/inbox/**\"],\"invariants\":[\"no automatic routing\",\"original input is preserved\",\"external file input is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 content is inline or hash-bound and never comes from stdin\"]},\"inbox.resolve\":{\"handler\":\"inbox_resolve\",\"cli_command\":\"inbox-resolve\",\"kind\":\"command\",\"writes\":[\"work/inbox/**\",\"archive/inbox/**\"],\"invariants\":[\"moves one named drop, or one file inside a drop folder, to archive/inbox/YYYY/ byte-identical\",\"the drop's SHA-256 must match the bytes read; a changed drop refuses\",\"routed_to names every destination that received the drop and is recorded on the receipt\",\"snapshot and touched-path revisions guarded; the archive never overwrites\"]},\"ai-action.delivery.apply\":{\"handler\":\"ai_action_apply_delivery\",\"cli_command\":\"ai-action-apply-delivery\",\"kind\":\"command\",\"writes\":[\"operations/ai-actions/requests/**\"],\"invariants\":[\"GatewayEnvelopeV2 with approved-delivery authority is required\",\"approval binds the imported delivery record and every referenced artifact by SHA-256\",\"canonical destinations retain their narrow domain-capability write authorities\",\"request completion and canonical writes commit atomically with one ReceiptV2\"],\"payload_records\":{\"artifact_sha256\":{\"description\":\"Free-form map of every artifact_ref to its exact SHA-256 digest.\",\"freeform\":true}}},\"garden.seed.create\":{\"handler\":\"garden_seed_create\",\"cli_command\":\"garden-seed-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/garden/**\"],\"invariants\":[\"no automatic classification or routing\",\"original seed text is preserved\",\"no AI is required\"]},\"module.attempt.record\":{\"handler\":\"module_attempt\",\"cli_command\":\"module-attempt\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; appends a new attempts row or updates the row for the same termin\",\"termin, date, result and optional grade/notes record Aram's stated exam fact; no plan contract or source map\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.sitting.update\":{\"handler\":\"module_sitting\",\"cli_command\":\"module-sitting\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; sets the examination sitting's withdrawal_deadline for one termin, nothing else\",\"the termin must already have a sitting; notes, attempts and every other sitting field are untouched\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.create\":{\"handler\":\"module_create\",\"cli_command\":\"module-create\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\"],\"invariants\":[\"creates one module record and its source map; it never edits an existing module\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the module's artifact revision is registered from birth\"]},\"collection.create\":{\"handler\":\"collection_create\",\"cli_command\":\"collection-create\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"creates one source collection file; it never edits an existing collection\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed file bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the collection's artifact revision is registered from birth\"]},\"program.semester.update\":{\"handler\":\"program_semester_update\",\"cli_command\":\"program-semester-update\",\"kind\":\"command\",\"writes\":[\"curriculum/programs/**\"],\"invariants\":[\"turns one semester-bound program's current semester; it never rolls the term forward on its own\",\"the reviewed package names the semester that becomes current; the previous one becomes previous, and no semester record is dropped\",\"only the program record is written — exam outcomes, registrations, learner state and study work are untouched\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"snapshot and program revision guarded, with one V2 receipt\"]},\"module.plan.import\":{\"handler\":\"module_plan_import\",\"cli_command\":\"module-plan-import\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/quarantine/masters-planning/catalog.yaml\",\"curriculum/quarantine/masters-planning/promotions/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one module\",\"preflight required\",\"external plan files are bound to their exact bytes by SHA-256 before use\",\"changed route-covers edges carry admitted evidence or refuse; admitted records persist atomically\"],\"payload_records\":{\"promotion\":{\"description\":\"Inline MasterPlanning promotion package; the accepted fields are the full promotion record governed by system/schema/master-planning-promotion.schema.json.\",\"record_schema\":\"system/schema/master-planning-promotion.schema.json\"}}},\"lineage.restamp\":{\"handler\":\"lineage_restamp\",\"cli_command\":\"lineage-restamp\",\"kind\":\"command\",\"writes\":[\"operations/transactions/lineage.yaml\"],\"invariants\":[\"only supported old-shape route-covers claims; withdrawn, contested and already-narrowed claims refuse\",\"every listed claim re-verified stampable against fresh analysis at apply; a claim whose route row or covered nodes differ from the judged state refuses, listed or not\",\"evidence, judge, admission, status and review state pass through untouched; the prior record rides as supersedes with restamped_by/restamped_on\",\"the approval binds the exact claim list by SHA-256 plus the snapshot and ledger guards\",\"the narrowed ledger commits atomically with one receipt\"]},\"note.analysis.save\":{\"handler\":\"note_analysis_save\",\"cli_command\":\"note-analysis-save\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical requests replay without a second note; id collision with different analysis refuses\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"analysis\":{\"description\":\"Accepted analysis input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"binding\"],\"required\":[\"id\",\"title\",\"path\",\"binding\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\"},\"fields\":{\"binding\":{\"type\":\"object\",\"description\":\"Provenance binding per the material_analysis record in system/schema/note.schema.json (frozen_input_sha256/bytes are derived by note-analysis-prepare, never drafted).\"}}}}},\"note.analysis.save_batch\":{\"handler\":\"note_analysis_save_batch\",\"cli_command\":\"note-analysis-save-batch\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"bounded to 1 to 20 notes per batch; every item carries an analysis record and a SHA-256-bound body file\",\"every item is validated before any note is written; one failure refuses the whole batch\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical notes replay without a second write; id collision with different analysis refuses the batch\",\"one transaction and one receipt cover the complete batch\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"]},\"note.revise\":{\"handler\":\"note_revise\",\"cli_command\":\"note-revise\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"id and role remain stable\",\"explicit approval\",\"external replacement files are bound to their exact bytes by SHA-256 before use\"]},\"note.evidence.add\":{\"handler\":\"note_evidence\",\"cli_command\":\"note-evidence\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"note body is never modified\",\"evidence is append-only\",\"existing entries are never rewritten or removed\"]},\"note.create\":{\"handler\":\"note_create\",\"cli_command\":\"note-create\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match the approved SHA-256\",\"filename is always the note id; id collision refuses and updates go through note.revise\",\"reference and question roles keep their dedicated capabilities and refuse here\",\"superseded notes must exist and are marked deprecated in the same transaction\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"note\":{\"description\":\"Accepted note input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"role\",\"concepts\",\"sources\",\"contexts\",\"supersedes\"],\"required\":[\"id\",\"title\",\"path\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\",\"role\":\"string\",\"concepts\":[\"array\",\"null\"],\"sources\":[\"array\",\"null\"],\"contexts\":[\"array\",\"null\"],\"supersedes\":[\"array\",\"null\"]}}}},\"unit.plan.revise\":{\"handler\":\"unit_plan_revise\",\"cli_command\":\"unit-plan-revise\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one existing unit\",\"compact patch names only what changes; unrelated routes are carried forward internally\",\"route add/update/remove operations use stable IDs and reject ambiguity\",\"when the unit already has a material-synthesis dossier, route additions, removals and evidential changes require a replacement dossier validated against staged state; without an existing dossier no replacement is required\",\"context-dependent changes require documented acknowledgments\",\"artifact IDs cover exactly the semantic owners the revision touches\",\"external revision files are bound to their exact bytes by SHA-256 before use\",\"one transaction and one receipt cover the complete revision\"],\"payload_records\":{\"record\":{\"description\":\"Compact revision naming only what changes: the v1 plan_contract coverage audit, route add/update/remove ops, the reviewed final study map, and an optional replacement dossier.\",\"accepted\":[\"unit_id\",\"plan_contract\",\"route_changes\",\"study_map\",\"material_synthesis\",\"claim_evidence\",\"acknowledgments\"],\"required\":[\"plan_contract\"],\"types\":{\"unit_id\":\"string\",\"plan_contract\":\"object\",\"route_changes\":[\"object\",\"null\"],\"study_map\":[\"object\",\"null\"],\"material_synthesis\":[\"object\",\"null\"],\"claim_evidence\":[\"array\",\"null\"],\"acknowledgments\":[\"array\",\"null\"]}}}},\"unit.map.import\":{\"handler\":\"unit_map_import\",\"cli_command\":\"unit-map-import\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"bounded to one unit\",\"external map files are bound to their exact bytes by SHA-256 before use\"]},\"unit.note.append\":{\"handler\":\"unit_note\",\"cli_command\":\"unit-note\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"session-level append\",\"failed save preserves caller draft\",\"every external attachment is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"unit.source-selection.set\":{\"handler\":\"unit_source_selection\",\"cli_command\":\"unit-source-selection\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**/unit.yaml\"],\"invariants\":[\"selection must match a rich route on the same unit\",\"complete material menu is unchanged\",\"a selection used by a study path cannot be removed implicitly\"]},\"unit.material-synthesis.publish\":{\"handler\":\"unit_material_synthesis_publish\",\"cli_command\":\"unit-material-synthesis-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"every current rich route is assessed exactly once\",\"current and prerequisite routes are deep-reviewed\",\"whole-dossier approval and revision guards are required\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full dossier record governed by system/schema/unit-material-synthesis.schema.json.\",\"record_schema\":\"system/schema/unit-material-synthesis.schema.json\"}}},\"legacy.archive.lock.publish\":{\"handler\":\"legacy_archive_lock_publish\",\"cli_command\":\"legacy-archive-lock-publish\",\"kind\":\"command\",\"writes\":[\"operations/legacy/archive-lock.yaml\"],\"invariants\":[\"reviewed allowlist-only evidence\",\"excluded boundary entries contain no paths or hashes\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full lock record governed by system/schema/legacy-archive-lock.schema.json.\",\"record_schema\":\"system/schema/legacy-archive-lock.schema.json\"}}},\"masters-planning.catalog.update\":{\"handler\":\"masters_planning_catalog_update\",\"cli_command\":\"masters-planning-catalog-update\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/catalog.yaml\"],\"invariants\":[\"academic-only sanitized input\",\"prospective ids never masquerade as canonical ids\",\"revision guarded and explicitly approved\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full catalog record governed by system/schema/master-planning-catalog.schema.json.\",\"record_schema\":\"system/schema/master-planning-catalog.schema.json\"}}},\"masters-planning.comparison.publish\":{\"handler\":\"masters_planning_comparison_publish\",\"cli_command\":\"masters-planning-comparison-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/comparisons/**\"],\"invariants\":[\"bounded to one selected candidate module\",\"all selected sources are assessed exactly once\",\"no scores, schedules, or time recommendations\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full comparison record governed by system/schema/candidate-source-comparison.schema.json.\",\"record_schema\":\"system/schema/candidate-source-comparison.schema.json\"}}},\"stage.note.write\":{\"handler\":\"stage_note\",\"cli_command\":\"stage-note\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/stages/**\"],\"invariants\":[\"one stage's working note; OPERATOR \\\"Capture routing\\\" uses it for log: captures\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]},\"stage.attachment.add\":{\"handler\":\"stage_attach\",\"cli_command\":\"stage-attach\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"source.feedback.record\":{\"handler\":\"source_feedback\",\"cli_command\":\"source-feedback\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"feedback is contextual\",\"source identity is unchanged\"]},\"source.intake.record\":{\"handler\":\"source_intake_record\",\"cli_command\":\"source-intake\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\"],\"invariants\":[\"creates a metadata-only source or corrects intake-owned fields of an existing one\",\"source identity is stable; evaluations, topics, material and every route, selection, note, feedback and observation are unchanged\",\"a check run returns the field-level diff; apply is bound to that diff's hash, the snapshot and each record's revision\",\"explicitly approved; one transaction and one receipt cover the batch\"],\"payload_records\":{\"record\":{\"description\":\"Batch of 1 to 20 intake rows; each row is a create or a correct carrying only its action's allowlisted fields, and the handler refuses a create-only field on a correct.\",\"accepted\":[\"records\"],\"required\":[\"records\"],\"fields\":{\"records\":{\"type\":\"array\",\"min_items\":1,\"max_items\":20,\"items\":{\"accepted\":[\"action\",\"id\",\"partition\",\"title\",\"type\",\"authors\",\"organization\",\"year\",\"url\",\"identifiers\",\"discovery\",\"thematic_group_ids\",\"remove_url\",\"remove_identifiers\"],\"required\":[\"action\",\"id\"],\"types\":{\"action\":\"string\",\"id\":\"string\",\"partition\":\"string\",\"type\":\"string\",\"title\":[\"string\",\"null\"],\"discovery\":[\"object\",\"null\"],\"thematic_group_ids\":[\"array\",\"null\"],\"remove_url\":[\"boolean\",\"null\"],\"remove_identifiers\":\"array\",\"identifiers\":[\"object\",\"null\"]}}}}}}},\"collection.entry.revise\":{\"handler\":\"collection_entry_revise\",\"cli_command\":\"collection-entry-revise\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"revises the why of one existing entry in one existing collection, addressed by filename stem and source id\",\"entry order, groups, sources and all other content are unchanged; empty, multi-line and no-op lines are refused\",\"a check run returns the old and proposed line; apply is bound to that diff's hash, the snapshot and the collection's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Revises one entry's why line, addressed by collection stem and source id; only why is written here.\",\"accepted\":[\"collection\",\"source\",\"why\"],\"required\":[\"collection\",\"source\",\"why\"],\"types\":{\"collection\":\"string\",\"source\":\"string\",\"why\":\"string\"}}}},\"source.record.revise\":{\"handler\":\"source_record_revise\",\"cli_command\":\"source-revise\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"attaches verified local material to one existing source, with an optional explicit evaluation replacement\",\"source identity and intake-owned fields are stable; topics, routes, selections, notes, feedback and observations are unchanged\",\"live bytes must match both the request hash and the materials manifest; the URI authority must be the source id and resolve through the runtime root; a held different material is never silently replaced\",\"when the attach moves an approved dossier's material basis, a reviewed replacement validated against the staged state ships in the same transaction; affected units join the diff and the revision guards\",\"replacement and rebased dossiers carry prospective freshness lineage bound to their new bytes and staged basis in the same transaction; existing lineage is retained as superseded provenance\",\"a reviewed rebase shortcut exists only when every moved route is screened, evidence-free, analysis-free and outside every comparison, and only material_checksums moves; it replays basis plus new provenance without echoing unchanged assessments, and every other case keeps the full replacement\",\"a check run returns the field-level diff with referring routes, bound dossiers, affected units and referring collection entries; apply is bound to that diff's hash, the snapshot and each touched record's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Attaches verified local material and/or replaces evaluations; identity and every intake-owned field stay with source.intake.record.\",\"accepted\":[\"id\",\"material\",\"material_sha256\",\"evaluations\",\"material_syntheses\",\"dossier_rebases\"],\"required\":[\"id\"],\"types\":{\"id\":\"string\",\"material\":\"string\",\"material_sha256\":[\"string\",\"null\"]}}}},\"detour.create\":{\"handler\":\"detour_create\",\"cli_command\":\"detour-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"return stage is explicit\"]},\"detour.resolve\":{\"handler\":\"detour_resolve\",\"cli_command\":\"detour-resolve\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"returns to originating stage\"]},\"review.prepare\":{\"handler\":\"shelving_prepare\",\"cli_command\":\"shelving-prepare\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"preparation never applies proposed canonical changes\",\"external proposal items are bound to their exact bytes by SHA-256 before use\"]},\"review.apply\":{\"handler\":\"shelving_apply\",\"cli_command\":\"shelving-apply\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/notes/**\",\"knowledge/garden/**\",\"curriculum/modules/**/units/**\"],\"invariants\":[\"explicit approval\",\"selected proposal is atomic\"]},\"path.note.write\":{\"handler\":\"path_note\",\"cli_command\":\"path-note\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"workspace-owned scratch only\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"path.progress.update\":{\"handler\":\"path_progress\",\"cli_command\":\"path-progress\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active stage\"]},\"path.attachment.add\":{\"handler\":\"path_attach\",\"cli_command\":\"path-attach\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"coordination.section.revise\":{\"handler\":\"coordination_section_revise\",\"cli_command\":\"coordination-section-revise\",\"kind\":\"command\",\"writes\":[\"work/COORDINATION.md\"],\"invariants\":[\"one existing coordination section; frontmatter and other section content are preserved\",\"reviewed text is envelope-inline and bound to the exact previous file SHA-256, snapshot and coordination revision\",\"preflight exposes before and after text; blank replacements, ambiguous sections and new section headings refuse\",\"no academic administrative record or learner evidence is changed\"]},\"workspace.next-action.update\":{\"handler\":\"workspace_next_action\",\"cli_command\":\"workspace-next-action\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active workspace; archived or non-active workspaces refuse\",\"only the Next Action section content changes; section editing is fence-aware and frontmatter is preserved\",\"GatewayEnvelopeV2 carries the action text inline and never reads it from stdin\"]},\"project.create\":{\"handler\":\"project_create\",\"cli_command\":\"project-create\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"new id only\",\"project schema v1\",\"no module mutation\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}},\"project.update\":{\"handler\":\"project_update\",\"cli_command\":\"project-update\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"id and type remain stable\",\"revision guarded\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\",\"verbs\":[{\"verb\":\"ability-candidate-append\",\"operation\":\"ability.candidate.append\",\"capability\":\"ability.candidate.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"ability-context\",\"operation\":\"ability.context\",\"capability\":\"ability.context\",\"kind\":\"porcelain\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"ability-evidence\"]},{\"verb\":\"ability-observation-append\",\"operation\":\"learner.ability-observation.append\",\"capability\":\"learner.ability-observation.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"ai-action-append-slices\",\"operation\":\"ai-action.append-slices\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-apply-delivery\",\"operation\":\"ai-action.delivery.apply\",\"capability\":\"ai-action.delivery.apply\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"ai-action-import-delivery\",\"operation\":\"ai-action.delivery.import\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-list\",\"operation\":\"ai-action.list\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-prepare\",\"operation\":\"ai-action.prepare\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-status\",\"operation\":\"ai-action.status\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"ai-action-validate-delivery\",\"operation\":\"ai-action.delivery.validate\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"atlas-context\",\"operation\":\"atlas.context\",\"capability\":\"atlas.context\",\"kind\":\"porcelain\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"atlas-question-save\",\"operation\":\"atlas.question.save\",\"capability\":\"atlas.question.save\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"backup-manifest\",\"operation\":\"backup.manifest\",\"capability\":\"backup.manifest\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"backup-verify\",\"operation\":\"backup.verify\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"bootstrap\",\"operation\":\"operator.bootstrap\",\"capability\":\"operator.bootstrap\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"open-work-or-priority-question\"]},{\"verb\":\"capabilities\",\"operation\":\"capabilities.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[\"create-or-revise-a-durable-note\",\"discover-capabilities\",\"log-a-line\",\"process-a-lecture\",\"record-stage-progress\",\"save-source-analyses\"]},{\"verb\":\"capability\",\"operation\":\"cli.capability\",\"capability\":null,\"kind\":\"command\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"capture\",\"operation\":\"capture.create\",\"capability\":\"capture.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"log-a-line\"]},{\"verb\":\"collection-create\",\"operation\":\"collection.create\",\"capability\":\"collection.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"collection-entry-revise\",\"operation\":\"collection.entry.revise\",\"capability\":\"collection.entry.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"concept-relations-change\",\"operation\":\"concept.relations.change\",\"capability\":\"concept.relations.change\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"coordination-section-revise\",\"operation\":\"coordination.section.revise\",\"capability\":\"coordination.section.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"detour-create\",\"operation\":\"detour.create\",\"capability\":\"detour.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"detour-resolve\",\"operation\":\"detour.resolve\",\"capability\":\"detour.resolve\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"dossier\",\"operation\":\"dossier.read\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"garden-seed-create\",\"operation\":\"garden.seed.create\",\"capability\":\"garden.seed.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"generate\",\"operation\":\"projection.generate\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"goal\",\"operation\":\"goal.decide\",\"capability\":\"goal.decision.record\",\"kind\":\"command\",\"surface\":\"internal\",\"writes\":true,\"tasks\":[]},{\"verb\":\"health-report\",\"operation\":\"health.report\",\"capability\":\"health.report\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"inbox-list\",\"operation\":\"inbox.list\",\"capability\":\"inbox.list\",\"kind\":\"tool\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"inbox-read\",\"operation\":\"inbox.content\",\"capability\":\"inbox.content\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"inbox-resolve\",\"operation\":\"inbox.resolve\",\"capability\":\"inbox.resolve\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"inspect\",\"operation\":\"project.inspect\",\"capability\":\"project.inspect\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"known-record-or-stage-note\",\"open-work-or-priority-question\"]},{\"verb\":\"intelligence-scan\",\"operation\":\"intelligence.scan\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[\"changes-awaiting-a-decision\"]},{\"verb\":\"legacy-archive-inspect\",\"operation\":\"legacy.archive.inspect\",\"capability\":\"legacy.archive.inspect\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"legacy-archive-lock-publish\",\"operation\":\"legacy.archive.lock.publish\",\"capability\":\"legacy.archive.lock.publish\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"legacy-archive-status\",\"operation\":\"legacy.archive.status\",\"capability\":\"legacy.archive.status\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"lineage-restamp\",\"operation\":\"lineage.restamp\",\"capability\":\"lineage.restamp\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"masters-planning-catalog-update\",\"operation\":\"masters-planning.catalog.update\",\"capability\":\"masters-planning.catalog.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"masters-planning-comparison-publish\",\"operation\":\"masters-planning.comparison.publish\",\"capability\":\"masters-planning.comparison.publish\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"masters-planning-dashboard\",\"operation\":\"masters-planning.dashboard\",\"capability\":\"masters-planning.dashboard\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"material-context\",\"operation\":\"material.context\",\"capability\":\"material.context\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"material-or-concept-explanation\"]},{\"verb\":\"material-span\",\"operation\":\"material.span\",\"capability\":\"material.span\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"material-or-concept-explanation\"]},{\"verb\":\"module-attempt\",\"operation\":\"module.attempt.record\",\"capability\":\"module.attempt.record\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"module-create\",\"operation\":\"module.create\",\"capability\":\"module.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"module-list\",\"operation\":\"module.list\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"module-materials-compact\",\"operation\":\"module.materials.compact\",\"capability\":\"module.materials.compact\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"module-plan-import\",\"operation\":\"module.plan.import\",\"capability\":\"module.plan.import\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"process-a-lecture\"]},{\"verb\":\"module-sitting\",\"operation\":\"module.sitting.update\",\"capability\":\"module.sitting.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"note-analysis-prepare\",\"operation\":\"note.analysis.prepare\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"note-analysis-save\",\"operation\":\"note.analysis.save\",\"capability\":\"note.analysis.save\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"note-analysis-save-batch\",\"operation\":\"note.analysis.save_batch\",\"capability\":\"note.analysis.save_batch\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"save-source-analyses\"]},{\"verb\":\"note-create\",\"operation\":\"note.create\",\"capability\":\"note.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"create-or-revise-a-durable-note\"]},{\"verb\":\"note-evidence\",\"operation\":\"note.evidence.add\",\"capability\":\"note.evidence.add\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"note-read\",\"operation\":\"note.content\",\"capability\":\"note.content\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"note-body-or-saved-reasoning\"]},{\"verb\":\"note-revise\",\"operation\":\"note.revise\",\"capability\":\"note.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"create-or-revise-a-durable-note\"]},{\"verb\":\"observation-append\",\"operation\":\"learner.observation.append\",\"capability\":\"learner.observation.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"observe\",\"operation\":\"learner.observe\",\"capability\":null,\"kind\":\"command\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"operations\",\"operation\":\"operations.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"path-attach\",\"operation\":\"path.attachment.add\",\"capability\":\"path.attachment.add\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"path-note\",\"operation\":\"path.note.write\",\"capability\":\"path.note.write\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"path-progress\",\"operation\":\"path.progress.update\",\"capability\":\"path.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"plan-edit-context\",\"operation\":\"plan.edit-context\",\"capability\":\"plan.edit-context\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"edit-a-known-material-route\",\"edit-a-known-stage\",\"process-a-lecture\",\"unit-coverage-and-unknown-ids\"]},{\"verb\":\"plan-template\",\"operation\":\"plan.template\",\"capability\":\"plan.template\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"program-list\",\"operation\":\"program.list\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"program-semester-update\",\"operation\":\"program.semester.update\",\"capability\":\"program.semester.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"project-create\",\"operation\":\"project.create\",\"capability\":\"project.create\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"project-list\",\"operation\":\"project.list\",\"capability\":\"project.list\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"project-update\",\"operation\":\"project.update\",\"capability\":\"project.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"projection-observe\",\"operation\":\"projection.observe\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"related\",\"operation\":\"related.read\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"resume\",\"operation\":\"resume.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[\"resume-recorded-study\"]},{\"verb\":\"route-patch\",\"operation\":\"route.patch\",\"capability\":\"route.patch\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"runtime-session\",\"operation\":\"runtime.session\",\"capability\":\"runtime.session\",\"kind\":\"porcelain\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"search\",\"operation\":\"note.search\",\"capability\":\"note.search\",\"kind\":\"query\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[]},{\"verb\":\"semantic\",\"operation\":\"semantic.query\",\"capability\":\"semantic.query\",\"kind\":\"tool\",\"surface\":\"catalog\",\"writes\":false,\"tasks\":[\"governance-question\"]},{\"verb\":\"session-end\",\"operation\":\"session.end\",\"capability\":null,\"kind\":\"porcelain\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"shelving-apply\",\"operation\":\"review.apply\",\"capability\":\"review.apply\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"shelving-prepare\",\"operation\":\"review.prepare\",\"capability\":\"review.prepare\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"source-feedback\",\"operation\":\"source.feedback.record\",\"capability\":\"source.feedback.record\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"source-intake\",\"operation\":\"source.intake.record\",\"capability\":\"source.intake.record\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"source-revise\",\"operation\":\"source.record.revise\",\"capability\":\"source.record.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"stage-attach\",\"operation\":\"stage.attachment.add\",\"capability\":\"stage.attachment.add\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"stage-note\",\"operation\":\"stage.note.write\",\"capability\":\"stage.note.write\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"log-a-line\"]},{\"verb\":\"stage-progress\",\"operation\":\"stage.progress.update\",\"capability\":\"stage.progress.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[\"record-stage-progress\"]},{\"verb\":\"stage-result\",\"operation\":\"learner.stage-result.append\",\"capability\":\"learner.stage-result.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"status\",\"operation\":\"status.read\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"unit-list\",\"operation\":\"unit.list\",\"capability\":null,\"kind\":\"query\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"unit-map-import\",\"operation\":\"unit.map.import\",\"capability\":\"unit.map.import\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-material-synthesis-publish\",\"operation\":\"unit.material-synthesis.publish\",\"capability\":\"unit.material-synthesis.publish\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-note\",\"operation\":\"unit.note.append\",\"capability\":\"unit.note.append\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-plan-revise\",\"operation\":\"unit.plan.revise\",\"capability\":\"unit.plan.revise\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"unit-source-selection\",\"operation\":\"unit.source-selection.set\",\"capability\":\"unit.source-selection.set\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]},{\"verb\":\"validate\",\"operation\":\"repository.validate\",\"capability\":null,\"kind\":\"tool\",\"surface\":\"cli-only\",\"writes\":null,\"tasks\":[]},{\"verb\":\"workspace-next-action\",\"operation\":\"workspace.next-action.update\",\"capability\":\"workspace.next-action.update\",\"kind\":\"command\",\"surface\":\"catalog\",\"writes\":true,\"tasks\":[]}],\"tasks\":[{\"id\":\"discover-capabilities\",\"task\":\"Discover capabilities\",\"entry_read\":\"`capabilities --compact --json`, then `capabilities NAME --json`\",\"entry_verb\":\"capabilities\",\"procedures\":[\"system/procedures/start-here.md#discover-the-capability-index\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\"]},{\"id\":\"log-a-line\",\"task\":\"Log a line (`log:`)\",\"entry_read\":\"`capabilities capture.create --json`, or `capabilities stage.note.write --json` for an identified stage\",\"entry_verb\":\"capture\",\"procedures\":[\"system/procedures/capture-routing.md#a-logged-line-for-an-identified-stage-is-one-stage-note-write\",\"system/procedures/capture-routing.md#a-logged-line-with-no-stage-is-one-inbox-capture\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#2-capture-temporary-material\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"record-stage-progress\",\"task\":\"Record stage progress or end a session\",\"entry_read\":\"`capabilities stage.progress.update --json`\",\"entry_verb\":\"stage-progress\",\"procedures\":[\"system/procedures/end-a-session.md#read-the-stage-progress-payload-contract\",\"system/procedures/end-a-session.md#step-3-review-the-session\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#22-end-a-session\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"create-or-revise-a-durable-note\",\"task\":\"Create or revise a durable note\",\"entry_read\":\"`capabilities note.create --json`, or `capabilities note.revise --json` for an existing note\",\"entry_verb\":\"note-create\",\"procedures\":[\"system/procedures/create-durable-note.md#search-for-an-existing-note-with-the-same-purpose\",\"system/procedures/create-durable-note.md#seal-the-creation-with-derived-guards\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#3-create-or-evolve-a-durable-note\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"save-source-analyses\",\"task\":\"Save source analyses\",\"entry_read\":\"`capabilities note.analysis.save_batch --json`\",\"entry_verb\":\"note-analysis-save-batch\",\"procedures\":[\"system/procedures/save-a-batch-of-source-analyses.md#draft-the-first-batch-two-notes-one-drafts-file\",\"system/procedures/save-a-batch-of-source-analyses.md#prepare-the-first-batch\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25b-save-a-batch-of-source-analyses\",\"system/WORKFLOWS.md#25c-build-a-write-envelope-gatewayenvelopev2\"]},{\"id\":\"edit-a-known-material-route\",\"task\":\"Edit a known material route\",\"entry_read\":\"`plan-edit-context UNIT_ID --route-id ROUTE_ID` or `--route-ids A B`\",\"entry_verb\":\"plan-edit-context\",\"procedures\":[\"system/procedures/revise-an-existing-plan.md#start-from-the-named-routes-edit-context\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25a-revise-an-existing-plan\",\"system/ARCHITECTURE.md#14a-module-first-curriculum-model\"]},{\"id\":\"edit-a-known-stage\",\"task\":\"Edit a known stage\",\"entry_read\":\"`plan-edit-context UNIT_ID --stage-id STAGE_ID`\",\"entry_verb\":\"plan-edit-context\",\"procedures\":[\"system/procedures/bootstrap-order.md#enter-through-the-named-stage\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25a-revise-an-existing-plan\",\"system/ARCHITECTURE.md#14a-module-first-curriculum-model\"]},{\"id\":\"unit-coverage-and-unknown-ids\",\"task\":\"Unit coverage, source completeness, or unknown IDs\",\"entry_read\":\"`plan-edit-context UNIT_ID --brief`\",\"entry_verb\":\"plan-edit-context\",\"procedures\":[\"system/procedures/start-here.md#follow-one-printed-expansion-with-its-snapshot-pin\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25a-revise-an-existing-plan\",\"system/WORKFLOWS.md#26-source-routing-and-feedback\"]},{\"id\":\"open-work-or-priority-question\",\"task\":\"Open work or priority question\",\"entry_read\":\"`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination\",\"entry_verb\":\"bootstrap\",\"procedures\":[\"system/procedures/retrieval-behavior.md#orient-operational-questions-from-the-brief\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\",\"system/CLAUDE.md\"]},{\"id\":\"known-record-or-stage-note\",\"task\":\"Known record or stage note\",\"entry_read\":\"`inspect ID`, including a batch of known IDs\",\"entry_verb\":\"inspect\",\"procedures\":[\"system/procedures/start-here.md#read-one-named-record\",\"system/procedures/start-here.md#read-one-named-stage-with-its-working-note-content\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\"]},{\"id\":\"note-body-or-saved-reasoning\",\"task\":\"Note body or saved reasoning\",\"entry_read\":\"`note-read NOTE_ID`\",\"entry_verb\":\"note-read\",\"procedures\":[\"system/procedures/start-here.md#search-beyond-note-summaries-then-read-the-saved-reasoning\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\"]},{\"id\":\"material-or-concept-explanation\",\"task\":\"Material or concept explanation\",\"entry_read\":\"`material-context`, then an exact `material-span` when needed\",\"entry_verb\":\"material-context\",\"procedures\":[\"system/procedures/retrieval-behavior.md#read-what-explains-it\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#26-source-routing-and-feedback\"]},{\"id\":\"resume-recorded-study\",\"task\":\"Resume recorded study\",\"entry_read\":\"`resume` or `resume --study`\",\"entry_verb\":\"resume\",\"procedures\":[\"system/procedures/start-here.md#the-study-suggestion-never-moves-the-resume-pointer\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#25-the-two-layer-operating-model-adr-006\",\"system/CLAUDE.md\"]},{\"id\":\"changes-awaiting-a-decision\",\"task\":\"Changes awaiting a decision\",\"entry_read\":\"`intelligence-scan --brief --json`\",\"entry_verb\":\"intelligence-scan\",\"procedures\":[\"system/procedures/start-here.md#read-what-wants-a-decision\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#30-review-exact-goal-decisions-together\"]},{\"id\":\"ability-evidence\",\"task\":\"Ability evidence\",\"entry_read\":\"`ability-context` horizon, then a known ability\",\"entry_verb\":\"ability-context\",\"procedures\":[\"system/procedures/start-here.md#read-one-ability-through-the-bounded-horizon\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#8-record-evidence\"]},{\"id\":\"governance-question\",\"task\":\"Governance question\",\"entry_read\":\"`semantic --list`, then `semantic PREDICATE --input k=v`\",\"entry_verb\":\"semantic\",\"procedures\":[\"system/procedures/start-here.md#ask-a-governance-question-through-the-semantic-surface\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/SEMANTIC-CONTRACT.md\"]},{\"id\":\"process-a-lecture\",\"task\":\"Process a lecture (23)\",\"entry_read\":\"`capabilities module.plan.import --json`, then `plan-edit-context UNIT_ID --brief`\",\"entry_verb\":\"module-plan-import\",\"procedures\":[\"system/procedures/process-a-lecture.md#materials-in-the-deck-lands-in-the-materials-tree\",\"system/procedures/process-a-lecture.md#package-and-preflight-the-lecture-unit\"],\"procedure_text\":null,\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#23-process-a-lecture\",\"system/WORKFLOWS.md#6-add-or-evaluate-a-source\"]},{\"id\":\"untranscribable-workflows\",\"task\":\"Turn the semester (24), promote a Master's module (27)\",\"entry_read\":\"none — stop and ask\",\"entry_verb\":null,\"procedures\":[],\"procedure_text\":\"none: these two have no executable transcript, and the scope authority they need does not exist in a checkout (boundary 18)\",\"scope\":[\"system/OPERATOR.md\",\"system/WORKFLOWS.md#24-turn-the-semester\",\"system/WORKFLOWS.md#27-promote-a-future-masters-module\"]}]}\n", "stdout_json": { "capability_contract_version": 2, "cli_protocol": 6, @@ -1362,6 +1362,7 @@ "tasks": [ { "entry_read": "`capabilities --compact --json`, then `capabilities NAME --json`", + "entry_verb": "capabilities", "id": "discover-capabilities", "procedure_text": null, "procedures": [ @@ -1374,6 +1375,7 @@ }, { "entry_read": "`capabilities capture.create --json`, or `capabilities stage.note.write --json` for an identified stage", + "entry_verb": "capture", "id": "log-a-line", "procedure_text": null, "procedures": [ @@ -1389,6 +1391,7 @@ }, { "entry_read": "`capabilities stage.progress.update --json`", + "entry_verb": "stage-progress", "id": "record-stage-progress", "procedure_text": null, "procedures": [ @@ -1404,6 +1407,7 @@ }, { "entry_read": "`capabilities note.create --json`, or `capabilities note.revise --json` for an existing note", + "entry_verb": "note-create", "id": "create-or-revise-a-durable-note", "procedure_text": null, "procedures": [ @@ -1419,6 +1423,7 @@ }, { "entry_read": "`capabilities note.analysis.save_batch --json`", + "entry_verb": "note-analysis-save-batch", "id": "save-source-analyses", "procedure_text": null, "procedures": [ @@ -1434,6 +1439,7 @@ }, { "entry_read": "`plan-edit-context UNIT_ID --route-id ROUTE_ID` or `--route-ids A B`", + "entry_verb": "plan-edit-context", "id": "edit-a-known-material-route", "procedure_text": null, "procedures": [ @@ -1448,6 +1454,7 @@ }, { "entry_read": "`plan-edit-context UNIT_ID --stage-id STAGE_ID`", + "entry_verb": "plan-edit-context", "id": "edit-a-known-stage", "procedure_text": null, "procedures": [ @@ -1462,6 +1469,7 @@ }, { "entry_read": "`plan-edit-context UNIT_ID --brief`", + "entry_verb": "plan-edit-context", "id": "unit-coverage-and-unknown-ids", "procedure_text": null, "procedures": [ @@ -1476,6 +1484,7 @@ }, { "entry_read": "`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination", + "entry_verb": "bootstrap", "id": "open-work-or-priority-question", "procedure_text": null, "procedures": [ @@ -1490,6 +1499,7 @@ }, { "entry_read": "`inspect ID`, including a batch of known IDs", + "entry_verb": "inspect", "id": "known-record-or-stage-note", "procedure_text": null, "procedures": [ @@ -1504,6 +1514,7 @@ }, { "entry_read": "`note-read NOTE_ID`", + "entry_verb": "note-read", "id": "note-body-or-saved-reasoning", "procedure_text": null, "procedures": [ @@ -1517,6 +1528,7 @@ }, { "entry_read": "`material-context`, then an exact `material-span` when needed", + "entry_verb": "material-context", "id": "material-or-concept-explanation", "procedure_text": null, "procedures": [ @@ -1530,6 +1542,7 @@ }, { "entry_read": "`resume` or `resume --study`", + "entry_verb": "resume", "id": "resume-recorded-study", "procedure_text": null, "procedures": [ @@ -1544,6 +1557,7 @@ }, { "entry_read": "`intelligence-scan --brief --json`", + "entry_verb": "intelligence-scan", "id": "changes-awaiting-a-decision", "procedure_text": null, "procedures": [ @@ -1557,6 +1571,7 @@ }, { "entry_read": "`ability-context` horizon, then a known ability", + "entry_verb": "ability-context", "id": "ability-evidence", "procedure_text": null, "procedures": [ @@ -1570,6 +1585,7 @@ }, { "entry_read": "`semantic --list`, then `semantic PREDICATE --input k=v`", + "entry_verb": "semantic", "id": "governance-question", "procedure_text": null, "procedures": [ @@ -1583,6 +1599,7 @@ }, { "entry_read": "`capabilities module.plan.import --json`, then `plan-edit-context UNIT_ID --brief`", + "entry_verb": "module-plan-import", "id": "process-a-lecture", "procedure_text": null, "procedures": [ @@ -1598,6 +1615,7 @@ }, { "entry_read": "none — stop and ask", + "entry_verb": null, "id": "untranscribable-workflows", "procedure_text": "none: these two have no executable transcript, and the scope authority they need does not exist in a checkout (boundary 18)", "procedures": [], diff --git a/tests/scenarios/recorded/health.report/cli-report-fresh.json b/tests/scenarios/recorded/health.report/cli-report-fresh.json index 3d951f22..4e8bfd40 100644 --- a/tests/scenarios/recorded/health.report/cli-report-fresh.json +++ b/tests/scenarios/recorded/health.report/cli-report-fresh.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 13 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v15 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", + "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 13 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v16 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", "stdout_json": { "checks": [ { @@ -55,7 +55,7 @@ "owner": "core-ui", "remedy": "Ship the producer schema and UI lock as one coordinated version.", "status": "ok", - "summary": "manifest contract v15 matches 28 top-level keys" + "summary": "manifest contract v16 matches 28 top-level keys" }, { "id": "schema-core-ui-lock", diff --git a/tests/scenarios/recorded/health.report/cli-report-stale-inbox.json b/tests/scenarios/recorded/health.report/cli-report-stale-inbox.json index 52cfe9c8..e605b82a 100644 --- a/tests/scenarios/recorded/health.report/cli-report-stale-inbox.json +++ b/tests/scenarios/recorded/health.report/cli-report-stale-inbox.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 14 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 30 days old (unrouted capture — the inbox should trend toward empty)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v15 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", + "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 14 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 30 days old (unrouted capture — the inbox should trend toward empty)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v16 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", "stdout_json": { "checks": [ { @@ -56,7 +56,7 @@ "owner": "core-ui", "remedy": "Ship the producer schema and UI lock as one coordinated version.", "status": "ok", - "summary": "manifest contract v15 matches 28 top-level keys" + "summary": "manifest contract v16 matches 28 top-level keys" }, { "id": "schema-core-ui-lock", diff --git a/tests/scenarios/recorded/health.report/cli-report-stale-neglect.json b/tests/scenarios/recorded/health.report/cli-report-stale-neglect.json index bf582db1..c794b9c1 100644 --- a/tests/scenarios/recorded/health.report/cli-report-stale-neglect.json +++ b/tests/scenarios/recorded/health.report/cli-report-stale-neglect.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-11-15T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 16 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 48 days old (unrouted capture — the inbox should trend toward empty)\",\"W WS-NEGLECT: workspace 'workspace-demo' untouched for 106 days (per Git)\",\"W WS-NEGLECT: workspace 'workspace-second' untouched for 106 days (per Git)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v15 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", + "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-11-15T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 16 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 48 days old (unrouted capture — the inbox should trend toward empty)\",\"W WS-NEGLECT: workspace 'workspace-demo' untouched for 106 days (per Git)\",\"W WS-NEGLECT: workspace 'workspace-second' untouched for 106 days (per Git)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v16 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", "stdout_json": { "checks": [ { @@ -58,7 +58,7 @@ "owner": "core-ui", "remedy": "Ship the producer schema and UI lock as one coordinated version.", "status": "ok", - "summary": "manifest contract v15 matches 28 top-level keys" + "summary": "manifest contract v16 matches 28 top-level keys" }, { "id": "schema-core-ui-lock", diff --git a/tests/scenarios/recorded/health.report/report-fresh.json b/tests/scenarios/recorded/health.report/report-fresh.json index 3d951f22..4e8bfd40 100644 --- a/tests/scenarios/recorded/health.report/report-fresh.json +++ b/tests/scenarios/recorded/health.report/report-fresh.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 13 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v15 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", + "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 13 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v16 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", "stdout_json": { "checks": [ { @@ -55,7 +55,7 @@ "owner": "core-ui", "remedy": "Ship the producer schema and UI lock as one coordinated version.", "status": "ok", - "summary": "manifest contract v15 matches 28 top-level keys" + "summary": "manifest contract v16 matches 28 top-level keys" }, { "id": "schema-core-ui-lock", diff --git a/tests/scenarios/recorded/health.report/report-stale-inbox.json b/tests/scenarios/recorded/health.report/report-stale-inbox.json index 52cfe9c8..e605b82a 100644 --- a/tests/scenarios/recorded/health.report/report-stale-inbox.json +++ b/tests/scenarios/recorded/health.report/report-stale-inbox.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 14 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 30 days old (unrouted capture — the inbox should trend toward empty)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v15 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", + "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-10-01T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 14 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 30 days old (unrouted capture — the inbox should trend toward empty)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v16 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", "stdout_json": { "checks": [ { @@ -56,7 +56,7 @@ "owner": "core-ui", "remedy": "Ship the producer schema and UI lock as one coordinated version.", "status": "ok", - "summary": "manifest contract v15 matches 28 top-level keys" + "summary": "manifest contract v16 matches 28 top-level keys" }, { "id": "schema-core-ui-lock", diff --git a/tests/scenarios/recorded/health.report/report-stale-neglect.json b/tests/scenarios/recorded/health.report/report-stale-neglect.json index bf582db1..c794b9c1 100644 --- a/tests/scenarios/recorded/health.report/report-stale-neglect.json +++ b/tests/scenarios/recorded/health.report/report-stale-neglect.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-11-15T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 16 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 48 days old (unrouted capture — the inbox should trend toward empty)\",\"W WS-NEGLECT: workspace 'workspace-demo' untouched for 106 days (per Git)\",\"W WS-NEGLECT: workspace 'workspace-second' untouched for 106 days (per Git)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v15 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", + "stdout": "{\"schema_version\":1,\"type\":\"health-report\",\"generated_at\":\"2026-11-15T07:00:00+00:00\",\"status\":\"attention-required\",\"checks\":[{\"id\":\"validation\",\"status\":\"warning\",\"summary\":\"Validation found 0 error(s) and 16 warning(s).\",\"owner\":\"core\",\"remedy\":\"Clear every error before a live canonical transaction. Warnings stay visible and never block; `.venv/bin/python tools/warning_baseline.py --check` is what refuses a NEW one.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W SELECTION-ROUTE-ID-MISSING: unit 'unit-demo-l02' has a readable pre-v13 source selection without route_id; exact route 'route-7d42915c4988c513e6caa207' is available [curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml]\",\"W RUNTIME-REVIEW-MISSING: stage stage-demo carries runtime semantics but no runtime_review attestation [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W URI-PROJECT: 'project://demo' does not resolve on disk [projects/registry/project-demo.yaml]\",\"W INBOX-STALE: inbox item 'note-drop.md' is 48 days old (unrouted capture — the inbox should trend toward empty)\",\"W WS-NEGLECT: workspace 'workspace-demo' untouched for 106 days (per Git)\",\"W WS-NEGLECT: workspace 'workspace-second' untouched for 106 days (per Git)\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l01' is a book whose locator names no page range ('lecture-01.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W LOCATOR-VAGUE: source 'source-demo-book' route to 'unit-demo-l02' is a book whose locator names no page range ('lecture-02.pdf') — give the chapter AND its PDF pages [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W STAGE-NODE-UNLINKED: study map 'study-map-demo-l01' stage 'stage-demo' carries no knowledge_node_id and its id matches no live node — name the node the stage teaches [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '§1' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at 'Appendix A' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo' teaches source-demo-book at '' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\",\"W RESOURCE-SCOPE-UNBOUND: study map 'study-map-demo-l01' stage 'stage-demo-pending' teaches source-demo-book at '§2' — the unit's source disposition is recorded, but no route for this unit matches this source and locator; bind the resource to a declared route or review the missing route [curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml]\"]}},{\"id\":\"route-integrity\",\"status\":\"warning\",\"summary\":\"Route validation found 0 error(s) and 3 warning(s).\",\"owner\":\"curriculum\",\"remedy\":\"Repair routes through the plan gateway — `los module-plan-import` (system/PLAN-CREATION-SOP.md). Never hand-edit a source map.\",\"details\":{\"errors\":[],\"warnings\":[\"W ROUTE-ID-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has no persisted route id; v13 projects 'route-7d42915c4988c513e6caa207' until migration [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l01' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\",\"W ROUTE-ANGLE-DETAIL-MISSING: source 'source-demo-book' route to 'unit-demo-l02' has a one-line angle but no `angle_detail` for the hover [curriculum/modules/module-demo/source-map.yaml]\"]}},{\"id\":\"manifest-contract\",\"status\":\"ok\",\"summary\":\"manifest contract v16 matches 28 top-level keys\",\"owner\":\"core-ui\",\"remedy\":\"Ship the producer schema and UI lock as one coordinated version.\"},{\"id\":\"schema-core-ui-lock\",\"status\":\"unknown\",\"summary\":\"The Obsidian UI manifest lock is unavailable from this Core checkout.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run its contract check.\"},{\"id\":\"ui-plugin-current\",\"status\":\"unknown\",\"summary\":\"The UI shipping manifest is unavailable: [Errno 2] No such file or directory: '/obsidian-ui/plugin-assets.json'.\",\"owner\":\"core-ui\",\"remedy\":\"Open the paired UI checkout and run `npm run build`.\"},{\"id\":\"projection-state\",\"status\":\"warning\",\"summary\":\"The generated manifest is missing.\",\"owner\":\"core\",\"remedy\":\"Regenerate projections after the next approved transaction.\"},{\"id\":\"capability-authority\",\"status\":\"ok\",\"summary\":\"Capability declarations and scopes load successfully.\",\"owner\":\"core\",\"remedy\":\"Keep every public write behind the declared scope matcher.\"},{\"id\":\"material-synthesis\",\"status\":\"ok\",\"summary\":\"0 current and 0 stale dossier(s).\",\"owner\":\"learner\",\"remedy\":\"Review and republish only the affected unit dossier.\",\"details\":{\"dossiers\":[]}},{\"id\":\"legacy-archive\",\"status\":\"unknown\",\"summary\":\"No reviewed Legacy archive lock is published.\",\"owner\":\"operator\",\"remedy\":\"Run the explicit allowlist inspection and approve its lock.\"},{\"id\":\"masters-isolation\",\"status\":\"ok\",\"summary\":\"Prospective candidates are isolated from the normal manifest.\",\"owner\":\"core\",\"remedy\":\"Keep all prospective records behind the explicit dashboard query.\",\"details\":{\"leaked_ids\":[]}},{\"id\":\"backup\",\"status\":\"warning\",\"summary\":\"No Time Machine destination is configured.\",\"owner\":\"operator\",\"remedy\":\"After selecting the external drive, configure encryption and complete a restore drill.\"}]}\n", "stdout_json": { "checks": [ { @@ -58,7 +58,7 @@ "owner": "core-ui", "remedy": "Ship the producer schema and UI lock as one coordinated version.", "status": "ok", - "summary": "manifest contract v15 matches 28 top-level keys" + "summary": "manifest contract v16 matches 28 top-level keys" }, { "id": "schema-core-ui-lock", diff --git a/tests/scenarios/recorded/lineage.restamp/check-all-cli.json b/tests/scenarios/recorded/lineage.restamp/check-all-cli.json index 20804dc3..effa60c0 100644 --- a/tests/scenarios/recorded/lineage.restamp/check-all-cli.json +++ b/tests/scenarios/recorded/lineage.restamp/check-all-cli.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"ok\":true,\"mode\":\"check\",\"capability\":\"lineage.restamp\",\"expected_snapshot\":\"\",\"claims\":{\"covers:route-b2f1f80014860a929a3af0bc\":{\"claim_id\":\"covers:route-b2f1f80014860a929a3af0bc\",\"verdict\":\"eligible\",\"reasons\":[],\"basis\":\"exact\",\"judgment_commit\":\"001177fc67a90948242c1ea970252862fe793333\",\"module_id\":\"module-demo\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"nodes\":[\"knowledge-demo-expectation\",\"knowledge-demo-outcomes\"],\"new_reads\":{\"route-content:route-b2f1f80014860a929a3af0bc\":\"sha256:28afdd9ac02bf323e243457332f678dd4054757e0388327c9c044feb301f43b3\",\"node-content:knowledge-demo-expectation\":\"sha256:1b3c2ba6f5c9cf1961dbc8b0ae7240b32f2cbe72a690b39ee35f69192be4013d\",\"node-content:knowledge-demo-outcomes\":\"sha256:474df21ce2189e4a94c4b6b6a26221fb99aaa91e773a3c65cf3bea55bbd38ad7\"},\"stampable\":\"exact\",\"bundled_rewriters\":[]}},\"already_stamped\":[],\"totals\":{\"eligible\":1,\"needs-rejudgment\":0,\"needs-review\":0}}\n", + "stdout": "{\"ok\":true,\"mode\":\"check\",\"capability\":\"lineage.restamp\",\"expected_snapshot\":\"\",\"claims\":{\"covers:route-b2f1f80014860a929a3af0bc\":{\"claim_id\":\"covers:route-b2f1f80014860a929a3af0bc\",\"verdict\":\"eligible\",\"reasons\":[],\"basis\":\"exact\",\"judgment_commit\":\"48d1ef477e94d707184f67e7ab24e23acd1ca28d\",\"module_id\":\"module-demo\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"nodes\":[\"knowledge-demo-expectation\",\"knowledge-demo-outcomes\"],\"new_reads\":{\"route-content:route-b2f1f80014860a929a3af0bc\":\"sha256:28afdd9ac02bf323e243457332f678dd4054757e0388327c9c044feb301f43b3\",\"node-content:knowledge-demo-expectation\":\"sha256:1b3c2ba6f5c9cf1961dbc8b0ae7240b32f2cbe72a690b39ee35f69192be4013d\",\"node-content:knowledge-demo-outcomes\":\"sha256:474df21ce2189e4a94c4b6b6a26221fb99aaa91e773a3c65cf3bea55bbd38ad7\"},\"stampable\":\"exact\",\"bundled_rewriters\":[]}},\"already_stamped\":[],\"totals\":{\"eligible\":1,\"needs-rejudgment\":0,\"needs-review\":0}}\n", "stdout_json": { "already_stamped": [], "capability": "lineage.restamp", @@ -16,7 +16,7 @@ "basis": "exact", "bundled_rewriters": [], "claim_id": "covers:route-b2f1f80014860a929a3af0bc", - "judgment_commit": "001177fc67a90948242c1ea970252862fe793333", + "judgment_commit": "48d1ef477e94d707184f67e7ab24e23acd1ca28d", "module_id": "module-demo", "new_reads": { "node-content:knowledge-demo-expectation": "sha256:1b3c2ba6f5c9cf1961dbc8b0ae7240b32f2cbe72a690b39ee35f69192be4013d", diff --git a/tests/scenarios/recorded/lineage.restamp/check-all.json b/tests/scenarios/recorded/lineage.restamp/check-all.json index aca4a458..409bb7b2 100644 --- a/tests/scenarios/recorded/lineage.restamp/check-all.json +++ b/tests/scenarios/recorded/lineage.restamp/check-all.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"schema_version\":2,\"request_id\":\"KEY1\",\"idempotency_key\":\"KEY2\",\"capability\":\"lineage.restamp\",\"ok\":true,\"replayed\":false,\"transaction_id\":null,\"receipt_path\":null,\"snapshot_after\":null,\"result\":{\"ok\":true,\"mode\":\"check\",\"capability\":\"lineage.restamp\",\"expected_snapshot\":\"\",\"claims\":{\"covers:route-b2f1f80014860a929a3af0bc\":{\"claim_id\":\"covers:route-b2f1f80014860a929a3af0bc\",\"verdict\":\"eligible\",\"reasons\":[],\"basis\":\"exact\",\"judgment_commit\":\"001177fc67a90948242c1ea970252862fe793333\",\"module_id\":\"module-demo\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"nodes\":[\"knowledge-demo-expectation\",\"knowledge-demo-outcomes\"],\"new_reads\":{\"route-content:route-b2f1f80014860a929a3af0bc\":\"sha256:28afdd9ac02bf323e243457332f678dd4054757e0388327c9c044feb301f43b3\",\"node-content:knowledge-demo-expectation\":\"sha256:1b3c2ba6f5c9cf1961dbc8b0ae7240b32f2cbe72a690b39ee35f69192be4013d\",\"node-content:knowledge-demo-outcomes\":\"sha256:474df21ce2189e4a94c4b6b6a26221fb99aaa91e773a3c65cf3bea55bbd38ad7\"},\"stampable\":\"exact\",\"bundled_rewriters\":[]}},\"already_stamped\":[],\"totals\":{\"eligible\":1,\"needs-rejudgment\":0,\"needs-review\":0}},\"error\":null}\n", + "stdout": "{\"schema_version\":2,\"request_id\":\"KEY1\",\"idempotency_key\":\"KEY2\",\"capability\":\"lineage.restamp\",\"ok\":true,\"replayed\":false,\"transaction_id\":null,\"receipt_path\":null,\"snapshot_after\":null,\"result\":{\"ok\":true,\"mode\":\"check\",\"capability\":\"lineage.restamp\",\"expected_snapshot\":\"\",\"claims\":{\"covers:route-b2f1f80014860a929a3af0bc\":{\"claim_id\":\"covers:route-b2f1f80014860a929a3af0bc\",\"verdict\":\"eligible\",\"reasons\":[],\"basis\":\"exact\",\"judgment_commit\":\"48d1ef477e94d707184f67e7ab24e23acd1ca28d\",\"module_id\":\"module-demo\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"nodes\":[\"knowledge-demo-expectation\",\"knowledge-demo-outcomes\"],\"new_reads\":{\"route-content:route-b2f1f80014860a929a3af0bc\":\"sha256:28afdd9ac02bf323e243457332f678dd4054757e0388327c9c044feb301f43b3\",\"node-content:knowledge-demo-expectation\":\"sha256:1b3c2ba6f5c9cf1961dbc8b0ae7240b32f2cbe72a690b39ee35f69192be4013d\",\"node-content:knowledge-demo-outcomes\":\"sha256:474df21ce2189e4a94c4b6b6a26221fb99aaa91e773a3c65cf3bea55bbd38ad7\"},\"stampable\":\"exact\",\"bundled_rewriters\":[]}},\"already_stamped\":[],\"totals\":{\"eligible\":1,\"needs-rejudgment\":0,\"needs-review\":0}},\"error\":null}\n", "stdout_json": { "capability": "lineage.restamp", "error": null, @@ -24,7 +24,7 @@ "basis": "exact", "bundled_rewriters": [], "claim_id": "covers:route-b2f1f80014860a929a3af0bc", - "judgment_commit": "001177fc67a90948242c1ea970252862fe793333", + "judgment_commit": "48d1ef477e94d707184f67e7ab24e23acd1ca28d", "module_id": "module-demo", "new_reads": { "node-content:knowledge-demo-expectation": "sha256:1b3c2ba6f5c9cf1961dbc8b0ae7240b32f2cbe72a690b39ee35f69192be4013d", diff --git a/tests/scenarios/recorded/operator.bootstrap/cli-full.json b/tests/scenarios/recorded/operator.bootstrap/cli-full.json index d8762171..cbffd88a 100644 --- a/tests/scenarios/recorded/operator.bootstrap/cli-full.json +++ b/tests/scenarios/recorded/operator.bootstrap/cli-full.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"capabilities\":{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"ability.context\":{\"handler\":\"ability_context\",\"cli_command\":\"ability-context\",\"kind\":\"porcelain\",\"result\":\"ability-context-v1\",\"schema\":\"system/schema/ability-context.schema.json\",\"invariants\":[\"snapshot-bound bounded global horizon with focused expansion\",\"the horizon pages at one snapshot (--offset carries the previous snapshot); every ability appears exactly once across pages, page-local edges only, off-page incident counts per row\",\"a focused --brief carries state, totals, and bounded provenance pointers (correction/conflict previews at most 20 with exact totals) without raw observation bodies or stage material rows; the paged evidence section is the complete audit history\",\"--section evidence pages complete observations in ledger order at one snapshot\",\"candidate abilities and bridges never affect readiness or evidence transfer\",\"only reviewed equivalence with a current source digest can transfer confirmed evidence under stated conditions\",\"contradictory and corrected work remains inspectable; stage completion grants nothing\",\"ability rows carry reason_codes parallel to reasons; decisions consume the structured codes, never the display prose\"]},\"material.span\":{\"handler\":\"material_span\",\"cli_command\":\"material-span\",\"kind\":\"query\",\"result\":\"material-span-v1\",\"schema\":\"system/schema/material-span.schema.json\",\"invariants\":[\"one exact registered route yields common source identity, locator, type, availability, and observed digest\",\"local extraction is on demand and bounded; remote sources are never fetched implicitly\",\"unreadable or changed bytes remain explicit and no semantic judgment is inferred\"]},\"runtime.session\":{\"handler\":\"runtime_session\",\"result\":\"runtime-session-v1\",\"schema\":\"system/schema/runtime-session.schema.json\",\"invariants\":[\"read-only snapshot-bound proposal for one explicit requirement\",\"sticky repair requires an explicit material event and the previous runtime packet, bound to its snapshot\",\"target evidence and feasibility failures stay visible\"]},\"plan.edit-context\":{\"handler\":\"plan_edit_context\",\"result\":\"plan-edit-context\",\"invariants\":[\"one unit's compact authored plan or one exact route and its stage overrides\",\"snapshot-bound; shared descriptions occur once and expected revisions are explicit\",\"an ordered batch of 1 to 20 distinct routes of one unit shares the unit snapshot and revision guards, preserves request order, and refuses atomically without a partial payload\",\"the brief lists direct analysis refs plus a related count and expansion hint; same-source-only refs list only via --include-related\",\"the brief reports a neighboring-unit source-reuse count with an explicit expansion; the full neighbor map lists only via --include-neighbors\"]},\"atlas.context\":{\"handler\":\"atlas_context\",\"result\":\"atlas-context\"},\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]},\"semantic.query\":{\"handler\":\"semantic\",\"result\":\"semantic-query\",\"invariants\":[\"one registered predicate evaluates against explicit --input k=v bindings; --list names the registry and --recipe shows the worked procedure for one class\",\"an unknown predicate names the registry instead of failing without a way forward\"]},\"note.content\":{\"handler\":\"note_read\",\"result\":\"note-content\",\"invariants\":[\"reads registered durable notes and garden seeds by stable id, without following symlinks\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.content\":{\"handler\":\"inbox_read\",\"result\":\"inbox-content\",\"invariants\":[\"reads one work/inbox file by inbox-relative name, without following symlinks\",\"non-UTF-8 drops refuse with no text read; dot-files read by exact name only\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.list\":{\"handler\":\"inbox_list\",\"result\":\"inbox-list\",\"invariants\":[\"lists work/inbox files by inbox-relative name, without reading bytes\",\"dot-files excluded; a missing inbox is empty\",\"each row reports its own age in days (age_days)\"]},\"note.search\":{\"handler\":\"search\",\"result\":\"note-content-search\",\"invariants\":[\"content mode searches complete registered durable notes and returns bounded line snippets\",\"content mode requires a nonempty query; empty-query listing is the CLI metadata search, not this capability\"]},\"material.context\":{\"handler\":\"material_context\",\"cli_command\":\"material-context\",\"kind\":\"query\",\"result\":\"material-context\",\"invariants\":[\"read-only; touches no repository file\",\"searches durable analysis notes plus the route assessments of approved unit syntheses\",\"deterministic lexical AND matching over explanation text (note title plus body); provenance frontmatter never matches; concept filter resolves declared ids and aliases; purpose, unit, and exact material narrow\",\"ranked by recorded stage use-evidence per source (positive feedback first, mismatch feedback last); ties keep stable order (notes by id, then assessments by unit and route); --include-related appends related notes under the same ranking\",\"use evidence is canonical study-map data under the snapshot guard; skipped is reported, never ranking\",\"unit-scoped analysis notes follow current source-map routes, independently of synthesis approval; direct notes share a routed file (and overlap its single stated page range when it states one); same-source-only notes are related, listed only via --include-related\",\"excerpts are bounded (8 note snippets — a title label or true file line numbers — 3 assessment fields); default 5 items, at most 20\",\"analysis-note anchors preview at most 8 per note with exact totals and clipping flags (purpose matches first); the complete index lists only via --include-anchors\",\"source freshness is observed live per result; review state and resolution are reported, never inferred\",\"empty results describe the searched records only, never the absence of an explanation\",\"continuation requires the snapshot and observations_sha256 guards; changed canonical data, observed material bytes, or normalized filters refuse mixed pages, even when an assessment remains stale\"]},\"plan.template\":{\"handler\":\"plan_template\",\"result\":\"plan-template-v1\",\"schema\":\"system/schema/plan-template.schema.json\",\"invariants\":[\"read-only; generates a record and touches no repository file\",\"always the current plan-template version, never a copy of an existing plan\",\"the generated record is validated against its own domain schema before it is answered\",\"curriculum requires unit_id and module_id\"]},\"project.list\":{\"handler\":\"project_list\",\"result\":\"project-list\"},\"project.inspect\":{\"handler\":\"inspect\",\"result\":\"record\"},\"health.report\":{\"handler\":\"health_report\",\"result\":\"health-report-v1\",\"schema\":\"system/schema/health-report.schema.json\",\"invariants\":[\"read-only and on demand; no watcher or daemon\",\"reports owner and remedy for every check\"]},\"backup.manifest\":{\"handler\":\"backup_manifest\",\"result\":\"backup-manifest-v1\",\"schema\":\"system/schema/backup-manifest.schema.json\",\"invariants\":[\"hashes only producer-declared allowlisted roots\",\"never follows symlinks or includes sibling directories implicitly\",\"read-only and does not configure Time Machine\"]},\"legacy.archive.inspect\":{\"handler\":\"legacy_archive_inspect\",\"result\":\"legacy-archive-lock-v1\",\"schema\":\"system/schema/legacy-archive-lock.schema.json\",\"invariants\":[\"reads only exact reviewed safe paths; there is no recursive discovery\",\"boundary-sensitive items are represented only by an aggregate count\",\"read-only and deliberately invoked\"]},\"legacy.archive.status\":{\"handler\":\"legacy_archive_status\",\"result\":\"legacy-archive-status-v1\",\"schema\":\"system/schema/legacy-archive-status.schema.json\",\"invariants\":[\"reads the last approved lock without rescanning Legacy\",\"absent from normal manifest and search\"]},\"masters-planning.dashboard\":{\"handler\":\"masters_planning_dashboard\",\"result\":\"masters-planning-dashboard-v1\",\"schema\":\"system/schema/masters-planning-dashboard.schema.json\",\"invariants\":[\"requires an explicit planning access gesture\",\"reads only the sanitized catalog and approved comparisons\",\"absent from normal manifest, search, workload, deadlines, recommendations, and ordinary AI\"]}},\"commands\":{\"ability.candidate.append\":{\"handler\":\"ability_candidate_append\",\"cli_command\":\"ability-candidate-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/ability-candidates.jsonl\"],\"invariants\":[\"appends a provenance-linked tentative connection between known abilities\",\"never changes a reviewed bridge or contributes to readiness or evidence transfer\",\"snapshot and candidate-ledger revision are guarded by a V2 receipt\"]},\"learner.ability-observation.append\":{\"handler\":\"ability_observation_append\",\"cli_command\":\"ability-observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"work/active/*/ability-observations.jsonl\"],\"invariants\":[\"appends only a learner-confirmed precise claim linked to actual work and a confirmation pointer\",\"ability identity must be active and reviewed; evidence binds to its claim, conditions, and criteria hash\",\"corrections preserve prior observations and conflicting work stays visible\",\"snapshot and workspace revision are guarded by a V2 receipt\"]},\"learner.observation.append\":{\"handler\":\"observation_append\",\"cli_command\":\"observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/active/*/observations.jsonl\"],\"invariants\":[\"append only to the registered active workspace's evidence ledger\",\"requirement resolves within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve historical evidence\",\"learner observations never update concept or source semantics\"]},\"learner.stage-result.append\":{\"handler\":\"stage_result\",\"cli_command\":\"stage-result\",\"kind\":\"command\",\"writes\":[\"work/active/*/stage-results.jsonl\"],\"invariants\":[\"append only to the registered active workspace's untargeted-result ledger\",\"unit and stage resolve to the unit's current study map within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve history\",\"untargeted rows never grant requirement, ability, or concept credit and are never retro-credited\"]},\"route.patch\":{\"handler\":\"route_patch\",\"cli_command\":\"route-patch\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/unit.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"one exact route in one owning unit; only declared descriptive material fields\",\"source selections and identical legacy mirrors synchronize; stage overrides are preserved\",\"snapshot and all affected logical revisions are guarded, including maps changed by inheritance\",\"full validation and the warning policy are enforced inside the receipt-producing transaction, on the staged state, refusing before anything commits\",\"changing a covered route's material identity or explicitly re-judging a stale or disputed claim uses shared evidence admission and the shared lineage file revision\"],\"payload_records\":{\"claim_evidence\":{\"description\":\"One reviewed covers claim for exactly the patched route; local readable material requires a matching excerpt at an explicit page or transcript window. Excerpts remain outside tracked output.\",\"accepted\":[\"claim_id\",\"evidence\",\"reads\"],\"required\":[\"claim_id\",\"evidence\"],\"types\":{\"claim_id\":\"string\",\"evidence\":\"array\",\"reads\":\"object\"},\"fields\":{\"evidence\":{\"type\":\"array\",\"min_items\":1,\"items\":{\"type\":\"object\",\"accepted\":[\"kind\",\"ref\",\"text\",\"page\",\"page_end\",\"window\",\"node\",\"note\"],\"required\":[\"kind\",\"ref\"],\"types\":{\"kind\":\"string\",\"ref\":\"string\",\"text\":\"string\",\"page\":\"integer\",\"page_end\":\"integer\",\"window\":\"string\",\"node\":\"string\",\"note\":\"string\"}}}}},\"changes\":{\"description\":\"A nonempty map of declared descriptive material fields to their new text; keys outside this list refuse, and empty text refuses.\",\"accepted\":[\"title\",\"locator\",\"angle\",\"angle_detail\",\"url\",\"vault_path\"],\"min_properties\":1,\"types\":{\"title\":\"string\",\"locator\":\"string\",\"angle\":\"string\",\"angle_detail\":\"string\",\"url\":\"string\",\"vault_path\":\"string\"}}}},\"module.materials.compact\":{\"handler\":\"module_materials_compact\",\"cli_command\":\"module-materials-compact\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\"],\"invariants\":[\"one module; exact route identity or unambiguous source/title/locator guards only\",\"identical fields become explicit references; every expanded study map is unchanged\",\"persisted route identities and compact maps commit together under the reviewed plan hash\",\"ambiguous or independent resources remain inline; no ordering, progress or teaching judgment changes\"]},\"concept.relations.change\":{\"handler\":\"concept_relations_change\",\"cli_command\":\"concept-relations-change\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/concept-relations.yaml\",\"knowledge/concept-relations/**\"],\"invariants\":[\"only explicitly supplied add, replace or remove operations; no inferred relations\",\"exact previous rows, snapshot and registry revision guard changes\",\"duplicates, unknown endpoints and prerequisite cycles fail atomically\"],\"payload_records\":{\"change\":{\"description\":\"Exactly one operations list of 1 to 50 explicit operations; each names its action and carries the exact old/new rows that action needs (add: new; replace: old and new; remove: old).\",\"accepted\":[\"operations\"],\"required\":[\"operations\"],\"fields\":{\"operations\":{\"type\":\"array\",\"min_items\":1,\"max_items\":50,\"items\":{\"accepted\":[\"action\",\"old\",\"new\"],\"required\":[\"action\"],\"types\":{\"action\":\"string\"}}}}}}},\"atlas.question.save\":{\"handler\":\"atlas_question_save\",\"cli_command\":\"atlas-question-save\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"learner wording and original target are preserved\",\"open and resolved describe a personal question, never mastery or task completion\"]},\"capture.create\":{\"handler\":\"capture\",\"cli_command\":\"capture\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/inbox/**\"],\"invariants\":[\"no automatic routing\",\"original input is preserved\",\"external file input is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 content is inline or hash-bound and never comes from stdin\"]},\"inbox.resolve\":{\"handler\":\"inbox_resolve\",\"cli_command\":\"inbox-resolve\",\"kind\":\"command\",\"writes\":[\"work/inbox/**\",\"archive/inbox/**\"],\"invariants\":[\"moves one named drop, or one file inside a drop folder, to archive/inbox/YYYY/ byte-identical\",\"the drop's SHA-256 must match the bytes read; a changed drop refuses\",\"routed_to names every destination that received the drop and is recorded on the receipt\",\"snapshot and touched-path revisions guarded; the archive never overwrites\"]},\"ai-action.delivery.apply\":{\"handler\":\"ai_action_apply_delivery\",\"cli_command\":\"ai-action-apply-delivery\",\"kind\":\"command\",\"writes\":[\"operations/ai-actions/requests/**\"],\"invariants\":[\"GatewayEnvelopeV2 with approved-delivery authority is required\",\"approval binds the imported delivery record and every referenced artifact by SHA-256\",\"canonical destinations retain their narrow domain-capability write authorities\",\"request completion and canonical writes commit atomically with one ReceiptV2\"],\"payload_records\":{\"artifact_sha256\":{\"description\":\"Free-form map of every artifact_ref to its exact SHA-256 digest.\",\"freeform\":true}}},\"garden.seed.create\":{\"handler\":\"garden_seed_create\",\"cli_command\":\"garden-seed-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/garden/**\"],\"invariants\":[\"no automatic classification or routing\",\"original seed text is preserved\",\"no AI is required\"]},\"module.attempt.record\":{\"handler\":\"module_attempt\",\"cli_command\":\"module-attempt\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; appends a new attempts row or updates the row for the same termin\",\"termin, date, result and optional grade/notes record Aram's stated exam fact; no plan contract or source map\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.sitting.update\":{\"handler\":\"module_sitting\",\"cli_command\":\"module-sitting\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; sets the examination sitting's withdrawal_deadline for one termin, nothing else\",\"the termin must already have a sitting; notes, attempts and every other sitting field are untouched\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.create\":{\"handler\":\"module_create\",\"cli_command\":\"module-create\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\"],\"invariants\":[\"creates one module record and its source map; it never edits an existing module\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the module's artifact revision is registered from birth\"]},\"collection.create\":{\"handler\":\"collection_create\",\"cli_command\":\"collection-create\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"creates one source collection file; it never edits an existing collection\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed file bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the collection's artifact revision is registered from birth\"]},\"program.semester.update\":{\"handler\":\"program_semester_update\",\"cli_command\":\"program-semester-update\",\"kind\":\"command\",\"writes\":[\"curriculum/programs/**\"],\"invariants\":[\"turns one semester-bound program's current semester; it never rolls the term forward on its own\",\"the reviewed package names the semester that becomes current; the previous one becomes previous, and no semester record is dropped\",\"only the program record is written — exam outcomes, registrations, learner state and study work are untouched\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"snapshot and program revision guarded, with one V2 receipt\"]},\"module.plan.import\":{\"handler\":\"module_plan_import\",\"cli_command\":\"module-plan-import\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/quarantine/masters-planning/catalog.yaml\",\"curriculum/quarantine/masters-planning/promotions/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one module\",\"preflight required\",\"external plan files are bound to their exact bytes by SHA-256 before use\",\"changed route-covers edges carry admitted evidence or refuse; admitted records persist atomically\"],\"payload_records\":{\"promotion\":{\"description\":\"Inline MasterPlanning promotion package; the accepted fields are the full promotion record governed by system/schema/master-planning-promotion.schema.json.\",\"record_schema\":\"system/schema/master-planning-promotion.schema.json\"}}},\"lineage.restamp\":{\"handler\":\"lineage_restamp\",\"cli_command\":\"lineage-restamp\",\"kind\":\"command\",\"writes\":[\"operations/transactions/lineage.yaml\"],\"invariants\":[\"only supported old-shape route-covers claims; withdrawn, contested and already-narrowed claims refuse\",\"every listed claim re-verified stampable against fresh analysis at apply; a claim whose route row or covered nodes differ from the judged state refuses, listed or not\",\"evidence, judge, admission, status and review state pass through untouched; the prior record rides as supersedes with restamped_by/restamped_on\",\"the approval binds the exact claim list by SHA-256 plus the snapshot and ledger guards\",\"the narrowed ledger commits atomically with one receipt\"]},\"note.analysis.save\":{\"handler\":\"note_analysis_save\",\"cli_command\":\"note-analysis-save\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical requests replay without a second note; id collision with different analysis refuses\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"analysis\":{\"description\":\"Accepted analysis input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"binding\"],\"required\":[\"id\",\"title\",\"path\",\"binding\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\"},\"fields\":{\"binding\":{\"type\":\"object\",\"description\":\"Provenance binding per the material_analysis record in system/schema/note.schema.json (frozen_input_sha256/bytes are derived by note-analysis-prepare, never drafted).\"}}}}},\"note.analysis.save_batch\":{\"handler\":\"note_analysis_save_batch\",\"cli_command\":\"note-analysis-save-batch\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"bounded to 1 to 20 notes per batch; every item carries an analysis record and a SHA-256-bound body file\",\"every item is validated before any note is written; one failure refuses the whole batch\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical notes replay without a second write; id collision with different analysis refuses the batch\",\"one transaction and one receipt cover the complete batch\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"]},\"note.revise\":{\"handler\":\"note_revise\",\"cli_command\":\"note-revise\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"id and role remain stable\",\"explicit approval\",\"external replacement files are bound to their exact bytes by SHA-256 before use\"]},\"note.evidence.add\":{\"handler\":\"note_evidence\",\"cli_command\":\"note-evidence\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"note body is never modified\",\"evidence is append-only\",\"existing entries are never rewritten or removed\"]},\"note.create\":{\"handler\":\"note_create\",\"cli_command\":\"note-create\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match the approved SHA-256\",\"filename is always the note id; id collision refuses and updates go through note.revise\",\"reference and question roles keep their dedicated capabilities and refuse here\",\"superseded notes must exist and are marked deprecated in the same transaction\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"note\":{\"description\":\"Accepted note input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"role\",\"concepts\",\"sources\",\"contexts\",\"supersedes\"],\"required\":[\"id\",\"title\",\"path\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\",\"role\":\"string\",\"concepts\":[\"array\",\"null\"],\"sources\":[\"array\",\"null\"],\"contexts\":[\"array\",\"null\"],\"supersedes\":[\"array\",\"null\"]}}}},\"unit.plan.revise\":{\"handler\":\"unit_plan_revise\",\"cli_command\":\"unit-plan-revise\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one existing unit\",\"compact patch names only what changes; unrelated routes are carried forward internally\",\"route add/update/remove operations use stable IDs and reject ambiguity\",\"when the unit already has a material-synthesis dossier, route additions, removals and evidential changes require a replacement dossier validated against staged state; without an existing dossier no replacement is required\",\"context-dependent changes require documented acknowledgments\",\"artifact IDs cover exactly the semantic owners the revision touches\",\"external revision files are bound to their exact bytes by SHA-256 before use\",\"one transaction and one receipt cover the complete revision\"],\"payload_records\":{\"record\":{\"description\":\"Compact revision naming only what changes: the v1 plan_contract coverage audit, route add/update/remove ops, the reviewed final study map, and an optional replacement dossier.\",\"accepted\":[\"unit_id\",\"plan_contract\",\"route_changes\",\"study_map\",\"material_synthesis\",\"claim_evidence\",\"acknowledgments\"],\"required\":[\"plan_contract\"],\"types\":{\"unit_id\":\"string\",\"plan_contract\":\"object\",\"route_changes\":[\"object\",\"null\"],\"study_map\":[\"object\",\"null\"],\"material_synthesis\":[\"object\",\"null\"],\"claim_evidence\":[\"array\",\"null\"],\"acknowledgments\":[\"array\",\"null\"]}}}},\"unit.map.import\":{\"handler\":\"unit_map_import\",\"cli_command\":\"unit-map-import\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"bounded to one unit\",\"external map files are bound to their exact bytes by SHA-256 before use\"]},\"unit.note.append\":{\"handler\":\"unit_note\",\"cli_command\":\"unit-note\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"session-level append\",\"failed save preserves caller draft\",\"every external attachment is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"unit.source-selection.set\":{\"handler\":\"unit_source_selection\",\"cli_command\":\"unit-source-selection\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**/unit.yaml\"],\"invariants\":[\"selection must match a rich route on the same unit\",\"complete material menu is unchanged\",\"a selection used by a study path cannot be removed implicitly\"]},\"unit.material-synthesis.publish\":{\"handler\":\"unit_material_synthesis_publish\",\"cli_command\":\"unit-material-synthesis-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"every current rich route is assessed exactly once\",\"current and prerequisite routes are deep-reviewed\",\"whole-dossier approval and revision guards are required\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full dossier record governed by system/schema/unit-material-synthesis.schema.json.\",\"record_schema\":\"system/schema/unit-material-synthesis.schema.json\"}}},\"legacy.archive.lock.publish\":{\"handler\":\"legacy_archive_lock_publish\",\"cli_command\":\"legacy-archive-lock-publish\",\"kind\":\"command\",\"writes\":[\"operations/legacy/archive-lock.yaml\"],\"invariants\":[\"reviewed allowlist-only evidence\",\"excluded boundary entries contain no paths or hashes\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full lock record governed by system/schema/legacy-archive-lock.schema.json.\",\"record_schema\":\"system/schema/legacy-archive-lock.schema.json\"}}},\"masters-planning.catalog.update\":{\"handler\":\"masters_planning_catalog_update\",\"cli_command\":\"masters-planning-catalog-update\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/catalog.yaml\"],\"invariants\":[\"academic-only sanitized input\",\"prospective ids never masquerade as canonical ids\",\"revision guarded and explicitly approved\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full catalog record governed by system/schema/master-planning-catalog.schema.json.\",\"record_schema\":\"system/schema/master-planning-catalog.schema.json\"}}},\"masters-planning.comparison.publish\":{\"handler\":\"masters_planning_comparison_publish\",\"cli_command\":\"masters-planning-comparison-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/comparisons/**\"],\"invariants\":[\"bounded to one selected candidate module\",\"all selected sources are assessed exactly once\",\"no scores, schedules, or time recommendations\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full comparison record governed by system/schema/candidate-source-comparison.schema.json.\",\"record_schema\":\"system/schema/candidate-source-comparison.schema.json\"}}},\"stage.note.write\":{\"handler\":\"stage_note\",\"cli_command\":\"stage-note\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/stages/**\"],\"invariants\":[\"one stage's working note; OPERATOR \\\"Capture routing\\\" uses it for log: captures\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]},\"stage.attachment.add\":{\"handler\":\"stage_attach\",\"cli_command\":\"stage-attach\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"source.feedback.record\":{\"handler\":\"source_feedback\",\"cli_command\":\"source-feedback\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"feedback is contextual\",\"source identity is unchanged\"]},\"source.intake.record\":{\"handler\":\"source_intake_record\",\"cli_command\":\"source-intake\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\"],\"invariants\":[\"creates a metadata-only source or corrects intake-owned fields of an existing one\",\"source identity is stable; evaluations, topics, material and every route, selection, note, feedback and observation are unchanged\",\"a check run returns the field-level diff; apply is bound to that diff's hash, the snapshot and each record's revision\",\"explicitly approved; one transaction and one receipt cover the batch\"],\"payload_records\":{\"record\":{\"description\":\"Batch of 1 to 20 intake rows; each row is a create or a correct carrying only its action's allowlisted fields, and the handler refuses a create-only field on a correct.\",\"accepted\":[\"records\"],\"required\":[\"records\"],\"fields\":{\"records\":{\"type\":\"array\",\"min_items\":1,\"max_items\":20,\"items\":{\"accepted\":[\"action\",\"id\",\"partition\",\"title\",\"type\",\"authors\",\"organization\",\"year\",\"url\",\"identifiers\",\"discovery\",\"thematic_group_ids\",\"remove_url\",\"remove_identifiers\"],\"required\":[\"action\",\"id\"],\"types\":{\"action\":\"string\",\"id\":\"string\",\"partition\":\"string\",\"type\":\"string\",\"title\":[\"string\",\"null\"],\"discovery\":[\"object\",\"null\"],\"thematic_group_ids\":[\"array\",\"null\"],\"remove_url\":[\"boolean\",\"null\"],\"remove_identifiers\":\"array\",\"identifiers\":[\"object\",\"null\"]}}}}}}},\"collection.entry.revise\":{\"handler\":\"collection_entry_revise\",\"cli_command\":\"collection-entry-revise\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"revises the why of one existing entry in one existing collection, addressed by filename stem and source id\",\"entry order, groups, sources and all other content are unchanged; empty, multi-line and no-op lines are refused\",\"a check run returns the old and proposed line; apply is bound to that diff's hash, the snapshot and the collection's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Revises one entry's why line, addressed by collection stem and source id; only why is written here.\",\"accepted\":[\"collection\",\"source\",\"why\"],\"required\":[\"collection\",\"source\",\"why\"],\"types\":{\"collection\":\"string\",\"source\":\"string\",\"why\":\"string\"}}}},\"source.record.revise\":{\"handler\":\"source_record_revise\",\"cli_command\":\"source-revise\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"attaches verified local material to one existing source, with an optional explicit evaluation replacement\",\"source identity and intake-owned fields are stable; topics, routes, selections, notes, feedback and observations are unchanged\",\"live bytes must match both the request hash and the materials manifest; the URI authority must be the source id and resolve through the runtime root; a held different material is never silently replaced\",\"when the attach moves an approved dossier's material basis, a reviewed replacement validated against the staged state ships in the same transaction; affected units join the diff and the revision guards\",\"replacement and rebased dossiers carry prospective freshness lineage bound to their new bytes and staged basis in the same transaction; existing lineage is retained as superseded provenance\",\"a reviewed rebase shortcut exists only when every moved route is screened, evidence-free, analysis-free and outside every comparison, and only material_checksums moves; it replays basis plus new provenance without echoing unchanged assessments, and every other case keeps the full replacement\",\"a check run returns the field-level diff with referring routes, bound dossiers, affected units and referring collection entries; apply is bound to that diff's hash, the snapshot and each touched record's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Attaches verified local material and/or replaces evaluations; identity and every intake-owned field stay with source.intake.record.\",\"accepted\":[\"id\",\"material\",\"material_sha256\",\"evaluations\",\"material_syntheses\",\"dossier_rebases\"],\"required\":[\"id\"],\"types\":{\"id\":\"string\",\"material\":\"string\",\"material_sha256\":[\"string\",\"null\"]}}}},\"detour.create\":{\"handler\":\"detour_create\",\"cli_command\":\"detour-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"return stage is explicit\"]},\"detour.resolve\":{\"handler\":\"detour_resolve\",\"cli_command\":\"detour-resolve\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"returns to originating stage\"]},\"review.prepare\":{\"handler\":\"shelving_prepare\",\"cli_command\":\"shelving-prepare\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"preparation never applies proposed canonical changes\",\"external proposal items are bound to their exact bytes by SHA-256 before use\"]},\"review.apply\":{\"handler\":\"shelving_apply\",\"cli_command\":\"shelving-apply\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/notes/**\",\"knowledge/garden/**\",\"curriculum/modules/**/units/**\"],\"invariants\":[\"explicit approval\",\"selected proposal is atomic\"]},\"path.note.write\":{\"handler\":\"path_note\",\"cli_command\":\"path-note\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"workspace-owned scratch only\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"path.progress.update\":{\"handler\":\"path_progress\",\"cli_command\":\"path-progress\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active stage\"]},\"path.attachment.add\":{\"handler\":\"path_attach\",\"cli_command\":\"path-attach\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"coordination.section.revise\":{\"handler\":\"coordination_section_revise\",\"cli_command\":\"coordination-section-revise\",\"kind\":\"command\",\"writes\":[\"work/COORDINATION.md\"],\"invariants\":[\"one existing coordination section; frontmatter and other section content are preserved\",\"reviewed text is envelope-inline and bound to the exact previous file SHA-256, snapshot and coordination revision\",\"preflight exposes before and after text; blank replacements, ambiguous sections and new section headings refuse\",\"no academic administrative record or learner evidence is changed\"]},\"workspace.next-action.update\":{\"handler\":\"workspace_next_action\",\"cli_command\":\"workspace-next-action\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active workspace; archived or non-active workspaces refuse\",\"only the Next Action section content changes; section editing is fence-aware and frontmatter is preserved\",\"GatewayEnvelopeV2 carries the action text inline and never reads it from stdin\"]},\"project.create\":{\"handler\":\"project_create\",\"cli_command\":\"project-create\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"new id only\",\"project schema v1\",\"no module mutation\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}},\"project.update\":{\"handler\":\"project_update\",\"cli_command\":\"project-update\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"id and type remain stable\",\"revision guarded\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\"},\"snapshot\":{\"contract_version\":15,\"generated_at\":\"(no Git history available)\",\"generator\":\"learning_os v3.2.0\",\"schema_sha256\":\"sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f\",\"snapshot_id\":\"\",\"source_dirty\":false,\"source_fingerprint\":\"3d19d501ad08c6e557718a6891f14646b005b25a527b283c8d43c792f88a8eb0\",\"source_revision\":\"001177fc67a90948242c1ea970252862fe793333\",\"warning\":\"GENERATED file - do not edit; rebuilt by python tools/generate.py\"},\"programs\":[{\"default\":true,\"id\":\"program-bachelors\",\"kind\":\"academic\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"revision\":0,\"semester_bound\":true,\"semesters\":[{\"id\":\"semester-sose-2026\",\"order\":1,\"status\":\"current\",\"title\":\"SoSe 2026\"}],\"status\":\"active\",\"title\":\"Bachelor’s\",\"type\":\"program\"}],\"modules\":[{\"administrative_status\":\"enrolled\",\"area_id\":\"program-bachelors\",\"attempts\":[{\"date\":\"2026-07-27\",\"result\":\"withdrawn\",\"termin\":1},{\"date\":\"2026-10-09\",\"result\":\"registered\",\"termin\":2}],\"code\":null,\"components\":[],\"credits\":null,\"examination\":{\"registration_windows\":[{\"action\":\"Register via AGNES.\",\"closes\":\"2026-09-10\",\"label\":\"2.-PZ Anmeldung\",\"opens\":\"2026-08-31\",\"termins\":[2]}],\"sittings\":[{\"date\":\"2000-01-01\",\"label\":\"Elapsed sitting with no attempt\",\"termin\":3},{\"date\":\"2026-10-09\",\"label\":\"2. Termin\",\"termin\":2,\"time\":\"13:00-16:00\"}],\"type\":\"klausur\"},\"grade\":null,\"id\":\"module-demo\",\"institution\":\"HU Berlin\",\"is_actionable\":true,\"kind\":\"academic\",\"operational_state\":\"active\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"revision\":0,\"semester\":\"sose-2026\",\"source_map\":\"source-map.yaml\",\"status\":\"enrolled\",\"thematic_group_ids\":[],\"title\":\"Demo Module\",\"type\":\"module\",\"unit_order\":[\"unit-demo-l01\",\"unit-demo-l02\"]}],\"projects\":[{\"boundaries\":{\"confidentiality\":\"private\",\"external_code_access\":\"approved\"},\"id\":\"project-demo\",\"linked_module_ids\":[\"module-demo\"],\"milestone_ids\":[],\"objective\":\"Demonstrate the shadow graph.\",\"path\":\"projects/registry/project-demo.yaml\",\"project_type\":\"software\",\"relationship_ids\":[\"relationship-demo\"],\"revision\":0,\"root_uri\":\"project://demo\",\"schema_version\":1,\"status\":\"active\",\"thematic_group_ids\":[],\"title\":\"Demo project\",\"type\":\"project\",\"unit_ids\":[\"unit-demo-l01\"],\"workspace_ids\":[\"workspace-demo\"]}],\"units\":[{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"current_study_map\":\"study-map-demo-l01\",\"id\":\"unit-demo-l01\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"id\":\"knowledge-demo-outcomes\",\"summary\":\"A random variable assigns a number to each outcome.\",\"title\":\"Outcome values\"},{\"builds_on\":[\"knowledge-demo-outcomes\"],\"concept_ids\":[\"concept-expected-value\"],\"id\":\"knowledge-demo-expectation\",\"summary\":\"Expectation weights every value by its probability.\",\"title\":\"Probability-weighted average\"}],\"summary\":\"Expected value connects outcome values to their probabilities.\"},\"module_id\":\"module-demo\",\"needs_study_map\":false,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":1,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"project_ids\":[\"project-demo\"],\"revision\":3,\"scope\":\"The lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 1\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-01.pdf\",\"purpose\":\"Current derivation\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Expected value\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]},{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"id\":\"unit-demo-l02\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"concept_ids\":[\"concept-variance\"],\"id\":\"knowledge-demo-variance\",\"summary\":\"Variance weights squared deviations by probability.\",\"title\":\"Spread around the mean\"}],\"summary\":\"Variance measures the spread around the expected value.\"},\"module_id\":\"module-demo\",\"needs_study_map\":true,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":2,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"project_ids\":[],\"revision\":0,\"scope\":\"The follow-up lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 2\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-02.pdf\",\"purpose\":\"Follow-up derivation\",\"route_id\":\"route-7d42915c4988c513e6caa207\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Variance\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]}],\"active_study_maps\":[{\"current_stage\":\"stage-demo\",\"detours\":[],\"id\":\"study-map-demo-l01\",\"module_id\":\"module-demo\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"revision\":0,\"shelving\":{\"state\":\"none\"},\"source_plan\":{\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"provenance\":\"operator\"},\"stages\":[{\"attachments\":[],\"done_when\":[\"Explain the derivation.\"],\"id\":\"stage-demo\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Derive and explain expected value.\",\"resources\":[{\"id\":\"resource-demo-book-ch01\",\"kind\":\"read\",\"label\":\"Demo Book §1\",\"locator\":\"§1\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"id\":\"resource-demo-book-appendix\",\"kind\":\"read\",\"label\":\"Demo Book Appendix\",\"locator\":\"Appendix A\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"kind\":\"watch\",\"label\":\"Demo companion video\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"angle\":\"Derives the weighted sum and works a discrete example.\",\"id\":\"resource-demo-route-mirror\",\"kind\":\"read\",\"label\":\"Demo book — expected-value derivation\",\"locator\":\"lecture-01.pdf\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/lecture-01.pdf\",\"material_uri\":\"material://source-demo-book/lecture-01.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"active\",\"title\":\"Derive expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\"},{\"attachments\":[],\"done_when\":[\"Work the example.\"],\"id\":\"stage-demo-pending\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Apply expected value to a worked example.\",\"resources\":[{\"kind\":\"read\",\"label\":\"Demo Book §2\",\"locator\":\"§2\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"pending\",\"title\":\"Apply expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\"}],\"status\":\"active\",\"type\":\"study-map\",\"unit_id\":\"unit-demo-l01\"}],\"resume_pointer\":{\"module_id\":\"module-demo\",\"stage_id\":\"stage-demo\",\"study_map_id\":\"study-map-demo-l01\",\"type\":\"resume-pointer\",\"unit_id\":\"unit-demo-l01\",\"updated\":\"2026-09-20\"},\"next\":\"Resume the pointer or choose any visible module and unit.\"}\n", + "stdout": "{\"capabilities\":{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"ability.context\":{\"handler\":\"ability_context\",\"cli_command\":\"ability-context\",\"kind\":\"porcelain\",\"result\":\"ability-context-v1\",\"schema\":\"system/schema/ability-context.schema.json\",\"invariants\":[\"snapshot-bound bounded global horizon with focused expansion\",\"the horizon pages at one snapshot (--offset carries the previous snapshot); every ability appears exactly once across pages, page-local edges only, off-page incident counts per row\",\"a focused --brief carries state, totals, and bounded provenance pointers (correction/conflict previews at most 20 with exact totals) without raw observation bodies or stage material rows; the paged evidence section is the complete audit history\",\"--section evidence pages complete observations in ledger order at one snapshot\",\"candidate abilities and bridges never affect readiness or evidence transfer\",\"only reviewed equivalence with a current source digest can transfer confirmed evidence under stated conditions\",\"contradictory and corrected work remains inspectable; stage completion grants nothing\",\"ability rows carry reason_codes parallel to reasons; decisions consume the structured codes, never the display prose\"]},\"material.span\":{\"handler\":\"material_span\",\"cli_command\":\"material-span\",\"kind\":\"query\",\"result\":\"material-span-v1\",\"schema\":\"system/schema/material-span.schema.json\",\"invariants\":[\"one exact registered route yields common source identity, locator, type, availability, and observed digest\",\"local extraction is on demand and bounded; remote sources are never fetched implicitly\",\"unreadable or changed bytes remain explicit and no semantic judgment is inferred\"]},\"runtime.session\":{\"handler\":\"runtime_session\",\"result\":\"runtime-session-v1\",\"schema\":\"system/schema/runtime-session.schema.json\",\"invariants\":[\"read-only snapshot-bound proposal for one explicit requirement\",\"sticky repair requires an explicit material event and the previous runtime packet, bound to its snapshot\",\"target evidence and feasibility failures stay visible\"]},\"plan.edit-context\":{\"handler\":\"plan_edit_context\",\"result\":\"plan-edit-context\",\"invariants\":[\"one unit's compact authored plan or one exact route and its stage overrides\",\"snapshot-bound; shared descriptions occur once and expected revisions are explicit\",\"an ordered batch of 1 to 20 distinct routes of one unit shares the unit snapshot and revision guards, preserves request order, and refuses atomically without a partial payload\",\"the brief lists direct analysis refs plus a related count and expansion hint; same-source-only refs list only via --include-related\",\"the brief reports a neighboring-unit source-reuse count with an explicit expansion; the full neighbor map lists only via --include-neighbors\"]},\"atlas.context\":{\"handler\":\"atlas_context\",\"result\":\"atlas-context\"},\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]},\"semantic.query\":{\"handler\":\"semantic\",\"result\":\"semantic-query\",\"invariants\":[\"one registered predicate evaluates against explicit --input k=v bindings; --list names the registry and --recipe shows the worked procedure for one class\",\"an unknown predicate names the registry instead of failing without a way forward\"]},\"note.content\":{\"handler\":\"note_read\",\"result\":\"note-content\",\"invariants\":[\"reads registered durable notes and garden seeds by stable id, without following symlinks\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.content\":{\"handler\":\"inbox_read\",\"result\":\"inbox-content\",\"invariants\":[\"reads one work/inbox file by inbox-relative name, without following symlinks\",\"non-UTF-8 drops refuse with no text read; dot-files read by exact name only\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.list\":{\"handler\":\"inbox_list\",\"result\":\"inbox-list\",\"invariants\":[\"lists work/inbox files by inbox-relative name, without reading bytes\",\"dot-files excluded; a missing inbox is empty\",\"each row reports its own age in days (age_days)\"]},\"note.search\":{\"handler\":\"search\",\"result\":\"note-content-search\",\"invariants\":[\"content mode searches complete registered durable notes and returns bounded line snippets\",\"content mode requires a nonempty query; empty-query listing is the CLI metadata search, not this capability\"]},\"material.context\":{\"handler\":\"material_context\",\"cli_command\":\"material-context\",\"kind\":\"query\",\"result\":\"material-context\",\"invariants\":[\"read-only; touches no repository file\",\"searches durable analysis notes plus the route assessments of approved unit syntheses\",\"deterministic lexical AND matching over explanation text (note title plus body); provenance frontmatter never matches; concept filter resolves declared ids and aliases; purpose, unit, and exact material narrow\",\"ranked by recorded stage use-evidence per source (positive feedback first, mismatch feedback last); ties keep stable order (notes by id, then assessments by unit and route); --include-related appends related notes under the same ranking\",\"use evidence is canonical study-map data under the snapshot guard; skipped is reported, never ranking\",\"unit-scoped analysis notes follow current source-map routes, independently of synthesis approval; direct notes share a routed file (and overlap its single stated page range when it states one); same-source-only notes are related, listed only via --include-related\",\"excerpts are bounded (8 note snippets — a title label or true file line numbers — 3 assessment fields); default 5 items, at most 20\",\"analysis-note anchors preview at most 8 per note with exact totals and clipping flags (purpose matches first); the complete index lists only via --include-anchors\",\"source freshness is observed live per result; review state and resolution are reported, never inferred\",\"empty results describe the searched records only, never the absence of an explanation\",\"continuation requires the snapshot and observations_sha256 guards; changed canonical data, observed material bytes, or normalized filters refuse mixed pages, even when an assessment remains stale\"]},\"plan.template\":{\"handler\":\"plan_template\",\"result\":\"plan-template-v1\",\"schema\":\"system/schema/plan-template.schema.json\",\"invariants\":[\"read-only; generates a record and touches no repository file\",\"always the current plan-template version, never a copy of an existing plan\",\"the generated record is validated against its own domain schema before it is answered\",\"curriculum requires unit_id and module_id\"]},\"project.list\":{\"handler\":\"project_list\",\"result\":\"project-list\"},\"project.inspect\":{\"handler\":\"inspect\",\"result\":\"record\"},\"health.report\":{\"handler\":\"health_report\",\"result\":\"health-report-v1\",\"schema\":\"system/schema/health-report.schema.json\",\"invariants\":[\"read-only and on demand; no watcher or daemon\",\"reports owner and remedy for every check\"]},\"backup.manifest\":{\"handler\":\"backup_manifest\",\"result\":\"backup-manifest-v1\",\"schema\":\"system/schema/backup-manifest.schema.json\",\"invariants\":[\"hashes only producer-declared allowlisted roots\",\"never follows symlinks or includes sibling directories implicitly\",\"read-only and does not configure Time Machine\"]},\"legacy.archive.inspect\":{\"handler\":\"legacy_archive_inspect\",\"result\":\"legacy-archive-lock-v1\",\"schema\":\"system/schema/legacy-archive-lock.schema.json\",\"invariants\":[\"reads only exact reviewed safe paths; there is no recursive discovery\",\"boundary-sensitive items are represented only by an aggregate count\",\"read-only and deliberately invoked\"]},\"legacy.archive.status\":{\"handler\":\"legacy_archive_status\",\"result\":\"legacy-archive-status-v1\",\"schema\":\"system/schema/legacy-archive-status.schema.json\",\"invariants\":[\"reads the last approved lock without rescanning Legacy\",\"absent from normal manifest and search\"]},\"masters-planning.dashboard\":{\"handler\":\"masters_planning_dashboard\",\"result\":\"masters-planning-dashboard-v1\",\"schema\":\"system/schema/masters-planning-dashboard.schema.json\",\"invariants\":[\"requires an explicit planning access gesture\",\"reads only the sanitized catalog and approved comparisons\",\"absent from normal manifest, search, workload, deadlines, recommendations, and ordinary AI\"]}},\"commands\":{\"ability.candidate.append\":{\"handler\":\"ability_candidate_append\",\"cli_command\":\"ability-candidate-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/ability-candidates.jsonl\"],\"invariants\":[\"appends a provenance-linked tentative connection between known abilities\",\"never changes a reviewed bridge or contributes to readiness or evidence transfer\",\"snapshot and candidate-ledger revision are guarded by a V2 receipt\"]},\"learner.ability-observation.append\":{\"handler\":\"ability_observation_append\",\"cli_command\":\"ability-observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"work/active/*/ability-observations.jsonl\"],\"invariants\":[\"appends only a learner-confirmed precise claim linked to actual work and a confirmation pointer\",\"ability identity must be active and reviewed; evidence binds to its claim, conditions, and criteria hash\",\"corrections preserve prior observations and conflicting work stays visible\",\"snapshot and workspace revision are guarded by a V2 receipt\"]},\"learner.observation.append\":{\"handler\":\"observation_append\",\"cli_command\":\"observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/active/*/observations.jsonl\"],\"invariants\":[\"append only to the registered active workspace's evidence ledger\",\"requirement resolves within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve historical evidence\",\"learner observations never update concept or source semantics\"]},\"learner.stage-result.append\":{\"handler\":\"stage_result\",\"cli_command\":\"stage-result\",\"kind\":\"command\",\"writes\":[\"work/active/*/stage-results.jsonl\"],\"invariants\":[\"append only to the registered active workspace's untargeted-result ledger\",\"unit and stage resolve to the unit's current study map within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve history\",\"untargeted rows never grant requirement, ability, or concept credit and are never retro-credited\"]},\"route.patch\":{\"handler\":\"route_patch\",\"cli_command\":\"route-patch\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/unit.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"one exact route in one owning unit; only declared descriptive material fields\",\"source selections and identical legacy mirrors synchronize; stage overrides are preserved\",\"snapshot and all affected logical revisions are guarded, including maps changed by inheritance\",\"full validation and the warning policy are enforced inside the receipt-producing transaction, on the staged state, refusing before anything commits\",\"changing a covered route's material identity or explicitly re-judging a stale or disputed claim uses shared evidence admission and the shared lineage file revision\"],\"payload_records\":{\"claim_evidence\":{\"description\":\"One reviewed covers claim for exactly the patched route; local readable material requires a matching excerpt at an explicit page or transcript window. Excerpts remain outside tracked output.\",\"accepted\":[\"claim_id\",\"evidence\",\"reads\"],\"required\":[\"claim_id\",\"evidence\"],\"types\":{\"claim_id\":\"string\",\"evidence\":\"array\",\"reads\":\"object\"},\"fields\":{\"evidence\":{\"type\":\"array\",\"min_items\":1,\"items\":{\"type\":\"object\",\"accepted\":[\"kind\",\"ref\",\"text\",\"page\",\"page_end\",\"window\",\"node\",\"note\"],\"required\":[\"kind\",\"ref\"],\"types\":{\"kind\":\"string\",\"ref\":\"string\",\"text\":\"string\",\"page\":\"integer\",\"page_end\":\"integer\",\"window\":\"string\",\"node\":\"string\",\"note\":\"string\"}}}}},\"changes\":{\"description\":\"A nonempty map of declared descriptive material fields to their new text; keys outside this list refuse, and empty text refuses.\",\"accepted\":[\"title\",\"locator\",\"angle\",\"angle_detail\",\"url\",\"vault_path\"],\"min_properties\":1,\"types\":{\"title\":\"string\",\"locator\":\"string\",\"angle\":\"string\",\"angle_detail\":\"string\",\"url\":\"string\",\"vault_path\":\"string\"}}}},\"module.materials.compact\":{\"handler\":\"module_materials_compact\",\"cli_command\":\"module-materials-compact\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\"],\"invariants\":[\"one module; exact route identity or unambiguous source/title/locator guards only\",\"identical fields become explicit references; every expanded study map is unchanged\",\"persisted route identities and compact maps commit together under the reviewed plan hash\",\"ambiguous or independent resources remain inline; no ordering, progress or teaching judgment changes\"]},\"concept.relations.change\":{\"handler\":\"concept_relations_change\",\"cli_command\":\"concept-relations-change\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/concept-relations.yaml\",\"knowledge/concept-relations/**\"],\"invariants\":[\"only explicitly supplied add, replace or remove operations; no inferred relations\",\"exact previous rows, snapshot and registry revision guard changes\",\"duplicates, unknown endpoints and prerequisite cycles fail atomically\"],\"payload_records\":{\"change\":{\"description\":\"Exactly one operations list of 1 to 50 explicit operations; each names its action and carries the exact old/new rows that action needs (add: new; replace: old and new; remove: old).\",\"accepted\":[\"operations\"],\"required\":[\"operations\"],\"fields\":{\"operations\":{\"type\":\"array\",\"min_items\":1,\"max_items\":50,\"items\":{\"accepted\":[\"action\",\"old\",\"new\"],\"required\":[\"action\"],\"types\":{\"action\":\"string\"}}}}}}},\"atlas.question.save\":{\"handler\":\"atlas_question_save\",\"cli_command\":\"atlas-question-save\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"learner wording and original target are preserved\",\"open and resolved describe a personal question, never mastery or task completion\"]},\"capture.create\":{\"handler\":\"capture\",\"cli_command\":\"capture\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/inbox/**\"],\"invariants\":[\"no automatic routing\",\"original input is preserved\",\"external file input is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 content is inline or hash-bound and never comes from stdin\"]},\"inbox.resolve\":{\"handler\":\"inbox_resolve\",\"cli_command\":\"inbox-resolve\",\"kind\":\"command\",\"writes\":[\"work/inbox/**\",\"archive/inbox/**\"],\"invariants\":[\"moves one named drop, or one file inside a drop folder, to archive/inbox/YYYY/ byte-identical\",\"the drop's SHA-256 must match the bytes read; a changed drop refuses\",\"routed_to names every destination that received the drop and is recorded on the receipt\",\"snapshot and touched-path revisions guarded; the archive never overwrites\"]},\"ai-action.delivery.apply\":{\"handler\":\"ai_action_apply_delivery\",\"cli_command\":\"ai-action-apply-delivery\",\"kind\":\"command\",\"writes\":[\"operations/ai-actions/requests/**\"],\"invariants\":[\"GatewayEnvelopeV2 with approved-delivery authority is required\",\"approval binds the imported delivery record and every referenced artifact by SHA-256\",\"canonical destinations retain their narrow domain-capability write authorities\",\"request completion and canonical writes commit atomically with one ReceiptV2\"],\"payload_records\":{\"artifact_sha256\":{\"description\":\"Free-form map of every artifact_ref to its exact SHA-256 digest.\",\"freeform\":true}}},\"garden.seed.create\":{\"handler\":\"garden_seed_create\",\"cli_command\":\"garden-seed-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/garden/**\"],\"invariants\":[\"no automatic classification or routing\",\"original seed text is preserved\",\"no AI is required\"]},\"module.attempt.record\":{\"handler\":\"module_attempt\",\"cli_command\":\"module-attempt\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; appends a new attempts row or updates the row for the same termin\",\"termin, date, result and optional grade/notes record Aram's stated exam fact; no plan contract or source map\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.sitting.update\":{\"handler\":\"module_sitting\",\"cli_command\":\"module-sitting\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; sets the examination sitting's withdrawal_deadline for one termin, nothing else\",\"the termin must already have a sitting; notes, attempts and every other sitting field are untouched\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.create\":{\"handler\":\"module_create\",\"cli_command\":\"module-create\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\"],\"invariants\":[\"creates one module record and its source map; it never edits an existing module\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the module's artifact revision is registered from birth\"]},\"collection.create\":{\"handler\":\"collection_create\",\"cli_command\":\"collection-create\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"creates one source collection file; it never edits an existing collection\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed file bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the collection's artifact revision is registered from birth\"]},\"program.semester.update\":{\"handler\":\"program_semester_update\",\"cli_command\":\"program-semester-update\",\"kind\":\"command\",\"writes\":[\"curriculum/programs/**\"],\"invariants\":[\"turns one semester-bound program's current semester; it never rolls the term forward on its own\",\"the reviewed package names the semester that becomes current; the previous one becomes previous, and no semester record is dropped\",\"only the program record is written — exam outcomes, registrations, learner state and study work are untouched\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"snapshot and program revision guarded, with one V2 receipt\"]},\"module.plan.import\":{\"handler\":\"module_plan_import\",\"cli_command\":\"module-plan-import\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/quarantine/masters-planning/catalog.yaml\",\"curriculum/quarantine/masters-planning/promotions/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one module\",\"preflight required\",\"external plan files are bound to their exact bytes by SHA-256 before use\",\"changed route-covers edges carry admitted evidence or refuse; admitted records persist atomically\"],\"payload_records\":{\"promotion\":{\"description\":\"Inline MasterPlanning promotion package; the accepted fields are the full promotion record governed by system/schema/master-planning-promotion.schema.json.\",\"record_schema\":\"system/schema/master-planning-promotion.schema.json\"}}},\"lineage.restamp\":{\"handler\":\"lineage_restamp\",\"cli_command\":\"lineage-restamp\",\"kind\":\"command\",\"writes\":[\"operations/transactions/lineage.yaml\"],\"invariants\":[\"only supported old-shape route-covers claims; withdrawn, contested and already-narrowed claims refuse\",\"every listed claim re-verified stampable against fresh analysis at apply; a claim whose route row or covered nodes differ from the judged state refuses, listed or not\",\"evidence, judge, admission, status and review state pass through untouched; the prior record rides as supersedes with restamped_by/restamped_on\",\"the approval binds the exact claim list by SHA-256 plus the snapshot and ledger guards\",\"the narrowed ledger commits atomically with one receipt\"]},\"note.analysis.save\":{\"handler\":\"note_analysis_save\",\"cli_command\":\"note-analysis-save\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical requests replay without a second note; id collision with different analysis refuses\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"analysis\":{\"description\":\"Accepted analysis input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"binding\"],\"required\":[\"id\",\"title\",\"path\",\"binding\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\"},\"fields\":{\"binding\":{\"type\":\"object\",\"description\":\"Provenance binding per the material_analysis record in system/schema/note.schema.json (frozen_input_sha256/bytes are derived by note-analysis-prepare, never drafted).\"}}}}},\"note.analysis.save_batch\":{\"handler\":\"note_analysis_save_batch\",\"cli_command\":\"note-analysis-save-batch\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"bounded to 1 to 20 notes per batch; every item carries an analysis record and a SHA-256-bound body file\",\"every item is validated before any note is written; one failure refuses the whole batch\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical notes replay without a second write; id collision with different analysis refuses the batch\",\"one transaction and one receipt cover the complete batch\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"]},\"note.revise\":{\"handler\":\"note_revise\",\"cli_command\":\"note-revise\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"id and role remain stable\",\"explicit approval\",\"external replacement files are bound to their exact bytes by SHA-256 before use\"]},\"note.evidence.add\":{\"handler\":\"note_evidence\",\"cli_command\":\"note-evidence\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"note body is never modified\",\"evidence is append-only\",\"existing entries are never rewritten or removed\"]},\"note.create\":{\"handler\":\"note_create\",\"cli_command\":\"note-create\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match the approved SHA-256\",\"filename is always the note id; id collision refuses and updates go through note.revise\",\"reference and question roles keep their dedicated capabilities and refuse here\",\"superseded notes must exist and are marked deprecated in the same transaction\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"note\":{\"description\":\"Accepted note input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"role\",\"concepts\",\"sources\",\"contexts\",\"supersedes\"],\"required\":[\"id\",\"title\",\"path\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\",\"role\":\"string\",\"concepts\":[\"array\",\"null\"],\"sources\":[\"array\",\"null\"],\"contexts\":[\"array\",\"null\"],\"supersedes\":[\"array\",\"null\"]}}}},\"unit.plan.revise\":{\"handler\":\"unit_plan_revise\",\"cli_command\":\"unit-plan-revise\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one existing unit\",\"compact patch names only what changes; unrelated routes are carried forward internally\",\"route add/update/remove operations use stable IDs and reject ambiguity\",\"when the unit already has a material-synthesis dossier, route additions, removals and evidential changes require a replacement dossier validated against staged state; without an existing dossier no replacement is required\",\"context-dependent changes require documented acknowledgments\",\"artifact IDs cover exactly the semantic owners the revision touches\",\"external revision files are bound to their exact bytes by SHA-256 before use\",\"one transaction and one receipt cover the complete revision\"],\"payload_records\":{\"record\":{\"description\":\"Compact revision naming only what changes: the v1 plan_contract coverage audit, route add/update/remove ops, the reviewed final study map, and an optional replacement dossier.\",\"accepted\":[\"unit_id\",\"plan_contract\",\"route_changes\",\"study_map\",\"material_synthesis\",\"claim_evidence\",\"acknowledgments\"],\"required\":[\"plan_contract\"],\"types\":{\"unit_id\":\"string\",\"plan_contract\":\"object\",\"route_changes\":[\"object\",\"null\"],\"study_map\":[\"object\",\"null\"],\"material_synthesis\":[\"object\",\"null\"],\"claim_evidence\":[\"array\",\"null\"],\"acknowledgments\":[\"array\",\"null\"]}}}},\"unit.map.import\":{\"handler\":\"unit_map_import\",\"cli_command\":\"unit-map-import\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"bounded to one unit\",\"external map files are bound to their exact bytes by SHA-256 before use\"]},\"unit.note.append\":{\"handler\":\"unit_note\",\"cli_command\":\"unit-note\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"session-level append\",\"failed save preserves caller draft\",\"every external attachment is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"unit.source-selection.set\":{\"handler\":\"unit_source_selection\",\"cli_command\":\"unit-source-selection\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**/unit.yaml\"],\"invariants\":[\"selection must match a rich route on the same unit\",\"complete material menu is unchanged\",\"a selection used by a study path cannot be removed implicitly\"]},\"unit.material-synthesis.publish\":{\"handler\":\"unit_material_synthesis_publish\",\"cli_command\":\"unit-material-synthesis-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"every current rich route is assessed exactly once\",\"current and prerequisite routes are deep-reviewed\",\"whole-dossier approval and revision guards are required\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full dossier record governed by system/schema/unit-material-synthesis.schema.json.\",\"record_schema\":\"system/schema/unit-material-synthesis.schema.json\"}}},\"legacy.archive.lock.publish\":{\"handler\":\"legacy_archive_lock_publish\",\"cli_command\":\"legacy-archive-lock-publish\",\"kind\":\"command\",\"writes\":[\"operations/legacy/archive-lock.yaml\"],\"invariants\":[\"reviewed allowlist-only evidence\",\"excluded boundary entries contain no paths or hashes\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full lock record governed by system/schema/legacy-archive-lock.schema.json.\",\"record_schema\":\"system/schema/legacy-archive-lock.schema.json\"}}},\"masters-planning.catalog.update\":{\"handler\":\"masters_planning_catalog_update\",\"cli_command\":\"masters-planning-catalog-update\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/catalog.yaml\"],\"invariants\":[\"academic-only sanitized input\",\"prospective ids never masquerade as canonical ids\",\"revision guarded and explicitly approved\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full catalog record governed by system/schema/master-planning-catalog.schema.json.\",\"record_schema\":\"system/schema/master-planning-catalog.schema.json\"}}},\"masters-planning.comparison.publish\":{\"handler\":\"masters_planning_comparison_publish\",\"cli_command\":\"masters-planning-comparison-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/comparisons/**\"],\"invariants\":[\"bounded to one selected candidate module\",\"all selected sources are assessed exactly once\",\"no scores, schedules, or time recommendations\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full comparison record governed by system/schema/candidate-source-comparison.schema.json.\",\"record_schema\":\"system/schema/candidate-source-comparison.schema.json\"}}},\"stage.note.write\":{\"handler\":\"stage_note\",\"cli_command\":\"stage-note\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/stages/**\"],\"invariants\":[\"one stage's working note; OPERATOR \\\"Capture routing\\\" uses it for log: captures\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]},\"stage.attachment.add\":{\"handler\":\"stage_attach\",\"cli_command\":\"stage-attach\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"source.feedback.record\":{\"handler\":\"source_feedback\",\"cli_command\":\"source-feedback\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"feedback is contextual\",\"source identity is unchanged\"]},\"source.intake.record\":{\"handler\":\"source_intake_record\",\"cli_command\":\"source-intake\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\"],\"invariants\":[\"creates a metadata-only source or corrects intake-owned fields of an existing one\",\"source identity is stable; evaluations, topics, material and every route, selection, note, feedback and observation are unchanged\",\"a check run returns the field-level diff; apply is bound to that diff's hash, the snapshot and each record's revision\",\"explicitly approved; one transaction and one receipt cover the batch\"],\"payload_records\":{\"record\":{\"description\":\"Batch of 1 to 20 intake rows; each row is a create or a correct carrying only its action's allowlisted fields, and the handler refuses a create-only field on a correct.\",\"accepted\":[\"records\"],\"required\":[\"records\"],\"fields\":{\"records\":{\"type\":\"array\",\"min_items\":1,\"max_items\":20,\"items\":{\"accepted\":[\"action\",\"id\",\"partition\",\"title\",\"type\",\"authors\",\"organization\",\"year\",\"url\",\"identifiers\",\"discovery\",\"thematic_group_ids\",\"remove_url\",\"remove_identifiers\"],\"required\":[\"action\",\"id\"],\"types\":{\"action\":\"string\",\"id\":\"string\",\"partition\":\"string\",\"type\":\"string\",\"title\":[\"string\",\"null\"],\"discovery\":[\"object\",\"null\"],\"thematic_group_ids\":[\"array\",\"null\"],\"remove_url\":[\"boolean\",\"null\"],\"remove_identifiers\":\"array\",\"identifiers\":[\"object\",\"null\"]}}}}}}},\"collection.entry.revise\":{\"handler\":\"collection_entry_revise\",\"cli_command\":\"collection-entry-revise\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"revises the why of one existing entry in one existing collection, addressed by filename stem and source id\",\"entry order, groups, sources and all other content are unchanged; empty, multi-line and no-op lines are refused\",\"a check run returns the old and proposed line; apply is bound to that diff's hash, the snapshot and the collection's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Revises one entry's why line, addressed by collection stem and source id; only why is written here.\",\"accepted\":[\"collection\",\"source\",\"why\"],\"required\":[\"collection\",\"source\",\"why\"],\"types\":{\"collection\":\"string\",\"source\":\"string\",\"why\":\"string\"}}}},\"source.record.revise\":{\"handler\":\"source_record_revise\",\"cli_command\":\"source-revise\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"attaches verified local material to one existing source, with an optional explicit evaluation replacement\",\"source identity and intake-owned fields are stable; topics, routes, selections, notes, feedback and observations are unchanged\",\"live bytes must match both the request hash and the materials manifest; the URI authority must be the source id and resolve through the runtime root; a held different material is never silently replaced\",\"when the attach moves an approved dossier's material basis, a reviewed replacement validated against the staged state ships in the same transaction; affected units join the diff and the revision guards\",\"replacement and rebased dossiers carry prospective freshness lineage bound to their new bytes and staged basis in the same transaction; existing lineage is retained as superseded provenance\",\"a reviewed rebase shortcut exists only when every moved route is screened, evidence-free, analysis-free and outside every comparison, and only material_checksums moves; it replays basis plus new provenance without echoing unchanged assessments, and every other case keeps the full replacement\",\"a check run returns the field-level diff with referring routes, bound dossiers, affected units and referring collection entries; apply is bound to that diff's hash, the snapshot and each touched record's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Attaches verified local material and/or replaces evaluations; identity and every intake-owned field stay with source.intake.record.\",\"accepted\":[\"id\",\"material\",\"material_sha256\",\"evaluations\",\"material_syntheses\",\"dossier_rebases\"],\"required\":[\"id\"],\"types\":{\"id\":\"string\",\"material\":\"string\",\"material_sha256\":[\"string\",\"null\"]}}}},\"detour.create\":{\"handler\":\"detour_create\",\"cli_command\":\"detour-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"return stage is explicit\"]},\"detour.resolve\":{\"handler\":\"detour_resolve\",\"cli_command\":\"detour-resolve\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"returns to originating stage\"]},\"review.prepare\":{\"handler\":\"shelving_prepare\",\"cli_command\":\"shelving-prepare\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"preparation never applies proposed canonical changes\",\"external proposal items are bound to their exact bytes by SHA-256 before use\"]},\"review.apply\":{\"handler\":\"shelving_apply\",\"cli_command\":\"shelving-apply\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/notes/**\",\"knowledge/garden/**\",\"curriculum/modules/**/units/**\"],\"invariants\":[\"explicit approval\",\"selected proposal is atomic\"]},\"path.note.write\":{\"handler\":\"path_note\",\"cli_command\":\"path-note\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"workspace-owned scratch only\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"path.progress.update\":{\"handler\":\"path_progress\",\"cli_command\":\"path-progress\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active stage\"]},\"path.attachment.add\":{\"handler\":\"path_attach\",\"cli_command\":\"path-attach\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"coordination.section.revise\":{\"handler\":\"coordination_section_revise\",\"cli_command\":\"coordination-section-revise\",\"kind\":\"command\",\"writes\":[\"work/COORDINATION.md\"],\"invariants\":[\"one existing coordination section; frontmatter and other section content are preserved\",\"reviewed text is envelope-inline and bound to the exact previous file SHA-256, snapshot and coordination revision\",\"preflight exposes before and after text; blank replacements, ambiguous sections and new section headings refuse\",\"no academic administrative record or learner evidence is changed\"]},\"workspace.next-action.update\":{\"handler\":\"workspace_next_action\",\"cli_command\":\"workspace-next-action\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active workspace; archived or non-active workspaces refuse\",\"only the Next Action section content changes; section editing is fence-aware and frontmatter is preserved\",\"GatewayEnvelopeV2 carries the action text inline and never reads it from stdin\"]},\"project.create\":{\"handler\":\"project_create\",\"cli_command\":\"project-create\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"new id only\",\"project schema v1\",\"no module mutation\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}},\"project.update\":{\"handler\":\"project_update\",\"cli_command\":\"project-update\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"id and type remain stable\",\"revision guarded\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\"},\"snapshot\":{\"contract_version\":16,\"generated_at\":\"(no Git history available)\",\"generator\":\"learning_os v3.2.0\",\"schema_sha256\":\"sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55\",\"snapshot_id\":\"\",\"source_dirty\":false,\"source_fingerprint\":\"cc33c20175354437a097f55f010780a34c25535cabdb11e872cf9ead6ffdf76e\",\"source_revision\":\"48d1ef477e94d707184f67e7ab24e23acd1ca28d\",\"warning\":\"GENERATED file - do not edit; rebuilt by python tools/generate.py\"},\"programs\":[{\"default\":true,\"id\":\"program-bachelors\",\"kind\":\"academic\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"revision\":0,\"semester_bound\":true,\"semesters\":[{\"id\":\"semester-sose-2026\",\"order\":1,\"status\":\"current\",\"title\":\"SoSe 2026\"}],\"status\":\"active\",\"title\":\"Bachelor’s\",\"type\":\"program\"}],\"modules\":[{\"administrative_status\":\"enrolled\",\"area_id\":\"program-bachelors\",\"attempts\":[{\"date\":\"2026-07-27\",\"result\":\"withdrawn\",\"termin\":1},{\"date\":\"2026-10-09\",\"result\":\"registered\",\"termin\":2}],\"code\":null,\"components\":[],\"credits\":null,\"examination\":{\"registration_windows\":[{\"action\":\"Register via AGNES.\",\"closes\":\"2026-09-10\",\"label\":\"2.-PZ Anmeldung\",\"opens\":\"2026-08-31\",\"termins\":[2]}],\"sittings\":[{\"date\":\"2000-01-01\",\"label\":\"Elapsed sitting with no attempt\",\"termin\":3},{\"date\":\"2026-10-09\",\"label\":\"2. Termin\",\"termin\":2,\"time\":\"13:00-16:00\"}],\"type\":\"klausur\"},\"grade\":null,\"id\":\"module-demo\",\"institution\":\"HU Berlin\",\"is_actionable\":true,\"kind\":\"academic\",\"operational_state\":\"active\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"revision\":0,\"semester\":\"sose-2026\",\"source_map\":\"source-map.yaml\",\"status\":\"enrolled\",\"thematic_group_ids\":[],\"title\":\"Demo Module\",\"type\":\"module\",\"unit_order\":[\"unit-demo-l01\",\"unit-demo-l02\"]}],\"projects\":[{\"boundaries\":{\"confidentiality\":\"private\",\"external_code_access\":\"approved\"},\"id\":\"project-demo\",\"linked_module_ids\":[\"module-demo\"],\"milestone_ids\":[],\"objective\":\"Demonstrate the shadow graph.\",\"path\":\"projects/registry/project-demo.yaml\",\"project_type\":\"software\",\"relationship_ids\":[\"relationship-demo\"],\"revision\":0,\"root_uri\":\"project://demo\",\"schema_version\":1,\"status\":\"active\",\"thematic_group_ids\":[],\"title\":\"Demo project\",\"type\":\"project\",\"unit_ids\":[\"unit-demo-l01\"],\"workspace_ids\":[\"workspace-demo\"]}],\"units\":[{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"current_study_map\":\"study-map-demo-l01\",\"id\":\"unit-demo-l01\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"id\":\"knowledge-demo-outcomes\",\"summary\":\"A random variable assigns a number to each outcome.\",\"title\":\"Outcome values\"},{\"builds_on\":[\"knowledge-demo-outcomes\"],\"concept_ids\":[\"concept-expected-value\"],\"id\":\"knowledge-demo-expectation\",\"summary\":\"Expectation weights every value by its probability.\",\"title\":\"Probability-weighted average\"}],\"summary\":\"Expected value connects outcome values to their probabilities.\"},\"module_id\":\"module-demo\",\"needs_study_map\":false,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":1,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"project_ids\":[\"project-demo\"],\"revision\":3,\"scope\":\"The lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 1\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-01.pdf\",\"purpose\":\"Current derivation\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Expected value\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]},{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"id\":\"unit-demo-l02\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"concept_ids\":[\"concept-variance\"],\"id\":\"knowledge-demo-variance\",\"summary\":\"Variance weights squared deviations by probability.\",\"title\":\"Spread around the mean\"}],\"summary\":\"Variance measures the spread around the expected value.\"},\"module_id\":\"module-demo\",\"needs_study_map\":true,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":2,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"project_ids\":[],\"revision\":0,\"scope\":\"The follow-up lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 2\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-02.pdf\",\"purpose\":\"Follow-up derivation\",\"route_id\":\"route-7d42915c4988c513e6caa207\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Variance\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]}],\"active_study_maps\":[{\"current_stage\":\"stage-demo\",\"detours\":[],\"id\":\"study-map-demo-l01\",\"module_id\":\"module-demo\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"revision\":0,\"shelving\":{\"state\":\"none\"},\"source_plan\":{\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"provenance\":\"operator\"},\"stages\":[{\"attachments\":[],\"done_when\":[\"Explain the derivation.\"],\"id\":\"stage-demo\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Derive and explain expected value.\",\"resources\":[{\"id\":\"resource-demo-book-ch01\",\"kind\":\"read\",\"label\":\"Demo Book §1\",\"locator\":\"§1\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"id\":\"resource-demo-book-appendix\",\"kind\":\"read\",\"label\":\"Demo Book Appendix\",\"locator\":\"Appendix A\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"kind\":\"watch\",\"label\":\"Demo companion video\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"angle\":\"Derives the weighted sum and works a discrete example.\",\"id\":\"resource-demo-route-mirror\",\"kind\":\"read\",\"label\":\"Demo book — expected-value derivation\",\"locator\":\"lecture-01.pdf\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/lecture-01.pdf\",\"material_uri\":\"material://source-demo-book/lecture-01.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"active\",\"title\":\"Derive expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\"},{\"attachments\":[],\"done_when\":[\"Work the example.\"],\"id\":\"stage-demo-pending\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Apply expected value to a worked example.\",\"resources\":[{\"kind\":\"read\",\"label\":\"Demo Book §2\",\"locator\":\"§2\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"pending\",\"title\":\"Apply expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\"}],\"status\":\"active\",\"type\":\"study-map\",\"unit_id\":\"unit-demo-l01\"}],\"resume_pointer\":{\"module_id\":\"module-demo\",\"stage_id\":\"stage-demo\",\"study_map_id\":\"study-map-demo-l01\",\"type\":\"resume-pointer\",\"unit_id\":\"unit-demo-l01\",\"updated\":\"2026-09-20\"},\"next\":\"Resume the pointer or choose any visible module and unit.\"}\n", "stdout_json": { "active_study_maps": [ { @@ -1594,14 +1594,14 @@ "updated": "2026-09-20" }, "snapshot": { - "contract_version": 15, + "contract_version": 16, "generated_at": "(no Git history available)", "generator": "learning_os v3.2.0", - "schema_sha256": "sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", + "schema_sha256": "sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55", "snapshot_id": "", "source_dirty": false, - "source_fingerprint": "3d19d501ad08c6e557718a6891f14646b005b25a527b283c8d43c792f88a8eb0", - "source_revision": "001177fc67a90948242c1ea970252862fe793333", + "source_fingerprint": "cc33c20175354437a097f55f010780a34c25535cabdb11e872cf9ead6ffdf76e", + "source_revision": "48d1ef477e94d707184f67e7ab24e23acd1ca28d", "warning": "GENERATED file - do not edit; rebuilt by python tools/generate.py" }, "units": [ diff --git a/tests/scenarios/recorded/operator.bootstrap/full.json b/tests/scenarios/recorded/operator.bootstrap/full.json index d8762171..cbffd88a 100644 --- a/tests/scenarios/recorded/operator.bootstrap/full.json +++ b/tests/scenarios/recorded/operator.bootstrap/full.json @@ -7,7 +7,7 @@ "revisions_changed": {}, "session_ledger_changed": null, "stderr": "", - "stdout": "{\"capabilities\":{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"ability.context\":{\"handler\":\"ability_context\",\"cli_command\":\"ability-context\",\"kind\":\"porcelain\",\"result\":\"ability-context-v1\",\"schema\":\"system/schema/ability-context.schema.json\",\"invariants\":[\"snapshot-bound bounded global horizon with focused expansion\",\"the horizon pages at one snapshot (--offset carries the previous snapshot); every ability appears exactly once across pages, page-local edges only, off-page incident counts per row\",\"a focused --brief carries state, totals, and bounded provenance pointers (correction/conflict previews at most 20 with exact totals) without raw observation bodies or stage material rows; the paged evidence section is the complete audit history\",\"--section evidence pages complete observations in ledger order at one snapshot\",\"candidate abilities and bridges never affect readiness or evidence transfer\",\"only reviewed equivalence with a current source digest can transfer confirmed evidence under stated conditions\",\"contradictory and corrected work remains inspectable; stage completion grants nothing\",\"ability rows carry reason_codes parallel to reasons; decisions consume the structured codes, never the display prose\"]},\"material.span\":{\"handler\":\"material_span\",\"cli_command\":\"material-span\",\"kind\":\"query\",\"result\":\"material-span-v1\",\"schema\":\"system/schema/material-span.schema.json\",\"invariants\":[\"one exact registered route yields common source identity, locator, type, availability, and observed digest\",\"local extraction is on demand and bounded; remote sources are never fetched implicitly\",\"unreadable or changed bytes remain explicit and no semantic judgment is inferred\"]},\"runtime.session\":{\"handler\":\"runtime_session\",\"result\":\"runtime-session-v1\",\"schema\":\"system/schema/runtime-session.schema.json\",\"invariants\":[\"read-only snapshot-bound proposal for one explicit requirement\",\"sticky repair requires an explicit material event and the previous runtime packet, bound to its snapshot\",\"target evidence and feasibility failures stay visible\"]},\"plan.edit-context\":{\"handler\":\"plan_edit_context\",\"result\":\"plan-edit-context\",\"invariants\":[\"one unit's compact authored plan or one exact route and its stage overrides\",\"snapshot-bound; shared descriptions occur once and expected revisions are explicit\",\"an ordered batch of 1 to 20 distinct routes of one unit shares the unit snapshot and revision guards, preserves request order, and refuses atomically without a partial payload\",\"the brief lists direct analysis refs plus a related count and expansion hint; same-source-only refs list only via --include-related\",\"the brief reports a neighboring-unit source-reuse count with an explicit expansion; the full neighbor map lists only via --include-neighbors\"]},\"atlas.context\":{\"handler\":\"atlas_context\",\"result\":\"atlas-context\"},\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]},\"semantic.query\":{\"handler\":\"semantic\",\"result\":\"semantic-query\",\"invariants\":[\"one registered predicate evaluates against explicit --input k=v bindings; --list names the registry and --recipe shows the worked procedure for one class\",\"an unknown predicate names the registry instead of failing without a way forward\"]},\"note.content\":{\"handler\":\"note_read\",\"result\":\"note-content\",\"invariants\":[\"reads registered durable notes and garden seeds by stable id, without following symlinks\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.content\":{\"handler\":\"inbox_read\",\"result\":\"inbox-content\",\"invariants\":[\"reads one work/inbox file by inbox-relative name, without following symlinks\",\"non-UTF-8 drops refuse with no text read; dot-files read by exact name only\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.list\":{\"handler\":\"inbox_list\",\"result\":\"inbox-list\",\"invariants\":[\"lists work/inbox files by inbox-relative name, without reading bytes\",\"dot-files excluded; a missing inbox is empty\",\"each row reports its own age in days (age_days)\"]},\"note.search\":{\"handler\":\"search\",\"result\":\"note-content-search\",\"invariants\":[\"content mode searches complete registered durable notes and returns bounded line snippets\",\"content mode requires a nonempty query; empty-query listing is the CLI metadata search, not this capability\"]},\"material.context\":{\"handler\":\"material_context\",\"cli_command\":\"material-context\",\"kind\":\"query\",\"result\":\"material-context\",\"invariants\":[\"read-only; touches no repository file\",\"searches durable analysis notes plus the route assessments of approved unit syntheses\",\"deterministic lexical AND matching over explanation text (note title plus body); provenance frontmatter never matches; concept filter resolves declared ids and aliases; purpose, unit, and exact material narrow\",\"ranked by recorded stage use-evidence per source (positive feedback first, mismatch feedback last); ties keep stable order (notes by id, then assessments by unit and route); --include-related appends related notes under the same ranking\",\"use evidence is canonical study-map data under the snapshot guard; skipped is reported, never ranking\",\"unit-scoped analysis notes follow current source-map routes, independently of synthesis approval; direct notes share a routed file (and overlap its single stated page range when it states one); same-source-only notes are related, listed only via --include-related\",\"excerpts are bounded (8 note snippets — a title label or true file line numbers — 3 assessment fields); default 5 items, at most 20\",\"analysis-note anchors preview at most 8 per note with exact totals and clipping flags (purpose matches first); the complete index lists only via --include-anchors\",\"source freshness is observed live per result; review state and resolution are reported, never inferred\",\"empty results describe the searched records only, never the absence of an explanation\",\"continuation requires the snapshot and observations_sha256 guards; changed canonical data, observed material bytes, or normalized filters refuse mixed pages, even when an assessment remains stale\"]},\"plan.template\":{\"handler\":\"plan_template\",\"result\":\"plan-template-v1\",\"schema\":\"system/schema/plan-template.schema.json\",\"invariants\":[\"read-only; generates a record and touches no repository file\",\"always the current plan-template version, never a copy of an existing plan\",\"the generated record is validated against its own domain schema before it is answered\",\"curriculum requires unit_id and module_id\"]},\"project.list\":{\"handler\":\"project_list\",\"result\":\"project-list\"},\"project.inspect\":{\"handler\":\"inspect\",\"result\":\"record\"},\"health.report\":{\"handler\":\"health_report\",\"result\":\"health-report-v1\",\"schema\":\"system/schema/health-report.schema.json\",\"invariants\":[\"read-only and on demand; no watcher or daemon\",\"reports owner and remedy for every check\"]},\"backup.manifest\":{\"handler\":\"backup_manifest\",\"result\":\"backup-manifest-v1\",\"schema\":\"system/schema/backup-manifest.schema.json\",\"invariants\":[\"hashes only producer-declared allowlisted roots\",\"never follows symlinks or includes sibling directories implicitly\",\"read-only and does not configure Time Machine\"]},\"legacy.archive.inspect\":{\"handler\":\"legacy_archive_inspect\",\"result\":\"legacy-archive-lock-v1\",\"schema\":\"system/schema/legacy-archive-lock.schema.json\",\"invariants\":[\"reads only exact reviewed safe paths; there is no recursive discovery\",\"boundary-sensitive items are represented only by an aggregate count\",\"read-only and deliberately invoked\"]},\"legacy.archive.status\":{\"handler\":\"legacy_archive_status\",\"result\":\"legacy-archive-status-v1\",\"schema\":\"system/schema/legacy-archive-status.schema.json\",\"invariants\":[\"reads the last approved lock without rescanning Legacy\",\"absent from normal manifest and search\"]},\"masters-planning.dashboard\":{\"handler\":\"masters_planning_dashboard\",\"result\":\"masters-planning-dashboard-v1\",\"schema\":\"system/schema/masters-planning-dashboard.schema.json\",\"invariants\":[\"requires an explicit planning access gesture\",\"reads only the sanitized catalog and approved comparisons\",\"absent from normal manifest, search, workload, deadlines, recommendations, and ordinary AI\"]}},\"commands\":{\"ability.candidate.append\":{\"handler\":\"ability_candidate_append\",\"cli_command\":\"ability-candidate-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/ability-candidates.jsonl\"],\"invariants\":[\"appends a provenance-linked tentative connection between known abilities\",\"never changes a reviewed bridge or contributes to readiness or evidence transfer\",\"snapshot and candidate-ledger revision are guarded by a V2 receipt\"]},\"learner.ability-observation.append\":{\"handler\":\"ability_observation_append\",\"cli_command\":\"ability-observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"work/active/*/ability-observations.jsonl\"],\"invariants\":[\"appends only a learner-confirmed precise claim linked to actual work and a confirmation pointer\",\"ability identity must be active and reviewed; evidence binds to its claim, conditions, and criteria hash\",\"corrections preserve prior observations and conflicting work stays visible\",\"snapshot and workspace revision are guarded by a V2 receipt\"]},\"learner.observation.append\":{\"handler\":\"observation_append\",\"cli_command\":\"observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/active/*/observations.jsonl\"],\"invariants\":[\"append only to the registered active workspace's evidence ledger\",\"requirement resolves within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve historical evidence\",\"learner observations never update concept or source semantics\"]},\"learner.stage-result.append\":{\"handler\":\"stage_result\",\"cli_command\":\"stage-result\",\"kind\":\"command\",\"writes\":[\"work/active/*/stage-results.jsonl\"],\"invariants\":[\"append only to the registered active workspace's untargeted-result ledger\",\"unit and stage resolve to the unit's current study map within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve history\",\"untargeted rows never grant requirement, ability, or concept credit and are never retro-credited\"]},\"route.patch\":{\"handler\":\"route_patch\",\"cli_command\":\"route-patch\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/unit.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"one exact route in one owning unit; only declared descriptive material fields\",\"source selections and identical legacy mirrors synchronize; stage overrides are preserved\",\"snapshot and all affected logical revisions are guarded, including maps changed by inheritance\",\"full validation and the warning policy are enforced inside the receipt-producing transaction, on the staged state, refusing before anything commits\",\"changing a covered route's material identity or explicitly re-judging a stale or disputed claim uses shared evidence admission and the shared lineage file revision\"],\"payload_records\":{\"claim_evidence\":{\"description\":\"One reviewed covers claim for exactly the patched route; local readable material requires a matching excerpt at an explicit page or transcript window. Excerpts remain outside tracked output.\",\"accepted\":[\"claim_id\",\"evidence\",\"reads\"],\"required\":[\"claim_id\",\"evidence\"],\"types\":{\"claim_id\":\"string\",\"evidence\":\"array\",\"reads\":\"object\"},\"fields\":{\"evidence\":{\"type\":\"array\",\"min_items\":1,\"items\":{\"type\":\"object\",\"accepted\":[\"kind\",\"ref\",\"text\",\"page\",\"page_end\",\"window\",\"node\",\"note\"],\"required\":[\"kind\",\"ref\"],\"types\":{\"kind\":\"string\",\"ref\":\"string\",\"text\":\"string\",\"page\":\"integer\",\"page_end\":\"integer\",\"window\":\"string\",\"node\":\"string\",\"note\":\"string\"}}}}},\"changes\":{\"description\":\"A nonempty map of declared descriptive material fields to their new text; keys outside this list refuse, and empty text refuses.\",\"accepted\":[\"title\",\"locator\",\"angle\",\"angle_detail\",\"url\",\"vault_path\"],\"min_properties\":1,\"types\":{\"title\":\"string\",\"locator\":\"string\",\"angle\":\"string\",\"angle_detail\":\"string\",\"url\":\"string\",\"vault_path\":\"string\"}}}},\"module.materials.compact\":{\"handler\":\"module_materials_compact\",\"cli_command\":\"module-materials-compact\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\"],\"invariants\":[\"one module; exact route identity or unambiguous source/title/locator guards only\",\"identical fields become explicit references; every expanded study map is unchanged\",\"persisted route identities and compact maps commit together under the reviewed plan hash\",\"ambiguous or independent resources remain inline; no ordering, progress or teaching judgment changes\"]},\"concept.relations.change\":{\"handler\":\"concept_relations_change\",\"cli_command\":\"concept-relations-change\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/concept-relations.yaml\",\"knowledge/concept-relations/**\"],\"invariants\":[\"only explicitly supplied add, replace or remove operations; no inferred relations\",\"exact previous rows, snapshot and registry revision guard changes\",\"duplicates, unknown endpoints and prerequisite cycles fail atomically\"],\"payload_records\":{\"change\":{\"description\":\"Exactly one operations list of 1 to 50 explicit operations; each names its action and carries the exact old/new rows that action needs (add: new; replace: old and new; remove: old).\",\"accepted\":[\"operations\"],\"required\":[\"operations\"],\"fields\":{\"operations\":{\"type\":\"array\",\"min_items\":1,\"max_items\":50,\"items\":{\"accepted\":[\"action\",\"old\",\"new\"],\"required\":[\"action\"],\"types\":{\"action\":\"string\"}}}}}}},\"atlas.question.save\":{\"handler\":\"atlas_question_save\",\"cli_command\":\"atlas-question-save\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"learner wording and original target are preserved\",\"open and resolved describe a personal question, never mastery or task completion\"]},\"capture.create\":{\"handler\":\"capture\",\"cli_command\":\"capture\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/inbox/**\"],\"invariants\":[\"no automatic routing\",\"original input is preserved\",\"external file input is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 content is inline or hash-bound and never comes from stdin\"]},\"inbox.resolve\":{\"handler\":\"inbox_resolve\",\"cli_command\":\"inbox-resolve\",\"kind\":\"command\",\"writes\":[\"work/inbox/**\",\"archive/inbox/**\"],\"invariants\":[\"moves one named drop, or one file inside a drop folder, to archive/inbox/YYYY/ byte-identical\",\"the drop's SHA-256 must match the bytes read; a changed drop refuses\",\"routed_to names every destination that received the drop and is recorded on the receipt\",\"snapshot and touched-path revisions guarded; the archive never overwrites\"]},\"ai-action.delivery.apply\":{\"handler\":\"ai_action_apply_delivery\",\"cli_command\":\"ai-action-apply-delivery\",\"kind\":\"command\",\"writes\":[\"operations/ai-actions/requests/**\"],\"invariants\":[\"GatewayEnvelopeV2 with approved-delivery authority is required\",\"approval binds the imported delivery record and every referenced artifact by SHA-256\",\"canonical destinations retain their narrow domain-capability write authorities\",\"request completion and canonical writes commit atomically with one ReceiptV2\"],\"payload_records\":{\"artifact_sha256\":{\"description\":\"Free-form map of every artifact_ref to its exact SHA-256 digest.\",\"freeform\":true}}},\"garden.seed.create\":{\"handler\":\"garden_seed_create\",\"cli_command\":\"garden-seed-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/garden/**\"],\"invariants\":[\"no automatic classification or routing\",\"original seed text is preserved\",\"no AI is required\"]},\"module.attempt.record\":{\"handler\":\"module_attempt\",\"cli_command\":\"module-attempt\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; appends a new attempts row or updates the row for the same termin\",\"termin, date, result and optional grade/notes record Aram's stated exam fact; no plan contract or source map\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.sitting.update\":{\"handler\":\"module_sitting\",\"cli_command\":\"module-sitting\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; sets the examination sitting's withdrawal_deadline for one termin, nothing else\",\"the termin must already have a sitting; notes, attempts and every other sitting field are untouched\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.create\":{\"handler\":\"module_create\",\"cli_command\":\"module-create\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\"],\"invariants\":[\"creates one module record and its source map; it never edits an existing module\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the module's artifact revision is registered from birth\"]},\"collection.create\":{\"handler\":\"collection_create\",\"cli_command\":\"collection-create\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"creates one source collection file; it never edits an existing collection\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed file bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the collection's artifact revision is registered from birth\"]},\"program.semester.update\":{\"handler\":\"program_semester_update\",\"cli_command\":\"program-semester-update\",\"kind\":\"command\",\"writes\":[\"curriculum/programs/**\"],\"invariants\":[\"turns one semester-bound program's current semester; it never rolls the term forward on its own\",\"the reviewed package names the semester that becomes current; the previous one becomes previous, and no semester record is dropped\",\"only the program record is written — exam outcomes, registrations, learner state and study work are untouched\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"snapshot and program revision guarded, with one V2 receipt\"]},\"module.plan.import\":{\"handler\":\"module_plan_import\",\"cli_command\":\"module-plan-import\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/quarantine/masters-planning/catalog.yaml\",\"curriculum/quarantine/masters-planning/promotions/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one module\",\"preflight required\",\"external plan files are bound to their exact bytes by SHA-256 before use\",\"changed route-covers edges carry admitted evidence or refuse; admitted records persist atomically\"],\"payload_records\":{\"promotion\":{\"description\":\"Inline MasterPlanning promotion package; the accepted fields are the full promotion record governed by system/schema/master-planning-promotion.schema.json.\",\"record_schema\":\"system/schema/master-planning-promotion.schema.json\"}}},\"lineage.restamp\":{\"handler\":\"lineage_restamp\",\"cli_command\":\"lineage-restamp\",\"kind\":\"command\",\"writes\":[\"operations/transactions/lineage.yaml\"],\"invariants\":[\"only supported old-shape route-covers claims; withdrawn, contested and already-narrowed claims refuse\",\"every listed claim re-verified stampable against fresh analysis at apply; a claim whose route row or covered nodes differ from the judged state refuses, listed or not\",\"evidence, judge, admission, status and review state pass through untouched; the prior record rides as supersedes with restamped_by/restamped_on\",\"the approval binds the exact claim list by SHA-256 plus the snapshot and ledger guards\",\"the narrowed ledger commits atomically with one receipt\"]},\"note.analysis.save\":{\"handler\":\"note_analysis_save\",\"cli_command\":\"note-analysis-save\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical requests replay without a second note; id collision with different analysis refuses\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"analysis\":{\"description\":\"Accepted analysis input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"binding\"],\"required\":[\"id\",\"title\",\"path\",\"binding\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\"},\"fields\":{\"binding\":{\"type\":\"object\",\"description\":\"Provenance binding per the material_analysis record in system/schema/note.schema.json (frozen_input_sha256/bytes are derived by note-analysis-prepare, never drafted).\"}}}}},\"note.analysis.save_batch\":{\"handler\":\"note_analysis_save_batch\",\"cli_command\":\"note-analysis-save-batch\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"bounded to 1 to 20 notes per batch; every item carries an analysis record and a SHA-256-bound body file\",\"every item is validated before any note is written; one failure refuses the whole batch\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical notes replay without a second write; id collision with different analysis refuses the batch\",\"one transaction and one receipt cover the complete batch\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"]},\"note.revise\":{\"handler\":\"note_revise\",\"cli_command\":\"note-revise\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"id and role remain stable\",\"explicit approval\",\"external replacement files are bound to their exact bytes by SHA-256 before use\"]},\"note.evidence.add\":{\"handler\":\"note_evidence\",\"cli_command\":\"note-evidence\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"note body is never modified\",\"evidence is append-only\",\"existing entries are never rewritten or removed\"]},\"note.create\":{\"handler\":\"note_create\",\"cli_command\":\"note-create\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match the approved SHA-256\",\"filename is always the note id; id collision refuses and updates go through note.revise\",\"reference and question roles keep their dedicated capabilities and refuse here\",\"superseded notes must exist and are marked deprecated in the same transaction\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"note\":{\"description\":\"Accepted note input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"role\",\"concepts\",\"sources\",\"contexts\",\"supersedes\"],\"required\":[\"id\",\"title\",\"path\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\",\"role\":\"string\",\"concepts\":[\"array\",\"null\"],\"sources\":[\"array\",\"null\"],\"contexts\":[\"array\",\"null\"],\"supersedes\":[\"array\",\"null\"]}}}},\"unit.plan.revise\":{\"handler\":\"unit_plan_revise\",\"cli_command\":\"unit-plan-revise\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one existing unit\",\"compact patch names only what changes; unrelated routes are carried forward internally\",\"route add/update/remove operations use stable IDs and reject ambiguity\",\"when the unit already has a material-synthesis dossier, route additions, removals and evidential changes require a replacement dossier validated against staged state; without an existing dossier no replacement is required\",\"context-dependent changes require documented acknowledgments\",\"artifact IDs cover exactly the semantic owners the revision touches\",\"external revision files are bound to their exact bytes by SHA-256 before use\",\"one transaction and one receipt cover the complete revision\"],\"payload_records\":{\"record\":{\"description\":\"Compact revision naming only what changes: the v1 plan_contract coverage audit, route add/update/remove ops, the reviewed final study map, and an optional replacement dossier.\",\"accepted\":[\"unit_id\",\"plan_contract\",\"route_changes\",\"study_map\",\"material_synthesis\",\"claim_evidence\",\"acknowledgments\"],\"required\":[\"plan_contract\"],\"types\":{\"unit_id\":\"string\",\"plan_contract\":\"object\",\"route_changes\":[\"object\",\"null\"],\"study_map\":[\"object\",\"null\"],\"material_synthesis\":[\"object\",\"null\"],\"claim_evidence\":[\"array\",\"null\"],\"acknowledgments\":[\"array\",\"null\"]}}}},\"unit.map.import\":{\"handler\":\"unit_map_import\",\"cli_command\":\"unit-map-import\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"bounded to one unit\",\"external map files are bound to their exact bytes by SHA-256 before use\"]},\"unit.note.append\":{\"handler\":\"unit_note\",\"cli_command\":\"unit-note\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"session-level append\",\"failed save preserves caller draft\",\"every external attachment is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"unit.source-selection.set\":{\"handler\":\"unit_source_selection\",\"cli_command\":\"unit-source-selection\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**/unit.yaml\"],\"invariants\":[\"selection must match a rich route on the same unit\",\"complete material menu is unchanged\",\"a selection used by a study path cannot be removed implicitly\"]},\"unit.material-synthesis.publish\":{\"handler\":\"unit_material_synthesis_publish\",\"cli_command\":\"unit-material-synthesis-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"every current rich route is assessed exactly once\",\"current and prerequisite routes are deep-reviewed\",\"whole-dossier approval and revision guards are required\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full dossier record governed by system/schema/unit-material-synthesis.schema.json.\",\"record_schema\":\"system/schema/unit-material-synthesis.schema.json\"}}},\"legacy.archive.lock.publish\":{\"handler\":\"legacy_archive_lock_publish\",\"cli_command\":\"legacy-archive-lock-publish\",\"kind\":\"command\",\"writes\":[\"operations/legacy/archive-lock.yaml\"],\"invariants\":[\"reviewed allowlist-only evidence\",\"excluded boundary entries contain no paths or hashes\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full lock record governed by system/schema/legacy-archive-lock.schema.json.\",\"record_schema\":\"system/schema/legacy-archive-lock.schema.json\"}}},\"masters-planning.catalog.update\":{\"handler\":\"masters_planning_catalog_update\",\"cli_command\":\"masters-planning-catalog-update\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/catalog.yaml\"],\"invariants\":[\"academic-only sanitized input\",\"prospective ids never masquerade as canonical ids\",\"revision guarded and explicitly approved\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full catalog record governed by system/schema/master-planning-catalog.schema.json.\",\"record_schema\":\"system/schema/master-planning-catalog.schema.json\"}}},\"masters-planning.comparison.publish\":{\"handler\":\"masters_planning_comparison_publish\",\"cli_command\":\"masters-planning-comparison-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/comparisons/**\"],\"invariants\":[\"bounded to one selected candidate module\",\"all selected sources are assessed exactly once\",\"no scores, schedules, or time recommendations\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full comparison record governed by system/schema/candidate-source-comparison.schema.json.\",\"record_schema\":\"system/schema/candidate-source-comparison.schema.json\"}}},\"stage.note.write\":{\"handler\":\"stage_note\",\"cli_command\":\"stage-note\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/stages/**\"],\"invariants\":[\"one stage's working note; OPERATOR \\\"Capture routing\\\" uses it for log: captures\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]},\"stage.attachment.add\":{\"handler\":\"stage_attach\",\"cli_command\":\"stage-attach\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"source.feedback.record\":{\"handler\":\"source_feedback\",\"cli_command\":\"source-feedback\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"feedback is contextual\",\"source identity is unchanged\"]},\"source.intake.record\":{\"handler\":\"source_intake_record\",\"cli_command\":\"source-intake\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\"],\"invariants\":[\"creates a metadata-only source or corrects intake-owned fields of an existing one\",\"source identity is stable; evaluations, topics, material and every route, selection, note, feedback and observation are unchanged\",\"a check run returns the field-level diff; apply is bound to that diff's hash, the snapshot and each record's revision\",\"explicitly approved; one transaction and one receipt cover the batch\"],\"payload_records\":{\"record\":{\"description\":\"Batch of 1 to 20 intake rows; each row is a create or a correct carrying only its action's allowlisted fields, and the handler refuses a create-only field on a correct.\",\"accepted\":[\"records\"],\"required\":[\"records\"],\"fields\":{\"records\":{\"type\":\"array\",\"min_items\":1,\"max_items\":20,\"items\":{\"accepted\":[\"action\",\"id\",\"partition\",\"title\",\"type\",\"authors\",\"organization\",\"year\",\"url\",\"identifiers\",\"discovery\",\"thematic_group_ids\",\"remove_url\",\"remove_identifiers\"],\"required\":[\"action\",\"id\"],\"types\":{\"action\":\"string\",\"id\":\"string\",\"partition\":\"string\",\"type\":\"string\",\"title\":[\"string\",\"null\"],\"discovery\":[\"object\",\"null\"],\"thematic_group_ids\":[\"array\",\"null\"],\"remove_url\":[\"boolean\",\"null\"],\"remove_identifiers\":\"array\",\"identifiers\":[\"object\",\"null\"]}}}}}}},\"collection.entry.revise\":{\"handler\":\"collection_entry_revise\",\"cli_command\":\"collection-entry-revise\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"revises the why of one existing entry in one existing collection, addressed by filename stem and source id\",\"entry order, groups, sources and all other content are unchanged; empty, multi-line and no-op lines are refused\",\"a check run returns the old and proposed line; apply is bound to that diff's hash, the snapshot and the collection's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Revises one entry's why line, addressed by collection stem and source id; only why is written here.\",\"accepted\":[\"collection\",\"source\",\"why\"],\"required\":[\"collection\",\"source\",\"why\"],\"types\":{\"collection\":\"string\",\"source\":\"string\",\"why\":\"string\"}}}},\"source.record.revise\":{\"handler\":\"source_record_revise\",\"cli_command\":\"source-revise\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"attaches verified local material to one existing source, with an optional explicit evaluation replacement\",\"source identity and intake-owned fields are stable; topics, routes, selections, notes, feedback and observations are unchanged\",\"live bytes must match both the request hash and the materials manifest; the URI authority must be the source id and resolve through the runtime root; a held different material is never silently replaced\",\"when the attach moves an approved dossier's material basis, a reviewed replacement validated against the staged state ships in the same transaction; affected units join the diff and the revision guards\",\"replacement and rebased dossiers carry prospective freshness lineage bound to their new bytes and staged basis in the same transaction; existing lineage is retained as superseded provenance\",\"a reviewed rebase shortcut exists only when every moved route is screened, evidence-free, analysis-free and outside every comparison, and only material_checksums moves; it replays basis plus new provenance without echoing unchanged assessments, and every other case keeps the full replacement\",\"a check run returns the field-level diff with referring routes, bound dossiers, affected units and referring collection entries; apply is bound to that diff's hash, the snapshot and each touched record's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Attaches verified local material and/or replaces evaluations; identity and every intake-owned field stay with source.intake.record.\",\"accepted\":[\"id\",\"material\",\"material_sha256\",\"evaluations\",\"material_syntheses\",\"dossier_rebases\"],\"required\":[\"id\"],\"types\":{\"id\":\"string\",\"material\":\"string\",\"material_sha256\":[\"string\",\"null\"]}}}},\"detour.create\":{\"handler\":\"detour_create\",\"cli_command\":\"detour-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"return stage is explicit\"]},\"detour.resolve\":{\"handler\":\"detour_resolve\",\"cli_command\":\"detour-resolve\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"returns to originating stage\"]},\"review.prepare\":{\"handler\":\"shelving_prepare\",\"cli_command\":\"shelving-prepare\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"preparation never applies proposed canonical changes\",\"external proposal items are bound to their exact bytes by SHA-256 before use\"]},\"review.apply\":{\"handler\":\"shelving_apply\",\"cli_command\":\"shelving-apply\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/notes/**\",\"knowledge/garden/**\",\"curriculum/modules/**/units/**\"],\"invariants\":[\"explicit approval\",\"selected proposal is atomic\"]},\"path.note.write\":{\"handler\":\"path_note\",\"cli_command\":\"path-note\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"workspace-owned scratch only\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"path.progress.update\":{\"handler\":\"path_progress\",\"cli_command\":\"path-progress\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active stage\"]},\"path.attachment.add\":{\"handler\":\"path_attach\",\"cli_command\":\"path-attach\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"coordination.section.revise\":{\"handler\":\"coordination_section_revise\",\"cli_command\":\"coordination-section-revise\",\"kind\":\"command\",\"writes\":[\"work/COORDINATION.md\"],\"invariants\":[\"one existing coordination section; frontmatter and other section content are preserved\",\"reviewed text is envelope-inline and bound to the exact previous file SHA-256, snapshot and coordination revision\",\"preflight exposes before and after text; blank replacements, ambiguous sections and new section headings refuse\",\"no academic administrative record or learner evidence is changed\"]},\"workspace.next-action.update\":{\"handler\":\"workspace_next_action\",\"cli_command\":\"workspace-next-action\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active workspace; archived or non-active workspaces refuse\",\"only the Next Action section content changes; section editing is fence-aware and frontmatter is preserved\",\"GatewayEnvelopeV2 carries the action text inline and never reads it from stdin\"]},\"project.create\":{\"handler\":\"project_create\",\"cli_command\":\"project-create\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"new id only\",\"project schema v1\",\"no module mutation\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}},\"project.update\":{\"handler\":\"project_update\",\"cli_command\":\"project-update\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"id and type remain stable\",\"revision guarded\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\"},\"snapshot\":{\"contract_version\":15,\"generated_at\":\"(no Git history available)\",\"generator\":\"learning_os v3.2.0\",\"schema_sha256\":\"sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f\",\"snapshot_id\":\"\",\"source_dirty\":false,\"source_fingerprint\":\"3d19d501ad08c6e557718a6891f14646b005b25a527b283c8d43c792f88a8eb0\",\"source_revision\":\"001177fc67a90948242c1ea970252862fe793333\",\"warning\":\"GENERATED file - do not edit; rebuilt by python tools/generate.py\"},\"programs\":[{\"default\":true,\"id\":\"program-bachelors\",\"kind\":\"academic\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"revision\":0,\"semester_bound\":true,\"semesters\":[{\"id\":\"semester-sose-2026\",\"order\":1,\"status\":\"current\",\"title\":\"SoSe 2026\"}],\"status\":\"active\",\"title\":\"Bachelor’s\",\"type\":\"program\"}],\"modules\":[{\"administrative_status\":\"enrolled\",\"area_id\":\"program-bachelors\",\"attempts\":[{\"date\":\"2026-07-27\",\"result\":\"withdrawn\",\"termin\":1},{\"date\":\"2026-10-09\",\"result\":\"registered\",\"termin\":2}],\"code\":null,\"components\":[],\"credits\":null,\"examination\":{\"registration_windows\":[{\"action\":\"Register via AGNES.\",\"closes\":\"2026-09-10\",\"label\":\"2.-PZ Anmeldung\",\"opens\":\"2026-08-31\",\"termins\":[2]}],\"sittings\":[{\"date\":\"2000-01-01\",\"label\":\"Elapsed sitting with no attempt\",\"termin\":3},{\"date\":\"2026-10-09\",\"label\":\"2. Termin\",\"termin\":2,\"time\":\"13:00-16:00\"}],\"type\":\"klausur\"},\"grade\":null,\"id\":\"module-demo\",\"institution\":\"HU Berlin\",\"is_actionable\":true,\"kind\":\"academic\",\"operational_state\":\"active\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"revision\":0,\"semester\":\"sose-2026\",\"source_map\":\"source-map.yaml\",\"status\":\"enrolled\",\"thematic_group_ids\":[],\"title\":\"Demo Module\",\"type\":\"module\",\"unit_order\":[\"unit-demo-l01\",\"unit-demo-l02\"]}],\"projects\":[{\"boundaries\":{\"confidentiality\":\"private\",\"external_code_access\":\"approved\"},\"id\":\"project-demo\",\"linked_module_ids\":[\"module-demo\"],\"milestone_ids\":[],\"objective\":\"Demonstrate the shadow graph.\",\"path\":\"projects/registry/project-demo.yaml\",\"project_type\":\"software\",\"relationship_ids\":[\"relationship-demo\"],\"revision\":0,\"root_uri\":\"project://demo\",\"schema_version\":1,\"status\":\"active\",\"thematic_group_ids\":[],\"title\":\"Demo project\",\"type\":\"project\",\"unit_ids\":[\"unit-demo-l01\"],\"workspace_ids\":[\"workspace-demo\"]}],\"units\":[{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"current_study_map\":\"study-map-demo-l01\",\"id\":\"unit-demo-l01\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"id\":\"knowledge-demo-outcomes\",\"summary\":\"A random variable assigns a number to each outcome.\",\"title\":\"Outcome values\"},{\"builds_on\":[\"knowledge-demo-outcomes\"],\"concept_ids\":[\"concept-expected-value\"],\"id\":\"knowledge-demo-expectation\",\"summary\":\"Expectation weights every value by its probability.\",\"title\":\"Probability-weighted average\"}],\"summary\":\"Expected value connects outcome values to their probabilities.\"},\"module_id\":\"module-demo\",\"needs_study_map\":false,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":1,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"project_ids\":[\"project-demo\"],\"revision\":3,\"scope\":\"The lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 1\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-01.pdf\",\"purpose\":\"Current derivation\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Expected value\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]},{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"id\":\"unit-demo-l02\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"concept_ids\":[\"concept-variance\"],\"id\":\"knowledge-demo-variance\",\"summary\":\"Variance weights squared deviations by probability.\",\"title\":\"Spread around the mean\"}],\"summary\":\"Variance measures the spread around the expected value.\"},\"module_id\":\"module-demo\",\"needs_study_map\":true,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":2,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"project_ids\":[],\"revision\":0,\"scope\":\"The follow-up lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 2\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-02.pdf\",\"purpose\":\"Follow-up derivation\",\"route_id\":\"route-7d42915c4988c513e6caa207\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Variance\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]}],\"active_study_maps\":[{\"current_stage\":\"stage-demo\",\"detours\":[],\"id\":\"study-map-demo-l01\",\"module_id\":\"module-demo\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"revision\":0,\"shelving\":{\"state\":\"none\"},\"source_plan\":{\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"provenance\":\"operator\"},\"stages\":[{\"attachments\":[],\"done_when\":[\"Explain the derivation.\"],\"id\":\"stage-demo\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Derive and explain expected value.\",\"resources\":[{\"id\":\"resource-demo-book-ch01\",\"kind\":\"read\",\"label\":\"Demo Book §1\",\"locator\":\"§1\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"id\":\"resource-demo-book-appendix\",\"kind\":\"read\",\"label\":\"Demo Book Appendix\",\"locator\":\"Appendix A\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"kind\":\"watch\",\"label\":\"Demo companion video\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"angle\":\"Derives the weighted sum and works a discrete example.\",\"id\":\"resource-demo-route-mirror\",\"kind\":\"read\",\"label\":\"Demo book — expected-value derivation\",\"locator\":\"lecture-01.pdf\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/lecture-01.pdf\",\"material_uri\":\"material://source-demo-book/lecture-01.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"active\",\"title\":\"Derive expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\"},{\"attachments\":[],\"done_when\":[\"Work the example.\"],\"id\":\"stage-demo-pending\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Apply expected value to a worked example.\",\"resources\":[{\"kind\":\"read\",\"label\":\"Demo Book §2\",\"locator\":\"§2\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"pending\",\"title\":\"Apply expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\"}],\"status\":\"active\",\"type\":\"study-map\",\"unit_id\":\"unit-demo-l01\"}],\"resume_pointer\":{\"module_id\":\"module-demo\",\"stage_id\":\"stage-demo\",\"study_map_id\":\"study-map-demo-l01\",\"type\":\"resume-pointer\",\"unit_id\":\"unit-demo-l01\",\"updated\":\"2026-09-20\"},\"next\":\"Resume the pointer or choose any visible module and unit.\"}\n", + "stdout": "{\"capabilities\":{\"contract_version\":2,\"capability_contract_version\":2,\"cli_protocol\":6,\"gateway\":\"tools/los.py\",\"projection\":\"generated/manifest.json\",\"operator_contract\":\"system/OPERATOR.md\",\"queries\":{\"ability.context\":{\"handler\":\"ability_context\",\"cli_command\":\"ability-context\",\"kind\":\"porcelain\",\"result\":\"ability-context-v1\",\"schema\":\"system/schema/ability-context.schema.json\",\"invariants\":[\"snapshot-bound bounded global horizon with focused expansion\",\"the horizon pages at one snapshot (--offset carries the previous snapshot); every ability appears exactly once across pages, page-local edges only, off-page incident counts per row\",\"a focused --brief carries state, totals, and bounded provenance pointers (correction/conflict previews at most 20 with exact totals) without raw observation bodies or stage material rows; the paged evidence section is the complete audit history\",\"--section evidence pages complete observations in ledger order at one snapshot\",\"candidate abilities and bridges never affect readiness or evidence transfer\",\"only reviewed equivalence with a current source digest can transfer confirmed evidence under stated conditions\",\"contradictory and corrected work remains inspectable; stage completion grants nothing\",\"ability rows carry reason_codes parallel to reasons; decisions consume the structured codes, never the display prose\"]},\"material.span\":{\"handler\":\"material_span\",\"cli_command\":\"material-span\",\"kind\":\"query\",\"result\":\"material-span-v1\",\"schema\":\"system/schema/material-span.schema.json\",\"invariants\":[\"one exact registered route yields common source identity, locator, type, availability, and observed digest\",\"local extraction is on demand and bounded; remote sources are never fetched implicitly\",\"unreadable or changed bytes remain explicit and no semantic judgment is inferred\"]},\"runtime.session\":{\"handler\":\"runtime_session\",\"result\":\"runtime-session-v1\",\"schema\":\"system/schema/runtime-session.schema.json\",\"invariants\":[\"read-only snapshot-bound proposal for one explicit requirement\",\"sticky repair requires an explicit material event and the previous runtime packet, bound to its snapshot\",\"target evidence and feasibility failures stay visible\"]},\"plan.edit-context\":{\"handler\":\"plan_edit_context\",\"result\":\"plan-edit-context\",\"invariants\":[\"one unit's compact authored plan or one exact route and its stage overrides\",\"snapshot-bound; shared descriptions occur once and expected revisions are explicit\",\"an ordered batch of 1 to 20 distinct routes of one unit shares the unit snapshot and revision guards, preserves request order, and refuses atomically without a partial payload\",\"the brief lists direct analysis refs plus a related count and expansion hint; same-source-only refs list only via --include-related\",\"the brief reports a neighboring-unit source-reuse count with an explicit expansion; the full neighbor map lists only via --include-neighbors\"]},\"atlas.context\":{\"handler\":\"atlas_context\",\"result\":\"atlas-context\"},\"operator.bootstrap\":{\"handler\":\"bootstrap\",\"result\":\"bootstrap\",\"invariants\":[\"compact mode returns bounded summary pages with snapshot-bound continuation\",\"brief mode returns one session-entry page with resume, counts, owed study maps, resumable stages, deadlines, domain glance, and runnable expands\",\"full material routes remain available through inspect; no source or angle is removed\"]},\"semantic.query\":{\"handler\":\"semantic\",\"result\":\"semantic-query\",\"invariants\":[\"one registered predicate evaluates against explicit --input k=v bindings; --list names the registry and --recipe shows the worked procedure for one class\",\"an unknown predicate names the registry instead of failing without a way forward\"]},\"note.content\":{\"handler\":\"note_read\",\"result\":\"note-content\",\"invariants\":[\"reads registered durable notes and garden seeds by stable id, without following symlinks\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.content\":{\"handler\":\"inbox_read\",\"result\":\"inbox-content\",\"invariants\":[\"reads one work/inbox file by inbox-relative name, without following symlinks\",\"non-UTF-8 drops refuse with no text read; dot-files read by exact name only\",\"exact content segments carry snapshot and byte hash; continuation refuses changed snapshots\"]},\"inbox.list\":{\"handler\":\"inbox_list\",\"result\":\"inbox-list\",\"invariants\":[\"lists work/inbox files by inbox-relative name, without reading bytes\",\"dot-files excluded; a missing inbox is empty\",\"each row reports its own age in days (age_days)\"]},\"note.search\":{\"handler\":\"search\",\"result\":\"note-content-search\",\"invariants\":[\"content mode searches complete registered durable notes and returns bounded line snippets\",\"content mode requires a nonempty query; empty-query listing is the CLI metadata search, not this capability\"]},\"material.context\":{\"handler\":\"material_context\",\"cli_command\":\"material-context\",\"kind\":\"query\",\"result\":\"material-context\",\"invariants\":[\"read-only; touches no repository file\",\"searches durable analysis notes plus the route assessments of approved unit syntheses\",\"deterministic lexical AND matching over explanation text (note title plus body); provenance frontmatter never matches; concept filter resolves declared ids and aliases; purpose, unit, and exact material narrow\",\"ranked by recorded stage use-evidence per source (positive feedback first, mismatch feedback last); ties keep stable order (notes by id, then assessments by unit and route); --include-related appends related notes under the same ranking\",\"use evidence is canonical study-map data under the snapshot guard; skipped is reported, never ranking\",\"unit-scoped analysis notes follow current source-map routes, independently of synthesis approval; direct notes share a routed file (and overlap its single stated page range when it states one); same-source-only notes are related, listed only via --include-related\",\"excerpts are bounded (8 note snippets — a title label or true file line numbers — 3 assessment fields); default 5 items, at most 20\",\"analysis-note anchors preview at most 8 per note with exact totals and clipping flags (purpose matches first); the complete index lists only via --include-anchors\",\"source freshness is observed live per result; review state and resolution are reported, never inferred\",\"empty results describe the searched records only, never the absence of an explanation\",\"continuation requires the snapshot and observations_sha256 guards; changed canonical data, observed material bytes, or normalized filters refuse mixed pages, even when an assessment remains stale\"]},\"plan.template\":{\"handler\":\"plan_template\",\"result\":\"plan-template-v1\",\"schema\":\"system/schema/plan-template.schema.json\",\"invariants\":[\"read-only; generates a record and touches no repository file\",\"always the current plan-template version, never a copy of an existing plan\",\"the generated record is validated against its own domain schema before it is answered\",\"curriculum requires unit_id and module_id\"]},\"project.list\":{\"handler\":\"project_list\",\"result\":\"project-list\"},\"project.inspect\":{\"handler\":\"inspect\",\"result\":\"record\"},\"health.report\":{\"handler\":\"health_report\",\"result\":\"health-report-v1\",\"schema\":\"system/schema/health-report.schema.json\",\"invariants\":[\"read-only and on demand; no watcher or daemon\",\"reports owner and remedy for every check\"]},\"backup.manifest\":{\"handler\":\"backup_manifest\",\"result\":\"backup-manifest-v1\",\"schema\":\"system/schema/backup-manifest.schema.json\",\"invariants\":[\"hashes only producer-declared allowlisted roots\",\"never follows symlinks or includes sibling directories implicitly\",\"read-only and does not configure Time Machine\"]},\"legacy.archive.inspect\":{\"handler\":\"legacy_archive_inspect\",\"result\":\"legacy-archive-lock-v1\",\"schema\":\"system/schema/legacy-archive-lock.schema.json\",\"invariants\":[\"reads only exact reviewed safe paths; there is no recursive discovery\",\"boundary-sensitive items are represented only by an aggregate count\",\"read-only and deliberately invoked\"]},\"legacy.archive.status\":{\"handler\":\"legacy_archive_status\",\"result\":\"legacy-archive-status-v1\",\"schema\":\"system/schema/legacy-archive-status.schema.json\",\"invariants\":[\"reads the last approved lock without rescanning Legacy\",\"absent from normal manifest and search\"]},\"masters-planning.dashboard\":{\"handler\":\"masters_planning_dashboard\",\"result\":\"masters-planning-dashboard-v1\",\"schema\":\"system/schema/masters-planning-dashboard.schema.json\",\"invariants\":[\"requires an explicit planning access gesture\",\"reads only the sanitized catalog and approved comparisons\",\"absent from normal manifest, search, workload, deadlines, recommendations, and ordinary AI\"]}},\"commands\":{\"ability.candidate.append\":{\"handler\":\"ability_candidate_append\",\"cli_command\":\"ability-candidate-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/ability-candidates.jsonl\"],\"invariants\":[\"appends a provenance-linked tentative connection between known abilities\",\"never changes a reviewed bridge or contributes to readiness or evidence transfer\",\"snapshot and candidate-ledger revision are guarded by a V2 receipt\"]},\"learner.ability-observation.append\":{\"handler\":\"ability_observation_append\",\"cli_command\":\"ability-observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"work/active/*/ability-observations.jsonl\"],\"invariants\":[\"appends only a learner-confirmed precise claim linked to actual work and a confirmation pointer\",\"ability identity must be active and reviewed; evidence binds to its claim, conditions, and criteria hash\",\"corrections preserve prior observations and conflicting work stays visible\",\"snapshot and workspace revision are guarded by a V2 receipt\"]},\"learner.observation.append\":{\"handler\":\"observation_append\",\"cli_command\":\"observation-append\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/active/*/observations.jsonl\"],\"invariants\":[\"append only to the registered active workspace's evidence ledger\",\"requirement resolves within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve historical evidence\",\"learner observations never update concept or source semantics\"]},\"learner.stage-result.append\":{\"handler\":\"stage_result\",\"cli_command\":\"stage-result\",\"kind\":\"command\",\"writes\":[\"work/active/*/stage-results.jsonl\"],\"invariants\":[\"append only to the registered active workspace's untargeted-result ledger\",\"unit and stage resolve to the unit's current study map within the workspace's declared module or unit scope\",\"exact snapshot and workspace revision guarded; receipt and retry preserve history\",\"untargeted rows never grant requirement, ability, or concept credit and are never retro-credited\"]},\"route.patch\":{\"handler\":\"route_patch\",\"cli_command\":\"route-patch\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/unit.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"one exact route in one owning unit; only declared descriptive material fields\",\"source selections and identical legacy mirrors synchronize; stage overrides are preserved\",\"snapshot and all affected logical revisions are guarded, including maps changed by inheritance\",\"full validation and the warning policy are enforced inside the receipt-producing transaction, on the staged state, refusing before anything commits\",\"changing a covered route's material identity or explicitly re-judging a stale or disputed claim uses shared evidence admission and the shared lineage file revision\"],\"payload_records\":{\"claim_evidence\":{\"description\":\"One reviewed covers claim for exactly the patched route; local readable material requires a matching excerpt at an explicit page or transcript window. Excerpts remain outside tracked output.\",\"accepted\":[\"claim_id\",\"evidence\",\"reads\"],\"required\":[\"claim_id\",\"evidence\"],\"types\":{\"claim_id\":\"string\",\"evidence\":\"array\",\"reads\":\"object\"},\"fields\":{\"evidence\":{\"type\":\"array\",\"min_items\":1,\"items\":{\"type\":\"object\",\"accepted\":[\"kind\",\"ref\",\"text\",\"page\",\"page_end\",\"window\",\"node\",\"note\"],\"required\":[\"kind\",\"ref\"],\"types\":{\"kind\":\"string\",\"ref\":\"string\",\"text\":\"string\",\"page\":\"integer\",\"page_end\":\"integer\",\"window\":\"string\",\"node\":\"string\",\"note\":\"string\"}}}}},\"changes\":{\"description\":\"A nonempty map of declared descriptive material fields to their new text; keys outside this list refuse, and empty text refuses.\",\"accepted\":[\"title\",\"locator\",\"angle\",\"angle_detail\",\"url\",\"vault_path\"],\"min_properties\":1,\"types\":{\"title\":\"string\",\"locator\":\"string\",\"angle\":\"string\",\"angle_detail\":\"string\",\"url\":\"string\",\"vault_path\":\"string\"}}}},\"module.materials.compact\":{\"handler\":\"module_materials_compact\",\"cli_command\":\"module-materials-compact\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/source-map.yaml\",\"curriculum/modules/*/units/*/study-map.yaml\"],\"invariants\":[\"one module; exact route identity or unambiguous source/title/locator guards only\",\"identical fields become explicit references; every expanded study map is unchanged\",\"persisted route identities and compact maps commit together under the reviewed plan hash\",\"ambiguous or independent resources remain inline; no ordering, progress or teaching judgment changes\"]},\"concept.relations.change\":{\"handler\":\"concept_relations_change\",\"cli_command\":\"concept-relations-change\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/concept-relations.yaml\",\"knowledge/concept-relations/**\"],\"invariants\":[\"only explicitly supplied add, replace or remove operations; no inferred relations\",\"exact previous rows, snapshot and registry revision guard changes\",\"duplicates, unknown endpoints and prerequisite cycles fail atomically\"],\"payload_records\":{\"change\":{\"description\":\"Exactly one operations list of 1 to 50 explicit operations; each names its action and carries the exact old/new rows that action needs (add: new; replace: old and new; remove: old).\",\"accepted\":[\"operations\"],\"required\":[\"operations\"],\"fields\":{\"operations\":{\"type\":\"array\",\"min_items\":1,\"max_items\":50,\"items\":{\"accepted\":[\"action\",\"old\",\"new\"],\"required\":[\"action\"],\"types\":{\"action\":\"string\"}}}}}}},\"atlas.question.save\":{\"handler\":\"atlas_question_save\",\"cli_command\":\"atlas-question-save\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"learner wording and original target are preserved\",\"open and resolved describe a personal question, never mastery or task completion\"]},\"capture.create\":{\"handler\":\"capture\",\"cli_command\":\"capture\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"work/inbox/**\"],\"invariants\":[\"no automatic routing\",\"original input is preserved\",\"external file input is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 content is inline or hash-bound and never comes from stdin\"]},\"inbox.resolve\":{\"handler\":\"inbox_resolve\",\"cli_command\":\"inbox-resolve\",\"kind\":\"command\",\"writes\":[\"work/inbox/**\",\"archive/inbox/**\"],\"invariants\":[\"moves one named drop, or one file inside a drop folder, to archive/inbox/YYYY/ byte-identical\",\"the drop's SHA-256 must match the bytes read; a changed drop refuses\",\"routed_to names every destination that received the drop and is recorded on the receipt\",\"snapshot and touched-path revisions guarded; the archive never overwrites\"]},\"ai-action.delivery.apply\":{\"handler\":\"ai_action_apply_delivery\",\"cli_command\":\"ai-action-apply-delivery\",\"kind\":\"command\",\"writes\":[\"operations/ai-actions/requests/**\"],\"invariants\":[\"GatewayEnvelopeV2 with approved-delivery authority is required\",\"approval binds the imported delivery record and every referenced artifact by SHA-256\",\"canonical destinations retain their narrow domain-capability write authorities\",\"request completion and canonical writes commit atomically with one ReceiptV2\"],\"payload_records\":{\"artifact_sha256\":{\"description\":\"Free-form map of every artifact_ref to its exact SHA-256 digest.\",\"freeform\":true}}},\"garden.seed.create\":{\"handler\":\"garden_seed_create\",\"cli_command\":\"garden-seed-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"knowledge/garden/**\"],\"invariants\":[\"no automatic classification or routing\",\"original seed text is preserved\",\"no AI is required\"]},\"module.attempt.record\":{\"handler\":\"module_attempt\",\"cli_command\":\"module-attempt\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; appends a new attempts row or updates the row for the same termin\",\"termin, date, result and optional grade/notes record Aram's stated exam fact; no plan contract or source map\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.sitting.update\":{\"handler\":\"module_sitting\",\"cli_command\":\"module-sitting\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/*/module.yaml\"],\"invariants\":[\"one module; sets the examination sitting's withdrawal_deadline for one termin, nothing else\",\"the termin must already have a sitting; notes, attempts and every other sitting field are untouched\",\"snapshot and module revision guarded, with one V2 receipt\"]},\"module.create\":{\"handler\":\"module_create\",\"cli_command\":\"module-create\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\"],\"invariants\":[\"creates one module record and its source map; it never edits an existing module\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the module's artifact revision is registered from birth\"]},\"collection.create\":{\"handler\":\"collection_create\",\"cli_command\":\"collection-create\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"creates one source collection file; it never edits an existing collection\",\"the destination must not exist: an existing canonical identity or file is refused, because an absent revision entry cannot prove absence\",\"the reviewed file bytes are bound to their exact SHA-256 before use\",\"one transaction and one receipt cover the creation; the collection's artifact revision is registered from birth\"]},\"program.semester.update\":{\"handler\":\"program_semester_update\",\"cli_command\":\"program-semester-update\",\"kind\":\"command\",\"writes\":[\"curriculum/programs/**\"],\"invariants\":[\"turns one semester-bound program's current semester; it never rolls the term forward on its own\",\"the reviewed package names the semester that becomes current; the previous one becomes previous, and no semester record is dropped\",\"only the program record is written — exam outcomes, registrations, learner state and study work are untouched\",\"the reviewed package bytes are bound to their exact SHA-256 before use\",\"snapshot and program revision guarded, with one V2 receipt\"]},\"module.plan.import\":{\"handler\":\"module_plan_import\",\"cli_command\":\"module-plan-import\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/quarantine/masters-planning/catalog.yaml\",\"curriculum/quarantine/masters-planning/promotions/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one module\",\"preflight required\",\"external plan files are bound to their exact bytes by SHA-256 before use\",\"changed route-covers edges carry admitted evidence or refuse; admitted records persist atomically\"],\"payload_records\":{\"promotion\":{\"description\":\"Inline MasterPlanning promotion package; the accepted fields are the full promotion record governed by system/schema/master-planning-promotion.schema.json.\",\"record_schema\":\"system/schema/master-planning-promotion.schema.json\"}}},\"lineage.restamp\":{\"handler\":\"lineage_restamp\",\"cli_command\":\"lineage-restamp\",\"kind\":\"command\",\"writes\":[\"operations/transactions/lineage.yaml\"],\"invariants\":[\"only supported old-shape route-covers claims; withdrawn, contested and already-narrowed claims refuse\",\"every listed claim re-verified stampable against fresh analysis at apply; a claim whose route row or covered nodes differ from the judged state refuses, listed or not\",\"evidence, judge, admission, status and review state pass through untouched; the prior record rides as supersedes with restamped_by/restamped_on\",\"the approval binds the exact claim list by SHA-256 plus the snapshot and ledger guards\",\"the narrowed ledger commits atomically with one receipt\"]},\"note.analysis.save\":{\"handler\":\"note_analysis_save\",\"cli_command\":\"note-analysis-save\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical requests replay without a second note; id collision with different analysis refuses\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"analysis\":{\"description\":\"Accepted analysis input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"binding\"],\"required\":[\"id\",\"title\",\"path\",\"binding\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\"},\"fields\":{\"binding\":{\"type\":\"object\",\"description\":\"Provenance binding per the material_analysis record in system/schema/note.schema.json (frozen_input_sha256/bytes are derived by note-analysis-prepare, never drafted).\"}}}}},\"note.analysis.save_batch\":{\"handler\":\"note_analysis_save_batch\",\"cli_command\":\"note-analysis-save-batch\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"bounded to 1 to 20 notes per batch; every item carries an analysis record and a SHA-256-bound body file\",\"every item is validated before any note is written; one failure refuses the whole batch\",\"body bytes are preserved verbatim and must match frozen_input_sha256\",\"identical notes replay without a second write; id collision with different analysis refuses the batch\",\"one transaction and one receipt cover the complete batch\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"]},\"note.revise\":{\"handler\":\"note_revise\",\"cli_command\":\"note-revise\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"id and role remain stable\",\"explicit approval\",\"external replacement files are bound to their exact bytes by SHA-256 before use\"]},\"note.evidence.add\":{\"handler\":\"note_evidence\",\"cli_command\":\"note-evidence\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"note body is never modified\",\"evidence is append-only\",\"existing entries are never rewritten or removed\"]},\"note.create\":{\"handler\":\"note_create\",\"cli_command\":\"note-create\",\"kind\":\"command\",\"writes\":[\"knowledge/notes/**\"],\"invariants\":[\"handler owns authorship and review defaults; input can never self-promote to user-reviewed\",\"body bytes are preserved verbatim and must match the approved SHA-256\",\"filename is always the note id; id collision refuses and updates go through note.revise\",\"reference and question roles keep their dedicated capabilities and refuse here\",\"superseded notes must exist and are marked deprecated in the same transaction\",\"saving preserves bytes; it never approves coverage, adopts plans, or records mastery\"],\"payload_records\":{\"note\":{\"description\":\"Accepted note input fields, a subset of the stored note record: type/created/state/authorship/semantic_review are set by the handler (the stored shape is system/schema/note.schema.json).\",\"accepted\":[\"id\",\"title\",\"path\",\"role\",\"concepts\",\"sources\",\"contexts\",\"supersedes\"],\"required\":[\"id\",\"title\",\"path\"],\"types\":{\"id\":\"string\",\"title\":\"string\",\"path\":\"string\",\"role\":\"string\",\"concepts\":[\"array\",\"null\"],\"sources\":[\"array\",\"null\"],\"contexts\":[\"array\",\"null\"],\"supersedes\":[\"array\",\"null\"]}}}},\"unit.plan.revise\":{\"handler\":\"unit_plan_revise\",\"cli_command\":\"unit-plan-revise\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**\",\"work/active/**\",\"sources/sources.yaml\",\"sources/registry/**\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"bounded to one existing unit\",\"compact patch names only what changes; unrelated routes are carried forward internally\",\"route add/update/remove operations use stable IDs and reject ambiguity\",\"when the unit already has a material-synthesis dossier, route additions, removals and evidential changes require a replacement dossier validated against staged state; without an existing dossier no replacement is required\",\"context-dependent changes require documented acknowledgments\",\"artifact IDs cover exactly the semantic owners the revision touches\",\"external revision files are bound to their exact bytes by SHA-256 before use\",\"one transaction and one receipt cover the complete revision\"],\"payload_records\":{\"record\":{\"description\":\"Compact revision naming only what changes: the v1 plan_contract coverage audit, route add/update/remove ops, the reviewed final study map, and an optional replacement dossier.\",\"accepted\":[\"unit_id\",\"plan_contract\",\"route_changes\",\"study_map\",\"material_synthesis\",\"claim_evidence\",\"acknowledgments\"],\"required\":[\"plan_contract\"],\"types\":{\"unit_id\":\"string\",\"plan_contract\":\"object\",\"route_changes\":[\"object\",\"null\"],\"study_map\":[\"object\",\"null\"],\"material_synthesis\":[\"object\",\"null\"],\"claim_evidence\":[\"array\",\"null\"],\"acknowledgments\":[\"array\",\"null\"]}}}},\"unit.map.import\":{\"handler\":\"unit_map_import\",\"cli_command\":\"unit-map-import\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"bounded to one unit\",\"external map files are bound to their exact bytes by SHA-256 before use\"]},\"unit.note.append\":{\"handler\":\"unit_note\",\"cli_command\":\"unit-note\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"session-level append\",\"failed save preserves caller draft\",\"every external attachment is bound to its exact bytes by SHA-256 before use\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"unit.source-selection.set\":{\"handler\":\"unit_source_selection\",\"cli_command\":\"unit-source-selection\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**/unit.yaml\"],\"invariants\":[\"selection must match a rich route on the same unit\",\"complete material menu is unchanged\",\"a selection used by a study path cannot be removed implicitly\"]},\"unit.material-synthesis.publish\":{\"handler\":\"unit_material_synthesis_publish\",\"cli_command\":\"unit-material-synthesis-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"every current rich route is assessed exactly once\",\"current and prerequisite routes are deep-reviewed\",\"whole-dossier approval and revision guards are required\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full dossier record governed by system/schema/unit-material-synthesis.schema.json.\",\"record_schema\":\"system/schema/unit-material-synthesis.schema.json\"}}},\"legacy.archive.lock.publish\":{\"handler\":\"legacy_archive_lock_publish\",\"cli_command\":\"legacy-archive-lock-publish\",\"kind\":\"command\",\"writes\":[\"operations/legacy/archive-lock.yaml\"],\"invariants\":[\"reviewed allowlist-only evidence\",\"excluded boundary entries contain no paths or hashes\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full lock record governed by system/schema/legacy-archive-lock.schema.json.\",\"record_schema\":\"system/schema/legacy-archive-lock.schema.json\"}}},\"masters-planning.catalog.update\":{\"handler\":\"masters_planning_catalog_update\",\"cli_command\":\"masters-planning-catalog-update\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/catalog.yaml\"],\"invariants\":[\"academic-only sanitized input\",\"prospective ids never masquerade as canonical ids\",\"revision guarded and explicitly approved\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full catalog record governed by system/schema/master-planning-catalog.schema.json.\",\"record_schema\":\"system/schema/master-planning-catalog.schema.json\"}}},\"masters-planning.comparison.publish\":{\"handler\":\"masters_planning_comparison_publish\",\"cli_command\":\"masters-planning-comparison-publish\",\"kind\":\"command\",\"writes\":[\"curriculum/quarantine/masters-planning/comparisons/**\"],\"invariants\":[\"bounded to one selected candidate module\",\"all selected sources are assessed exactly once\",\"no scores, schedules, or time recommendations\"],\"payload_records\":{\"record\":{\"description\":\"The accepted fields are the full comparison record governed by system/schema/candidate-source-comparison.schema.json.\",\"record_schema\":\"system/schema/candidate-source-comparison.schema.json\"}}},\"stage.note.write\":{\"handler\":\"stage_note\",\"cli_command\":\"stage-note\",\"kind\":\"command\",\"writes\":[\"curriculum/modules/**/units/**/stages/**\"],\"invariants\":[\"one stage's working note; OPERATOR \\\"Capture routing\\\" uses it for log: captures\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"stage.progress.update\":{\"handler\":\"stage_progress\",\"cli_command\":\"stage-progress\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\",\"curriculum/resume.yaml\"],\"invariants\":[\"one active stage\",\"the resume pointer names the stage this action made current and commits in the same transaction\",\"other units keep their own active study maps\",\"an optional progress summary/next is recorded on the stage row with today's date\"]},\"stage.attachment.add\":{\"handler\":\"stage_attach\",\"cli_command\":\"stage-attach\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"source.feedback.record\":{\"handler\":\"source_feedback\",\"cli_command\":\"source-feedback\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"feedback is contextual\",\"source identity is unchanged\"]},\"source.intake.record\":{\"handler\":\"source_intake_record\",\"cli_command\":\"source-intake\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\"],\"invariants\":[\"creates a metadata-only source or corrects intake-owned fields of an existing one\",\"source identity is stable; evaluations, topics, material and every route, selection, note, feedback and observation are unchanged\",\"a check run returns the field-level diff; apply is bound to that diff's hash, the snapshot and each record's revision\",\"explicitly approved; one transaction and one receipt cover the batch\"],\"payload_records\":{\"record\":{\"description\":\"Batch of 1 to 20 intake rows; each row is a create or a correct carrying only its action's allowlisted fields, and the handler refuses a create-only field on a correct.\",\"accepted\":[\"records\"],\"required\":[\"records\"],\"fields\":{\"records\":{\"type\":\"array\",\"min_items\":1,\"max_items\":20,\"items\":{\"accepted\":[\"action\",\"id\",\"partition\",\"title\",\"type\",\"authors\",\"organization\",\"year\",\"url\",\"identifiers\",\"discovery\",\"thematic_group_ids\",\"remove_url\",\"remove_identifiers\"],\"required\":[\"action\",\"id\"],\"types\":{\"action\":\"string\",\"id\":\"string\",\"partition\":\"string\",\"type\":\"string\",\"title\":[\"string\",\"null\"],\"discovery\":[\"object\",\"null\"],\"thematic_group_ids\":[\"array\",\"null\"],\"remove_url\":[\"boolean\",\"null\"],\"remove_identifiers\":\"array\",\"identifiers\":[\"object\",\"null\"]}}}}}}},\"collection.entry.revise\":{\"handler\":\"collection_entry_revise\",\"cli_command\":\"collection-entry-revise\",\"kind\":\"command\",\"writes\":[\"sources/collections/**\"],\"invariants\":[\"revises the why of one existing entry in one existing collection, addressed by filename stem and source id\",\"entry order, groups, sources and all other content are unchanged; empty, multi-line and no-op lines are refused\",\"a check run returns the old and proposed line; apply is bound to that diff's hash, the snapshot and the collection's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Revises one entry's why line, addressed by collection stem and source id; only why is written here.\",\"accepted\":[\"collection\",\"source\",\"why\"],\"required\":[\"collection\",\"source\",\"why\"],\"types\":{\"collection\":\"string\",\"source\":\"string\",\"why\":\"string\"}}}},\"source.record.revise\":{\"handler\":\"source_record_revise\",\"cli_command\":\"source-revise\",\"kind\":\"command\",\"writes\":[\"sources/sources.yaml\",\"sources/registry/**\",\"curriculum/modules/**/units/**/material-synthesis.yaml\",\"operations/transactions/lineage.yaml\"],\"invariants\":[\"attaches verified local material to one existing source, with an optional explicit evaluation replacement\",\"source identity and intake-owned fields are stable; topics, routes, selections, notes, feedback and observations are unchanged\",\"live bytes must match both the request hash and the materials manifest; the URI authority must be the source id and resolve through the runtime root; a held different material is never silently replaced\",\"when the attach moves an approved dossier's material basis, a reviewed replacement validated against the staged state ships in the same transaction; affected units join the diff and the revision guards\",\"replacement and rebased dossiers carry prospective freshness lineage bound to their new bytes and staged basis in the same transaction; existing lineage is retained as superseded provenance\",\"a reviewed rebase shortcut exists only when every moved route is screened, evidence-free, analysis-free and outside every comparison, and only material_checksums moves; it replays basis plus new provenance without echoing unchanged assessments, and every other case keeps the full replacement\",\"a check run returns the field-level diff with referring routes, bound dossiers, affected units and referring collection entries; apply is bound to that diff's hash, the snapshot and each touched record's revision\",\"explicitly approved; one transaction and one receipt cover the revision\"],\"payload_records\":{\"record\":{\"description\":\"Attaches verified local material and/or replaces evaluations; identity and every intake-owned field stay with source.intake.record.\",\"accepted\":[\"id\",\"material\",\"material_sha256\",\"evaluations\",\"material_syntheses\",\"dossier_rebases\"],\"required\":[\"id\"],\"types\":{\"id\":\"string\",\"material\":\"string\",\"material_sha256\":[\"string\",\"null\"]}}}},\"detour.create\":{\"handler\":\"detour_create\",\"cli_command\":\"detour-create\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"return stage is explicit\"]},\"detour.resolve\":{\"handler\":\"detour_resolve\",\"cli_command\":\"detour-resolve\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"returns to originating stage\"]},\"review.prepare\":{\"handler\":\"shelving_prepare\",\"cli_command\":\"shelving-prepare\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"curriculum/modules/**/units/**\"],\"invariants\":[\"preparation never applies proposed canonical changes\",\"external proposal items are bound to their exact bytes by SHA-256 before use\"]},\"review.apply\":{\"handler\":\"shelving_apply\",\"cli_command\":\"shelving-apply\",\"kind\":\"command\",\"admission\":\"direct-user-gesture\",\"admission_channels\":[\"ui\"],\"writes\":[\"knowledge/notes/**\",\"knowledge/garden/**\",\"curriculum/modules/**/units/**\"],\"invariants\":[\"explicit approval\",\"selected proposal is atomic\"]},\"path.note.write\":{\"handler\":\"path_note\",\"cli_command\":\"path-note\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"workspace-owned scratch only\",\"GatewayEnvelopeV2 carries note text inline and never reads it from stdin\"]},\"path.progress.update\":{\"handler\":\"path_progress\",\"cli_command\":\"path-progress\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active stage\"]},\"path.attachment.add\":{\"handler\":\"path_attach\",\"cli_command\":\"path-attach\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"source file is copied\",\"never moved\",\"the external attachment is bound to its exact bytes by SHA-256 before use\"]},\"coordination.section.revise\":{\"handler\":\"coordination_section_revise\",\"cli_command\":\"coordination-section-revise\",\"kind\":\"command\",\"writes\":[\"work/COORDINATION.md\"],\"invariants\":[\"one existing coordination section; frontmatter and other section content are preserved\",\"reviewed text is envelope-inline and bound to the exact previous file SHA-256, snapshot and coordination revision\",\"preflight exposes before and after text; blank replacements, ambiguous sections and new section headings refuse\",\"no academic administrative record or learner evidence is changed\"]},\"workspace.next-action.update\":{\"handler\":\"workspace_next_action\",\"cli_command\":\"workspace-next-action\",\"kind\":\"command\",\"writes\":[\"work/active/**\"],\"invariants\":[\"one active workspace; archived or non-active workspaces refuse\",\"only the Next Action section content changes; section editing is fence-aware and frontmatter is preserved\",\"GatewayEnvelopeV2 carries the action text inline and never reads it from stdin\"]},\"project.create\":{\"handler\":\"project_create\",\"cli_command\":\"project-create\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"new id only\",\"project schema v1\",\"no module mutation\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}},\"project.update\":{\"handler\":\"project_update\",\"cli_command\":\"project-update\",\"kind\":\"command\",\"writes\":[\"projects/registry/*\"],\"invariants\":[\"id and type remain stable\",\"revision guarded\",\"external project files are bound to their exact bytes by SHA-256 before use\"],\"payload_records\":{\"project\":{\"description\":\"Full project record governed by system/schema/project.schema.json; schema_version defaults when omitted.\",\"record_schema\":\"system/schema/project.schema.json\",\"required\":[\"id\",\"type\",\"title\",\"project_type\",\"status\",\"root_uri\",\"objective\",\"milestone_ids\",\"linked_module_ids\",\"unit_ids\",\"workspace_ids\",\"thematic_group_ids\",\"boundaries\"]}}}},\"rules\":{\"canonical_writes_are_transactional\":true,\"successful_writes_have_receipts\":true,\"artifact_revision_conflicts_fail_closed\":true,\"shelving_requires_explicit_approval\":true,\"ordinary_interfaces_read_projection_only\":true,\"module_plan_preflight_required\":true,\"ai_actions_are_provider_independent\":true,\"bounded_ai_actions_use_exact_context\":true},\"root\":\"\"},\"snapshot\":{\"contract_version\":16,\"generated_at\":\"(no Git history available)\",\"generator\":\"learning_os v3.2.0\",\"schema_sha256\":\"sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55\",\"snapshot_id\":\"\",\"source_dirty\":false,\"source_fingerprint\":\"cc33c20175354437a097f55f010780a34c25535cabdb11e872cf9ead6ffdf76e\",\"source_revision\":\"48d1ef477e94d707184f67e7ab24e23acd1ca28d\",\"warning\":\"GENERATED file - do not edit; rebuilt by python tools/generate.py\"},\"programs\":[{\"default\":true,\"id\":\"program-bachelors\",\"kind\":\"academic\",\"path\":\"curriculum/programs/program-bachelors.yaml\",\"revision\":0,\"semester_bound\":true,\"semesters\":[{\"id\":\"semester-sose-2026\",\"order\":1,\"status\":\"current\",\"title\":\"SoSe 2026\"}],\"status\":\"active\",\"title\":\"Bachelor’s\",\"type\":\"program\"}],\"modules\":[{\"administrative_status\":\"enrolled\",\"area_id\":\"program-bachelors\",\"attempts\":[{\"date\":\"2026-07-27\",\"result\":\"withdrawn\",\"termin\":1},{\"date\":\"2026-10-09\",\"result\":\"registered\",\"termin\":2}],\"code\":null,\"components\":[],\"credits\":null,\"examination\":{\"registration_windows\":[{\"action\":\"Register via AGNES.\",\"closes\":\"2026-09-10\",\"label\":\"2.-PZ Anmeldung\",\"opens\":\"2026-08-31\",\"termins\":[2]}],\"sittings\":[{\"date\":\"2000-01-01\",\"label\":\"Elapsed sitting with no attempt\",\"termin\":3},{\"date\":\"2026-10-09\",\"label\":\"2. Termin\",\"termin\":2,\"time\":\"13:00-16:00\"}],\"type\":\"klausur\"},\"grade\":null,\"id\":\"module-demo\",\"institution\":\"HU Berlin\",\"is_actionable\":true,\"kind\":\"academic\",\"operational_state\":\"active\",\"path\":\"curriculum/modules/module-demo/module.yaml\",\"revision\":0,\"semester\":\"sose-2026\",\"source_map\":\"source-map.yaml\",\"status\":\"enrolled\",\"thematic_group_ids\":[],\"title\":\"Demo Module\",\"type\":\"module\",\"unit_order\":[\"unit-demo-l01\",\"unit-demo-l02\"]}],\"projects\":[{\"boundaries\":{\"confidentiality\":\"private\",\"external_code_access\":\"approved\"},\"id\":\"project-demo\",\"linked_module_ids\":[\"module-demo\"],\"milestone_ids\":[],\"objective\":\"Demonstrate the shadow graph.\",\"path\":\"projects/registry/project-demo.yaml\",\"project_type\":\"software\",\"relationship_ids\":[\"relationship-demo\"],\"revision\":0,\"root_uri\":\"project://demo\",\"schema_version\":1,\"status\":\"active\",\"thematic_group_ids\":[],\"title\":\"Demo project\",\"type\":\"project\",\"unit_ids\":[\"unit-demo-l01\"],\"workspace_ids\":[\"workspace-demo\"]}],\"units\":[{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"current_study_map\":\"study-map-demo-l01\",\"id\":\"unit-demo-l01\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"id\":\"knowledge-demo-outcomes\",\"summary\":\"A random variable assigns a number to each outcome.\",\"title\":\"Outcome values\"},{\"builds_on\":[\"knowledge-demo-outcomes\"],\"concept_ids\":[\"concept-expected-value\"],\"id\":\"knowledge-demo-expectation\",\"summary\":\"Expectation weights every value by its probability.\",\"title\":\"Probability-weighted average\"}],\"summary\":\"Expected value connects outcome values to their probabilities.\"},\"module_id\":\"module-demo\",\"needs_study_map\":false,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":1,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/unit.yaml\",\"project_ids\":[\"project-demo\"],\"revision\":3,\"scope\":\"The lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 1\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-01.pdf\",\"purpose\":\"Current derivation\",\"route_id\":\"route-b2f1f80014860a929a3af0bc\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Expected value\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]},{\"artifacts\":{\"ultimate_reference\":\"note-demo\"},\"id\":\"unit-demo-l02\",\"kind\":\"lecture\",\"knowledge_map\":{\"nodes\":[{\"concept_ids\":[\"concept-variance\"],\"id\":\"knowledge-demo-variance\",\"summary\":\"Variance weights squared deviations by probability.\",\"title\":\"Spread around the mean\"}],\"summary\":\"Variance measures the spread around the expected value.\"},\"module_id\":\"module-demo\",\"needs_study_map\":true,\"note_sections\":[],\"notes_text\":\"\",\"notes_updated\":null,\"order\":2,\"path\":\"curriculum/modules/module-demo/units/unit-demo-l02/unit.yaml\",\"project_ids\":[],\"revision\":0,\"scope\":\"The follow-up lecture as taught.\",\"scope_sources\":[{\"authority\":\"slides\",\"locator\":\"Lecture 2\",\"source_id\":\"source-demo-book\"}],\"source_selections\":[{\"locator\":\"lecture-02.pdf\",\"purpose\":\"Follow-up derivation\",\"route_id\":\"route-7d42915c4988c513e6caa207\",\"source_id\":\"source-demo-book\"}],\"status\":\"active\",\"title\":\"Variance\",\"type\":\"unit\",\"workspace_ids\":[\"workspace-demo\"]}],\"active_study_maps\":[{\"current_stage\":\"stage-demo\",\"detours\":[],\"id\":\"study-map-demo-l01\",\"module_id\":\"module-demo\",\"path\":\"curriculum/modules/module-demo/units/unit-demo-l01/study-map.yaml\",\"revision\":0,\"shelving\":{\"state\":\"none\"},\"source_plan\":{\"path\":\"work/active/workspace-demo/CONTEXT.md\",\"provenance\":\"operator\"},\"stages\":[{\"attachments\":[],\"done_when\":[\"Explain the derivation.\"],\"id\":\"stage-demo\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Derive and explain expected value.\",\"resources\":[{\"id\":\"resource-demo-book-ch01\",\"kind\":\"read\",\"label\":\"Demo Book §1\",\"locator\":\"§1\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"id\":\"resource-demo-book-appendix\",\"kind\":\"read\",\"label\":\"Demo Book Appendix\",\"locator\":\"Appendix A\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"kind\":\"watch\",\"label\":\"Demo companion video\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"},{\"angle\":\"Derives the weighted sum and works a discrete example.\",\"id\":\"resource-demo-route-mirror\",\"kind\":\"read\",\"label\":\"Demo book — expected-value derivation\",\"locator\":\"lecture-01.pdf\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/lecture-01.pdf\",\"material_uri\":\"material://source-demo-book/lecture-01.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"active\",\"title\":\"Derive expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo/notes.md\"},{\"attachments\":[],\"done_when\":[\"Work the example.\"],\"id\":\"stage-demo-pending\",\"notes_text\":\"\",\"notes_updated\":\"\",\"objective\":\"Apply expected value to a worked example.\",\"resources\":[{\"kind\":\"read\",\"label\":\"Demo Book §2\",\"locator\":\"§2\",\"material_exists\":true,\"material_path\":\"materials/source-demo-book/book.pdf\",\"material_uri\":\"material://source-demo-book/book.pdf\",\"source_id\":\"source-demo-book\"}],\"scope_triage\":\"required-now\",\"source_feedback\":[],\"status\":\"pending\",\"title\":\"Apply expected value\",\"working_note\":\"curriculum/modules/module-demo/units/unit-demo-l01/stages/stage-demo-pending/notes.md\"}],\"status\":\"active\",\"type\":\"study-map\",\"unit_id\":\"unit-demo-l01\"}],\"resume_pointer\":{\"module_id\":\"module-demo\",\"stage_id\":\"stage-demo\",\"study_map_id\":\"study-map-demo-l01\",\"type\":\"resume-pointer\",\"unit_id\":\"unit-demo-l01\",\"updated\":\"2026-09-20\"},\"next\":\"Resume the pointer or choose any visible module and unit.\"}\n", "stdout_json": { "active_study_maps": [ { @@ -1594,14 +1594,14 @@ "updated": "2026-09-20" }, "snapshot": { - "contract_version": 15, + "contract_version": 16, "generated_at": "(no Git history available)", "generator": "learning_os v3.2.0", - "schema_sha256": "sha256:c487c6ed2e05c05425c6b41bd291e566b16a7e1ee3af667ae00763608d7e121f", + "schema_sha256": "sha256:ff2a123d01db72982e538d7e73f21ff2fc5d2f24fb4ec9474ada834952c02c55", "snapshot_id": "", "source_dirty": false, - "source_fingerprint": "3d19d501ad08c6e557718a6891f14646b005b25a527b283c8d43c792f88a8eb0", - "source_revision": "001177fc67a90948242c1ea970252862fe793333", + "source_fingerprint": "cc33c20175354437a097f55f010780a34c25535cabdb11e872cf9ead6ffdf76e", + "source_revision": "48d1ef477e94d707184f67e7ab24e23acd1ca28d", "warning": "GENERATED file - do not edit; rebuilt by python tools/generate.py" }, "units": [ diff --git a/tests/test_agent_reporting.py b/tests/test_agent_reporting.py new file mode 100644 index 00000000..d8404ddb --- /dev/null +++ b/tests/test_agent_reporting.py @@ -0,0 +1,262 @@ +"""Disposable report retention and append-only recovery corrections.""" +from __future__ import annotations + +import json +import time +from pathlib import Path + +import pytest + +from learning_os.app.agent_reporting import ( + RETENTION_MARKER, + ReportStore, + expand_report, + prune_reports, + write_full_report, +) + + +def _run(root, parent, *, keep=False, finalize=True): + with ReportStore(root, parent, keep_report=keep) as store: + store.inputs({"steps": []}, []) + if finalize: + write_full_report(store.path, {"schema_version": 2, "steps": [], "totals": {}, + "full_report": str(store.full_path)}) + return store.path + + +def _created(path, created_ns): + marker = path / RETENTION_MARKER + data = json.loads(marker.read_text()) + data["created_ns"] = created_ns + marker.write_text(json.dumps(data)) + + +def test_new_runs_retain_the_newest_fifty(tmp_path): + parent = tmp_path / "reports" + paths = [_run(tmp_path / "root", parent) for _ in range(52)] + assert not paths[0].exists() and not paths[1].exists() + assert all(path.is_dir() for path in paths[2:]) + assert len(list(parent.iterdir())) == 50 + + +def test_retention_preserves_active_and_kept_reports(tmp_path): + parent = tmp_path / "reports" + expired = _run(tmp_path / "root", parent) + kept = _run(tmp_path / "root", parent, keep=True) + now = time.time_ns() + old = now - 15 * 24 * 60 * 60 * 1_000_000_000 + _created(expired, old) + _created(kept, old) + with ReportStore(tmp_path / "root", parent) as active: + active.inputs({"steps": []}, []) + _created(active.path, old) + prune_reports(parent, now_ns=now, max_runs=0) + assert active.path.is_dir() + assert kept.is_dir() + assert not expired.exists() + # Closed but never finalized: unresolved evidence still survives. + prune_reports(parent, now_ns=now, max_runs=0) + assert active.path.exists() and kept.is_dir() + write_full_report(active.path, {"schema_version": 2, "steps": [], "totals": {}, + "full_report": str(active.path / "full-report.json")}) + prune_reports(parent, now_ns=now, max_runs=0) + assert not active.path.exists() and kept.is_dir() + + +def test_retention_does_not_touch_unowned_or_symlinked_directories(tmp_path): + parent = tmp_path / "reports" + parent.mkdir() + unrelated = parent / "los-agent-plan-unrelated" + unrelated.mkdir() + (unrelated / "important.txt").write_text("preserve") + target = _run(tmp_path / "root", tmp_path / "elsewhere") + link = parent / "los-agent-plan-linked" + link.symlink_to(target, target_is_directory=True) + assert prune_reports(parent, max_runs=0) == [] + assert target.is_dir() and link.is_symlink() + assert (unrelated / "important.txt").read_text() == "preserve" + + +def test_unfinalized_reports_survive_retention_beyond_the_run_limit(tmp_path): + parent = tmp_path / "reports" + unfinished = [_run(tmp_path / "root", parent, finalize=False) for _ in range(3)] + completed = _run(tmp_path / "root", parent) + assert prune_reports(parent, max_runs=0) == [completed] + assert all(path.is_dir() for path in unfinished) + # A finalized report with a corrupt digest is likewise preserved. + corrupt = _run(tmp_path / "root", parent) + (corrupt / "full-report.sha256").write_text("0" * 64) + assert prune_reports(parent, max_runs=0) == [] + assert corrupt.is_dir() + + +def test_invalid_marker_is_preserved_instead_of_treated_as_legacy(tmp_path): + path = _run(tmp_path / "root", tmp_path / "reports") + (path / RETENTION_MARKER).write_text('{"kind":"other-app"}') + assert prune_reports(path.parent, max_runs=0) == [] + assert path.is_dir() + + +def test_only_finalized_digest_bound_legacy_reports_are_pruned(tmp_path): + parent = tmp_path / "reports" + completed = _run(tmp_path / "root", parent) + partial = _run(tmp_path / "root", parent, finalize=False) + corrupt = _run(tmp_path / "root", parent) + for path in (completed, partial, corrupt): + (path / RETENTION_MARKER).unlink() + (corrupt / "full-report.sha256").write_text("0" * 64) + assert prune_reports(parent, max_runs=0) == [completed] + assert partial.is_dir() and corrupt.is_dir() + + +def test_report_parent_cannot_be_inside_data_root(tmp_path): + root = tmp_path / "root" + root.mkdir() + with pytest.raises(ValueError, match="outside"): + ReportStore(root, root / "reports") + assert not (root / "reports").exists() + + +def test_correction_appends_evidence_and_detaches_mutable_rows(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + row = {"id": "read", "status": "ok", "commit_certainty": "none", "output": {"answer": 1}} + store.record(row) + row.update(status="error", error={"code": "SNAPSHOT_CONFLICT", "retryable": True}) + row.pop("output") + assert store.rows[0]["status"] == "ok" + store.correct(row) + entries = [json.loads(line) for line in (store.path / "checkpoint.jsonl").read_text().splitlines()] + assert entries[0]["status"] == "ok" and entries[0]["output"] == {"answer": 1} + assert entries[1] == {"event": "step-correction", "details_index": 0, "row": row} + assert store.rows == [row] and store.rows[0] is not row + + +def test_correction_cannot_erase_commit_receipt(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + row = {"id": "write", "status": "ok", "commit_certainty": "committed", + "receipt": {"receipt_path": "operations/transactions/one.yaml", "snapshot_after": "sha256:one"}} + store.record(row) + with pytest.raises(ValueError, match="cannot erase"): + store.correct({"id": "write", "status": "error", "commit_certainty": "none"}) + assert len((store.path / "checkpoint.jsonl").read_text().splitlines()) == 1 + + +def _flaky_sync(store, failures): + real = store.sync + calls = {"n": 0} + + def flaky(): + calls["n"] += 1 + if calls["n"] <= failures: + raise OSError("sync failed") + return real() + + store.sync = flaky + + +def _committed_row(): + return {"id": "write", "status": "ok", "commit_certainty": "committed", + "receipt": {"receipt_path": "operations/transactions/one.yaml", + "snapshot_after": "sha256:one"}} + + +def _entries(store): + return [json.loads(line) for line in + (store.path / "checkpoint.jsonl").read_text().splitlines()] + + +def _latest(entries, index=0): + row = entries[index] + for entry in entries[index + 1:]: + if entry.get("event") == "step-correction" and entry["details_index"] == index: + row = entry["row"] + return row + + +def test_one_shot_sync_failure_after_record_append_is_reconciled(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + row = _committed_row() + _flaky_sync(store, 1) + with pytest.raises(OSError, match="sync failed"): + store.record(row) + row.update(status="error", error={"code": "ARTIFACT_FAILED", "retryable": False}) + assert store.reconcile(row) is True + assert store.checkpoint_consistent + latest = _latest(_entries(store)) + assert latest["error"]["code"] == "ARTIFACT_FAILED" + assert latest["commit_certainty"] == "committed" + assert latest["receipt"] == row["receipt"] + + +def test_one_shot_sync_failure_after_correction_append_is_reconciled(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + store.record({"id": "read", "status": "ok", "commit_certainty": "none", + "output": {"answer": 1}}) + row = {"id": "read", "status": "error", "commit_certainty": "none", + "error": {"code": "SNAPSHOT_CONFLICT", "retryable": True}} + _flaky_sync(store, 1) + with pytest.raises(OSError, match="sync failed"): + store.correct(row) + row.update(status="error", error={"code": "ARTIFACT_FAILED", "retryable": False}) + assert store.reconcile(row) is True + assert _latest(_entries(store))["error"]["code"] == "ARTIFACT_FAILED" + + +def test_persistent_sync_failure_stays_pending_and_refuses_finalization(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + row = _committed_row() + _flaky_sync(store, 100) + with pytest.raises(OSError, match="sync failed"): + store.record(row) + row.update(status="error", error={"code": "ARTIFACT_FAILED", "retryable": False}) + assert store.reconcile(row) is False + assert not store.checkpoint_consistent + with pytest.raises(OSError, match="reconciliation unresolved"): + store.flush_pending() + # The correction was appended but never durably synced: still unresolved. + assert _latest(_entries(store))["error"]["code"] == "ARTIFACT_FAILED" + + +def test_record_failure_before_append_never_corrects_an_unrecorded_row(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + checkpoint = store.path / "checkpoint.jsonl" + checkpoint.unlink() + checkpoint.mkdir() + row = _committed_row() + with pytest.raises(OSError): + store.record(row) + assert store.rows == [] + assert store.reconcile(row) is False + assert store.checkpoint_consistent + store.flush_pending() + + +def test_correction_requires_an_existing_step(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + with pytest.raises(ValueError, match="unrecorded"): + store.correct({"id": "unknown", "status": "error", "commit_certainty": "none"}) + + +def test_expansion_holds_a_read_lease_against_retention(tmp_path, monkeypatch): + path = _run(tmp_path / "root", tmp_path / "reports") + full = path / "full-report.json" + original = Path.read_bytes + + def prune_after_body_read(candidate): + body = original(candidate) + if candidate == full: + assert prune_reports(path.parent, max_runs=0) == [] + assert path.is_dir() + return body + + monkeypatch.setattr(Path, "read_bytes", prune_after_body_read) + assert expand_report(full)["schema_version"] == 2 + assert prune_reports(path.parent, max_runs=0) == [path] + + +def test_expansion_of_an_active_report_refuses_without_waiting(tmp_path): + with ReportStore(tmp_path / "root", tmp_path / "reports") as store: + write_full_report(store.path, {"schema_version": 2, "steps": [], "totals": {}}) + with pytest.raises(ValueError, match="still active"): + expand_report(store.full_path) diff --git a/tests/test_agent_run.py b/tests/test_agent_run.py index 71d24075..08f95390 100644 --- a/tests/test_agent_run.py +++ b/tests/test_agent_run.py @@ -7,32 +7,72 @@ import subprocess import sys import threading +import time from pathlib import Path import pytest from repo_builders import add_curriculum, seed_live_goal_ids +from learning_os.adapters import agent_runner as agent_run +from learning_os.app import agent_presentation as presentation +from learning_os.app.agent_plans import compile_plan, execute_plan, validate_plan +from learning_os.app.agent_reporting import ReportStore +from learning_os.domain.agent_plans import PlanControls, PlanStepError, RawOutcome + ROOT = Path(__file__).resolve().parents[1] _spec = importlib.util.spec_from_file_location("agent_run", ROOT / "tools/agent_run.py") -agent_run = importlib.util.module_from_spec(_spec) -_spec.loader.exec_module(agent_run) +agent_cli = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(agent_cli) + + INDEX = {"verbs": ["bootstrap", "capture", "inspect"], "verb_to_operation": {"bootstrap": "operator.bootstrap", "capture": "capture.create", "inspect": "project.inspect"}, "task_to_use": {"open-work-or-priority-question": "bootstrap"}} +def _test_plan(plan, root, *, executor=None, index=None, readiness=None, preflight=None, + poll_s=0.1, report_dir=None, **kwargs): + """Scheduler tests substitute the Executor protocol; real plans use the CLI port.""" + if executor is None: + return agent_run.run_plan(plan, root, poll_s=poll_s, report_dir=report_dir, **kwargs) + started = time.monotonic() + steps = validate_plan(plan, poll_s) + compiled = compile_plan(steps, index or INDEX, lambda argv: (argv[0], False), plan.get("session_id")) + + class FakePort(agent_run.CliPlanPort): + def execute(self, step, remaining): + return RawOutcome(*executor(list(step.argv), root)) + + def preflight(self, step): + return preflight + + def ready(self, required, known, submitting): + return readiness(required, known, submitting) if readiness else (True, "ready") + + def epoch(self, root): + return False + + def resources(self): + return {} + + with ReportStore(root, Path(report_dir) if report_dir else None) as store: + store.inputs(plan, []) + return execute_plan(compiled, root, FakePort(root, executor), PlanControls( + deadline_s=plan.get("deadline_s", 120), report_max_bytes=plan.get("report_max_bytes", 65536), + on_error=plan.get("on_error", "stop"), session_id=plan.get("session_id")), store, started, poll_s) + + def _run(plan, *args, **kwargs): - """Legacy independent-step scenarios explicitly retain continue policy.""" - return agent_run.run_plan({"session_id": "runner-test", "on_error": "continue", **plan}, *args, **kwargs) + return _test_plan({"session_id": "runner-test", "on_error": "continue", **plan}, *args, **kwargs) def test_resolver_accepts_verb_operation_and_task(): - assert agent_run.resolve_use("inspect", INDEX) == "inspect" - assert agent_run.resolve_use("capture.create", INDEX) == "capture" - assert agent_run.resolve_use("open-work-or-priority-question", INDEX) == "bootstrap" - with pytest.raises(agent_run.AgentRunError, match="unknown"): - agent_run.resolve_use("no-such-name", INDEX) + assert presentation.resolve_use("inspect", INDEX) == "inspect" + assert presentation.resolve_use("capture.create", INDEX) == "capture" + assert presentation.resolve_use("open-work-or-priority-question", INDEX) == "bootstrap" + with pytest.raises(PlanStepError, match="unknown"): + presentation.resolve_use("no-such-name", INDEX) def _published(root, stamp): @@ -50,17 +90,6 @@ def _receipt(root, name="w", snapshot="sha256:abc", create=True): return {"ok": True, "receipt_path": str(path.relative_to(root)), "snapshot_after": snapshot} -def test_readiness_requires_receipt_and_matching_published_pair(tmp_path): - result = _receipt(tmp_path) - _published(tmp_path, "sha256:abc") - assert agent_run.write_ready(tmp_path, result)[0] - _published(tmp_path, "sha256:other") - assert not agent_run.write_ready(tmp_path, result)[0] - assert not agent_run.write_ready(tmp_path, _receipt(tmp_path, "missing", create=False))[0] - result["receipt_path"] = str(Path(__file__).resolve()) - assert not agent_run.write_ready(tmp_path, result)[0] - - @pytest.mark.parametrize("ready", [True, False]) def test_pending_write_waits_and_stale_read_never_executes(tmp_path, ready): calls = [] @@ -71,7 +100,7 @@ def executor(argv, root): calls.append(argv[0]) return 0, json.dumps(result if argv[0] == "capture" else {"id": "fresh"}), "" - timer = threading.Timer(0.02, _published, args=(tmp_path, "sha256:abc")) if ready else None + timer = threading.Timer(0.02, (tmp_path / "published").touch) if ready else None if timer: timer.start() try: @@ -79,7 +108,8 @@ def executor(argv, root): {"id": "w", "use": "capture", "write": True}, {"id": "r", "use": "inspect", "depends_on": ["w"], "ready_timeout_s": 0.15}, {"id": "free", "use": "bootstrap"}, - ]}, tmp_path, executor=executor, index=INDEX, poll_s=0.005) + ]}, tmp_path, executor=executor, index=INDEX, poll_s=0.005, + readiness=lambda *_: ((ready and (tmp_path / "published").exists()), "projection-pending")) finally: if timer: timer.join() @@ -106,7 +136,8 @@ def executor(argv, root): report = _run({"steps": [ {"id": "w", "use": "capture", "write": True}, {"id": "r", "use": "inspect", "depends_on": ["w"], "ready_timeout_s": 0}, - ]}, tmp_path, executor=executor, index=INDEX) + ]}, tmp_path, executor=executor, index=INDEX, + readiness=lambda *_: (False, "projection-not-current" if change == "external" else "projection-pending")) assert calls == ["capture"] error = report["steps"][1]["error"] assert error["code"] == ("SNAPSHOT_CONFLICT" if change == "external" else "NOT_READY") @@ -125,7 +156,8 @@ def executor(argv, root): report = _run({"steps": [ {"id": "w", "use": "capture", "write": True}, {"id": "r", "use": "inspect", "write": True, "depends_on": ["w"], "ready_timeout_s": 0}, - ]}, tmp_path, executor=executor, index=INDEX) + ]}, tmp_path, executor=executor, index=INDEX, + readiness=lambda *_: (False, "projection-not-current")) assert calls == ["capture"] assert report["steps"][1]["error"]["code"] == "SNAPSHOT_CONFLICT" @@ -138,7 +170,7 @@ def executor(argv, root): ]) def test_invalid_log_keys_refuse_whole_plan_before_any_write(tmp_path, steps): calls = [] - with pytest.raises(agent_run.AgentRunError, match="key"): + with pytest.raises(PlanStepError, match="key"): _run({"steps": steps}, tmp_path, executor=lambda *args: calls.append(args), index=INDEX) assert calls == [] @@ -216,52 +248,36 @@ def test_real_cli_root_without_implementation_copy(mini_repo, tmp_path): @pytest.mark.parametrize("args", [["--root", "/tmp"], ["--root=/tmp"]]) def test_root_override_refuses_entire_plan(tmp_path, args): - with pytest.raises(agent_run.AgentRunError, match="root overrides"): + with pytest.raises(PlanStepError, match="root overrides"): _run({"steps": [{"id": "r", "argv": [*args, "inspect", "note-demo"]}]}, tmp_path) @pytest.mark.parametrize("text", ["a", "ä", '"\\\n', "😀"]) @pytest.mark.parametrize("fields", [None, ["x"]]) def test_summary_bounds_final_utf8_json(text, fields): - encoded = agent_run.summarize({"x": text * 10000}, fields=fields, max_bytes=120) + encoded = presentation.summarize({"x": text * 10000}, fields=fields, max_bytes=120) assert len(encoded.encode("utf-8")) <= 120 assert json.loads(encoded)["_truncated_bytes"] > 120 - out = agent_run.summarize({"counts": {"modules": 15}}, fields=["counts.modules"]) + out = presentation.summarize({"counts": {"modules": 15}}, fields=["counts.modules"]) assert json.loads(out) == {"counts": {"modules": 15}} @pytest.mark.parametrize("budget", [-1, 1, 63, 64.1, True]) def test_impossible_byte_budget_refuses_before_execution(tmp_path, budget): - with pytest.raises(agent_run.AgentRunError, match="max_bytes"): + with pytest.raises(PlanStepError, match="max_bytes"): _run({"steps": [{"id": "r", "use": "inspect", "summary": {"max_bytes": budget}}]}, tmp_path) -@pytest.mark.parametrize("code,out,expected", [ - (2, "", "PREFLIGHT_FAILED"), - (1, "validator crashed", "PREFLIGHT_FAILED"), - (0, "", "PREFLIGHT_FAILED"), - (1, "E GLOBAL: pathless error\n1 error(s), 0 warning(s) — FAIL", "VALIDATION_FAILED"), - (1, "E A: in scope [work/inbox/a.md]\nE B: elsewhere [curriculum/b.yaml]\n" - "2 error(s), 0 warning(s) — FAIL", "VALIDATION_FAILED"), -]) -def test_preflight_failure_blocks_execution_and_keeps_pathless_errors(tmp_path, code, out, expected): +@pytest.mark.parametrize("error", [ + {"code": "PREFLIGHT_FAILED", "retryable": False}, + {"code": "VALIDATION_FAILED", "retryable": False, "scope": {"unrelated": [{"path": ""}]}}]) +def test_typed_preflight_blocks_execution(tmp_path, error): calls = [] - - def executor(argv, root): - calls.append(argv) - return code, out, "validator stderr" - result = _run({"steps": [{"id": "w", "kind": "log", "text": "x", - "key": "preflight-test", "preflight": True, "writes": ["work/inbox/**"]}]}, - tmp_path, executor=executor, index=INDEX) - assert calls == [["validate"]] - error = result["steps"][0]["error"] - assert error["code"] == expected - if "GLOBAL" in out: - assert error["scope"]["unrelated"][0]["path"] == "" - if "E A:" in out: - assert [e["code"] for e in error["scope"]["in_scope"]] == ["A"] - assert [e["code"] for e in error["scope"]["unrelated"]] == ["B"] + "key": "preflight-test", "preflight": True}]}, tmp_path, index=INDEX, + executor=lambda *args: calls.append(args), preflight=error) + assert calls == [] + assert result["steps"][0]["error"] == error def test_real_preflight_catches_unrelated_error_before_sealing(mini_repo): @@ -277,20 +293,18 @@ def test_real_preflight_catches_unrelated_error_before_sealing(mini_repo): assert not list((mini_repo / "work/inbox").iterdir()) -def test_preflight_revalidates_after_write_and_gateway_still_checks(mini_repo): +def test_preflight_revalidates_after_write_and_gateway_still_checks(mini_repo, monkeypatch): add_curriculum(mini_repo) plan = _write_plan() for row in plan["steps"][:2]: row.update(preflight=True, writes=["work/inbox/**"]) - execute = agent_run._cli_executor_factory(mini_repo) + diagnostic = agent_run.diagnostic_report validations = [] - - def executor(argv, root): - if argv == ["validate"]: - validations.append(len(list((root / "operations/transactions").glob("transaction-*.yaml")))) - return execute(argv, root) - - result = _run(plan, mini_repo, executor=executor) + def measured(root): + validations.append(len(list((root / "operations/transactions").glob("transaction-*.yaml")))) + return diagnostic(root) + monkeypatch.setattr(agent_run, "diagnostic_report", measured) + result = _run(plan, mini_repo) assert result["totals"]["ok"] == 3, result assert validations == [0, 1] assert all("0 error(s)" in row["validation"] for row in result["steps"][:2]) @@ -301,7 +315,7 @@ def test_cluster_expansion_is_executable_and_recovers_all_members(mini_repo, arg expected = seed_live_goal_ids(mini_repo, "one", "two", "three") execute = agent_run._cli_executor_factory(mini_repo) result = _run({"steps": [{"id": "q", "use": "intelligence-scan", - "args": args, "clusters": True}]}, mini_repo, executor=execute) + "args": args, "clusters": True}]}, mini_repo) assert result["totals"]["ok"] == 1, result preview = result["steps"][0]["output"] assert "--cluster" not in preview["expand_argv"] @@ -330,23 +344,23 @@ def test_cluster_byte_cap_preserves_counts_and_expansion(tmp_path): assert row["output"]["expand_argv"] == ["intelligence-scan", "--json"] -def test_followup_projection_cannot_precede_latest_required_write(tmp_path): - a = _receipt(tmp_path, "a", "sha256:A") - b = _receipt(tmp_path, "b", "sha256:B") - c = _receipt(tmp_path, "c", "sha256:C") - _published(tmp_path, "sha256:A") - assert not agent_run.writes_ready(tmp_path, [a, b], [a, b])[0] - _published(tmp_path, "sha256:B") - assert agent_run.writes_ready(tmp_path, [b, a], [a, b])[0] - _published(tmp_path, "sha256:C") - assert agent_run.writes_ready(tmp_path, [a, b], [a, b, c])[0] +def test_followup_projection_cannot_precede_latest_required_write(mini_repo): + from test_projection_readiness import capture + + from learning_os.app.projection_readiness import dependency_ready + a = capture(mini_repo, "a") + b = capture(mini_repo, "b") + assert not dependency_ready(mini_repo, [b], [a])[0] + assert dependency_ready(mini_repo, [a, b], [a, b])[0] + c = capture(mini_repo, "c") + assert dependency_ready(mini_repo, [a, b], [a, b, c])[0] @pytest.mark.parametrize("number", ["NaN", "Infinity", "-Infinity", "1e999"]) def test_followup_nonfinite_output_is_per_step_failure(tmp_path, number): def executor(argv, root): return (0, '{"x":' + number + '}', "") if argv[0] == "inspect" else (0, '{"ok":true}', "") - report = agent_run.run_plan({"on_error": "continue", "steps": [ + report = _test_plan({"on_error": "continue", "steps": [ {"id": "bad", "use": "inspect"}, {"id": "good", "use": "bootstrap"}, ]}, tmp_path, executor=executor, index=INDEX) assert report["steps"][0]["error"]["code"] == "INVALID_STEP_OUTPUT" @@ -355,14 +369,14 @@ def executor(argv, root): def test_followup_missing_fields_are_explicit_and_bounded(): - result = agent_run.summarize({"a": 1, "empty": None}, fields=["a", "empty", "nope.deep"], max_bytes=120) + result = presentation.summarize({"a": 1, "empty": None}, fields=["a", "empty", "nope.deep"], max_bytes=120) decoded = json.loads(result) assert decoded == {"a": 1, "empty": None, "_missing_fields": ["nope.deep"]} assert len(result.encode()) <= 120 - truncated = json.loads(agent_run.summarize({"a": "ä" * 1000}, fields=["a", "missing"], max_bytes=120)) + truncated = json.loads(presentation.summarize({"a": "ä" * 1000}, fields=["a", "missing"], max_bytes=120)) assert truncated["_missing_fields"] == ["missing"] - with pytest.raises(agent_run.AgentRunError, match="metadata"): - agent_run.summarize({}, fields=["missing" * 100], max_bytes=64) + with pytest.raises(PlanStepError, match="metadata"): + presentation.summarize({}, fields=["missing" * 100], max_bytes=64) @pytest.mark.parametrize("explicit", [False, True]) @@ -375,7 +389,7 @@ def test_followup_stop_policy_preserves_commit_and_skips_later_write(mini_repo, ]} if explicit: plan["on_error"] = "stop" - report = agent_run.run_plan(plan, mini_repo) + report = _test_plan(plan, mini_repo) assert report["steps"][0]["status"] == "ok" assert report["steps"][1]["status"] == "error" assert report["steps"][2]["status"] == "skipped" @@ -389,7 +403,7 @@ def test_followup_plan_sessions_isolate_ledgers_and_restore_environment(mini_rep monkeypatch.setenv("LOS_SESSION_ID", "outside-session") for session in ("agent-A", "agent-B"): plan = {"session_id": session, "steps": [{"id": "log", "kind": "log", "text": session, "key": session}]} - report = agent_run.run_plan(plan, mini_repo) + report = _test_plan(plan, mini_repo) assert report["totals"]["ok"] == 1, report assert report["session_id"] == session a = load_session_paths(mini_repo, "agent-A") @@ -416,7 +430,7 @@ def test_followup_gateway_requires_matching_sealed_session(mini_repo, tmp_path, path = tmp_path / "envelope.json" path.write_text(json.dumps(envelope)) before = path.read_bytes() - report = agent_run.run_plan({"session_id": "plan-session", "steps": [ + report = _test_plan({"session_id": "plan-session", "steps": [ {"id": "write", "use": "capability", "args": ["capture.create", "--payload-file", str(path)]} ]}, mini_repo) receipts = list((mini_repo / "operations/transactions").glob("transaction-*.yaml")) @@ -434,8 +448,8 @@ def test_followup_gateway_requires_matching_sealed_session(mini_repo, tmp_path, {"session_id": "s", "on_error": "ignore"}]) def test_write_plan_session_and_policy_validate_before_execution(tmp_path, extra): calls = [] - with pytest.raises(agent_run.AgentRunError): - agent_run.run_plan({**extra, "steps": [ + with pytest.raises(PlanStepError): + _test_plan({**extra, "steps": [ {"id": "write", "kind": "log", "text": "x", "key": "key"} ]}, tmp_path, executor=lambda *a: calls.append(a), index=INDEX) assert calls == [] @@ -446,10 +460,10 @@ def test_session_environment_restores_when_execution_raises(tmp_path, monkeypatc monkeypatch.delenv("LOS_SESSION_ID", raising=False) def fail(argv, root): - assert os.environ["LOS_SESSION_ID"] == "local-session" + assert "LOS_SESSION_ID" not in os.environ raise OSError("broken executor") - report = agent_run.run_plan({"session_id": "local-session", "steps": [ + report = _test_plan({"session_id": "local-session", "steps": [ {"id": "fail", "use": "inspect"}, {"id": "skipped", "use": "bootstrap"}, ]}, tmp_path, executor=fail, index=INDEX) assert report["steps"][0]["status"] == "error" @@ -458,8 +472,8 @@ def fail(argv, root): def test_parser_classified_writer_requires_plan_session(mini_repo): - with pytest.raises(agent_run.AgentRunError, match="session_id"): - agent_run.run_plan({"steps": [{"id": "goal", "use": "goal", "args": ["missing"]}]}, mini_repo) + with pytest.raises(PlanStepError, match="session_id"): + _test_plan({"steps": [{"id": "goal", "use": "goal", "args": ["missing"]}]}, mini_repo) assert not list((mini_repo / "operations/transactions").glob("transaction-*.yaml")) @@ -468,16 +482,15 @@ def test_nonfinite_cli_failure_returns_complete_report(tmp_path, monkeypatch, ca plan.write_text(json.dumps({"on_error": "continue", "steps": [ {"id": "bad", "use": "inspect"}, {"id": "good", "use": "bootstrap"}, ]})) - original = agent_run.run_plan def run(plan, root, **kwargs): def executor(argv, root): return 0, '{"x":NaN}' if argv[0] == "inspect" else '{"ok":true}', "" - return original(plan, root, executor=executor, index=INDEX) + return _test_plan(plan, root, executor=executor, index=INDEX) monkeypatch.setattr(agent_run, "run_plan", run) monkeypatch.setattr(sys, "argv", ["agent_run.py", str(plan), "--root", str(tmp_path)]) - assert agent_run.main() == 3 + assert agent_cli.main() == 3 report = json.loads(capsys.readouterr().out) assert report["steps"][0]["error"]["code"] == "INVALID_STEP_OUTPUT" assert report["steps"][1]["status"] == "ok" @@ -485,8 +498,8 @@ def executor(argv, root): def test_internal_seal_marker_cannot_be_supplied_by_plan(mini_repo): add_curriculum(mini_repo) - with pytest.raises(agent_run.AgentRunError, match="internal"): - agent_run.run_plan({"steps": [{"id": "write", "argv": [ + with pytest.raises(PlanStepError, match="internal"): + _test_plan({"steps": [{"id": "write", "argv": [ "__seal_submit__", "capture.create", '{"text":"must not write"}', "private-bypass", ]}]}, mini_repo) assert not list((mini_repo / "operations/transactions").glob("transaction-*.yaml")) @@ -500,7 +513,7 @@ def test_prefixed_gateway_write_cannot_escape_session_requirement(mini_repo, tmp artifact_ids=[request_artifact_id("capture.create", key)], idempotency_key=key) path = tmp_path / "envelope.json" path.write_text(json.dumps(envelope)) - report = agent_run.run_plan({"steps": [{"id": "write", "argv": [ + report = _test_plan({"steps": [{"id": "write", "argv": [ "--lock-timeout", "1", "capability", "capture.create", "--payload-file", str(path), ]}]}, mini_repo) assert report["steps"][0]["error"]["code"] == "SESSION_REQUIRED" @@ -513,7 +526,7 @@ def test_abbreviated_root_override_cannot_change_selected_root(mini_repo, tmp_pa other = build_mini_repo(tmp_path / "other") note = other / "knowledge/notes/mathematics/note-demo.md" note.write_text(note.read_text().replace("id: note-demo", "id: note-other")) - report = agent_run.run_plan({"steps": [{"id": "read", "argv": [ + report = _test_plan({"steps": [{"id": "read", "argv": [ flag, str(other), "inspect", "note-other", ]}]}, mini_repo) assert report["steps"][0]["error"]["code"] == "ROOT_MISMATCH" @@ -531,7 +544,7 @@ def spy(namespace): return original(namespace) monkeypatch.setattr(cli_entry, "run", spy) - report = agent_run.run_plan({"session_id": "plan-session", "steps": [ + report = _test_plan({"session_id": "plan-session", "steps": [ {"id": "end", "argv": ["session-end", "--session-i", "other-session"]}, ]}, mini_repo) assert report["steps"][0]["error"]["code"] == "SESSION_MISMATCH" @@ -540,7 +553,7 @@ def spy(namespace): def test_flag_like_log_values_are_passed_as_values(mini_repo): add_curriculum(mini_repo) - report = agent_run.run_plan({"session_id": "--root", "steps": [ + report = _test_plan({"session_id": "--root", "steps": [ {"id": "log", "kind": "log", "text": "flag-like values", "key": "flag-like-values"}, ]}, mini_repo) assert report["steps"][0]["status"] == "ok", report @@ -551,7 +564,7 @@ def test_takeover_whole_report_cap_is_always_enforced(tmp_path): {'id': str(i), 'argv': ['inspect'], 'summary': {'max_bytes': 1500}} for i in range(10)]}, tmp_path, index=INDEX, executor=lambda *_: (0, json.dumps({'value': 'x' * 1200}), 'notice')) - assert len((agent_run._json(report) + '\n').encode()) <= 4096 + assert len((presentation.encode_json(report) + '\n').encode()) <= 4096 full = Path(report['full_report']) assert full.is_file() assert len(json.loads(full.read_text())['steps']) == 10 @@ -596,10 +609,11 @@ def executor(argv, root): calls.append(argv[0]) return 0, json.dumps(result), '' started = time.monotonic() - report = _run({'deadline_s': 0.04, 'steps': [ + report = _run({'deadline_s': 0.2, 'steps': [ {'id': 'w', 'argv': ['capture'], 'write': True}, {'id': 'r', 'argv': ['inspect'], 'depends_on': ['w'], 'ready_timeout_s': 5}]}, - tmp_path, index=INDEX, executor=executor, poll_s=0.005) + tmp_path, index=INDEX, executor=executor, poll_s=0.005, + readiness=lambda *_: (False, "projection-pending")) assert time.monotonic() - started < 1 assert report['steps'][1]['status'] == 'deadline' assert calls == ['capture'] @@ -612,7 +626,7 @@ def test_takeover_real_process_wave_and_write_barrier(mini_repo): {'id': 'w', 'kind': 'log', 'text': 'worker barrier', 'key': 'worker-barrier'}, {'id': 'after', 'argv': ['inspect', 'note-demo'], 'depends_on': ['w']}]}, mini_repo) assert report['totals']['ok'] == 4, report - assert report['totals']['process_count'] == 4 # runner + two persistent workers + sealer + assert report['totals']['process_count'] == 2 # runner + sealer; legacy workers are serial assert report['steps'][2]['commit_certainty'] == 'committed' @@ -670,6 +684,48 @@ def execute(argv, root): assert report['steps'][1]['status'] == 'error' # record of the refusal also fails +def test_one_shot_checkpoint_sync_failure_reconciles_before_finalizing(tmp_path, monkeypatch): + result = _receipt(tmp_path) + real_sync = ReportStore.sync + calls = {"n": 0} + + def flaky(self): + calls["n"] += 1 + if calls["n"] == 1: + raise OSError("sync failed once") + return real_sync(self) + + monkeypatch.setattr(ReportStore, "sync", flaky) + report = _run({"steps": [{"id": "w", "argv": ["capture"], "write": True}]}, + tmp_path, index=INDEX, report_dir=str(tmp_path) + "-reports", + executor=lambda argv, root: (0, json.dumps(result), "")) + step = report["steps"][0] + assert step["error"]["code"] == "ARTIFACT_FAILED" + assert step["commit_certainty"] == "committed" + assert step["receipt"]["receipt_path"] == result["receipt_path"] + store_dir = next(Path(str(tmp_path) + "-reports").glob("los-agent-plan-*")) + full = json.loads((store_dir / "full-report.json").read_text()) + assert full["steps"][0]["error"]["code"] == "ARTIFACT_FAILED" + entries = [json.loads(line) for line in (store_dir / "checkpoint.jsonl").read_text().splitlines()] + corrections = [e["row"] for e in entries if e.get("event") == "step-correction"] + assert corrections and corrections[-1]["error"]["code"] == "ARTIFACT_FAILED" + assert corrections[-1]["receipt"]["receipt_path"] == result["receipt_path"] + + +def test_persistent_checkpoint_sync_failure_refuses_a_finalized_report(tmp_path, monkeypatch): + result = _receipt(tmp_path) + monkeypatch.setattr(ReportStore, "sync", + lambda self: (_ for _ in ()).throw(OSError("sync always fails"))) + report = _run({"steps": [{"id": "w", "argv": ["capture"], "write": True}]}, + tmp_path, index=INDEX, report_dir=str(tmp_path) + "-reports", + executor=lambda argv, root: (0, json.dumps(result), "")) + assert report["steps"][0]["commit_certainty"] == "committed" + assert report["totals"]["ok"] == 0 + store_dir = next(Path(str(tmp_path) + "-reports").glob("los-agent-plan-*")) + assert not (store_dir / "full-report.json").exists() + assert report["full_report"].endswith("checkpoint.jsonl") + + def test_explicit_read_commands_need_no_task_catalogue(mini_repo, monkeypatch): from learning_os.store.contracts import verb_catalogue def unnecessary(*_): @@ -718,8 +774,8 @@ def test_query_and_tool_effects_are_explicit_and_file_outputs_are_writers(mini_r assert {"validate", "note-analysis-prepare", "backup-manifest", "backup-verify", "search", "dossier"} <= writers assert REGISTRY["ai-action.delivery.validate"].effects == OperationEffects.READ assert "ability-context" not in writers # Explicit read despite porcelain invocation. - with pytest.raises(agent_run.AgentRunError) as error: - agent_run.run_plan({"steps": [{"id": "validation", "argv": ["validate"]}]}, mini_repo) + with pytest.raises(PlanStepError) as error: + _test_plan({"steps": [{"id": "validation", "argv": ["validate"]}]}, mini_repo) assert error.value.code == "SESSION_REQUIRED" @@ -731,7 +787,7 @@ def test_session_end_commit_push_requires_plan_session_before_dispatch(mini_repo from learning_os.adapters import cli calls = [] - monkeypatch.setattr(cli, "invoke_outcome", lambda ns: ( + monkeypatch.setattr(cli, "invoke_outcome", lambda ns, **kwargs: ( calls.append(ns.command) or SimpleNamespace(exit_code=0, stdout='{"ok":true}', stderr=""))) args = ["--commit-message", "fixture commit", "--push"] step = ({"id": "end", "use": "session.end", "args": args} if form == "use" else @@ -739,8 +795,8 @@ def test_session_end_commit_push_requires_plan_session_before_dispatch(mini_repo step["write"] = False # A presentation hint cannot weaken registry effects. steps = ([{"id": "read", "use": "inspect", "args": ["note-demo"]}] if mixed else []) + [step] try: - report = agent_run.run_plan({"steps": steps}, mini_repo) - except agent_run.AgentRunError as exc: + report = _test_plan({"steps": steps}, mini_repo) + except PlanStepError as exc: assert exc.code == "SESSION_REQUIRED" else: assert report["steps"][-1]["error"]["code"] == "SESSION_REQUIRED", report @@ -760,7 +816,7 @@ def lost_write_response(argv, **kwargs): calls.append("seal") return subprocess.CompletedProcess(argv, 1, "", "fixture lost write response") - def dispatch(namespace): + def dispatch(namespace, **kwargs): calls.append(namespace.command) return SimpleNamespace(exit_code=0, stdout='{"ok":true}', stderr="") @@ -768,7 +824,7 @@ def dispatch(namespace): monkeypatch.setattr(cli, "invoke_outcome", dispatch) step = ({"id": "end", "use": "session-end", "args": ["--commit-message", "fixture", "--push"]} if use else {"id": "end", "argv": ["session-end", "--commit-message", "fixture", "--push"]}) - report = agent_run.run_plan({"session_id": "classification-fixture", "on_error": "continue", "steps": [ + report = _test_plan({"session_id": "classification-fixture", "on_error": "continue", "steps": [ {"id": "write", "kind": "log", "text": "fixture", "key": "classification-fixture"}, step, {"id": "read", "argv": ["inspect", "note-demo"]}, ]}, mini_repo) @@ -780,7 +836,7 @@ def dispatch(namespace): def test_describing_porcelain_requires_no_write_session(mini_repo): - report = agent_run.run_plan({"steps": [ + report = _test_plan({"steps": [ {"id": "describe", "use": "session-end", "describe": True}, ]}, mini_repo) assert report["totals"]["ok"] == 1, report @@ -805,7 +861,7 @@ def test_session_commit_then_failed_push_blocks_later_writes(mini_repo, use): args = ["--commit-message", "fixture partial completion", "--push"] step = ({"id": "end", "use": "session-end", "args": args} if use else {"id": "end", "argv": ["session-end", *args]}) - report = agent_run.run_plan({"session_id": session, "on_error": "continue", "steps": [ + report = _test_plan({"session_id": session, "on_error": "continue", "steps": [ step, {"id": "later", "kind": "log", "text": "must not run", "key": "after-partial-porcelain"}, {"id": "read", "argv": ["inspect", "note-demo"]}, ]}, mini_repo) @@ -827,7 +883,7 @@ def test_porcelain_without_commit_evidence_retains_uncertainty(mini_repo, monkey calls = [] - def dispatch(namespace): + def dispatch(namespace, **kwargs): calls.append(namespace.command) if namespace.command == "session-end": if response == "exception": @@ -837,7 +893,7 @@ def dispatch(namespace): return SimpleNamespace(exit_code=0, stdout='{"ok":true}', stderr="") monkeypatch.setattr(cli, "invoke_outcome", dispatch) - report = agent_run.run_plan({"session_id": "porcelain-evidence", "on_error": "continue", "steps": [ + report = _test_plan({"session_id": "porcelain-evidence", "on_error": "continue", "steps": [ {"id": "end", "argv": ["session-end"]}, {"id": "later", "argv": ["generate"]}, {"id": "read", "argv": ["inspect", "note-demo"]}, @@ -856,7 +912,7 @@ def test_gateway_refusal_cannot_erase_commit_receipt(mini_repo, monkeypatch, rec payload["ok"] = False monkeypatch.setattr(agent_run.subprocess, "run", lambda argv, **kwargs: subprocess.CompletedProcess(argv, 1, json.dumps(payload), "fixture refusal")) - report = agent_run.run_plan({"session_id": "gateway-evidence", "steps": [ + report = _test_plan({"session_id": "gateway-evidence", "steps": [ {"id": "write", "kind": "log", "text": "fixture", "key": "gateway-evidence"}, ]}, mini_repo) assert report["steps"][0]["status"] == "error" @@ -873,3 +929,148 @@ def test_external_feed_reads_are_neither_memoized_nor_parallel(mini_repo, tmp_pa assert report['totals']['memo_hits'] == 0 assert report['totals']['process_count'] == 1 assert report['totals']['model_loads'] == 2 + + +@pytest.mark.parametrize("command,writer", [("inspect", False), ("unit-list", False), ("session-end", True)]) +def test_plan_deadline_bounds_serial_lock_wait(mini_repo, command, writer): + from test_operator_lock import _hold_in_background + release, worker = _hold_in_background(mini_repo) + try: + started = time.monotonic() + report = agent_run.run_plan({"session_id": "deadline-fixture", "deadline_s": 0.1, + "steps": [{"id": "waiting", "argv": [command, *(["note-demo"] if command == "inspect" else [])]}]}, mini_repo) + assert time.monotonic() - started < 2 + finally: + release.set() + worker.join(timeout=5) + row = report["steps"][0] + assert row["status"] == "deadline", row + assert row["error"]["code"] == "DEADLINE_EXPIRED" + assert row["commit_certainty"] == ("uncertain" if writer else "none") + + +@pytest.mark.parametrize("seal", [True, False]) +def test_subprocess_transport_receives_remaining_timeout_and_counts_failure(mini_repo, monkeypatch, seal): + original = agent_run.CliExecutor.validate + def fallback(self, argv): + namespace = original(self, argv) + del namespace._operation + return namespace + if not seal: + monkeypatch.setattr(agent_run.CliExecutor, "validate", fallback) + calls = [] + def timeout(argv, **kwargs): + calls.append(kwargs) + raise subprocess.TimeoutExpired(argv, kwargs["timeout"]) + monkeypatch.setattr(agent_run.subprocess, "run", timeout) + report = agent_run.run_plan({"session_id": "subprocess-deadline", "deadline_s": 2, + "on_error": "continue", "steps": [ + {"id": "attempt", **({"kind": "log", "text": "x", "key": "timeout"} if seal else {"argv": ["inspect", "note-demo"]})}, + {"id": "later", "argv": ["generate"]}]}, mini_repo) + assert len(calls) == (1 if seal else 2) + assert 0 < calls[0]["timeout"] <= 2 + assert calls[0]["env"]["LOS_SESSION_ID"] == "subprocess-deadline" + assert report["totals"]["process_count"] == 1 + len(calls) + assert report["steps"][0]["commit_certainty"] == ("uncertain" if seal else "none") + if seal: + assert report["steps"][1]["status"] == "skipped" + + +def test_in_process_invocation_has_explicit_context_without_environment_mutation(mini_repo, monkeypatch): + import os + from dataclasses import replace + + from learning_os.app.registry import REGISTRY + from learning_os.store.session_ledger import current_session_id + original = REGISTRY["project.inspect"] + observed = [] + def handler(ctx, req): + observed.append((ctx.session_id, current_session_id(), os.environ.get("LOS_SESSION_ID"), os.environ.get("LOS_LOCK_TIMEOUT"))) + return original.handler(ctx, req) + monkeypatch.setitem(REGISTRY, "project.inspect", replace(original, handler=handler)) + monkeypatch.setenv("LOS_SESSION_ID", "outside") + monkeypatch.delenv("LOS_LOCK_TIMEOUT", raising=False) + report = agent_run.run_plan({"session_id": "inside", "steps": [{"id": "read", "argv": ["inspect", "note-demo"]}]}, mini_repo) + assert report["totals"]["ok"] == 1, report + assert observed == [("inside", "inside", "outside", None)] + assert current_session_id() == "outside" + + +@pytest.mark.parametrize("closing_error", [False, True]) +def test_epoch_conflict_appends_checkpoint_correction(mini_repo, monkeypatch, closing_error): + from contextlib import contextmanager + + from learning_os.app import agent_plans + class ChangedEpoch: + hits = loads = 0 + def __init__(self, root): pass + @contextmanager + def activate(self, prepare, *, timeout_s=None): + yield + if closing_error: + raise OSError("cannot observe closing epoch") + def get(self, key): return None + def put(self, key, value): pass + def unchanged(self): return False + def close(self): pass + monkeypatch.setattr(agent_plans, "ReadSession", ChangedEpoch) + report = agent_run.run_plan({"steps": [{"id": "read", "argv": ["inspect", "note-demo"]}]}, mini_repo) + entries = [json.loads(line) for line in (Path(report["full_report"]).parent / "checkpoint.jsonl").read_text().splitlines()] + assert entries[0]["status"] == "ok" + assert entries[1]["event"] == "step-correction" + assert entries[1]["row"]["status"] == "error" + assert entries[1]["row"]["error"]["code"] == "SNAPSHOT_CONFLICT" + assert report["steps"][0] == entries[1]["row"] + + +def test_schema_is_admission_authority_and_version_one_has_migration_error(tmp_path, monkeypatch): + from learning_os.store.contracts import agent_plans + schema = json.loads(agent_plans.SCHEMA_PATH.read_text()) + schema["properties"]["steps"]["items"]["properties"]["id"] = {"const": "schema-owned"} + path = tmp_path / "schema.json" + path.write_text(json.dumps(schema)) + monkeypatch.setattr(agent_plans, "SCHEMA_PATH", path) + with pytest.raises(PlanStepError, match="schema-owned"): + validate_plan({"steps": [{"id": "not-the-schema-value", "argv": ["inspect"]}]}, 0.1) + with pytest.raises(PlanStepError, match="migrate.*2"): + validate_plan({"schema_version": 1, "steps": [{"id": "schema-owned", "argv": ["inspect"]}]}, 0.1) + + +def test_task_dispatch_uses_machine_field_and_parser_table_is_detached(mini_repo): + import yaml + + from learning_os.adapters.cli_parser import build_parser, verb_table + contract = mini_repo / "system/contracts/task-scope.yaml" + text = contract.read_text().replace('`bootstrap --brief`, then `inspect WORKSPACE_ID` and relevant coordination', '`inspect WORKSPACE_ID`') + contract.write_text(text) + index = agent_run.build_index(mini_repo) + assert index["task_to_use"]["open-work-or-priority-question"] == "bootstrap" + parser = build_parser() + table = verb_table(parser) + table.clear() + assert verb_table(parser)["inspect"] == "project.inspect" + document = yaml.safe_load(contract.read_text()) + document["tasks"][0]["entry_verb"] = "not-a-command" + contract.write_text(yaml.safe_dump(document)) + with pytest.raises(PlanStepError, match="entry_verb"): + agent_run.build_index(mini_repo) + + +def test_resource_snapshot_is_read_once(mini_repo, monkeypatch): + calls = [] + monkeypatch.setattr(agent_run.CliPlanPort, "resources", lambda self: calls.append(1) or {}) + report = agent_run.run_plan({"steps": [{"id": "read", "argv": ["unit-list"]}]}, mini_repo) + assert report["totals"]["ok"] == 1 + assert calls == [1] + + +def test_checkpoint_correction_failure_blocks_later_write(mini_repo, monkeypatch): + from learning_os.app.read_session import ReadSession + monkeypatch.setattr(ReadSession, "unchanged", lambda self: False) + monkeypatch.setattr(ReportStore, "correct", lambda *_: (_ for _ in ()).throw(OSError("checkpoint full"))) + report = agent_run.run_plan({"session_id": "correction-error", "on_error": "continue", "steps": [ + {"id": "read", "argv": ["inspect", "note-demo"]}, + {"id": "write", "kind": "log", "text": "must not write", "key": "correction-error"}]}, mini_repo) + assert report["steps"][0]["error"]["code"] == "ARTIFACT_FAILED" + assert report["steps"][1]["status"] == "skipped" + assert not list((mini_repo / "operations/transactions").glob("transaction-*.yaml")) diff --git a/tests/test_arch_cli_parity.py b/tests/test_arch_cli_parity.py index 8d3d0e62..f8a64b60 100644 --- a/tests/test_arch_cli_parity.py +++ b/tests/test_arch_cli_parity.py @@ -533,7 +533,7 @@ def _run(parser, argv: list[str]) -> dict: namespace = parser.parse_args(argv) except SystemExit as exc: code = exc.code if isinstance(exc.code, int) else 2 - stderr = stderr_buf.getvalue() + stderr = arch_cli_describe.normalize_usage(stderr_buf.getvalue()) first = stderr.strip().splitlines()[0] if stderr.strip() else "" return {"error": {"exit": code, "first_line": first, "stderr": stderr}, @@ -637,12 +637,20 @@ def _normalize_claim_surface_observation(parser, argv, recorded): prefix, separator, body = result["error"]["stderr"].partition("los goal: error:") assert separator and prefix.startswith("usage: los goal") action = next(action for action in parser._actions if isinstance(action, argparse._SubParsersAction)) - usage = action.choices[command].format_usage() + usage = arch_cli_describe.normalize_usage(action.choices[command].format_usage()) result["error"]["stderr"] = usage + separator + body result["error"]["first_line"] = usage.strip().splitlines()[0] return result +def test_usage_recording_preserves_diagnostic_body(): + body = "los: error: invalid choice: 'bad'\n exact diagnostic detail\n" + assert arch_cli_describe.normalize_usage( + "usage: los [-h]\n {old,new}\n\n" + body + ) == "usage: los [-h]\n\n" + body + assert arch_cli_describe.normalize_usage(body) == body + + @pytest.mark.parametrize("argv,field,value", [ (["goal", "lineage-stale:covers:route-demo@" + "a"*64, "--authorize"], "authorize", True), (["goal", "claims-audit:" + "a"*64, "--close", "--audit-file", "/scratch/audit.yaml", "--check"], "audit_file", "/scratch/audit.yaml"), diff --git a/tests/test_arch_engine_neutrality.py b/tests/test_arch_engine_neutrality.py index b090131b..c201e796 100644 --- a/tests/test_arch_engine_neutrality.py +++ b/tests/test_arch_engine_neutrality.py @@ -9,6 +9,7 @@ import contextvars import json +import re import sys import threading from pathlib import Path @@ -26,7 +27,27 @@ def _load_baseline() -> dict[str, dict]: - return json.loads(BASELINE_PATH.read_text(encoding="utf-8")) + # Every original digest comparison remains exact. Separating the pool + # keeps contract-byte updates out of thousands of repeated effect rows. + hashes = json.loads(BASELINE_PATH.with_name("engine-baseline-hashes.json") + .read_text(encoding="utf-8")) + used = set() + + def expand(value): + if isinstance(value, str) and value.startswith("@digest/"): + used.add(value) + digest = hashes[value] + assert re.fullmatch(r"(?:sha256:)?[0-9a-f]{64}", digest) + return digest + if isinstance(value, dict): + return {key: expand(item) for key, item in value.items()} + if isinstance(value, list): + return [expand(item) for item in value] + return value + + result = expand(json.loads(BASELINE_PATH.read_text(encoding="utf-8"))) + assert used == hashes.keys(), "unused or missing engine digest evidence" + return result @pytest.mark.parametrize("case", arch_engine_cases.CASE_NAMES) diff --git a/tests/test_arch_world.py b/tests/test_arch_world.py index 9af83a1a..8f4eb582 100644 --- a/tests/test_arch_world.py +++ b/tests/test_arch_world.py @@ -277,15 +277,16 @@ def test_contract_version_bump_without_transition_exits_one(world: dict, tmp_pat baseline = _git(clone, "rev-parse", "HEAD").stdout.strip() assert not (REPO_ROOT / "tests" / "architecture" / "contract-transitions.yaml").exists() - old_schema = clone / "system" / "contracts" / "manifest-v15.schema.json" - text = old_schema.read_text(encoding="utf-8") - text = text.replace("manifest-v15.schema.json", "manifest-v16.schema.json") - text = text.replace("atomic manifest v15", "atomic manifest v16") - old_const = '"contract_version": {\n "const": 15\n }' - assert text.count(old_const) == 1 - text = text.replace(old_const, '"contract_version": {\n "const": 16\n }') - (clone / "system" / "contracts" / "manifest-v16.schema.json").write_text( - text, encoding="utf-8") + import yaml + + contract = yaml.safe_load((clone / "system/contracts/manifest-contract.yaml").read_text()) + old_version = contract["contract_version"] + new_version = old_version + 1 + schema = json.loads((clone / contract["schema_path"]).read_text()) + schema["$id"] = schema["$id"].replace(f"manifest-v{old_version}", f"manifest-v{new_version}") + schema["title"] = f"LearningOS atomic manifest v{new_version}" + schema["$defs"]["generated"]["properties"]["contract_version"]["const"] = new_version + (clone / f"system/contracts/manifest-v{new_version}.schema.json").write_text(json.dumps(schema)) bumped = subprocess.run( [sys.executable, str(clone / "tools" / "manifest_contract.py"), "--bump", "--note", "S07 test: contract version bump"], @@ -293,7 +294,7 @@ def test_contract_version_bump_without_transition_exits_one(world: dict, tmp_pat ) assert bumped.returncode == 0, bumped.stderr[-2000:] _git(clone, "add", "-A") - _git(clone, "commit", "-qm", "S07 test: bump the manifest contract to v16") + _git(clone, "commit", "-qm", f"S07 test: bump the manifest contract to v{new_version}") candidate = _git(clone, "rev-parse", "HEAD").stdout.strip() proc = _compare(clone, world["dir"], baseline, candidate, _materials_copy(world, tmp_path), tmp_path / "runs") @@ -301,10 +302,10 @@ def test_contract_version_bump_without_transition_exits_one(world: dict, tmp_pat report = json.loads(proc.stdout) assert report["identical"] is False assert "contract:contract_version" in report["differences"] - assert report["contract"]["baseline_version"] == 15 + assert report["contract"]["baseline_version"] == old_version # The candidate's own contract bytes survived tree construction: its # stamped version is the bumped one, and its metadata is self-consistent. - assert report["candidate"]["contract_version"] == 16 + assert report["candidate"]["contract_version"] == new_version assert report["candidate"]["checks"] == { "contract_version": True, "schema_sha256": True, "snapshot_id": True} assert report["semantic"]["equal"] is True diff --git a/tests/test_contract_differential.py b/tests/test_contract_differential.py index 04e95438..44386e04 100644 --- a/tests/test_contract_differential.py +++ b/tests/test_contract_differential.py @@ -1,7 +1,7 @@ """Prototype: Python jsonschema vs Ajv standalone differential agreement. Paired-gate test: needs the sibling UI checkout (which carries the checked-in -Ajv validator), node, and the v15 bundle. Skips with an explicit reason when +Ajv validator), node, and the current declared bundle. Skips with an explicit reason when the UI sibling or node is absent, so Core stays usable alone; a missing checked-in validator is a failure, never a skip. Verdict booleans are compared, not error sets (Ajv reports short; Python reports all). @@ -21,10 +21,11 @@ from learning_os.store.contracts.bundle import build_bundle, digest_of from learning_os.store.contracts.json_schema import schema_registry +from learning_os.store.contracts.manifest_contract import load_contract pytestmark = [pytest.mark.full_repo, pytest.mark.paired] -V15_REL = "system/contracts/manifest-v15.schema.json" +CURRENT_SCHEMA_REL = load_contract(Path(__file__).resolve().parents[1])["schema_path"] VALIDATOR_REL = "contract-prototype/generated/manifest.validator.cjs" VERDICT_REL = "scripts/ajv-verdict.mjs" FIXTURE_REL = "fixture-vault/generated/manifest.json" @@ -49,7 +50,7 @@ def _paired_ui(repo_root: Path) -> Path: def _python_validator(repo_root: Path) -> Draft202012Validator: - schema = json.loads((repo_root / V15_REL).read_text(encoding="utf-8")) + schema = json.loads((repo_root / CURRENT_SCHEMA_REL).read_text(encoding="utf-8")) return Draft202012Validator( schema, registry=schema_registry(repo_root / "system" / "schema"), @@ -264,7 +265,7 @@ def test_differential_agreement(repo_root: Path, tmp_path: Path) -> None: def _format_subschemas(repo_root: Path, tmp_path: Path) -> dict[str, dict]: del tmp_path - bundle = json.loads(build_bundle(repo_root / V15_REL, repo_root / "system" / "schema")) + bundle = json.loads(build_bundle(repo_root / CURRENT_SCHEMA_REL, repo_root / "system" / "schema")) found: dict[str, dict] = {} def visit(node: Any) -> None: @@ -323,7 +324,7 @@ def test_prototype_lock_matches_production_lock(repo_root: Path) -> None: """Every scalar the generator emits must equal the hand-mirrored lock.""" ui = _paired_ui(repo_root) - production = json.loads((ui / "contracts" / "manifest-v15.lock.json").read_text( + production = json.loads(next((ui / "contracts").glob("manifest-v*.lock.json")).read_text( encoding="utf-8")) prototype = json.loads((ui / "contract-prototype" / "generated" / "manifest.prototype.lock.json").read_text(encoding="utf-8")) @@ -331,7 +332,7 @@ def test_prototype_lock_matches_production_lock(repo_root: Path) -> None: "top_level_keys", "generated_keys", "index_keys", "forbidden_top_level_keys"): assert prototype[key] == production[key], f"prototype lock drifts on {key}" - closure = digest_of(build_bundle(repo_root / V15_REL, repo_root / "system" / "schema")) + closure = digest_of(build_bundle(repo_root / CURRENT_SCHEMA_REL, repo_root / "system" / "schema")) assert prototype["closure_sha256"] == closure, ( "prototype schema closure is stale; regenerate the Core bundle and UI validator") header = (ui / VALIDATOR_REL).read_text(encoding="utf-8").splitlines()[:10] diff --git a/tests/test_operator_lock.py b/tests/test_operator_lock.py index fad54929..7c6dc452 100644 --- a/tests/test_operator_lock.py +++ b/tests/test_operator_lock.py @@ -68,7 +68,8 @@ def test_lock_timeout_exits_2_naming_holder(mini_repo): release.set() worker.join(timeout=60) assert proc.returncode == 2, proc.stderr - assert "timed out after 1s waiting for the operator lock" in proc.stderr + assert "timed out after " in proc.stderr + assert "s waiting for the operator lock" in proc.stderr assert f"pid {os.getpid()}" in proc.stderr assert not proc.stdout # The 60s holder was still holding: the timeout fired instead of waiting. @@ -202,7 +203,7 @@ def test_reader_without_tmpdir_waits_and_names_the_holder(mini_repo): assert proc.returncode == 2, proc.stderr assert "waiting for the operator lock" in proc.stderr assert f"pid {os.getpid()}" in proc.stderr - assert "timed out after 1s" in proc.stderr + assert "timed out after " in proc.stderr assert elapsed >= 1.0, elapsed diff --git a/tests/test_ops_context.py b/tests/test_ops_context.py index 65b4646e..a5a51604 100644 --- a/tests/test_ops_context.py +++ b/tests/test_ops_context.py @@ -88,6 +88,7 @@ def _assert_refusal(root, capsys, *, expected, gateway=None, verified=False, def test_members_are_exactly_the_spec_list(): assert [f.name for f in dataclasses.fields(OpContext)] == [ "root", "operation", "channel", "invocation", "gateway", + "session_id", "lock_timeout_s", ] public = {name for name, member in vars(OpContext).items() if not name.startswith("_") and callable(member)} diff --git a/tests/test_pre_push_hook.py b/tests/test_pre_push_hook.py index 14cd9482..be89ce23 100644 --- a/tests/test_pre_push_hook.py +++ b/tests/test_pre_push_hook.py @@ -616,16 +616,58 @@ def test_commit_check_preserves_affected_selection_contract(tmp_path, selection) def test_ci_bootstrap_accepts_clean_non_main_head(pair, monkeypatch): - monkeypatch.setenv("LOS_CI_BOOTSTRAP", "1") - head = _head(pair["core"]) + head = _bootstrap_head(pair) + monkeypatch.setenv("LOS_CI_BOOTSTRAP", "feat") result = _run_hook(pair["core"], f"refs/heads/feat {head} refs/heads/feat {ZERO_SHA}\n") assert result.returncode == 0 - assert "UNVERIFIED" in result.stdout + assert "UNVERIFIED" in result.stderr assert _invocations(pair["log"]) == [] # no local gate, no stamp def test_ci_bootstrap_refuses_main(pair, monkeypatch): - monkeypatch.setenv("LOS_CI_BOOTSTRAP", "1") - head = _head(pair["core"]) + head = _bootstrap_head(pair) + monkeypatch.setenv("LOS_CI_BOOTSTRAP", "feat") result = _run_hook(pair["core"], f"refs/heads/main {head} refs/heads/main {ZERO_SHA}\n") assert result.returncode == 1 + + +def _bootstrap_head(pair, *, trailer=True): + subprocess.run(["git", "checkout", "-qb", "feat"], cwd=pair["core"], check=True) + message = "fixture CI submission" + ("\n\nLOS-CI-Bootstrap: feat" if trailer else "") + subprocess.run(["git", "commit", "--allow-empty", "-qm", message], cwd=pair["core"], check=True) + return _head(pair["core"]) + + +@pytest.mark.parametrize("value", ["1", "other"]) +def test_ci_bootstrap_refuses_exported_or_wrong_branch_value(pair, monkeypatch, value): + head = _bootstrap_head(pair) + monkeypatch.setenv("LOS_CI_BOOTSTRAP", value) + result = _run_hook(pair["core"], f"refs/heads/feat {head} refs/heads/feat {ZERO_SHA}\n") + assert result.returncode == 1 + assert "must name the checked-out branch" in result.stderr + assert _invocations(pair["log"]) == [] + + +def test_ci_bootstrap_requires_commit_intent_trailer(pair, monkeypatch): + head = _bootstrap_head(pair, trailer=False) + monkeypatch.setenv("LOS_CI_BOOTSTRAP", "feat") + result = _run_hook(pair["core"], f"refs/heads/feat {head} refs/heads/feat {ZERO_SHA}\n") + assert result.returncode == 1 + assert "commit must record the trailer" in result.stderr + + +@pytest.mark.parametrize("destination", ["refs/tags/release", "refs/heads/other"]) +def test_ci_bootstrap_refuses_other_destination(pair, monkeypatch, destination): + head = _bootstrap_head(pair) + monkeypatch.setenv("LOS_CI_BOOTSTRAP", "feat") + result = _run_hook(pair["core"], f"refs/heads/feat {head} {destination} {ZERO_SHA}\n") + assert result.returncode == 1 + + +def test_ci_bootstrap_refuses_multiple_refs_and_dirty_checkout(pair, monkeypatch): + head = _bootstrap_head(pair) + monkeypatch.setenv("LOS_CI_BOOTSTRAP", "feat") + line = f"refs/heads/feat {head} refs/heads/feat {ZERO_SHA}\n" + assert _run_hook(pair["core"], line + line).returncode == 1 + (pair["core"] / "core.txt").write_text("uncommitted\n") + assert _run_hook(pair["core"], line).returncode == 1 diff --git a/tests/test_projection_readiness.py b/tests/test_projection_readiness.py index bed4c4d9..ab8811be 100644 --- a/tests/test_projection_readiness.py +++ b/tests/test_projection_readiness.py @@ -36,6 +36,15 @@ def test_dependency_ready_at_latest_and_later_known_write(mini_repo): assert dependency_ready(mini_repo, [a, b], [a, b]) == (True, "ready") +def test_dependency_ready_refuses_a_stale_projection_after_an_unpublished_edit(mini_repo): + a = capture(mini_repo, "ready-a") + assert dependency_ready(mini_repo, [a], [a]) == (True, "ready") + note = mini_repo / "knowledge/notes/mathematics/note-demo.md" + note.write_text(note.read_text() + "\nUnpublished authored edit.\n") + ready, reason = dependency_ready(mini_repo, [a], [a]) + assert ready is False and reason != "ready" + + def test_unknown_projection_and_missing_receipt_refuse(mini_repo): a = capture(mini_repo, "ready-a") assert not receipt_completed(mini_repo, a["receipt_path"], "sha256:wrong") @@ -70,15 +79,13 @@ def test_forged_receipt_is_not_completion(mini_repo): @pytest.mark.parametrize("relative", [ "knowledge/notes/fake.yaml", "operations/transactions/../../knowledge/fake.yaml", - "operations/transactions-other/fake.yaml", "../outside.yaml", + "operations/transactions-other/fake.yaml", "../outside.yaml", "/tmp/outside.yaml", ]) def test_receipt_paths_are_rejected_before_authority_read(mini_repo, monkeypatch, relative): - from learning_os.app import projection_readiness - def unexpected(*args): pytest.fail("receipt outside the transaction boundary was opened") - monkeypatch.setattr(projection_readiness, "_completed", unexpected) + monkeypatch.setattr(Path, "open", unexpected) assert not receipt_completed(mini_repo, relative, "sha256:fake") @@ -89,3 +96,84 @@ def test_receipt_symlink_cannot_escape_transaction_boundary(mini_repo): path.parent.mkdir(parents=True, exist_ok=True) path.symlink_to(target) assert not receipt_completed(mini_repo, str(path.relative_to(mini_repo)), "sha256:fake") + + +def test_receipt_parent_symlink_cannot_escape_transaction_boundary(mini_repo, monkeypatch): + directory = mini_repo / "operations/transactions/linked-parent" + directory.parent.mkdir(parents=True, exist_ok=True) + directory.symlink_to(mini_repo / "knowledge", target_is_directory=True) + monkeypatch.setattr(Path, "open", lambda *_: pytest.fail("escaped receipt was opened")) + assert not receipt_completed(mini_repo, "operations/transactions/linked-parent/fake.yaml", "sha256:fake") + + +def test_publication_cache_is_deeply_immutable_and_identity_still_validates(mini_repo): + from learning_os.app import projection_readiness as readiness + + capture(mini_repo, "immutable-publication") + pair = readiness._publication(str(mini_repo.resolve()), + readiness._stat(mini_repo / "generated/manifest.json"), + readiness._stat(mini_repo / "generated/manifest.identity.json")) + assert pair is not None + with pytest.raises(TypeError): + pair[0]["_generated"]["snapshot_id"] = "forged" + with pytest.raises(TypeError): + pair[1]["snapshot_id"] = "forged" + assert observe(mini_repo)["published"] is True + + +def test_authority_retries_once_after_a_real_concurrent_commit(mini_repo, monkeypatch): + from learning_os.app import projection_readiness as readiness + + first = capture(mini_repo, "race-first") + actual = readiness.collect_authority + calls = [] + + def concurrent(*args, **kwargs): + authority = actual(*args, **kwargs) + calls.append(1) + if len(calls) == 1: + capture(mini_repo, "race-second") + return authority + + monkeypatch.setattr(readiness, "collect_authority", concurrent) + result = settlement_ready(mini_repo, first["receipt_path"], first["snapshot_after"]) + assert result["write_completed"] is True and result["settled"] is True + assert result["current_snapshot_id"] != first["snapshot_after"] + assert len(calls) == 2 + + +def test_repeated_ledger_instability_fails_closed(mini_repo, monkeypatch): + from learning_os.app import projection_readiness as readiness + + first = capture(mini_repo, "unstable-first") + actual = readiness.collect_authority + calls = [] + + def concurrent(*args, **kwargs): + authority = actual(*args, **kwargs) + calls.append(1) + ledger = mini_repo / "operations/transactions/idempotency.yaml" + ledger.write_text(ledger.read_text() + "\n") + return authority + + monkeypatch.setattr(readiness, "collect_authority", concurrent) + assert not receipt_completed(mini_repo, first["receipt_path"], first["snapshot_after"]) + assert len(calls) == 2 + + +def test_receipt_change_during_authority_read_cannot_reuse_old_verification(mini_repo, monkeypatch): + from learning_os.app import projection_readiness as readiness + + first = capture(mini_repo, "receipt-race") + actual = readiness.collect_authority + calls = [] + + def concurrent(*args, **kwargs): + authority = actual(*args, **kwargs) + calls.append(1) + (mini_repo / first["receipt_path"]).write_text("snapshot_after: forged\n") + return authority + + monkeypatch.setattr(readiness, "collect_authority", concurrent) + assert not receipt_completed(mini_repo, first["receipt_path"], first["snapshot_after"]) + assert len(calls) == 1 diff --git a/tests/test_read_session.py b/tests/test_read_session.py index d74aa718..8a97d005 100644 --- a/tests/test_read_session.py +++ b/tests/test_read_session.py @@ -1,12 +1,10 @@ -"""ReadSession epoch, memo eligibility, and parallel-wave proof.""" +"""ReadSession epochs and memo eligibility use real read operations.""" from __future__ import annotations import sys -import threading from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "tools")) -from learning_os.adapters.agent_workers import parallel_reads # noqa: E402 from learning_os.app.read_session import ReadSession # noqa: E402 @@ -36,47 +34,6 @@ def test_close_ends_epoch(mini_repo): assert s.get(("a",)) is None -def test_parallel_reads_overlap_and_preserve_order(tmp_path): - barrier = threading.Barrier(2) - - def slow(argv): - barrier.wait(timeout=10) - return 0, argv[0], "" - - out = parallel_reads(tmp_path, [["a"], ["b"]], 2, executor=slow) - assert [r[1] for r in out] == ["a", "b"] # overlap proved by barrier - - -def test_cancellable_worker_never_recovers_or_escalates(mini_repo, monkeypatch): - import pytest - - from learning_os.app import lock - from learning_os.domain.failures import WriteRefused - - calls = [] - monkeypatch.setenv(lock.LOS_DEFER_RECOVERY_ENV, '1') - monkeypatch.setattr(lock, 'reconcile_inflight_transactions', lambda *_: calls.append('recover')) - with pytest.raises(WriteRefused, match='deferred'): - with lock.operator_lock(mini_repo): - pass - with lock.operator_lock(mini_repo, shared=True): - before = lock._HELD_OPERATOR_LOCKS.get() - with pytest.raises(WriteRefused, match='deferred'): - lock.escalate_operator_lock(mini_repo) - assert lock._HELD_OPERATOR_LOCKS.get() == before - with pytest.raises(WriteRefused, match='deferred'): - with lock.operator_lock(mini_repo): - pass - with lock.operator_lock(mini_repo, shared=True): - assert lock._HELD_OPERATOR_LOCKS.get() == before - journal = mini_repo / 'operations/transactions/.inflight/armed' - journal.mkdir(parents=True) - with pytest.raises(WriteRefused, match='foreground recovery'): - with lock.operator_lock(mini_repo, shared=True): - pass - assert journal.is_dir() and calls == [] - - def test_ranked_scan_loads_one_model_and_reuses_active_epoch(mini_repo): from learning_os.app.ranking import ranked_scan from learning_os.store.loading import count_repo_loads @@ -91,3 +48,112 @@ def test_ranked_scan_loads_one_model_and_reuses_active_epoch(mini_repo): assert ranked_scan(mini_repo) == expected assert bounded == [1] assert session.loads == 1 + + +def test_activation_observes_dependencies_only_at_its_boundaries(mini_repo, monkeypatch): + from learning_os.app import read_session + + calls = [] + actual = read_session._dependency_state + monkeypatch.setattr(read_session, "_dependency_state", lambda root: (calls.append(root), actual(root))[1]) + session = ReadSession(mini_repo) + assert calls == [] + with session.activate(): + session.put(("read",), 1) + assert session.get(("read",)) == 1 + assert len(calls) == 1 + assert session.unchanged() and session.unchanged() + session.close() + assert len(calls) == 2 + + +def test_epoch_detects_changed_inputs_and_resets_on_next_activation(mini_repo): + session = ReadSession(mini_repo) + with session.activate(): + note = mini_repo / "knowledge/notes/mathematics/note-demo.md" + note.write_text(note.read_text() + "\nA noncooperating edit.\n") + assert not session.unchanged() + with session.activate(): + pass + assert session.unchanged() + + +def test_prepare_publication_is_outside_the_memo_lifetime(mini_repo): + from learning_os.app.read_session import current_session + + session = ReadSession(mini_repo) + calls = [] + + def prepare(): + assert current_session(mini_repo) is None + calls.append(1) + _root(mini_repo) + return {}, object() + + with session.activate(prepare): + assert current_session(mini_repo) is session + assert calls == [1] and session.unchanged() + + +def test_git_head_invalidates_standalone_and_active_memos(mini_repo): + import subprocess + + def git(*args): + return subprocess.run(["git", "-C", str(mini_repo), *args], check=True, + capture_output=True, text=True) + + git("init") + git("-c", "user.name=Test", "-c", "user.email=test@example.invalid", "commit", "--allow-empty", "-m", "first") + session = ReadSession(mini_repo) + session.put(("history",), "first") + git("-c", "user.name=Test", "-c", "user.email=test@example.invalid", "commit", "--allow-empty", "-m", "second") + assert session.get(("history",)) is None + with session.activate(): + git("-c", "user.name=Test", "-c", "user.email=test@example.invalid", "commit", "--allow-empty", "-m", "third") + assert not session.unchanged() + + +def test_prepare_cannot_hide_a_model_from_an_earlier_snapshot(mini_repo): + from learning_os.store.fingerprint import canonical_fingerprint + + before = "sha256:" + canonical_fingerprint(mini_repo) + + def prepare(): + note = mini_repo / "knowledge/notes/mathematics/note-demo.md" + note.write_text(note.read_text() + "\nChanged while preparing the model.\n") + return {"_generated": {"snapshot_id": before}}, object() + + session = ReadSession(mini_repo) + with session.activate(prepare): + pass + assert not session.unchanged() + + +def test_all_cache_eligible_read_operations_preserve_the_loaded_model(mini_repo): + import hashlib + import pickle + + from learning_os.adapters.cli import invoke_outcome + from learning_os.adapters.cli_parser import build_parser + from learning_os.app.registry import REGISTRY + + commands = { + "operator.bootstrap": ["bootstrap", "--brief"], + "project.inspect": ["inspect", "note-demo"], + "capabilities.read": ["capabilities", "--compact", "--json"], + "intelligence.scan": ["intelligence-scan", "--brief", "--json"], + } + # Pin the complete eligible set: a new registration needs an exercised read. + eligible = {name for name, op in REGISTRY.items() if op.cache != "none"} + assert eligible == commands.keys() + parser = build_parser() + session = ReadSession(mini_repo) + with session.activate(): + repo = session.repository() + before = hashlib.sha256(pickle.dumps(repo)).digest() + for argv in commands.values(): + result = invoke_outcome(parser.parse_args(["--root", str(mini_repo), *argv])) + assert result.exit_code == 0, result.stderr + assert session.repository() is repo + assert hashlib.sha256(pickle.dumps(repo)).digest() == before, argv + assert session.unchanged() diff --git a/tests/test_release_pair_receipt.py b/tests/test_release_pair_receipt.py index a573f268..a9991e86 100644 --- a/tests/test_release_pair_receipt.py +++ b/tests/test_release_pair_receipt.py @@ -137,7 +137,7 @@ def test_a_valid_exact_pair_generates_a_schema_valid_receipt(clean_pair): assert receipt["shipped_asset_sha256"][name] == _sha256( (clean_pair["ui"] / "plugin" / name).read_bytes() ) - assert receipt["system_check_passed"] is True + assert receipt["system_check_passed"] is False # never self-proven assert receipt["stress_scope"] == "not-run-materials-unprovisioned" assert receipt["live_install_scope"] == "not-run-live-install-deselected" @@ -151,6 +151,12 @@ def test_receipt_records_the_declared_live_install_scope(clean_pair, tmp_path, s rpr.verify(receipt, artifact) # must not raise +def test_system_check_claim_must_be_asserted_by_the_caller(clean_pair): + receipt = _generate(clean_pair, system_check_passed=True) + assert receipt["system_check_passed"] is True + rpr.validate_receipt(receipt) + + def test_undeclared_live_install_scope_is_refused(clean_pair): with pytest.raises(rpr.ReleasePairReceiptError, match="live_install_scope"): _generate(clean_pair, live_install_scope="maybe") diff --git a/tests/test_review_consolidation.py b/tests/test_review_consolidation.py index 0cc1b665..07baa31e 100644 --- a/tests/test_review_consolidation.py +++ b/tests/test_review_consolidation.py @@ -1,30 +1,45 @@ """Register completeness: every finding has owner/callers/tests/disposition.""" from __future__ import annotations +import re from pathlib import Path import yaml +from jsonschema import Draft202012Validator ROOT = Path(__file__).resolve().parents[1] def test_register_complete(): data = yaml.safe_load((ROOT / "system/contracts/review-consolidation.yaml").read_text()) - assert data["schema_version"] == 1 + schema = yaml.safe_load((ROOT / "system/contracts/review-consolidation.schema.json").read_text()) + Draft202012Validator.check_schema(schema) + Draft202012Validator(schema).validate(data) ids = [f["id"] for f in data["findings"]] assert len(ids) == len(set(ids)) == 42 + assert set(ids) == set(( + "G30 G31 G32 G33 G34 G35 G36 O37 O38 O39 O40 O41 O42 O43 O44 O45 O46 O47 " + "I49 R50 R51 R52 R53 R54 R55 R56 R57 R58 R59 R60 " + "E01 E02 E03 E04 E05 E06 E07 E08 E09 E10 E11 E12" + ).split()) for f in data["findings"]: - for field in ("source", "root_cause", "owner", "affected_callers", - "regression_tests", "disposition", "installed_status"): - assert f[field], (f["id"], field) - assert (ROOT / f["regression_tests"]).is_file(), f["id"] - assert (ROOT / f["owner_path"]).is_file(), f["id"] - assert isinstance(f["caller_paths"], list) and f["caller_paths"], f["id"] - assert all((ROOT / path).is_file() for path in f["caller_paths"]), f["id"] - assert f["hosted_ci_status"] == f["installed_status"] == "external-promotion-record" + # Owner/caller paths describe recorded_revision, not the current tree. + # Evidence itself must remain available without an external workbench. + for evidence in f["measured_evidence"]: + if evidence.startswith("https://"): + assert re.fullmatch(r"https://github\.com/Aram164/LearningOS/actions/runs/[0-9]+", evidence), f["id"] + else: + path = (ROOT / evidence).resolve() + assert path.is_relative_to(ROOT) and path.is_file(), (f["id"], evidence) # Distinct inherited defects must link their actual owning suites rather # than an unrelated runner test whose existence alone would pass. by_id = {f["id"]: f for f in data["findings"]} assert by_id["G31"]["regression_tests"] == "tests/test_claim_status_audits.py" assert by_id["O41"]["regression_tests"] == "tests/test_note_evidence.py" assert "../obsidian-ui/src/main.ts" in by_id["R51"]["caller_paths"] + + +def test_completed_register_is_historical(): + corpus = yaml.safe_load((ROOT / "system/contracts/normative-corpus.yaml").read_text()) + page = next(row for row in corpus["documents"] if row["path"] == "system/developer/review-consolidation.md") + assert (page["status"], page["authority"]) == ("frozen", "historical") diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 16ad3510..57429833 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -70,9 +70,14 @@ def test_ordinary_ci_runs_every_gate_stage(): "tools/validate.py --no-report", "tools/warning_baseline.py --check", "npm run check", - "--collect-only", + "tools/check_shard_completeness.py", ): assert stage in runs, f"validate.yml lost gate stage: {stage}" + # The release gate must run the same shared completeness proof, so the + # two workflows cannot drift back into separate implementations. + release_runs = "\n".join(_all_run_steps(_load(RELEASE_PAIR))) + assert "tools/check_shard_completeness.py" in release_runs, ( + "release-pair.yml lost the shared completeness proof") # A lesser target must never stand in for the full gate. assert "make check\n" not in runs @@ -96,18 +101,25 @@ def test_ordinary_ci_permissions_are_read_only(): assert doc.get("permissions") == {"contents": "read"} -def test_ordinary_ci_does_not_claim_immutable_pairing(): - """Branch-based CI is useful but mutable — it must never look like the - exact-pair guarantee release-pair.yml exists to provide. - """ +def test_ordinary_ci_uses_the_exact_declared_consumer_revision(): + """Branch movement must not change which UI is tested with this Core.""" text = VALIDATE.read_text(encoding="utf-8") - # No literal 40-character commit SHA is pinned anywhere in the ordinary - # workflow; the UI side is always resolved by branch name at run time. - assert not re.search(rf"\b{HEX40}\b", text.lower()), ( - "ordinary CI must resolve the UI by branch, never by a pinned commit" - ) + pin = (ROOT / ".github/ui-revision.txt").read_text().strip() + assert re.fullmatch(HEX40, pin) + assert ".github/ui-revision.txt" in text + assert "git ls-remote" not in text + assert "REQUESTED_REF" not in text + assert 'test "$(git rev-parse HEAD)" = "$DECLARED_UI_SHA"' in text assert "workflow_dispatch" in text # still triggerable, not release-only - assert "consumer-ref" in text # the same-branch-or-main resolution step + assert "consumer-ref" in text + + +def test_pr_ci_is_not_duplicated_by_branch_pushes(): + doc = _load(VALIDATE) + assert _triggers(doc)["push"]["branches"] == ["main"] + assert "pull_request" in _triggers(doc) + assert "github.event.pull_request.number" in doc["concurrency"]["group"] + assert doc["concurrency"]["cancel-in-progress"] == "${{ github.event_name == 'pull_request' }}" def test_ordinary_ci_does_not_run_full_stress(): diff --git a/tools/README.md b/tools/README.md index 8c7b572e..8981216e 100644 --- a/tools/README.md +++ b/tools/README.md @@ -23,6 +23,7 @@ runtime coverage; the exact roots and historical allowlist live in | `warning_baseline.py` | supported gate | No-new-warning policy. | | `verify_plan_receipt.py` | supported gate | Receipt/projection check for one plan transaction (`make plan-check`). | | `code_reachability.py` | supported code gate | Static, code-only import/reachability report. | +| `check_shard_completeness.py` | supported CI gate | Proves the sharded CI runs are exactly the collected suite: manifest partition plus executed node-ID multiset equality. Invoked by validate.yml and release-pair.yml. | | `schema_contract.py` | supported contract tool | Stored-record contract check and deliberate bump entrypoint. | | `system_map.py` | supported development gate | Checks module ownership, named references, layers and generated developer-map blocks; `--write` regenerates those blocks. Never a canonical validation rule. | | `tree_contract.py` | supported contract tool | Renders ARCHITECTURE §3.2 from the tree contract; `--check` is what `make check` compares. | diff --git a/tools/agent_run.py b/tools/agent_run.py index 04805cc9..7b955037 100644 --- a/tools/agent_run.py +++ b/tools/agent_run.py @@ -1,729 +1,26 @@ #!/usr/bin/env python3 -"""Experimental CLI plan runner; canonical writes still use the gateway. - -``use`` accepts a task, operation id or verb; ``describe: true`` reads its -contract. Log steps require an explicit, unique ``key`` stable across retries. -Write plans require a stable ``session_id``; presealed gateway envelopes -must already bind that session. ``on_error`` defaults to ``stop``; explicitly -choose ``continue`` to keep running independent steps after a failure. -Only operations explicitly declaring read effects are reads. Derived, canonical -and unknown effects are write barriers for both ``argv`` and ``use``. -Dependencies mean completion of successful receipted writes, not persistence -of their effects after later writes. Before a dependent read, the current -projection must match a successful write at or after the latest required write -in this plan's execution order. Unrecognised -projection changes refuse; the CLI's own freshness/snapshot guards still run. - -Each summary has a UTF-8 byte budget; report_max_bytes caps all stdout, -including metadata. Every run retains a private full report and raw journals. -Use --expand-report PATH [--step ID] to verify and retrieve complete output. -``clusters: true`` retains omission counts and an executable full-scan route; -it neither makes learner decisions nor implements bulk mutations. Optional -preflight reuses the existing validation cache under its complete pins, -refusing on any error or unusable validation result. It never replaces gateway validation. - -Example:: - - {"session_id": "agent-session-42", "on_error": "stop", "steps": [ - {"id": "boot", "use": "open-work-or-priority-question", - "args": ["--brief"], "summary": {"fields": ["counts.modules"]}}, - {"id": "note", "kind": "log", "text": "...", "key": "intent-42"}, - {"id": "after", "use": "inspect", "args": ["unit-demo"], - "depends_on": ["note"]} - ]} - -Exit codes: 0 all steps succeeded; 3 a step failed/was blocked; 2 invalid plan. -""" +"""Run an experimental bounded agent plan or expand its retained report.""" from __future__ import annotations import argparse -import fnmatch -import io import json import math -import os -import re -import shlex -import subprocess -import sys -import tempfile -import time -from contextlib import contextmanager, redirect_stderr, redirect_stdout from pathlib import Path -from learning_os.app.projection_readiness import observe as _observe_projection -from learning_os.domain.codes import ( - DISCOVERY_FAILED, - INVALID_REQUEST, - INVALID_STEP_OUTPUT, - PREFLIGHT_FAILED, - REPORT_BUDGET_TOO_SMALL, - ROOT_MISMATCH, - SESSION_MISMATCH, - SESSION_REQUIRED, - VALIDATION_FAILED, -) -from learning_os.store.contracts.agent_plans import parse_controls +from learning_os.adapters import agent_runner +from learning_os.app.agent_presentation import encode_json +from learning_os.domain.agent_plans import PlanStepError +from learning_os.domain.codes import INVALID_REQUEST, INVALID_STEP_OUTPUT TOOLS = Path(__file__).resolve().parent - -class AgentRunError(Exception): - def __init__(self, message: str, code: str = INVALID_REQUEST): - super().__init__(message) - self.code = code - - -def _json(value) -> str: - try: - return json.dumps(value, ensure_ascii=False, separators=(",", ":"), allow_nan=False) - except (ValueError, TypeError) as exc: - raise AgentRunError("output must be finite JSON", INVALID_STEP_OUTPUT) from exc - - def _finite_number(value: str) -> float: number = float(value) if not math.isfinite(number): - raise AgentRunError("nonfinite JSON number in step output", INVALID_STEP_OUTPUT) + raise PlanStepError("nonfinite JSON number in plan", INVALID_STEP_OUTPUT) return number -@contextmanager -def _session_environment(session_id): - previous = os.environ.get("LOS_SESSION_ID") - if session_id is not None: - os.environ["LOS_SESSION_ID"] = session_id - try: - yield - finally: - if session_id is not None: - if previous is None: - os.environ.pop("LOS_SESSION_ID", None) - else: - os.environ["LOS_SESSION_ID"] = previous - - -def resolve_use(use: str, index: dict) -> str: - """Map a task id, operation id, or verb to the canonical CLI verb.""" - if use in index.get("verbs", []): - return use - operation_to_verb = {op: verb for verb, op in index.get("verb_to_operation", {}).items()} - if use in operation_to_verb: - return operation_to_verb[use] - if use in index.get("task_to_use", {}): - return index["task_to_use"][use] - raise AgentRunError(f"unknown task, capability, or verb: {use}") - - -def build_index(root: Path, executor, *, resolve_tasks: bool = True) -> dict: - """Use the executing parser and selected root's capability catalogue.""" - if str(TOOLS) not in sys.path: - sys.path.insert(0, str(TOOLS)) - from learning_os.adapters.cli_parser import build_parser - from learning_os.app.registry import REGISTRY, OperationEffects - - parser = getattr(executor, "parser", None) or build_parser() - choices = parser._subparsers._group_actions[0].choices # noqa: SLF001 - verb_to_operation = {} - for name, sub in choices.items(): - operation = getattr(sub, "_defaults", {}).get("_operation") - if operation: - verb_to_operation[name] = operation - # The executing parser/registry owns effects for every plan shape. Only - # an explicitly declared read is a read. Neither invocation kind nor - # task discovery can weaken the default barrier for undeclared effects. - index = {"verbs": sorted(choices), "verb_to_operation": verb_to_operation, - "task_to_use": {}, "write_verbs": [name for name in choices - if (entry := REGISTRY.get(verb_to_operation.get(name))) is None - or entry.effects != OperationEffects.READ]} - if not resolve_tasks: - return index # Explicit argv/log steps need no task prose expansion. - if hasattr(executor, "parser"): - from learning_os.store.contracts.verb_catalogue import ( - VerbCatalogueError, - build_verb_catalogue, - ) - try: - catalogue = build_verb_catalogue(root) - except VerbCatalogueError as exc: - raise AgentRunError(f"capability discovery failed: {exc}", DISCOVERY_FAILED) from exc - compact = {"verbs": [row.as_dict() for row in catalogue.verbs], - "tasks": [row.as_dict() for row in catalogue.tasks]} - else: - code, out, err = executor(["capabilities", "--json"], root) - if code: - raise AgentRunError(f"capability discovery failed: {err.strip()}", DISCOVERY_FAILED) - compact = json.loads(out) - task_to_use = {} - operation_to_verb = {op: v for v, op in verb_to_operation.items()} - for task in compact.get("tasks", []): - segments = re.findall(r"`([^`]+)`", task.get("entry_read") or "") - tokens = segments[0].split() if segments else [] - if not tokens: - continue - if tokens[0] == "capabilities" and len(tokens) > 1 and tokens[1] in operation_to_verb: - task_to_use[task["id"]] = operation_to_verb[tokens[1]] - elif tokens[0] in verb_to_operation: - task_to_use[task["id"]] = tokens[0] - index["task_to_use"] = task_to_use - return index - - -def _field(payload, name): - if isinstance(payload, dict): - if payload.get(name): - return payload[name] - nested = payload.get("result") - if isinstance(nested, dict): - return nested.get(name) - return None - - -def _receipt_ready(root: Path, result) -> tuple[bool, str]: - if not isinstance(result, dict) or result.get("ok") is not True: - return False, "write-not-ok" - receipt = _field(result, "receipt_path") - if not isinstance(receipt, str) or not receipt: - return False, "receipt-missing-from-result" - path = (root / receipt).resolve() - if not path.is_relative_to(root.resolve()) or not path.is_file(): - return False, "receipt-not-on-disk-in-root" - if not isinstance(_field(result, "snapshot_after"), str) or not _field(result, "snapshot_after"): - return False, "snapshot-after-missing" - return True, "completed" - - -def _writes_completed(root: Path, required: list) -> tuple[bool, str]: - for result in required: - ready, reason = _receipt_ready(root, result) - if not ready: - return ready, reason - return True, "completed" - - -def writes_ready(root: Path, required: list, known: list) -> tuple[bool, str]: - """Required writes completed; projection cannot precede their last write. - - Gateway success plus the retained receipt proves historical completion. - ``known`` is in plan execution order. A later known write may supersede - earlier effects; an earlier completion cannot stand in for a later one. - An arbitrary different - projection is not accepted as a successor, and actual reads retain their - normal current-input guards. This also supports replaying a multi-write - plan while its final projection is still current. - """ - completed, reason = _writes_completed(root, required) - if not completed: - return False, reason - signatures = {(_field(result, "receipt_path"), _field(result, "snapshot_after")) for result in required} - positions = {(_field(result, "receipt_path"), _field(result, "snapshot_after")): i - for i, result in enumerate(known) if _receipt_ready(root, result)[0]} - if not signatures or not signatures.issubset(positions): - return False, "required-write-not-known" - latest = max(positions[signature] for signature in signatures) - snapshots = {_field(result, "snapshot_after") for result in known[latest:] - if _receipt_ready(root, result)[0]} - obs = _observe_projection(root, verify_current=False) - stamp = obs["snapshot_id"] - if stamp is None: - return False, ("projection-publication-pending" if (root / "generated/manifest.json").exists() - else "projection-not-readable") - if stamp not in snapshots: - return False, "projection-not-current" - return True, "ready" - - -def write_ready(root: Path, write_result) -> tuple[bool, str]: - return writes_ready(root, [write_result], [write_result]) - - -def _extract(payload, dotted: str): - node = payload - for part in dotted.split("."): - if isinstance(node, dict) and part in node: - node = node[part] - elif isinstance(node, list) and part.isdigit() and int(part) < len(node): - node = node[int(part)] - else: - return None, False - return node, True - - -def _place(target: dict, dotted: str, value) -> None: - parts = dotted.split(".") - node = target - for part in parts[:-1]: - existing = node.setdefault(part, {}) - if not isinstance(existing, dict): - raise AgentRunError("summary fields must not overlap") - node = existing - node[parts[-1]] = value - - -def _cap(node, max_items: int): - if isinstance(node, dict): - return {key: _cap(value, max_items) for key, value in node.items()} - if isinstance(node, list): - capped = [_cap(value, max_items) for value in node[:max_items]] - if len(node) > max_items: - capped.append({"_omitted": len(node) - max_items}) - return capped - if isinstance(node, str) and len(node) > 240: - return node[:240] + "…" - return node - - -def summarize(payload, *, fields=None, max_items: int = 5, max_bytes: int = 2000) -> str: - if not isinstance(max_bytes, int) or isinstance(max_bytes, bool) or max_bytes < 64: - raise AgentRunError("summary.max_bytes must be an integer >= 64") - if not isinstance(max_items, int) or isinstance(max_items, bool) or max_items < 1: - raise AgentRunError("summary.max_items must be a positive integer") - missing = [] - if fields: - picked: dict = {} - for dotted in fields: - value, found = _extract(payload, dotted) - if found: - _place(picked, dotted, value) - else: - missing.append(dotted) - if missing: - picked["_missing_fields"] = missing - encoded = _json(picked) - elif isinstance(payload, str): - encoded = _json({"text": payload}) - else: - encoded = _json(_cap(payload, max_items)) - size = len(encoded.encode("utf-8")) - if size <= max_bytes: - return encoded - metadata = {"_truncated_bytes": size, **({"_missing_fields": missing} if missing else {})} - if len(_json({**metadata, "preview": ""}).encode("utf-8")) > max_bytes: - raise AgentRunError("budget cannot hold missing-field metadata; increase max_bytes", "SUMMARY_BUDGET_TOO_SMALL") - # Search the final escaped JSON bytes, not source character count. - lo, hi = 0, min(len(encoded), max_bytes) - while lo < hi: - mid = (lo + hi + 1) // 2 - candidate = _json({**metadata, "preview": encoded[:mid]}) - if len(candidate.encode("utf-8")) <= max_bytes: - lo = mid - else: - hi = mid - 1 - return _json({**metadata, "preview": encoded[:lo]}) - - -def cluster_preview(scan: dict, *, argv=None, sample: int = 3) -> dict: - """Preserve the public scan's bounds and route to complete membership.""" - if not isinstance(scan.get("groups"), list): - raise AgentRunError("cluster preview requires the brief scan's groups") - if argv is None: - argv = shlex.split(scan.get("full_result") or "intelligence-scan --json") - full_argv = [token for token in argv if token != "--brief"] - if "--json" not in full_argv: - full_argv.append("--json") - groups = [] - for group in scan.get("groups", []): - members = group.get("sample_goal_ids", []) - count = group.get("member_count", len(members)) - groups.append({"cluster_id": group.get("cluster_id"), "title": group.get("title"), - "member_count": count, "sample_goal_ids": members[:sample], - "omitted_members": max(0, count - len(members[:sample]))}) - return {"groups": groups, "total_groups": scan.get("total_groups", len(groups)), - "total_goals": scan.get("total_goals", sum(g["member_count"] for g in groups)), - "omitted_groups": scan.get("omitted_groups", 0), - "omitted_goals": scan.get("omitted_goals", 0), - "full_result": shlex.join(full_argv), "expand_argv": full_argv} - - -def _cluster_summary(scan: dict, argv: list[str], summary: dict) -> str: - preview = cluster_preview(scan, argv=argv, sample=summary.get("max_items", 3)) - budget = summary.get("max_bytes", 2000) - # Keep recovery metadata even when groups/samples need to be removed. - while len(_json(preview).encode("utf-8")) > budget: - sampled = next((g for g in reversed(preview["groups"]) if g["sample_goal_ids"]), None) - if sampled: - sampled["sample_goal_ids"].pop() - sampled["omitted_members"] += 1 - elif preview["groups"]: - removed = preview["groups"].pop() - preview["omitted_groups"] += 1 - preview["omitted_goals"] += removed["member_count"] - else: - raise AgentRunError("cluster budget cannot hold counts and expansion; increase max_bytes") - return _json(preview) - - -def classify_scope(errors: list[dict], writes: list[str]) -> dict: - in_scope, unrelated = [], [] - for error in errors: - path = error.get("path", "") - (in_scope if path and any(fnmatch.fnmatch(path, glob) for glob in writes) - else unrelated).append(error) - return {"in_scope": in_scope, "unrelated": unrelated} - - -def _preflight(executor, root: Path, writes: list[str]) -> dict | None: - code, out, err = executor(["validate"], root) - errors = [] - for line in out.splitlines(): - match = re.match(r"^E ([^:]+): (.*)$", line) - if match: - location = re.search(r" \[([^\]]+)\]$", match[2]) - errors.append({"code": match[1], "message": match[2], - "path": location[1] if location else ""}) - summary = re.search(r"(?m)^(\d+) error\(s\), \d+ warning\(s\) — (OK|FAIL)$", out) - if code not in (0, 1) or not summary or int(summary[1]) != len(errors) \ - or (code == 0) != (not errors) or (summary[2] == "OK") != (not errors): - return {"code": PREFLIGHT_FAILED, "retryable": False, - "message": "validation did not return a trustworthy result", - "exit": code, "stderr": err.strip()[-400:]} - if errors: - return {"code": VALIDATION_FAILED, "retryable": False, - "scope": classify_scope(errors, writes)} - return None - - -@contextmanager -def _session_bound_envelope(namespace, session_id): - if session_id is None or getattr(namespace, "command", None) != "capability": - yield - return - if namespace.payload_file == "-": - raise AgentRunError("session-bound gateway steps require an envelope file", SESSION_MISMATCH) - content = Path(namespace.payload_file).read_bytes() - try: - envelope = json.loads(content) - except ValueError as exc: - raise AgentRunError("session-bound gateway steps require a JSON envelope", SESSION_MISMATCH) from exc - if not isinstance(envelope, dict) or envelope.get("session_id") != session_id: - raise AgentRunError("sealed envelope session differs from plan; reseal the approved intent", SESSION_MISMATCH) - # Preserve approved bytes. Submit an immutable copy of the file checked - # here, avoiding a second read of a caller-changeable source pathname. - previous = namespace.payload_file - with tempfile.TemporaryDirectory(prefix="agent-run-envelope-") as directory: - target = Path(directory) / "envelope.json" - target.write_bytes(content) - namespace.payload_file = str(target) - try: - yield - finally: - namespace.payload_file = previous - - -def _cli_executor_factory(root: Path, *, session_id=None, write_commands=None): - from learning_os.adapters.cli import invoke_outcome - from learning_os.adapters.cli_parser import build_parser - from learning_os.app.lock import LOS_LOCK_TIMEOUT_ENV - - parser = build_parser() - writers = write_commands if write_commands is not None else {"capability"} - admitted_envelopes = {} - - def validate(argv): - if any(arg == "--root" or arg.startswith("--root=") for arg in argv): - raise AgentRunError("step root overrides are forbidden; use runner --root") - errors = io.StringIO() - try: - with redirect_stderr(errors), redirect_stdout(errors): - namespace = parser.parse_args(["--root", str(root), *argv]) - except SystemExit as exc: - raise AgentRunError("invalid step arguments: " + errors.getvalue()[-1000:]) from exc - if Path(namespace.root).resolve() != root: - raise AgentRunError("parsed step root differs from selected root", ROOT_MISMATCH) - if session_id is not None and getattr(namespace, "session_id", None) not in (None, session_id): - raise AgentRunError("parsed step session differs from plan", SESSION_MISMATCH) - if session_id is None and namespace.command in writers: - raise AgentRunError("parsed write command requires a plan session_id", SESSION_REQUIRED) - return namespace - - def executor(argv, selected_root): - if selected_root.resolve() != root: - raise AgentRunError("executor root differs from plan", ROOT_MISMATCH) - if argv[:1] == ["__seal_submit__"]: - _, capability, payload, key, *session_args = argv - proc = subprocess.run( - [sys.executable, str(TOOLS / "seal_envelope.py"), "--root", str(root), - "--capability", capability, "--payload=" + payload, "--key=" + key, - "--submit", *session_args], capture_output=True, text=True, cwd=root) - return proc.returncode, proc.stdout, proc.stderr - namespace = validate(argv) - previous = os.environ.get(LOS_LOCK_TIMEOUT_ENV) - try: - if namespace.lock_timeout is not None: - os.environ[LOS_LOCK_TIMEOUT_ENV] = str(namespace.lock_timeout) - with _session_bound_envelope(namespace, session_id): - expected = admitted_envelopes.get(tuple(argv)) - if expected is not None and Path(namespace.payload_file).read_bytes() != expected: - raise AgentRunError("approved envelope changed since plan admission") - if hasattr(namespace, "_operation"): - outcome = invoke_outcome(namespace) - return outcome.exit_code, outcome.stdout, outcome.stderr - proc = subprocess.run( - [sys.executable, str(TOOLS / "los.py"), "--root", str(root), *argv], - capture_output=True, text=True, cwd=root) - return proc.returncode, proc.stdout, proc.stderr - finally: - if previous is None: - os.environ.pop(LOS_LOCK_TIMEOUT_ENV, None) - else: - os.environ[LOS_LOCK_TIMEOUT_ENV] = previous - - executor.validate = validate - executor.parser = parser - executor.envelope_bytes = admitted_envelopes - return executor - - -def _expand_log_step(step: dict, session_id=None) -> list[str]: - if step.get("stage_id"): - capability = "stage.note.write" - payload = {"unit_id": step["unit_id"], "stage_id": step["stage_id"], "text": step["text"]} - else: - capability, payload = "capture.create", {"text": step["text"]} - return ["__seal_submit__", capability, _json(payload), step["key"], - *(["--session-id=" + session_id] if session_id is not None else [])] - - -def _validate_plan(plan, poll_s: float) -> list[dict]: - if len(_json(plan).encode("utf-8")) > 1048576: - raise AgentRunError("plan input exceeds 1 MiB") - if isinstance(poll_s, bool) or not math.isfinite(poll_s) or poll_s < 0: - raise AgentRunError("poll interval must be finite and nonnegative") - if isinstance(plan, dict): - unknown = set(plan) - {"steps", "session_id", "on_error", "schema_version", - "read_workers", "deadline_s", "report_max_bytes"} - if unknown: - raise AgentRunError(f"unknown plan fields: {sorted(unknown)}") - try: - parse_controls(plan) - except ValueError as exc: - raise AgentRunError(str(exc)) from exc - steps = plan.get("steps") if isinstance(plan, dict) else None - if not isinstance(steps, list) or not steps: - raise AgentRunError("plan needs a non-empty steps list") - if len(steps) > 256: - raise AgentRunError("plans are limited to 256 steps") - if plan.get("on_error", "stop") not in ("stop", "continue"): - raise AgentRunError("on_error must be stop or continue") - session_id = plan.get("session_id") - if "session_id" in plan and (not isinstance(session_id, str) or not session_id.strip() - or session_id != session_id.strip() or len(session_id) > 128): - raise AgentRunError("session_id must be a nonblank, trimmed string of at most 128 characters") - seen, keys = set(), set() - for step in steps: - if not isinstance(step, dict) or not isinstance(step.get("id"), str) or not step["id"]: - raise AgentRunError("steps need nonempty string ids") - if len(step["id"]) > 64: - raise AgentRunError("step ids are limited to 64 characters") - if step["id"] in seen: - raise AgentRunError("step ids must be unique") - allowed_step = {"id", "depends_on", "kind", "describe", "write", "preflight", "clusters", - "ready_timeout_s", "args", "argv", "writes", "summary", "key", "text", - "stage_id", "unit_id", "use"} - if set(step) - allowed_step: - raise AgentRunError("unknown step fields: " + str(sorted(set(step) - allowed_step))) - if "argv" in step and ("use" in step or "args" in step): - raise AgentRunError("argv and use/args are mutually exclusive") - deps = step.get("depends_on", []) - if not isinstance(deps, list) or any(not isinstance(d, str) or d not in seen for d in deps): - raise AgentRunError("dependencies must name earlier steps") - seen.add(step["id"]) - if step.get("kind") not in (None, "log"): - raise AgentRunError("kind must be log or omitted") - for flag in ("describe", "write", "preflight", "clusters"): - if flag in step and not isinstance(step[flag], bool): - raise AgentRunError(f"{flag} must be boolean") - if step.get("describe") and not isinstance(step.get("use"), str): - raise AgentRunError("describe requires use") - timeout = step.get("ready_timeout_s", 10) - if isinstance(timeout, bool) or not isinstance(timeout, (int, float)) or not math.isfinite(timeout) or timeout < 0: - raise AgentRunError("readiness timeout must be finite and nonnegative") - for name in ("args", "argv", "writes"): - values = step.get(name, []) - if not isinstance(values, list) or any(not isinstance(v, str) for v in values): - raise AgentRunError(f"{name} must be a string list") - if step.get("argv", [])[:1] == ["__seal_submit__"]: - raise AgentRunError("internal executor commands cannot be supplied in a plan") - if any(a == "--root" or a.startswith("--root=") for a in step.get("argv", []) + step.get("args", [])): - raise AgentRunError("step root overrides are forbidden") - summary = step.get("summary", {}) - if not isinstance(summary, dict): - raise AgentRunError("summary must be an object") - if set(summary) - {"fields", "max_items", "max_bytes"}: - raise AgentRunError("unknown summary fields") - fields = summary.get("fields", []) - if not isinstance(fields, list) or any(not isinstance(f, str) or not f or "" in f.split(".") for f in fields): - raise AgentRunError("summary fields must be dotted strings") - if any(f == "_missing_fields" or f.startswith("_missing_fields.") for f in fields): - raise AgentRunError("_missing_fields is reserved summary metadata") - if any(a != b and (a.startswith(b + ".") or b.startswith(a + ".")) for a in fields for b in fields): - raise AgentRunError("summary fields must not overlap") - summarize({}, max_items=summary.get("max_items", 5), max_bytes=summary.get("max_bytes", 2000)) - if step.get("kind") == "log": - key = step.get("key") - if not isinstance(key, str) or not key.strip() or key in keys: - raise AgentRunError("each log needs a unique explicit key stable across retries") - keys.add(key) - if not isinstance(step.get("text"), str) or not step["text"].strip(): - raise AgentRunError("log text must be nonempty") - if step.get("stage_id") and not step.get("unit_id"): - raise AgentRunError("stage log requires unit_id") - elif not isinstance(step.get("use"), str) and "argv" not in step: - raise AgentRunError("step needs use or argv") - command = (step.get("argv") or [step.get("use")])[0] - if session_id is None and (step.get("kind") == "log" or step.get("write") - or command in ("capability", "cli.capability")): - raise AgentRunError("log/gateway plans require an explicit session_id stable across retries") - if session_id is not None and any(a == "--session-id" or a.startswith("--session-id=") - for a in step.get("argv", []) + step.get("args", [])): - raise AgentRunError("step session overrides are forbidden; use plan session_id") - return steps - - -def _step_argv(step: dict, index: dict, session_id=None) -> list[str]: - if step.get("kind") == "log": - argv = _expand_log_step(step, session_id) - elif step.get("describe"): - argv = ["capabilities", step["use"], "--json"] - elif "argv" in step: - argv = list(step["argv"]) - else: - argv = [resolve_use(step["use"], index), *step.get("args", [])] - if step.get("clusters"): - if not argv or argv[0] != "intelligence-scan": - raise AgentRunError("clusters requires intelligence-scan") - for flag in ("--brief", "--json"): - if flag not in argv: - argv.append(flag) - return argv - - -def run_plan(plan: dict, root: Path, *, executor=None, poll_s: float = 0.1, - index: dict | None = None, report_dir=None) -> dict: - from learning_os.adapters.agent_workers import parallel_reads - from learning_os.app.agent_plans import execute_plan - from learning_os.app.agent_reporting import ReportStore, minimum_ledger_bytes - from learning_os.app.projection_readiness import dependency_ready - from learning_os.app.registry import REGISTRY - from learning_os.app.validation_service import diagnostic_report - from learning_os.domain.agent_plans import CompiledStep, PlanControls, RawOutcome - - started = time.monotonic() - steps = _validate_plan(plan, poll_s) - root = root.resolve() - injected = executor is not None - session_id = plan.get("session_id") - writers = {"capability"} - actual = executor or _cli_executor_factory(root, session_id=session_id, write_commands=writers) - with _session_environment(session_id): - index = index if index is not None else build_index(root, actual, - resolve_tasks=any("use" in s and not s.get("describe") and s.get("kind") != "log" - for s in steps) or injected) - writers.update(index.get("write_verbs", [])) - compiled = [] - for step in steps: - direct = (step.get("argv") or [step.get("use")])[0] - if session_id is None and direct in writers and not step.get("describe"): - raise AgentRunError("write plans require an explicit session_id stable across retries", SESSION_REQUIRED) - try: - argv = _step_argv(step, index, session_id) - command = argv[0] if argv else "" - if not injected and command != "__seal_submit__": - namespace = actual.validate(argv) - command = namespace.command - # Check all static envelope/session bindings before the first mutation. - with _session_bound_envelope(namespace, session_id): - if command == "capability": - actual.envelope_bytes[tuple(argv)] = Path(namespace.payload_file).read_bytes() - writer = command in writers or step.get("kind") == "log" or step.get("write", False) - if writer and session_id is None: - raise AgentRunError("write plans require an explicit session_id stable across retries", SESSION_REQUIRED) - operation = index.get("verb_to_operation", {}).get(command) - entry = REGISTRY.get(operation) - profile = entry.memo_profile if entry is not None else "none" - reusable = not injected and not writer and profile != "none" - if profile == "manifest-brief" and ("--brief" not in argv or - (not injected and getattr(namespace, "feed", None))): - reusable = False - compiled.append(CompiledStep( - id=step["id"], argv=tuple(argv), dependencies=tuple(step.get("depends_on", [])), - writer=bool(writer), submitting=command in ("capability", "__seal_submit__"), - reusable=reusable, parallel_safe=bool(reusable and entry.parallel_safe), - ready_timeout_s=float(step.get("ready_timeout_s", 10)), - preflight=step.get("preflight", False), scope=tuple(step.get("writes", [])), - presentation=step)) - except AgentRunError as exc: - compiled.append(CompiledStep(id=step["id"], argv=(), - admission_error={"code": exc.code, "retryable": False, "message": str(exc)})) - store = ReportStore(root, Path(report_dir) if report_dir is not None else None) - budget = plan.get("report_max_bytes", 65536) - if minimum_ledger_bytes([s.id for s in compiled], str(store.full_path)) > budget: - raise AgentRunError("report_max_bytes cannot hold the minimum step ledger", - REPORT_BUDGET_TOO_SMALL) - - class Port: - def __init__(self): - self.resource_info = {} - - def execute(self, step, remaining): - code, out, err = actual(list(step.argv), root) - count = int(not injected and step.submitting and step.argv[0] == "__seal_submit__") - return RawOutcome(code, out, err, count) - - def parallel(self, batch, workers, remaining): - counter = [0] - elapsed = {} - outcomes = parallel_reads(root, [list(s.argv) for s in batch], workers, - timeout_s=remaining, session_id=session_id, - process_counter=counter, resource_stats=self.resource_info, elapsed_times=elapsed) - return [RawOutcome(*outcome, processes=counter[0] if i == 0 else 0, elapsed_ms=elapsed.get(i, 0)) - for i, outcome in enumerate(outcomes)] - - def preflight(self, step): - if injected: - return _preflight(actual, root, list(step.scope)) - report = diagnostic_report(root) - if not report.get("trustworthy"): - return report.get("error") - errors = report.get("errors", []) - return ({"code": VALIDATION_FAILED, "retryable": False, - "scope": classify_scope(errors, list(step.scope))} - if errors else None) - - def summarize(self, step, payload): - description = step.presentation - summary = description.get("summary") or {} - return (_cluster_summary(payload, list(step.argv), summary) - if description.get("clusters") and isinstance(payload, dict) - else summarize(payload, fields=summary.get("fields"), - max_items=summary.get("max_items", 5), - max_bytes=summary.get("max_bytes", 2000))) - - def ready(self, required, known, submitting): - if injected: - return (_writes_completed(root, required) if submitting - else writes_ready(root, required, known)) - records = [{"receipt_path": _field(r, "receipt_path"), - "snapshot_after": _field(r, "snapshot_after")} for r in required] - all_records = [{"receipt_path": _field(r, "receipt_path"), - "snapshot_after": _field(r, "snapshot_after")} for r in known] - return dependency_ready(root, records, all_records, completion_only=submitting) - - def epoch(self, selected_root): - return not injected - - def resources(self): - import resource - return {**self.resource_info, "runner_peak_rss_bytes": - resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * (1 if sys.platform == "darwin" else 1024)} - - store.inputs(plan, list(actual.envelope_bytes.values()) if not injected else []) - controls = PlanControls(read_workers=plan.get("read_workers", 1), - deadline_s=float(plan.get("deadline_s", 120)), report_max_bytes=budget, - on_error=plan.get("on_error", "stop"), session_id=session_id) - return execute_plan(compiled, root, Port(), controls, store, started, poll_s) - - def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("plan", nargs="?", help="plan JSON file") @@ -733,6 +30,7 @@ def build_parser() -> argparse.ArgumentParser: parser.add_argument("--poll-s", type=float, default=0.1) parser.add_argument("--report-dir", default=None, help="directory for the full report artifact (bounded stdout)") + parser.add_argument("--keep-report", action="store_true", help="exclude this run from report retention") return parser @@ -743,19 +41,19 @@ def main() -> int: if args.expand_report: from learning_os.app.agent_reporting import expand_report if args.plan: - raise AgentRunError("choose a plan or --expand-report") - print(_json(expand_report(Path(args.expand_report), args.step))) + raise PlanStepError("choose a plan or --expand-report") + print(encode_json(expand_report(Path(args.expand_report), args.step))) return 0 if not args.plan or args.step: - raise AgentRunError("a plan is required; --step needs --expand-report") + raise PlanStepError("a plan is required; --step needs --expand-report") if Path(args.plan).stat().st_size > 1048576: - raise AgentRunError("plan input exceeds 1 MiB") - report = run_plan(json.loads(Path(args.plan).read_text(encoding="utf-8"), parse_float=_finite_number, parse_constant=_finite_number), root, poll_s=args.poll_s, report_dir=args.report_dir) - except (OSError, ValueError, KeyError, TypeError, AgentRunError) as exc: - print(_json({"error": {"code": getattr(exc, "code", INVALID_REQUEST), + raise PlanStepError("plan input exceeds 1 MiB") + report = agent_runner.run_plan(json.loads(Path(args.plan).read_text(encoding="utf-8"), parse_float=_finite_number, parse_constant=_finite_number), root, poll_s=args.poll_s, report_dir=args.report_dir, keep_report=args.keep_report) + except (OSError, ValueError, KeyError, TypeError, PlanStepError) as exc: + print(encode_json({"error": {"code": getattr(exc, "code", INVALID_REQUEST), "message": str(exc), "retryable": False}})) return 2 - print(_json(report)) + print(encode_json(report)) return 0 if all(row["status"] == "ok" for row in report["steps"]) else 3 diff --git a/tools/check_shard_completeness.py b/tools/check_shard_completeness.py new file mode 100644 index 00000000..ce6a30a9 --- /dev/null +++ b/tools/check_shard_completeness.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"""Prove the sharded CI runs are exactly the collected suite. + +Shared by validate.yml and release-pair.yml so the two gates cannot drift: +the shard manifest must partition tests/, and every executed JUnit testcase +must map back to a canonical collected node ID with multiplicity exactly +one — a duplicate plus an omission has the same count and must still fail. +""" +from __future__ import annotations + +import argparse +import json +import subprocess +import sys +import xml.etree.ElementTree as ET +from collections import Counter +from pathlib import Path + + +def _fail(message: str) -> SystemExit: + return SystemExit(f"shard completeness: {message}") + + +def check(junit_dir: Path, manifest_path: Path) -> str: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + disk = sorted(f"tests/{p.name}" for p in Path("tests").glob("test_*.py")) + covered = Counter(f for leg in manifest["legs"].values() for f in leg) + for name, count in sorted(covered.items()): + expected = manifest.get("node_shards", {}).get(name, {}).get("count", 1) + if count != expected: + raise _fail(f"{name} appears in {count} legs, expected {expected}") + if sorted(covered) != disk: + raise _fail( + ".github/shard-manifest.json does not partition tests/: " + f"missing={sorted(set(disk) - set(covered))} " + f"extra={sorted(set(covered) - set(disk))}") + + out = subprocess.run( + [sys.executable, "-m", "pytest", "--collect-only", "-q", + "-m", "not live_install"], + capture_output=True, text=True, check=True) + collected_ids = [line.strip() for line in out.stdout.splitlines() + if "::" in line and not line.startswith(" ")] + expected_ids = Counter(collected_ids) + if not expected_ids: + raise _fail("full collection produced no node IDs") + + def node_id(classname: str | None, name: str | None) -> str | None: + parts = (classname or "").split(".") + for split in range(1, len(parts) + 1): + candidate = ("/".join(parts[:split]) + ".py::" + + "::".join(parts[split:] + [name or ""])) + if candidate in expected_ids: + return candidate + return None + + executed: Counter[str] = Counter() + unmapped: list[str] = [] + skipped = 0 + for path in sorted(junit_dir.glob("junit-*.xml")): + root = ET.parse(path).getroot() + for case in root.iter("testcase"): + mapped = node_id(case.get("classname"), case.get("name")) + if mapped is None: + unmapped.append(f"{case.get('classname')}::{case.get('name')}") + else: + executed[mapped] += 1 + if case.find("skipped") is not None: + skipped += 1 + if case.find("failure") is not None or case.find("error") is not None: + raise _fail(f"{path.name}: failing testcase " + f"{case.get('classname')}::{case.get('name')}") + if unmapped: + raise _fail(f"executed tests with no collected node ID: {unmapped[:10]}") + if executed != expected_ids: + missing = sorted((expected_ids - executed).elements()) + extra = sorted((executed - expected_ids).elements()) + raise _fail("shard test identities differ from the full collection: " + f"missing={missing[:10]} extra_or_duplicated={extra[:10]}") + return (f"gate: {sum(executed.values())} executed test IDs == full " + f"collection, each exactly once ({skipped} skipped, visible, " + "never blocking)") + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--junit-dir", required=True, type=Path) + parser.add_argument("--manifest", type=Path, + default=Path(".github/shard-manifest.json")) + return parser + + +def main() -> int: + args = build_parser().parse_args() + print(check(args.junit_dir, args.manifest)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/code_reachability.py b/tools/code_reachability.py index ca236811..36eff9b1 100644 --- a/tools/code_reachability.py +++ b/tools/code_reachability.py @@ -30,6 +30,7 @@ "build_materials_index.py", "build_materials_tree.py", "capture_world.py", + "check_shard_completeness.py", "code_reachability.py", "codex_obsidian.py", "compare_world.py", diff --git a/tools/hooks/pre-push b/tools/hooks/pre-push index 13bf6b9d..3f8e3899 100755 --- a/tools/hooks/pre-push +++ b/tools/hooks/pre-push @@ -148,15 +148,33 @@ for repo in "$core" "$ui"; do fi done -# Guarded CI-bootstrap mode (D15): explicit, command-scoped, unverified. -# Submits only the checked-out HEAD to one non-main, non-tag branch; never -# creates a verified-pair stamp. Normal behavior is unchanged. -if [ "${LOS_CI_BOOTSTRAP:-}" = "1" ]; then +# Guarded CI submission: name the current branch explicitly and record intent +# in the already-created commit. The hook never amends the SHA being checked. +if [ -n "${LOS_CI_BOOTSTRAP:-}" ]; then if [ "$main_pushed" = "1" ]; then echo "pre-push: CI-bootstrap refuses protected refs (main/tag)" >&2; exit 1 fi case "$refs" in *refs/tags/*) echo "pre-push: CI-bootstrap refuses tags" >&2; exit 1;; esac - echo "pre-push: CI-bootstrap submission of $HEAD_SHA (UNVERIFIED until hosted exact-pair gate succeeds)" + branch="$(git -C "$current" symbolic-ref --quiet --short HEAD || true)" + if [ -z "$branch" ] || [ "$LOS_CI_BOOTSTRAP" != "$branch" ]; then + echo "pre-push: LOS_CI_BOOTSTRAP must name the checked-out branch exactly (not 1)" >&2 + exit 1 + fi + set -f + # The four fields are Git's hook input, not shell commands. + # shellcheck disable=SC2086 + set -- $refs + set +f + if [ "$#" -ne 4 ] || [ "$3" != "refs/heads/$branch" ]; then + echo "pre-push: CI-bootstrap submits exactly one ref to refs/heads/$branch" >&2 + exit 1 + fi + if ! git -C "$current" log -1 --format=%B | git interpret-trailers --parse \ + | grep -Fqx "LOS-CI-Bootstrap: $branch"; then + echo "pre-push: commit must record the trailer LOS-CI-Bootstrap: $branch" >&2 + exit 1 + fi + echo "pre-push: CI-bootstrap branch=$branch sha=$HEAD_SHA (UNVERIFIED until hosted exact-pair gate succeeds)" >&2 exit 0 fi diff --git a/tools/learning_os/adapters/agent_runner.py b/tools/learning_os/adapters/agent_runner.py new file mode 100644 index 00000000..d18444a0 --- /dev/null +++ b/tools/learning_os/adapters/agent_runner.py @@ -0,0 +1,242 @@ +"""CLI transport and execution port for the shared agent-plan application.""" +from __future__ import annotations + +import argparse +import io +import json +import os +import subprocess +import sys +import tempfile +import time +from collections.abc import Iterator +from contextlib import contextmanager, redirect_stderr, redirect_stdout +from pathlib import Path +from typing import cast + +from learning_os.app.agent_plans import compile_plan, execute_plan, validate_plan +from learning_os.app.agent_presentation import ( + classify_scope, + cluster_summary, + field_value, + summarize, +) +from learning_os.app.agent_reporting import ReportStore, minimum_ledger_bytes +from learning_os.app.projection_readiness import dependency_ready +from learning_os.app.validation_service import diagnostic_report +from learning_os.domain.agent_plans import ( + CompiledStep, + PlanControls, + PlanIndex, + PlanInput, + PlanStepError, + RawOutcome, + SummarySpec, +) +from learning_os.domain.codes import ( + DISCOVERY_FAILED, + REPORT_BUDGET_TOO_SMALL, + ROOT_MISMATCH, + SESSION_MISMATCH, + SESSION_REQUIRED, + VALIDATION_FAILED, +) + +TOOLS = Path(__file__).resolve().parents[2] + +def build_index(root: Path, executor: CliExecutor | None = None, *, resolve_tasks: bool = True) -> PlanIndex: + """Use declared effects and task dispatch; presentation prose is never parsed.""" + from learning_os.adapters.cli_parser import verb_table + from learning_os.app.registry import REGISTRY, OperationEffects + + bindings = verb_table(getattr(executor, "parser", None)) + index: PlanIndex = {"verbs": sorted(bindings), "verb_to_operation": bindings, + "task_to_use": {}, "write_verbs": [verb for verb, operation in bindings.items() + if (entry := REGISTRY.get(operation or "")) is None + or entry.effects != OperationEffects.READ]} + if resolve_tasks: + from learning_os.store.contracts.verb_catalogue import ( + VerbCatalogueError, + build_verb_catalogue, + ) + try: + catalogue = build_verb_catalogue(root) + except VerbCatalogueError as exc: + raise PlanStepError(f"capability discovery failed: {exc}", DISCOVERY_FAILED) from exc + index["task_to_use"] = {task.id: task.entry_verb for task in catalogue.tasks if task.entry_verb} + return index + + +@contextmanager +def _session_bound_envelope(namespace: argparse.Namespace, session_id: str | None) -> Iterator[None]: + if session_id is None or getattr(namespace, "command", None) != "capability": + yield + return + if namespace.payload_file == "-": + raise PlanStepError("session-bound gateway steps require an envelope file", SESSION_MISMATCH) + content = Path(namespace.payload_file).read_bytes() + try: + envelope = json.loads(content) + except ValueError as exc: + raise PlanStepError("session-bound gateway steps require a JSON envelope", SESSION_MISMATCH) from exc + if not isinstance(envelope, dict) or envelope.get("session_id") != session_id: + raise PlanStepError("sealed envelope session differs from plan; reseal the approved intent", SESSION_MISMATCH) + # Preserve approved bytes. Submit an immutable copy of the file checked + # here, avoiding a second read of a caller-changeable source pathname. + previous = namespace.payload_file + with tempfile.TemporaryDirectory(prefix="agent-run-envelope-") as directory: + target = Path(directory) / "envelope.json" + target.write_bytes(content) + namespace.payload_file = str(target) + try: + yield + finally: + namespace.payload_file = previous + +class CliExecutor: + def __init__(self, root: Path, *, session_id: str | None = None, + write_commands: set[str] | None = None) -> None: + from learning_os.adapters.cli_parser import build_parser + self.root = root + self.session_id = session_id + self.parser = build_parser() + self.writers = write_commands if write_commands is not None else {"capability"} + self.envelope_bytes: dict[tuple[str, ...], bytes] = {} + self.process_count = 0 + + def validate(self, argv: list[str]) -> argparse.Namespace: + root, session_id, parser, writers = self.root, self.session_id, self.parser, self.writers + if any(arg == "--root" or arg.startswith("--root=") for arg in argv): + raise PlanStepError("step root overrides are forbidden; use runner --root") + errors = io.StringIO() + try: + with redirect_stderr(errors), redirect_stdout(errors): + namespace = parser.parse_args(["--root", str(root), *argv]) + except SystemExit as exc: + raise PlanStepError("invalid step arguments: " + errors.getvalue()[-1000:]) from exc + if Path(namespace.root).resolve() != root: + raise PlanStepError("parsed step root differs from selected root", ROOT_MISMATCH) + if session_id is not None and getattr(namespace, "session_id", None) not in (None, session_id): + raise PlanStepError("parsed step session differs from plan", SESSION_MISMATCH) + if session_id is None and namespace.command in writers: + raise PlanStepError("parsed write command requires a plan session_id", SESSION_REQUIRED) + return namespace + + def __call__(self, argv: list[str], selected_root: Path, *, timeout_s: float | None = None) -> tuple[int, str, str]: + from learning_os.adapters.cli import invoke_outcome + root, session_id = self.root, self.session_id + if selected_root.resolve() != root: + raise PlanStepError("executor root differs from plan", ROOT_MISMATCH) + + def launch(command: list[str], user_timeout: float | None = None) -> tuple[int, str, str]: + timeout = timeout_s if user_timeout is None else min(user_timeout, timeout_s) if timeout_s is not None else user_timeout + environment = os.environ.copy() + if session_id is not None: + environment["LOS_SESSION_ID"] = session_id + if timeout is not None: + environment["LOS_LOCK_TIMEOUT"] = str(timeout) + self.process_count += 1 + proc = subprocess.run(command, capture_output=True, text=True, cwd=root, + timeout=timeout, env=environment) + return proc.returncode, proc.stdout, proc.stderr + + if argv[:1] == ["__seal_submit__"]: + _, capability, payload, key, *session_args = argv + return launch([sys.executable, str(TOOLS / "seal_envelope.py"), "--root", str(root), + "--capability", capability, "--payload=" + payload, "--key=" + key, + "--submit", *session_args]) + namespace = self.validate(argv) + with _session_bound_envelope(namespace, session_id): + expected = self.envelope_bytes.get(tuple(argv)) + if expected is not None and Path(namespace.payload_file).read_bytes() != expected: + raise PlanStepError("approved envelope changed since plan admission") + timeout = timeout_s if namespace.lock_timeout is None else min(namespace.lock_timeout, timeout_s) if timeout_s is not None else namespace.lock_timeout + if hasattr(namespace, "_operation"): + outcome = invoke_outcome(namespace, session_id=session_id, timeout_s=timeout) + return outcome.exit_code, outcome.stdout, outcome.stderr + return launch([sys.executable, str(TOOLS / "los.py"), "--root", str(root), *argv], + namespace.lock_timeout) + +def _cli_executor_factory(root: Path, *, session_id: str | None = None, + write_commands: set[str] | None = None) -> CliExecutor: + return CliExecutor(root, session_id=session_id, write_commands=write_commands) + + +class CliPlanPort: + """Production plan port; tests replace this protocol, never its semantics.""" + + def __init__(self, root: Path, executor: CliExecutor) -> None: + self.root = root + self.executor = executor + self.reported_processes = 0 + + def execute(self, step: CompiledStep, remaining: float) -> RawOutcome: + code, out, err = self.executor(list(step.argv), self.root, timeout_s=remaining) + count = self.executor.process_count - self.reported_processes + self.reported_processes = self.executor.process_count + return RawOutcome(code, out, err, processes=count) + + def preflight(self, step: CompiledStep) -> dict[str, object] | None: + report = diagnostic_report(self.root) + if not report.get("trustworthy"): + return cast(dict[str, object] | None, report.get("error")) + errors = cast(list[dict[str, object]], report.get("errors", [])) + return ({"code": VALIDATION_FAILED, "retryable": False, + "scope": classify_scope(errors, list(step.scope))} if errors else None) + + def summarize(self, step: CompiledStep, payload: object) -> str: + description = step.presentation or {} + summary = description.get("summary") or SummarySpec() + return (cluster_summary(cast(dict[str, object], payload), list(step.argv), summary) + if description.get("clusters") and isinstance(payload, dict) + else summarize(payload, fields=summary.get("fields"), + max_items=summary.get("max_items", 5), + max_bytes=summary.get("max_bytes", 2000))) + + def ready(self, required: list[object], known: list[object], submitting: bool) -> tuple[bool, str]: + records = [{"receipt_path": cast(str | None, field_value(row, "receipt_path")), + "snapshot_after": cast(str | None, field_value(row, "snapshot_after"))} for row in required] + all_records = [{"receipt_path": cast(str | None, field_value(row, "receipt_path")), + "snapshot_after": cast(str | None, field_value(row, "snapshot_after"))} for row in known] + return dependency_ready(self.root, records, all_records, completion_only=submitting) + + def epoch(self, root: Path) -> bool: + return True + + def resources(self) -> dict[str, int]: + import resource + return {"runner_peak_rss_bytes": resource.getrusage(resource.RUSAGE_SELF).ru_maxrss + * (1 if sys.platform == "darwin" else 1024), + "unreported_processes": self.executor.process_count - self.reported_processes} + + +def run_plan(plan: PlanInput, root: Path, *, poll_s: float = 0.1, + report_dir: str | Path | None = None, keep_report: bool = False) -> dict[str, object]: + started = time.monotonic() + steps = validate_plan(plan, poll_s) + root = root.resolve() + session_id = plan.get("session_id") + writers = {"capability"} + actual = _cli_executor_factory(root, session_id=session_id, write_commands=writers) + index = build_index(root, actual, resolve_tasks=any("use" in step and not step.get("describe") + and step.get("kind") != "log" for step in steps)) + writers.update(index["write_verbs"]) + + def admit(argv: list[str]) -> tuple[str, bool]: + namespace = actual.validate(argv) + with _session_bound_envelope(namespace, session_id): + if namespace.command == "capability": + actual.envelope_bytes[tuple(argv)] = Path(namespace.payload_file).read_bytes() + return str(namespace.command), bool(getattr(namespace, "feed", None)) + + compiled = compile_plan(steps, index, admit, session_id) + budget = plan.get("report_max_bytes", 65536) + with ReportStore(root, Path(report_dir) if report_dir is not None else None, + keep_report=keep_report) as store: + if minimum_ledger_bytes([step.id for step in compiled], str(store.full_path)) > budget: + raise PlanStepError("report_max_bytes cannot hold the minimum step ledger", REPORT_BUDGET_TOO_SMALL) + store.inputs(plan, list(actual.envelope_bytes.values())) + controls = PlanControls(read_workers=1, deadline_s=float(plan.get("deadline_s", 120)), + report_max_bytes=budget, on_error=plan.get("on_error", "stop"), + session_id=session_id) + return execute_plan(compiled, root, CliPlanPort(root, actual), controls, store, started, poll_s) diff --git a/tools/learning_os/adapters/agent_workers.py b/tools/learning_os/adapters/agent_workers.py deleted file mode 100644 index 226de753..00000000 --- a/tools/learning_os/adapters/agent_workers.py +++ /dev/null @@ -1,154 +0,0 @@ -"""Persistent spawn workers for contiguous, explicitly safe read waves.""" -from __future__ import annotations - -import json -import multiprocessing -import os -import resource -import sys -import time -from collections.abc import Callable -from concurrent.futures import ThreadPoolExecutor -from multiprocessing.connection import wait -from pathlib import Path -from typing import Protocol, cast - -from learning_os.app.read_session import ReadSession, dependency_pin -from learning_os.domain.codes import DEADLINE_EXPIRED, READ_WAVE_FAILED, SNAPSHOT_CONFLICT - -Raw = tuple[int, str, str] - - -class Channel(Protocol): - def send(self, value: object) -> None: ... - def recv(self) -> object: ... - def close(self) -> None: ... - - -def _worker_run(connection: Channel, root_text: str, tasks: list[tuple[int, list[str]]], - session_id: str | None, expected: str, deadline: float, load_counter: list[int]) -> None: - from learning_os.adapters.cli import invoke_outcome - from learning_os.adapters.cli_parser import build_parser - from learning_os.app.projection import fresh_manifest_and_repo - from learning_os.app.registry import REGISTRY - - os.environ["LOS_WORKER_DEFER_RECOVERY"] = "1" - if session_id is not None: - os.environ["LOS_SESSION_ID"] = session_id - root = Path(root_text) - results: list[tuple[int, Raw, int]] = [] - parser = build_parser() - try: - if dependency_pin(root) != expected: - raise ValueError("inputs changed before worker admission") - session = ReadSession(root) - with session.activate(lambda: fresh_manifest_and_repo(root)): - for ordinal, argv in tasks: - if time.monotonic() >= deadline: - results.append((ordinal, (3, json.dumps({"ok": False, "error": { - "code": DEADLINE_EXPIRED, "retryable": False}}), ""), 0)) - continue - begin = time.monotonic() - args = parser.parse_args(["--root", root_text, *argv]) - entry = REGISTRY.get(getattr(args, "_operation", "")) - if Path(args.root).resolve() != root or entry is None or not entry.parallel_safe or entry.kind not in ("query", "tool") or getattr(args, "feed", None): - raise ValueError("operation is not admitted as a parallel read") - outcome = invoke_outcome(args) - results.append((ordinal, (outcome.exit_code, outcome.stdout, outcome.stderr), round((time.monotonic() - begin) * 1000))) - if not session.unchanged(): - raise ValueError("inputs changed during read wave") - connection.send((results, resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * (1 if sys.platform == "darwin" else 1024), load_counter[0])) - except BaseException as exc: - connection.send(([(ordinal, (3, json.dumps({"ok": False, "error": { - "code": READ_WAVE_FAILED, "message": str(exc), "retryable": True}}), ""), 0) - for ordinal, _ in tasks], 0, load_counter[0])) - finally: - connection.close() - - -def _worker(connection: Channel, root_text: str, tasks: list[tuple[int, list[str]]], - session_id: str | None, expected: str, deadline: float) -> None: - from learning_os.store.loading import count_repo_loads - - with count_repo_loads() as counter: - _worker_run(connection, root_text, tasks, session_id, expected, deadline, counter) - - -def parallel_reads(root: Path, argvs: list[list[str]], workers: int, - executor: Callable[[list[str]], Raw] | None = None, *, - timeout_s: float = 120, session_id: str | None = None, - process_counter: list[int] | None = None, - resource_stats: dict[str, int] | None = None, - elapsed_times: dict[int, int] | None = None) -> list[Raw]: - # The injected API is only a test seam; production never threads CLI execution. - if executor is not None: - with ThreadPoolExecutor(max_workers=workers) as pool: - return list(pool.map(executor, argvs)) - from learning_os.app.lock import operator_lock - from learning_os.app.projection import publish - from learning_os.app.projection_readiness import observe - - started = time.monotonic() - with operator_lock(root): - if not observe(root)["published"]: - publish(root) - expected = dependency_pin(root) - context = multiprocessing.get_context("spawn") - children = [] - connections = [] - tasks = list(enumerate(argvs)) - count = min(workers, len(tasks)) - result: list[Raw] = [(3, json.dumps({"ok": False, "error": { - "code": DEADLINE_EXPIRED, "retryable": False}}), "") for _ in tasks] - try: - for number in range(count): - if time.monotonic() - started >= timeout_s: - break - parent, child = context.Pipe(duplex=False) - process = context.Process(target=_worker, args=( - child, str(root.resolve()), tasks[number::count], session_id, expected, started + timeout_s)) - process.start() - if process_counter is not None: - process_counter[0] += 1 - child.close() - children.append(process) - connections.append(parent) - pending = set(connections) - while pending: - remaining = timeout_s - (time.monotonic() - started) - if remaining <= 0: - break - ready = wait(list(pending), timeout=remaining) - if not ready: - break - for connection in list(pending): - if connection not in ready: - continue - try: - values, peak, loads = cast(tuple[list[tuple[int, Raw, int]], int, int], connection.recv()) - if resource_stats is not None: - resource_stats["worker_model_loads"] = resource_stats.get("worker_model_loads", 0) + loads - resource_stats["worker_peak_rss_sum_upper_bound_bytes"] = resource_stats.get("worker_peak_rss_sum_upper_bound_bytes", 0) + peak - resource_stats["worker_peak_rss_max_bytes"] = max(resource_stats.get("worker_peak_rss_max_bytes", 0), peak) - for ordinal, outcome, elapsed in values: - result[ordinal] = outcome - if elapsed_times is not None: - elapsed_times[ordinal] = elapsed - except (EOFError, OSError, ValueError, TypeError): - pass - pending.remove(connection) - if dependency_pin(root) != expected: - return [(3, json.dumps({"ok": False, "error": { - "code": SNAPSHOT_CONFLICT, "retryable": True}}), "") for _ in tasks] - return result - finally: - # Only the enforced defer-recovery workers can be terminated here. - for process in children: - if process.is_alive(): - process.terminate() - process.join(timeout=5) - if process.is_alive(): - process.kill() - process.join() - for connection in connections: - connection.close() diff --git a/tools/learning_os/adapters/cli.py b/tools/learning_os/adapters/cli.py index bc75efd5..08642345 100644 --- a/tools/learning_os/adapters/cli.py +++ b/tools/learning_os/adapters/cli.py @@ -25,10 +25,11 @@ def invoke(args) -> int: return outcome.exit_code -def invoke_outcome(args: argparse.Namespace) -> Outcome: +def invoke_outcome(args: argparse.Namespace, *, session_id: str | None = None, + timeout_s: float | None = None) -> Outcome: """Outcome-returning execution (D03): same pipeline, no global capture.""" if args.root: root = Path(args.root).resolve() else: root = Path(__file__).resolve().parents[3] - return run_cli(root, args._operation, args) + return run_cli(root, args._operation, args, session_id=session_id, timeout_s=timeout_s) diff --git a/tools/learning_os/adapters/cli_entry.py b/tools/learning_os/adapters/cli_entry.py index 19ca3bb0..315a0c60 100644 --- a/tools/learning_os/adapters/cli_entry.py +++ b/tools/learning_os/adapters/cli_entry.py @@ -2,18 +2,16 @@ from __future__ import annotations -import os import sys -from learning_os.app.lock import LOS_LOCK_TIMEOUT_ENV +from learning_os.app.lock import lock_wait_budget from learning_os.app.outcomes import classify, resolve def run(args) -> int: - if args.lock_timeout is not None: - os.environ[LOS_LOCK_TIMEOUT_ENV] = str(args.lock_timeout) try: - return args.func(args) + with lock_wait_budget(args.lock_timeout): + return args.func(args) except Exception as exc: row = classify(exc, "cli") if row is None: diff --git a/tools/learning_os/adapters/cli_parser.py b/tools/learning_os/adapters/cli_parser.py index 40d79a24..0b45e649 100644 --- a/tools/learning_os/adapters/cli_parser.py +++ b/tools/learning_os/adapters/cli_parser.py @@ -289,4 +289,12 @@ def build_parser() -> argparse.ArgumentParser: p.set_defaults(func=func, _parser_factory=build_parser) else: p.set_defaults(func=func) + parser._los_verbs = {name: getattr(child, "_defaults", {}).get("_operation") + for name, child in sub.choices.items()} return parser + + +def verb_table(parser: argparse.ArgumentParser | None = None) -> dict[str, str | None]: + """The executing parser's declared command-to-operation table (a copy).""" + selected = parser if parser is not None else build_parser() + return dict(selected._los_verbs) diff --git a/tools/learning_os/app/agent_plans.py b/tools/learning_os/app/agent_plans.py index faa197f7..95729a6a 100644 --- a/tools/learning_os/app/agent_plans.py +++ b/tools/learning_os/app/agent_plans.py @@ -1,17 +1,29 @@ -"""Admit, schedule and settle bounded plans through an injected adapter port.""" +"""Admit, schedule and settle bounded plans through the shared execution port.""" from __future__ import annotations import json import math import time +from collections.abc import Callable from contextlib import nullcontext from pathlib import Path from typing import cast +from learning_os.app.agent_presentation import step_argv from learning_os.app.agent_reporting import ReportStore, bound_report +from learning_os.app.lock import lock_wait_budget from learning_os.app.projection import fresh_manifest_and_repo from learning_os.app.read_session import ReadSession -from learning_os.domain.agent_plans import CompiledStep, Executor, PlanControls, RawOutcome +from learning_os.app.registry import REGISTRY, CacheProfile +from learning_os.domain.agent_plans import ( + CompiledStep, + Executor, + PlanControls, + PlanIndex, + PlanStep, + PlanStepError, + RawOutcome, +) from learning_os.domain.codes import ( ARTIFACT_FAILED, DEADLINE_EXPIRED, @@ -21,12 +33,71 @@ PLAN_INVALID, PLAN_STOPPED, PREFLIGHT_FAILED, + SESSION_REQUIRED, SNAPSHOT_CONFLICT, STEP_FAILED, UNCONFIRMED, ) +from learning_os.store.contracts.agent_plans import validate_input + -DEFAULT_CONTROLS = PlanControls() +def validate_plan(plan: object, poll_s: float) -> list[PlanStep]: + if isinstance(poll_s, bool) or not isinstance(poll_s, (int, float)) or not math.isfinite(poll_s) or poll_s < 0: + raise PlanStepError("poll interval must be finite and nonnegative") + plan = validate_input(plan) + seen, keys = set(), set() + session_id = plan.get("session_id") + for step in plan["steps"]: + if step["id"] in seen: + raise PlanStepError("step ids must be unique") + if any(dep not in seen for dep in step.get("depends_on", [])): + raise PlanStepError("dependencies must name earlier steps") + seen.add(step["id"]) + fields = step.get("summary", {}).get("fields", []) + if any(a != b and (a.startswith(b + ".") or b.startswith(a + ".")) for a in fields for b in fields): + raise PlanStepError("summary fields must not overlap") + if step.get("kind") == "log": + if step["key"] in keys: + raise PlanStepError("each log needs a unique explicit key stable across retries") + keys.add(step["key"]) + args = step.get("argv", []) + step.get("args", []) + if args[:1] == ["__seal_submit__"]: + raise PlanStepError("internal executor commands cannot be supplied in a plan") + if any(a == "--root" or a.startswith("--root=") for a in args): + raise PlanStepError("step root overrides are forbidden") + command = (step.get("argv") or [step.get("use", "")])[0] + if session_id is None and (step.get("kind") == "log" or step.get("write") or command in ("capability", "cli.capability")): + raise PlanStepError("log/gateway plans require an explicit session_id stable across retries", SESSION_REQUIRED) + if session_id is not None and any(a == "--session-id" or a.startswith("--session-id=") for a in args): + raise PlanStepError("step session overrides are forbidden; use plan session_id") + return plan["steps"] + + +def compile_plan(steps: list[PlanStep], index: PlanIndex, admit: Callable[[list[str]], tuple[str, bool]], session_id: str | None) -> list[CompiledStep]: + writers = {"capability", *index.get("write_verbs", [])} + compiled = [] + for step in steps: + direct = (step.get("argv") or [step.get("use", "")])[0] + if session_id is None and direct in writers and not step.get("describe"): + raise PlanStepError("write plans require an explicit session_id stable across retries", SESSION_REQUIRED) + try: + argv = step_argv(step, index, session_id) + command, feed = ("__seal_submit__", False) if argv[0] == "__seal_submit__" else admit(argv) + writer = command in writers or step.get("kind") == "log" or step.get("write", False) + if writer and session_id is None: + raise PlanStepError("write plans require an explicit session_id stable across retries", SESSION_REQUIRED) + entry = REGISTRY.get(index["verb_to_operation"].get(command) or "") + cache = entry.cache if entry is not None else CacheProfile.NONE + reusable = not writer and cache != CacheProfile.NONE + if cache == CacheProfile.MANIFEST_BRIEF and ("--brief" not in argv or feed): + reusable = False + compiled.append(CompiledStep(id=step["id"], argv=tuple(argv), dependencies=tuple(step.get("depends_on", [])), + writer=bool(writer), submitting=command in ("capability", "__seal_submit__"), reusable=reusable, + ready_timeout_s=float(step.get("ready_timeout_s", 10)), preflight=step.get("preflight", False), + scope=tuple(step.get("writes", [])), presentation=step)) + except PlanStepError as exc: + compiled.append(CompiledStep(id=step["id"], argv=(), admission_error={"code":exc.code,"retryable":False,"message":str(exc)})) + return compiled def field(payload: object, name: str) -> object: @@ -41,7 +112,7 @@ def field(payload: object, name: str) -> object: def finite(value: str) -> float: number = float(value) if not math.isfinite(number): - raise ValueError("nonfinite numeric step output") + raise PlanStepError("nonfinite numeric step output", INVALID_STEP_OUTPUT) return number @@ -85,6 +156,7 @@ def retain(step: CompiledStep, row: dict[str, object]) -> None: row.update(status="error", error={"code": ARTIFACT_FAILED, "retryable": False, "message": str(exc)}) uncertain = True # report storage failure blocks further writes too + store.reconcile(row) rows.append(row) results[step.id] = row error = row.get("error") @@ -95,6 +167,16 @@ def retain(step: CompiledStep, row: dict[str, object]) -> None: if row["status"] != "ok" and controls.on_error == "stop": stopped = stopped or step.id + def correct(row: dict[str, object]) -> None: + nonlocal uncertain + try: + store.correct(row) + except OSError as exc: + row.update(status="error", error={"code": ARTIFACT_FAILED, + "retryable": False, "message": str(exc)}) + uncertain = True + store.reconcile(row) + def consume(step: CompiledStep, raw: RawOutcome, begin: float, ready_ms: int = 0) -> dict[str, object]: nonlocal processes @@ -108,7 +190,7 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, except json.JSONDecodeError: payload = raw.stdout # established human-output support except ValueError as exc: - raise ValueError("INVALID_STEP_OUTPUT: " + str(exc)) from exc + raise PlanStepError(str(exc), INVALID_STEP_OUTPUT) from exc snapshot = field(payload, "snapshot_after") receipt = field(payload, "receipt_path") if snapshot and receipt: @@ -135,7 +217,7 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, encoded = port.summarize(step, payload) row.update(output=json.loads(encoded), out_bytes=len(encoded.encode("utf-8"))) except (OSError, ValueError, TypeError) as exc: - code = INVALID_STEP_OUTPUT if str(exc).startswith(INVALID_STEP_OUTPUT) else getattr(exc, "code", STEP_FAILED) + code = getattr(exc, "code", STEP_FAILED) row.update(status="error", error={"code": code, "retryable": False, "message": str(exc)}) except Exception as exc: # Adapter refusals remain step-scoped and retain any committed receipt. @@ -185,38 +267,42 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, session = ReadSession(root) if port.epoch(root) else None begin_rows = len(rows) try: - if controls.read_workers > 1 and len(wave) > 1 and all(s.parallel_safe for s in wave): - # Coordinator holds no lock while waiting for child processes. - outputs = port.parallel(wave, controls.read_workers, remaining()) - for item, raw in zip(wave, outputs, strict=True): - retain(item, consume(item, raw, time.monotonic())) + scope = session.activate(lambda: fresh_manifest_and_repo(root), timeout_s=remaining()) if session is not None else nullcontext() + with scope: + for item in wave: ancestors[item.id] = set() - else: - scope = session.activate(lambda: fresh_manifest_and_repo(root)) if session is not None else nullcontext() - with scope: - for item in wave: - ancestors[item.id] = set() - if stopped or remaining() <= 0: - retain(item, fail_row(item, "skipped" if stopped else "deadline", - PLAN_STOPPED if stopped else DEADLINE_EXPIRED)) - continue - begin = time.monotonic() - key = item.argv - cached = session.get(key) if session is not None else None - raw = cached if isinstance(cached, RawOutcome) else port.execute(item, remaining()) - row = consume(item, raw, begin) - if session is not None and row["status"] == "ok" and not cached: - session.put(key, raw) - retain(item, row) - if session is not None and not session.unchanged(): - for row in rows[begin_rows:]: - row.update(status="error", error={"code": SNAPSHOT_CONFLICT, - "retryable": True, "message": "inputs changed during read epoch"}) - row.pop("output", None) - stopped = stopped or (wave[0].id if controls.on_error == "stop" else None) + if stopped or remaining() <= 0: + retain(item, fail_row(item, "skipped" if stopped else "deadline", + PLAN_STOPPED if stopped else DEADLINE_EXPIRED)) + continue + begin = time.monotonic() + key = item.argv + cached = session.get(key) if session is not None else None + raw = cached if isinstance(cached, RawOutcome) else port.execute(item, remaining()) + row = consume(item, raw, begin) + if session is not None and row["status"] == "ok" and not cached: + session.put(key, raw) + retain(item, row) + if session is not None and not session.unchanged(): + for row in rows[begin_rows:]: + row.update(status="error", error={"code": SNAPSHOT_CONFLICT, + "retryable": True, "message": "inputs changed during read epoch"}) + row.pop("output", None) + correct(row) + stopped = stopped or (wave[0].id if controls.on_error == "stop" else None) except Exception as exc: + # A failed epoch close cannot attest the already emitted reads. + for row in rows[begin_rows:]: + if row["status"] == "ok": + row.update(status="error", error={"code": SNAPSHOT_CONFLICT, + "retryable": True, "message": "read epoch did not complete"}) + row.pop("output", None) + correct(row) + if controls.on_error == "stop": + stopped = stopped or wave[0].id for item in wave[len(rows) - begin_rows:]: - retain(item, fail_row(item, "error", getattr(exc, "code", STEP_FAILED), message=str(exc))) + retain(item, fail_row(item, "deadline" if remaining() <= 0 else "error", + DEADLINE_EXPIRED if remaining() <= 0 else getattr(exc, "code", STEP_FAILED), message=str(exc))) finally: if session is not None: memo_hits += session.hits @@ -231,7 +317,14 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, if required: until = min(deadline, time.monotonic() + step.ready_timeout_s) while True: - ready, reason = port.ready(required, list(writes.values()), step.submitting) + try: + with lock_wait_budget(remaining()): + ready, reason = port.ready(required, list(writes.values()), step.submitting) + except Exception as exc: + expired = remaining() <= 0 + retain(step, fail_row(step, "deadline" if expired else "error", + DEADLINE_EXPIRED if expired else getattr(exc, "code", STEP_FAILED), message=str(exc))) + break if ready: break if time.monotonic() >= until: @@ -249,7 +342,8 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, index += 1 continue try: - error = port.preflight(step) if step.preflight else None + with lock_wait_budget(remaining()): + error = port.preflight(step) if step.preflight else None if error: retain(step, {**fail_row(step, "blocked", PREFLIGHT_FAILED), "error": error}) elif remaining() <= 0: @@ -257,13 +351,16 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, else: retain(step, consume(step, port.execute(step, remaining()), begin, ready_ms)) except Exception as exc: - row = fail_row(step, "error", getattr(exc, "code", STEP_FAILED), message=str(exc)) + expired = remaining() <= 0 + row = fail_row(step, "deadline" if expired else "error", + DEADLINE_EXPIRED if expired else getattr(exc, "code", STEP_FAILED), message=str(exc)) # Dispatch may have crossed the commit boundary before transport failed. if step.writer: row["commit_certainty"] = "uncertain" retain(step, row) index += 1 + resource_info = port.resources() report: dict[str, object] = {"schema_version": 2, "experimental": True, "session_id": controls.session_id, "on_error": controls.on_error, "steps": rows, "plan_sha256": store.plan_digest, "plan_artifact": "plan.json", @@ -274,11 +371,12 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, "deadline_overshoot_ms": max(0, round((time.monotonic() - deadline) * 1000)), "raw_bytes": sum(cast(int, r.get("raw_bytes", 0)) for r in rows), "out_bytes": sum(cast(int, r.get("out_bytes", 0)) for r in rows), - "process_count": processes, "memo_hits": memo_hits, "shared_model_loads": model_loads, "model_loads": (load_counter[0] if load_counter else 0) + port.resources().get("worker_model_loads", 0), - "resources": port.resources()}} + "process_count": processes + resource_info.get("unreported_processes", 0), "memo_hits": memo_hits, "shared_model_loads": model_loads, "model_loads": (load_counter[0] if load_counter else 0), + "resources": resource_info}} report["full_report"] = str(store.full_path) try: from learning_os.app.agent_reporting import write_full_report + store.flush_pending() store.sync() full = write_full_report(store.path, report) except OSError as exc: @@ -289,5 +387,6 @@ def consume(step: CompiledStep, raw: RawOutcome, begin: float, if row["status"] == "ok": row["status"] = "error" row["error"] = {"code": ARTIFACT_FAILED, "retryable": False} + correct(row) cast(dict[str, object], report["totals"])["ok"] = 0 return bound_report(report, controls.report_max_bytes, str(full)) diff --git a/tools/learning_os/app/agent_presentation.py b/tools/learning_os/app/agent_presentation.py new file mode 100644 index 00000000..2cbda930 --- /dev/null +++ b/tools/learning_os/app/agent_presentation.py @@ -0,0 +1,201 @@ +"""Bounded agent-plan presentation and pure step expansion.""" +from __future__ import annotations + +import fnmatch +import json +import shlex +from typing import TypedDict, cast + +from learning_os.domain.agent_plans import PlanIndex, PlanStep, PlanStepError, SummarySpec +from learning_os.domain.codes import INVALID_STEP_OUTPUT, SUMMARY_BUDGET_TOO_SMALL + + +def encode_json(value: object) -> str: + try: + return json.dumps(value, ensure_ascii=False, separators=(",", ":"), allow_nan=False) + except (ValueError, TypeError) as exc: + raise PlanStepError("output must be finite JSON", INVALID_STEP_OUTPUT) from exc + +def resolve_use(use: str, index: PlanIndex) -> str: + """Map a task id, operation id, or verb to the canonical CLI verb.""" + if use in index.get("verbs", []): + return use + operation_to_verb = {op: verb for verb, op in index.get("verb_to_operation", {}).items()} + if use in operation_to_verb: + return operation_to_verb[use] + if use in index.get("task_to_use", {}): + return index["task_to_use"][use] + raise PlanStepError(f"unknown task, capability, or verb: {use}") + +def _extract(payload: object, dotted: str) -> tuple[object, bool]: + node = payload + for part in dotted.split("."): + if isinstance(node, dict) and part in node: + node = node[part] + elif isinstance(node, list) and part.isdigit() and int(part) < len(node): + node = node[int(part)] + else: + return None, False + return node, True + +def _place(target: dict[str, object], dotted: str, value: object) -> None: + parts = dotted.split(".") + node = target + for part in parts[:-1]: + existing = node.setdefault(part, {}) + if not isinstance(existing, dict): + raise PlanStepError("summary fields must not overlap") + node = existing + node[parts[-1]] = value + +def _cap(node: object, max_items: int) -> object: + if isinstance(node, dict): + return {key: _cap(value, max_items) for key, value in node.items()} + if isinstance(node, list): + capped = [_cap(value, max_items) for value in node[:max_items]] + if len(node) > max_items: + capped.append({"_omitted": len(node) - max_items}) + return capped + if isinstance(node, str) and len(node) > 240: + return node[:240] + "…" + return node + +def summarize(payload: object, *, fields: list[str] | None = None, max_items: int = 5, max_bytes: int = 2000) -> str: + if not isinstance(max_bytes, int) or isinstance(max_bytes, bool) or max_bytes < 64: + raise PlanStepError("summary.max_bytes must be an integer >= 64") + if not isinstance(max_items, int) or isinstance(max_items, bool) or max_items < 1: + raise PlanStepError("summary.max_items must be a positive integer") + missing = [] + if fields: + picked: dict[str, object] = {} + for dotted in fields: + value, found = _extract(payload, dotted) + if found: + _place(picked, dotted, value) + else: + missing.append(dotted) + if missing: + picked["_missing_fields"] = missing + encoded = encode_json(picked) + elif isinstance(payload, str): + encoded = encode_json({"text": payload}) + else: + encoded = encode_json(_cap(payload, max_items)) + size = len(encoded.encode("utf-8")) + if size <= max_bytes: + return encoded + metadata = {"_truncated_bytes": size, **({"_missing_fields": missing} if missing else {})} + if len(encode_json({**metadata, "preview": ""}).encode("utf-8")) > max_bytes: + raise PlanStepError("budget cannot hold missing-field metadata; increase max_bytes", SUMMARY_BUDGET_TOO_SMALL) + # Search the final escaped JSON bytes, not source character count. + lo, hi = 0, min(len(encoded), max_bytes) + while lo < hi: + mid = (lo + hi + 1) // 2 + candidate = encode_json({**metadata, "preview": encoded[:mid]}) + if len(candidate.encode("utf-8")) <= max_bytes: + lo = mid + else: + hi = mid - 1 + return encode_json({**metadata, "preview": encoded[:lo]}) + +class ClusterGroup(TypedDict): + cluster_id: object + title: object + member_count: int + sample_goal_ids: list[str] + omitted_members: int + + +class ClusterPreview(TypedDict): + groups: list[ClusterGroup] + total_groups: int + total_goals: int + omitted_groups: int + omitted_goals: int + full_result: str + expand_argv: list[str] + + +def cluster_preview(scan: dict[str, object], *, argv: list[str] | None = None, sample: int = 3) -> ClusterPreview: + """Preserve the public scan's bounds and route to complete membership.""" + if not isinstance(scan.get("groups"), list): + raise PlanStepError("cluster preview requires the brief scan's groups") + if argv is None: + argv = shlex.split(cast(str, scan.get("full_result")) or "intelligence-scan --json") + full_argv = [token for token in argv if token != "--brief"] + if "--json" not in full_argv: + full_argv.append("--json") + groups: list[ClusterGroup] = [] + for group in cast(list[dict[str, object]], scan["groups"]): + members = cast(list[str], group.get("sample_goal_ids", [])) + count = cast(int, group.get("member_count", len(members))) + groups.append({"cluster_id": group.get("cluster_id"), "title": group.get("title"), + "member_count": count, "sample_goal_ids": members[:sample], + "omitted_members": max(0, count - len(members[:sample]))}) + return {"groups": groups, "total_groups": cast(int, scan.get("total_groups", len(groups))), + "total_goals": cast(int, scan.get("total_goals", sum(g["member_count"] for g in groups))), + "omitted_groups": cast(int, scan.get("omitted_groups", 0)), + "omitted_goals": cast(int, scan.get("omitted_goals", 0)), + "full_result": shlex.join(full_argv), "expand_argv": full_argv} + +def cluster_summary(scan: dict[str, object], argv: list[str], summary: SummarySpec) -> str: + preview = cluster_preview(scan, argv=argv, sample=summary.get("max_items", 3)) + budget = summary.get("max_bytes", 2000) + # Keep recovery metadata even when groups/samples need to be removed. + while len(encode_json(preview).encode("utf-8")) > budget: + sampled = next((g for g in reversed(preview["groups"]) if g["sample_goal_ids"]), None) + if sampled: + sampled["sample_goal_ids"].pop() + sampled["omitted_members"] += 1 + elif preview["groups"]: + removed = preview["groups"].pop() + preview["omitted_groups"] += 1 + preview["omitted_goals"] += removed["member_count"] + else: + raise PlanStepError("cluster budget cannot hold counts and expansion; increase max_bytes") + return encode_json(preview) + +def classify_scope(errors: list[dict[str, object]], writes: list[str]) -> dict[str, object]: + in_scope: list[dict[str, object]] = [] + unrelated: list[dict[str, object]] = [] + for error in errors: + path = str(error.get("path", "")) + (in_scope if path and any(fnmatch.fnmatch(path, glob) for glob in writes) + else unrelated).append(error) + return {"in_scope": in_scope, "unrelated": unrelated} + +def _expand_log_step(step: PlanStep, session_id: str | None = None) -> list[str]: + if step.get("stage_id"): + capability = "stage.note.write" + payload = {"unit_id": step["unit_id"], "stage_id": step["stage_id"], "text": step["text"]} + else: + capability, payload = "capture.create", {"text": step["text"]} + return ["__seal_submit__", capability, encode_json(payload), step["key"], + *(["--session-id=" + session_id] if session_id is not None else [])] + +def step_argv(step: PlanStep, index: PlanIndex, session_id: str | None = None) -> list[str]: + if step.get("kind") == "log": + argv = _expand_log_step(step, session_id) + elif step.get("describe"): + argv = ["capabilities", step["use"], "--json"] + elif "argv" in step: + argv = list(step["argv"]) + else: + argv = [resolve_use(step["use"], index), *step.get("args", [])] + if step.get("clusters"): + if not argv or argv[0] != "intelligence-scan": + raise PlanStepError("clusters requires intelligence-scan") + for flag in ("--brief", "--json"): + if flag not in argv: + argv.append(flag) + return argv + + +def field_value(payload: object, name: str) -> object: + if isinstance(payload, dict): + if payload.get(name): + return payload[name] + nested = payload.get("result") + if isinstance(nested, dict): + return nested.get(name) + return None diff --git a/tools/learning_os/app/agent_reporting.py b/tools/learning_os/app/agent_reporting.py index 11448b69..6c3d4393 100644 --- a/tools/learning_os/app/agent_reporting.py +++ b/tools/learning_os/app/agent_reporting.py @@ -1,16 +1,26 @@ """Complete stdout budgets and private, incremental recovery evidence.""" from __future__ import annotations +import fcntl import hashlib import json import os +import shutil import tempfile +import time from pathlib import Path +from types import TracebackType from typing import cast from learning_os.domain.codes import STEP_FAILED from learning_os.store.transactions import atomic_write_bytes +REPORT_PREFIX = "los-agent-plan-" +RETENTION_MARKER = ".report-retention.json" +RETENTION_KIND = "learningos-agent-report" +MAX_REPORT_RUNS = 50 +MAX_REPORT_AGE_S = 14 * 24 * 60 * 60 + def encode(value: object) -> str: return json.dumps(value, ensure_ascii=False, separators=(",", ":"), allow_nan=False) @@ -50,6 +60,79 @@ def write_full_report(artifact_dir: Path, report: dict[str, object]) -> Path: return target +def _finalized(path: Path) -> bool: + """A report is disposable only once its digest-bound final form exists.""" + names = ("plan.json", "approved-envelopes.json", "checkpoint.jsonl", + "raw-steps.jsonl", "full-report.json", "full-report.sha256") + if any((path / name).is_symlink() or not (path / name).is_file() for name in names): + return False + with (path / "full-report.json").open("rb") as stream: + digest = hashlib.file_digest(stream, "sha256").hexdigest() + return digest == (path / "full-report.sha256").read_text().strip() + + +def _retention_info(path: Path) -> tuple[int, bool, bool] | None: + """(created_ns, keep, finalized) for an owned report directory. + + An unfinalized report can hold the only runner evidence of an uncertain + or partial write; it still occupies a retention slot, but routine + retention must never delete it, marker or legacy alike. + """ + marker = path / RETENTION_MARKER + try: + if marker.is_symlink(): + return None + if marker.exists(): + data = json.loads(marker.read_text()) + if (not isinstance(data, dict) or data.get("kind") != RETENTION_KIND + or data.get("version") != 1 or type(data.get("created_ns")) is not int + or data["created_ns"] <= 0 or type(data.get("keep")) is not bool): + return None + return data["created_ns"], data["keep"], _finalized(path) + # Old versions had no marker/lock. Only finalized, digest-bound reports + # with the complete known layout are recognized; partial legacy + # evidence stays available for review rather than being guessed owned. + if not _finalized(path): + return None + return (path / "full-report.json").stat().st_mtime_ns, False, True + except (OSError, ValueError, TypeError): + return None + + +def prune_reports(parent: Path, *, now_ns: int | None = None, + max_runs: int = MAX_REPORT_RUNS, + max_age_s: int = MAX_REPORT_AGE_S) -> list[Path]: + """Bound one report collection, preserving kept and unfinished runs.""" + now = time.time_ns() if now_ns is None else now_ns + candidates = [] + for path in parent.glob(REPORT_PREFIX + "*"): + if path.is_symlink() or not path.is_dir(): + continue + info = _retention_info(path) + if info is not None and not info[1]: + candidates.append((info[0], path, info[2])) + candidates.sort(key=lambda item: (item[0], item[1].name), reverse=True) + removed = [] + for index, (created, path, finalized) in enumerate(candidates): + if index < max_runs and now - created <= max_age_s * 1_000_000_000: + continue + if not finalized: + continue # Unresolved execution evidence is never routine waste. + descriptor = None + try: + flags = os.O_RDWR | os.O_CREAT | getattr(os, "O_NOFOLLOW", 0) + descriptor = os.open(path / ".active.lock", flags, 0o600) + fcntl.flock(descriptor, fcntl.LOCK_EX | fcntl.LOCK_NB) + shutil.rmtree(path) + removed.append(path) + except OSError: + pass # Active, concurrently removed, or unreadable evidence stays safe. + finally: + if descriptor is not None: + os.close(descriptor) + return removed + + def bound_report(report: dict[str, object], max_bytes: int, artifact_path: str | None) -> dict[str, object]: bounded = cast(dict[str, object], json.loads(encode(report))) @@ -66,19 +149,41 @@ def bound_report(report: dict[str, object], max_bytes: int, class ReportStore: - def __init__(self, root: Path, requested: Path | None = None): - if requested is not None and requested.resolve().is_relative_to(root.resolve()): + def __init__(self, root: Path, requested: Path | None = None, *, keep_report: bool = False): + parent = (requested if requested is not None else Path(tempfile.gettempdir())).resolve() + if parent.is_relative_to(root.resolve()): raise ValueError("full report directory must be outside the selected data root") - if requested is not None: - requested.mkdir(parents=True, exist_ok=True, mode=0o700) - self.path = Path(tempfile.mkdtemp(prefix="los-agent-plan-", dir=requested)) + parent.mkdir(parents=True, exist_ok=True, mode=0o700) + self.path = Path(tempfile.mkdtemp(prefix=REPORT_PREFIX, dir=parent)) os.chmod(self.path, 0o700) + self._lock = os.fdopen(os.open(self.path / ".active.lock", os.O_CREAT | os.O_RDWR, 0o600), "a+b") + fcntl.flock(self._lock, fcntl.LOCK_EX) + marker = {"kind": RETENTION_KIND, "version": 1, + "created_ns": time.time_ns(), "keep": keep_report} + atomic_write_bytes(self.path / RETENTION_MARKER, encode(marker).encode()) self.full_path = self.path / "full-report.json" self.rows: list[dict[str, object]] = [] + self._pending: dict[str, dict[str, object]] = {} self.plan_digest = "" # Probe before any mutation; the directory is also the emergency recovery index. for name in ("checkpoint.jsonl", "raw-steps.jsonl"): atomic_write_bytes(self.path / name, b"") + prune_reports(parent) + + def __enter__(self) -> ReportStore: + return self + + def __exit__(self, exc_type: type[BaseException] | None, + exc: BaseException | None, traceback: TracebackType | None) -> None: + self.close() + + def close(self) -> None: + lock = getattr(self, "_lock", None) + if lock is not None and not lock.closed: + lock.close() + + def __del__(self) -> None: + self.close() def inputs(self, plan: object, envelopes: list[bytes]) -> None: body = encode(plan).encode("utf-8") @@ -98,14 +203,65 @@ def raw(self, index: int, stdout: str, stderr: str) -> tuple[str, str]: return f"raw-steps.jsonl#{index}", hashlib.sha256(body).hexdigest() def record(self, row: dict[str, object]) -> None: - self.rows.append(row) + stored = cast(dict[str, object], json.loads(encode(row))) with (self.path / "checkpoint.jsonl").open("ab") as stream: - stream.write(encode(row).encode("utf-8") + b"\n") + stream.write(encode(stored).encode("utf-8") + b"\n") + self.rows.append(stored) # Flush evidence before admitting another mutation. Read-only rows are # linear append I/O, then synced together at finalization. if row.get("commit_certainty") != "none" or row.get("status") != "ok": self.sync() + def correct(self, row: dict[str, object]) -> None: + """Append the replacement evidence; never rewrite an earlier checkpoint.""" + index = next((i for i, old in enumerate(self.rows) if old["id"] == row["id"]), None) + if index is None: + raise ValueError("cannot correct an unrecorded step") + stored = cast(dict[str, object], json.loads(encode(row))) + old = self.rows[index] + if old.get("commit_certainty") == "committed" and ( + stored.get("commit_certainty") != "committed" or stored.get("receipt") != old.get("receipt")): + raise ValueError("a checkpoint correction cannot erase committed receipt evidence") + event = {"event": "step-correction", "details_index": index, "row": stored} + with (self.path / "checkpoint.jsonl").open("ab") as stream: + stream.write(encode(event).encode("utf-8") + b"\n") + self.rows[index] = stored + self.sync() + + @property + def checkpoint_consistent(self) -> bool: + return not self._pending + + def _recorded(self, row: dict[str, object]) -> bool: + return any(old["id"] == row["id"] for old in self.rows) + + def reconcile(self, row: dict[str, object]) -> bool: + """Append a correction matching a relabelled recorded row. + + Returns False without writing when the row was never recorded: + an unrecorded row must not gain checkpoint evidence. Storage + failures leave the row pending so finalization can refuse. + """ + if not self._recorded(row): + return False + try: + self.correct(row) + except OSError: + self._pending[str(row["id"])] = cast( + dict[str, object], json.loads(encode(row))) + return False + except ValueError: + return False # A guard refusal keeps the stronger checkpoint evidence. + self._pending.pop(str(row["id"]), None) + return True + + def flush_pending(self) -> None: + for row in list(self._pending.values()): + self.reconcile(row) + if self._pending: + raise OSError("checkpoint reconciliation unresolved for steps: " + + ", ".join(sorted(self._pending))) + def sync(self) -> None: for name in ("raw-steps.jsonl", "checkpoint.jsonl"): with (self.path / name).open("ab") as stream: @@ -114,7 +270,26 @@ def sync(self) -> None: def expand_report(path: Path, step_id: str | None = None) -> dict[str, object]: - """Explicit expansion verifies the finalized report and its raw journals.""" + """Check finalized-report and journal corruption, then expand. + + Adjacent digests are not signatures: changing both data and its digest can + pass these checks. They do not authenticate reports or approval evidence. + """ + if path.name != "full-report.json": + raise ValueError("full report is not finalized") + flags = os.O_CREAT | os.O_RDWR | getattr(os, "O_NOFOLLOW", 0) + descriptor = os.open(path.parent / ".active.lock", flags, 0o600) + try: + try: + fcntl.flock(descriptor, fcntl.LOCK_SH | fcntl.LOCK_NB) + except BlockingIOError as exc: + raise ValueError("report is still active; expand it after finalization") from exc + return _expand_report_contents(path, step_id) + finally: + os.close(descriptor) + + +def _expand_report_contents(path: Path, step_id: str | None) -> dict[str, object]: body = path.read_bytes() if path.name != "full-report.json" or hashlib.sha256(body).hexdigest() != (path.parent / "full-report.sha256").read_text().strip(): raise ValueError("full report digest mismatch or report is not finalized") diff --git a/tools/learning_os/app/context.py b/tools/learning_os/app/context.py index b301b0ad..a9beaf4a 100644 --- a/tools/learning_os/app/context.py +++ b/tools/learning_os/app/context.py @@ -24,6 +24,8 @@ class OpContext: channel: str # "cli" | "ui" | "operator" | "codex" | "system-task" invocation: str # "query" | "command" | "check" | "replay" | "porcelain" gateway: GatewayRequestContext | None + session_id: str | None = None + lock_timeout_s: float | None = None def repo(self) -> Repo: """The loaded repository, loaded once and cached on the context.""" diff --git a/tools/learning_os/app/handlers/platform.py b/tools/learning_os/app/handlers/platform.py index 9cdebec3..783f47be 100644 --- a/tools/learning_os/app/handlers/platform.py +++ b/tools/learning_os/app/handlers/platform.py @@ -28,7 +28,7 @@ from learning_os.app.projection import fresh_manifest as _fresh_manifest from learning_os.app.projection import fresh_manifest_and_repo as _fresh_manifest_and_repo from learning_os.app.proposal import Result, TransactionProposal -from learning_os.app.registry import OperationEffects, register +from learning_os.app.registry import CacheProfile, OperationEffects, register from learning_os.derive import masters_catalog from learning_os.derive.health import build_health_report from learning_os.domain.failures import NotFound, StaleSnapshot, WriteRefused @@ -339,7 +339,7 @@ def _inspect_batch(ctx: OpContext, req: dict) -> Result: ) from exc -@register("project.inspect", kind="query", parallel_safe=True, memo_profile="manifest", read_session_profile="manifest", effects=OperationEffects.READ) +@register("project.inspect", kind="query", cache=CacheProfile.MANIFEST, effects=OperationEffects.READ) def inspect(ctx: OpContext, req: dict) -> Result: """Inspect one record or structural id, or a batch of up to 20.""" if req.get("more_ids"): diff --git a/tools/learning_os/app/handlers/reads.py b/tools/learning_os/app/handlers/reads.py index 51ec31c5..6870fc87 100644 --- a/tools/learning_os/app/handlers/reads.py +++ b/tools/learning_os/app/handlers/reads.py @@ -13,7 +13,7 @@ from learning_os.app.projection import fresh_manifest as _fresh_manifest from learning_os.app.proposal import Result from learning_os.app.ranking import ranked_scan -from learning_os.app.registry import OperationEffects, register +from learning_os.app.registry import CacheProfile, OperationEffects, register from learning_os.app.validation_service import status_issues from learning_os.derive.learning_runtime import RuntimeInputError, collect_requirements from learning_os.derive.projection import adoption_counts, exam_spine @@ -356,7 +356,7 @@ def _brief_bootstrap(ctx: OpContext, req: dict) -> Result: ) from exc -@register("operator.bootstrap", kind="query", parallel_safe=True, memo_profile="manifest-brief", read_session_profile="manifest-brief", effects=OperationEffects.READ) +@register("operator.bootstrap", kind="query", cache=CacheProfile.MANIFEST_BRIEF, effects=OperationEffects.READ) def bootstrap(ctx: OpContext, req: dict) -> Result: """Serve the operator bootstrap: full, brief, or compact pages.""" if req.get("brief"): @@ -720,7 +720,7 @@ def _human_intelligence_scan(payload, view) -> str: return "\n".join(lines) -@register("intelligence.scan", kind="tool", human=_human_intelligence_scan, parallel_safe=True, memo_profile="manifest-brief", read_session_profile="manifest-brief", effects=OperationEffects.READ) +@register("intelligence.scan", kind="tool", human=_human_intelligence_scan, cache=CacheProfile.MANIFEST_BRIEF, effects=OperationEffects.READ) def intelligence_scan(ctx: OpContext, req: dict) -> Result: """Run one observation loop: observe, interpret, propose. @@ -893,7 +893,7 @@ def _human_capabilities(payload, view) -> str: " every successful canonical write has one receipt"]) -@register("capabilities.read", kind="tool", human=_human_capabilities, parallel_safe=True, memo_profile="catalogue", read_session_profile="catalogue", effects=OperationEffects.READ) +@register("capabilities.read", kind="tool", human=_human_capabilities, cache=CacheProfile.CATALOGUE, effects=OperationEffects.READ) def capabilities(ctx: OpContext, req: dict) -> Result: """Serve the machine discovery/read catalogue, in full or in part. diff --git a/tools/learning_os/app/lock.py b/tools/learning_os/app/lock.py index d4d511a3..0ca372b7 100644 --- a/tools/learning_os/app/lock.py +++ b/tools/learning_os/app/lock.py @@ -31,17 +31,26 @@ #: Environment override for the operator-lock wait. `los --lock-timeout` -#: sets this for the process; in-process callers set it directly. Unset or +#: accepts this at process boundaries; in-process callers use lock_wait_budget. Unset or #: malformed means wait as long as the holder needs, announced on stderr. LOS_LOCK_TIMEOUT_ENV = "LOS_LOCK_TIMEOUT" -#: Cancellable read workers set this so they defer canonical recovery (D09): -#: they must report recovery-required instead of reconciling transactions. -LOS_DEFER_RECOVERY_ENV = "LOS_WORKER_DEFER_RECOVERY" +# A scoped absolute budget bounds every nested lock acquisition without +# changing the process environment. Subprocess boundaries still accept the env. +_LOCK_DEADLINE: contextvars.ContextVar[float | None] = contextvars.ContextVar("learningos_lock_deadline", default=None) -def defer_recovery() -> bool: - return os.environ.get(LOS_DEFER_RECOVERY_ENV) == "1" +@contextlib.contextmanager +def lock_wait_budget(timeout_s: float | None): + current = _LOCK_DEADLINE.get() + deadline = time.monotonic() + max(0.0, timeout_s) if timeout_s is not None else current + if current is not None and deadline is not None: + deadline = min(current, deadline) + token = _LOCK_DEADLINE.set(deadline) + try: + yield + finally: + _LOCK_DEADLINE.reset(token) #: Poll interval while a lock timeout is armed. The default (unbounded) @@ -51,16 +60,16 @@ def defer_recovery() -> bool: def _lock_timeout_seconds() -> float | None: """The configured lock wait bound, or None for an unbounded announced wait.""" - raw = os.environ.get(LOS_LOCK_TIMEOUT_ENV) - if raw is None or not raw.strip(): - return None + deadline = _LOCK_DEADLINE.get() + scoped = max(0.0, deadline - time.monotonic()) if deadline is not None else None try: - value = float(raw) + configured = float(os.environ.get(LOS_LOCK_TIMEOUT_ENV, "")) + if not math.isfinite(configured): + return scoped except ValueError: - return None - if not math.isfinite(value): - return None - return max(0.0, value) + return scoped + configured = max(0.0, configured) + return configured if scoped is None else min(configured, scoped) def _read_holder(lock_path: Path) -> str | None: @@ -190,8 +199,6 @@ def escalate_operator_lock(root: Path) -> bool: # Invalidate re-entrancy before dropping SH. If acquisition, holder # publication, or recovery fails, an outer caller that catches the # exception must never mistake this scope for a still-held read lock. - if defer_recovery(): - raise WriteRefused("recovery-required: lock escalation deferred in worker mode") _HELD_OPERATOR_LOCKS.set(tuple( (key, "released" if key == root_key else held_mode, held_handle) for key, held_mode, held_handle in _HELD_OPERATOR_LOCKS.get() @@ -210,7 +217,7 @@ def escalate_operator_lock(root: Path) -> bool: @contextlib.contextmanager -def operator_lock(root: Path, *, shared: bool = False): +def _operator_lock(root: Path, *, shared: bool = False): """Cross-process lock for every read and write/generation transaction. Writes take it exclusive, as before. Reads that only serve a provably @@ -229,8 +236,6 @@ def operator_lock(root: Path, *, shared: bool = False): wait announcement and `--lock-timeout` semantics are identical for both modes, and re-entrancy is unchanged. """ - if defer_recovery() and not shared: - raise WriteRefused("recovery-required: exclusive operation deferred in worker mode") root_key = str(root.resolve()) entry = _held_entry(root_key) if entry is not None: @@ -260,12 +265,15 @@ def operator_lock(root: Path, *, shared: bool = False): _HELD_OPERATOR_LOCKS.get() + ((root_key, mode, handle),)) try: if shared and _has_armed_inflight(root): - if defer_recovery(): - raise WriteRefused( - "recovery-required: a published crash journal awaits " - "foreground recovery; worker deferred") escalate_operator_lock(root) yield finally: _HELD_OPERATOR_LOCKS.reset(context_token) fcntl.flock(handle.fileno(), fcntl.LOCK_UN) + + +@contextlib.contextmanager +def operator_lock(root: Path, *, shared: bool = False, timeout_s: float | None = None): + """Acquire the ordinary recovering lock within the caller's wait budget.""" + with lock_wait_budget(timeout_s), _operator_lock(root, shared=shared): + yield diff --git a/tools/learning_os/app/pipeline.py b/tools/learning_os/app/pipeline.py index 2f988308..bc52c979 100644 --- a/tools/learning_os/app/pipeline.py +++ b/tools/learning_os/app/pipeline.py @@ -25,6 +25,7 @@ from learning_os.app.gateway import dispatch as _dispatch from learning_os.app.gateway import prepare_dispatch from learning_os.app.gateway import validate_capability_envelope as _validate_capability_envelope +from learning_os.app.lock import lock_wait_budget from learning_os.app.lock import operator_lock as _operator_lock from learning_os.app.outcomes import classify, error_object, resolve from learning_os.app.outcomes import take_gateway_refusal as _take_gateway_refusal @@ -80,6 +81,7 @@ replay_for_request, ) from learning_os.store.fingerprint import canonical_fingerprint +from learning_os.store.session_ledger import invocation_session @dataclass(frozen=True) @@ -223,7 +225,14 @@ def _commit_with_gesture(ctx, operation: str, result): return CommitOutcome(code, errors, confirmation, refusal=outcome.refusal) -def run_cli(root: Path, operation: str, args) -> Outcome: +def run_cli(root: Path, operation: str, args, *, session_id: str | None = None, + timeout_s: float | None = None) -> Outcome: + """Run the same pipeline with explicit invocation session and wait budget.""" + with invocation_session(session_id), lock_wait_budget(timeout_s): + return _run_cli(root, operation, args, session_id=session_id, timeout_s=timeout_s) + + +def _run_cli(root: Path, operation: str, args, *, session_id=None, timeout_s=None) -> Outcome: """Run registered ``operation`` for a direct CLI invocation (SPEC 11.2). Takes the shared operator lock for a query, the exclusive lock for a @@ -235,21 +244,21 @@ def run_cli(root: Path, operation: str, args) -> Outcome: kind = getattr(args, "_operation_kind", entry.kind) if kind == "query": with _operator_lock(root, shared=True): - return _execute_cli(root, operation, entry, args) + return _execute_cli(root, operation, entry, args, session_id=session_id, timeout_s=timeout_s) if kind == "tool": - return _execute_cli(root, operation, entry, args) + return _execute_cli(root, operation, entry, args, session_id=session_id, timeout_s=timeout_s) with _operator_lock(root): - return _execute_cli(root, operation, entry, args) + return _execute_cli(root, operation, entry, args, session_id=session_id, timeout_s=timeout_s) -def _execute_cli(root: Path, operation: str, entry, args) -> Outcome: +def _execute_cli(root: Path, operation: str, entry, args, *, session_id=None, timeout_s=None) -> Outcome: schema = request_schema(root, operation) properties = schema.get("properties", {}) req = {key: value for key, value in vars(args).items() if key in properties} checking = req.get("check") is True ctx = OpContext(root=root, operation=operation, channel="operator", invocation="check" if checking else _KIND_TO_INVOCATION.get(getattr(args, "_operation_kind", entry.kind), "command"), - gateway=None) + gateway=None, session_id=session_id, lock_timeout_s=timeout_s) commit, receipt, replayed = "none", None, False _take_gateway_refusal() try: diff --git a/tools/learning_os/app/projection_readiness.py b/tools/learning_os/app/projection_readiness.py index 9caa6768..3ad236f4 100644 --- a/tools/learning_os/app/projection_readiness.py +++ b/tools/learning_os/app/projection_readiness.py @@ -3,8 +3,10 @@ import functools import json +from collections.abc import Mapping from pathlib import Path -from typing import cast +from types import MappingProxyType +from typing import cast, overload import yaml @@ -37,7 +39,7 @@ def _receipt_path(root: Path, receipt_path: str) -> Path | None: @functools.lru_cache(maxsize=32) def _publication(root_text: str, manifest_stat: tuple[int, ...], - identity_stat: tuple[int, ...]) -> tuple[dict[str, object], dict[str, object]] | None: + identity_stat: tuple[int, ...]) -> tuple[Mapping[str, object], Mapping[str, object]] | None: root = Path(root_text) try: raw = (root / "generated/manifest.json").read_bytes() @@ -52,11 +54,44 @@ def _publication(root_text: str, manifest_stat: tuple[int, ...], return None if _stat(root / "generated/manifest.json") != manifest_stat or _stat(root / "generated/manifest.identity.json") != identity_stat: return None - return {"_generated": generated}, identity + return _freeze({"_generated": generated}), _freeze(identity) except (OSError, ValueError, TypeError): return None +@overload +def _freeze(value: Mapping[str, object]) -> Mapping[str, object]: ... + + +@overload +def _freeze(value: object) -> object: ... + + +def _freeze(value: object) -> object: + if isinstance(value, dict): + return MappingProxyType({key: _freeze(item) for key, item in value.items()}) + if isinstance(value, list): + return tuple(_freeze(item) for item in value) + return value + + +@overload +def _mutable(value: Mapping[str, object]) -> dict[str, object]: ... + + +@overload +def _mutable(value: object) -> object: ... + + +def _mutable(value: object) -> object: + """Give the identity validator its actual dict/list wire contracts.""" + if isinstance(value, Mapping): + return {key: _mutable(item) for key, item in value.items()} + if isinstance(value, tuple): + return [_mutable(item) for item in value] + return value + + def observe(root: Path, *, verify_current: bool = True) -> dict[str, object]: root = root.resolve() pair = _publication(str(root), _stat(root / "generated/manifest.json"), @@ -66,7 +101,7 @@ def observe(root: Path, *, verify_current: bool = True) -> dict[str, object]: if pair is not None and verify_current: manifest, identity = pair try: - current, reason = check_identity(root, manifest, identity, + current, reason = check_identity(root, _mutable(manifest), _mutable(identity), live_snapshot="sha256:" + canonical_fingerprint(root)) except (OSError, ValueError): current = False @@ -76,40 +111,35 @@ def observe(root: Path, *, verify_current: bool = True) -> dict[str, object]: return {"snapshot_id": pair[1]["snapshot_id"], "published": True, "reason": "ready"} -def _completed(root_text: str, receipt_path: str, snapshot_after: str, - receipt_stat: tuple[int, ...], ledger_stat: tuple[int, ...]) -> bool: - root = Path(root_text) - path = _receipt_path(root, receipt_path) - try: - if path is None: - return False - with path.open() as stream: - data: object = yaml.load(stream, Loader=UniqueKeySafeLoader) - if not isinstance(data, dict) or data.get("snapshot_after") != snapshot_after: - return False - request = data.get("request") - if not isinstance(request, dict): - return False - authority = collect_authority(root, request_id=str(request.get("request_id")), - idempotency_key=str(request.get("idempotency_key")), capability=str(data.get("capability"))) - verified = authority.verified_receipt - return bool(verified is not None and verified.get("_path") == receipt_path - and verified.get("snapshot_after") == snapshot_after - and _stat(path) == receipt_stat - and _stat(root / "operations/transactions/idempotency.yaml") == ledger_stat) - except (OSError, ValueError, TypeError, yaml.YAMLError): - return False - - def receipt_completed(root: Path, receipt_path: str | None, snapshot_after: str | None) -> bool: root = root.resolve() if not receipt_path or not snapshot_after: return False - path = _receipt_path(root, receipt_path) - if path is None: - return False - return _completed(str(root), receipt_path, snapshot_after, _stat(path), - _stat(root / "operations/transactions/idempotency.yaml")) + ledger = root / "operations/transactions/idempotency.yaml" + # One concurrent commit can move the ledger during authority verification. + # Re-read from disk once; repeated movement cannot establish completion. + for _ in range(2): + path = _receipt_path(root, receipt_path) + if path is None: + return False + receipt_stat, ledger_stat = _stat(path), _stat(ledger) + completed = False + try: + with path.open() as stream: + data: object = yaml.load(stream, Loader=UniqueKeySafeLoader) + if isinstance(data, dict) and isinstance(request := data.get("request"), dict) and data.get("snapshot_after") == snapshot_after: + authority = collect_authority(root, request_id=str(request.get("request_id")), + idempotency_key=str(request.get("idempotency_key")), capability=str(data.get("capability"))) + verified = authority.verified_receipt + completed = bool(verified is not None and verified.get("_path") == receipt_path + and verified.get("snapshot_after") == snapshot_after) + except (OSError, ValueError, TypeError, yaml.YAMLError): + pass + if _receipt_path(root, receipt_path) is None: + return False + if _stat(path) == receipt_stat and _stat(ledger) == ledger_stat: + return completed + return False def dependency_ready(root: Path, required: list[dict[str, str | None]], @@ -151,7 +181,9 @@ def completed(path: str | None, snapshot: str | None) -> bool: latest = max(positions[s] for s in signatures) allowed = {r.get("snapshot_after") for r in known[latest:] if completed(r.get("receipt_path"), r.get("snapshot_after"))} - obs = observe(root, verify_current=False) + # Final readiness must prove the publication still matches canonical + # state; the cheap unverified observation above is only an early hint. + obs = observe(root) if not obs["published"]: return False, str(obs["reason"]) return (True, "ready") if obs["snapshot_id"] in allowed else (False, "projection-not-current") diff --git a/tools/learning_os/app/read_session.py b/tools/learning_os/app/read_session.py index 7ca9c87d..72d7029c 100644 --- a/tools/learning_os/app/read_session.py +++ b/tools/learning_os/app/read_session.py @@ -20,6 +20,7 @@ from learning_os.store.fingerprint import canonical_fingerprint from learning_os.store.loader import load_repo from learning_os.store.manifest_identity import materials_digest, operations_digest +from learning_os.store.session.githistory import read_history _CURRENT: contextvars.ContextVar[ReadSession | None] = contextvars.ContextVar("read_session", default=None) @@ -29,7 +30,8 @@ def _dependency_state(root: Path) -> tuple[str, str]: snapshot = "sha256:" + canonical_fingerprint(root) inputs = [str(root.resolve()), snapshot, digest_code_identity(root), runtime_digest(), declared_schema_sha256(root), materials_digest(root), - operations_digest(root), observations.today().isoformat()] + operations_digest(root), observations.today().isoformat(), + read_history(root, "-1", "--format=%H")] # Task descriptions can come from the executing authority when a data-only # fixture has no operator prose. Pin both actual readers' roots. authorities = {root.resolve(), Path(__file__).resolve().parents[3]} @@ -58,7 +60,8 @@ def current_session(root: Path) -> ReadSession | None: class ReadSession: def __init__(self, root: Path): self.root = root.resolve() - self.pin, self.snapshot = _dependency_state(self.root) + self.pin = self.snapshot = "" + self._epoch_unchanged: bool | None = None self._memo: dict[tuple[str, ...], object] = {} self.loads = 0 self.hits = 0 @@ -68,10 +71,22 @@ def __init__(self, root: Path): self.model: object | None = None def valid(self) -> bool: - return not self.closed and (self.active or dependency_pin(self.root) == self.pin) + if self.closed: + return False + if self.active: + return True + if not self.pin: + self.pin, self.snapshot = _dependency_state(self.root) + return True + return dependency_pin(self.root) == self.pin def unchanged(self) -> bool: - return not self.closed and dependency_pin(self.root) == self.pin + """Use the completed epoch's closing observation, or check a standalone memo.""" + if self.closed: + return False + if self._epoch_unchanged is not None: + return self._epoch_unchanged + return self.valid() def repository(self) -> Repo: if isinstance(self.model, Repo): @@ -104,26 +119,37 @@ def invalidate(self) -> None: self.manifest = None self.model = None self.pin, self.snapshot = _dependency_state(self.root) + self._epoch_unchanged = None @contextmanager - def activate(self, prepare: Callable[[], tuple[dict[str, object], object]] | None = None) -> Iterator[ReadSession]: + def activate(self, prepare: Callable[[], tuple[dict[str, object], object]] | None = None, + *, timeout_s: float | None = None) -> Iterator[ReadSession]: """Hold the cooperating-writer boundary only while executing serial reads.""" from learning_os.app.lock import operator_lock - # A stale projection may need escalation. Prepare outside the epoch. - before = self.pin - prepared = prepare() if prepare is not None else None - with operator_lock(self.root, shared=True): + if self.closed or self.active: + raise RuntimeError("read session is closed or already active") + options = {} if timeout_s is None else {"timeout_s": timeout_s} + with operator_lock(self.root, shared=True, **options): + # Publication can escalate this lock before any memo is live. + prepared = prepare() if prepare is not None else None self.invalidate() - if prepare is not None: - self.manifest, self.model = prepared if prepared is not None and before == self.pin else prepare() + prepared_current = True + if prepared is not None: + self.manifest, self.model = prepared + generated = self.manifest.get("_generated") + if isinstance(generated, dict): + prepared_current = generated.get("snapshot_id") == self.snapshot self.active = True token = _CURRENT.set(self) try: yield self finally: - self.active = False - _CURRENT.reset(token) + try: + self._epoch_unchanged = dependency_pin(self.root) == self.pin and prepared_current + finally: + self.active = False + _CURRENT.reset(token) def close(self) -> None: self.closed = True diff --git a/tools/learning_os/app/registry.py b/tools/learning_os/app/registry.py index 575aa5e8..75571297 100644 --- a/tools/learning_os/app/registry.py +++ b/tools/learning_os/app/registry.py @@ -17,6 +17,13 @@ class OperationEffects(StrEnum): UNKNOWN = "unknown" +class CacheProfile(StrEnum): + NONE = "none" + MANIFEST = "manifest" + MANIFEST_BRIEF = "manifest-brief" + CATALOGUE = "catalogue" + + @dataclass(frozen=True) class Operation: name: str @@ -28,9 +35,7 @@ class Operation: render_check: Callable[[dict, dict], dict] | None = None # (check record, prepared Result.payload) # Execution traits (D05): conservative defaults; a query kind alone does # not prove purity. Traits describe execution, never write authority. - parallel_safe: bool = False - memo_profile: str = "none" - read_session_profile: str = "none" + cache: CacheProfile = CacheProfile.NONE # Invocation kind controls dispatch/locking, not effects. A new operation # is a write barrier until its owner explicitly declares a read. effects: OperationEffects = OperationEffects.UNKNOWN @@ -45,9 +50,7 @@ def register( kind: str, human: Callable[[dict], str] | Callable[[dict, dict], str] | None = None, render_check: Callable[[dict, dict], dict] | None = None, - parallel_safe: bool = False, - memo_profile: str = "none", - read_session_profile: str = "none", + cache: CacheProfile = CacheProfile.NONE, effects: OperationEffects = OperationEffects.UNKNOWN, ): """Register ``fn`` under ``name``; returns ``fn`` unchanged (stackable).""" @@ -56,8 +59,7 @@ def decorator(fn): REGISTRY[name] = Operation( name=name, kind=kind, handler=fn, human=human, render_check=render_check, - parallel_safe=parallel_safe, memo_profile=memo_profile, - read_session_profile=read_session_profile, + cache=CacheProfile(cache), effects=OperationEffects(effects), ) return fn diff --git a/tools/learning_os/domain/agent_plans.py b/tools/learning_os/domain/agent_plans.py index 27f24fa5..08f6b374 100644 --- a/tools/learning_os/domain/agent_plans.py +++ b/tools/learning_os/domain/agent_plans.py @@ -3,11 +3,58 @@ from dataclasses import dataclass from pathlib import Path -from typing import Protocol +from typing import NotRequired, Protocol, TypedDict -COMMIT_NONE = "none" -COMMIT_COMMITTED = "committed" -COMMIT_UNCERTAIN = "uncertain" +from learning_os.domain.codes import INVALID_REQUEST + + +class PlanStepError(Exception): + def __init__(self, message: str, code: str = INVALID_REQUEST) -> None: + super().__init__(message) + self.code = code + + +class SummarySpec(TypedDict, total=False): + fields: list[str] + max_items: int + max_bytes: int + + +class PlanStep(TypedDict, total=False): + id: str + kind: str + depends_on: list[str] + use: str + argv: list[str] + args: list[str] + writes: list[str] + ready_timeout_s: float + summary: SummarySpec + key: str + text: str + unit_id: str + stage_id: str + describe: bool + write: bool + preflight: bool + clusters: bool + + +class PlanInput(TypedDict): + steps: list[PlanStep] + schema_version: NotRequired[int] + session_id: NotRequired[str] + on_error: NotRequired[str] + read_workers: NotRequired[int] + deadline_s: NotRequired[float] + report_max_bytes: NotRequired[int] + + +class PlanIndex(TypedDict): + verbs: list[str] + verb_to_operation: dict[str, str | None] + task_to_use: dict[str, str] + write_verbs: NotRequired[list[str]] @dataclass(frozen=True) @@ -27,11 +74,10 @@ class CompiledStep: writer: bool = False submitting: bool = False reusable: bool = False - parallel_safe: bool = False ready_timeout_s: float = 10.0 preflight: bool = False scope: tuple[str, ...] = () - presentation: object = None + presentation: PlanStep | None = None admission_error: dict[str, object] | None = None @@ -46,27 +92,9 @@ class RawOutcome: class Executor(Protocol): def execute(self, step: CompiledStep, remaining: float) -> RawOutcome: ... - def parallel(self, steps: list[CompiledStep], workers: int, - remaining: float) -> list[RawOutcome]: ... def preflight(self, step: CompiledStep) -> dict[str, object] | None: ... def summarize(self, step: CompiledStep, payload: object) -> str: ... def ready(self, required: list[object], known: list[object], submitting: bool) -> tuple[bool, str]: ... def epoch(self, root: Path) -> bool: ... def resources(self) -> dict[str, int]: ... - - -# Backward-compatible value retained for existing importers. -@dataclass(frozen=True) -class StepOutcome: - step_id: str - status: str - exit_code: int | None = None - error_code: str | None = None - retryable: bool = False - commit_certainty: str = COMMIT_NONE - receipt_path: str | None = None - raw_bytes: int = 0 - out_bytes: int = 0 - ms: int = 0 - ready_wait_ms: int = 0 diff --git a/tools/learning_os/domain/codes.py b/tools/learning_os/domain/codes.py index 0047f5a4..2027a7a2 100644 --- a/tools/learning_os/domain/codes.py +++ b/tools/learning_os/domain/codes.py @@ -51,12 +51,12 @@ NOT_READY = "NOT_READY" SNAPSHOT_CONFLICT = "SNAPSHOT_CONFLICT" PREFLIGHT_FAILED = "PREFLIGHT_FAILED" +SUMMARY_BUDGET_TOO_SMALL = "SUMMARY_BUDGET_TOO_SMALL" DISCOVERY_FAILED = "DISCOVERY_FAILED" PLAN_STOPPED = "PLAN_STOPPED" PLAN_INVALID = "PLAN_INVALID" DEADLINE_EXPIRED = "DEADLINE_EXPIRED" ARTIFACT_FAILED = "ARTIFACT_FAILED" -READ_WAVE_FAILED = "READ_WAVE_FAILED" REPORT_BUDGET_TOO_SMALL = "REPORT_BUDGET_TOO_SMALL" DEPENDENCY_FAILED = "DEPENDENCY_FAILED" @@ -65,6 +65,7 @@ SESSION_MISMATCH, SESSION_REQUIRED, INVALID_STEP_OUTPUT, + SUMMARY_BUDGET_TOO_SMALL, STEP_FAILED, NOT_READY, SNAPSHOT_CONFLICT, @@ -74,7 +75,6 @@ PLAN_INVALID, DEADLINE_EXPIRED, ARTIFACT_FAILED, - READ_WAVE_FAILED, REPORT_BUDGET_TOO_SMALL, DEPENDENCY_FAILED, ) diff --git a/tools/learning_os/store/contracts/agent_plans.py b/tools/learning_os/store/contracts/agent_plans.py index 0fe1410d..3b2ed58d 100644 --- a/tools/learning_os/store/contracts/agent_plans.py +++ b/tools/learning_os/store/contracts/agent_plans.py @@ -1,28 +1,29 @@ -"""Strict loading/validation helpers for agent-plan controls (D12).""" +"""One schema authority for agent-plan input shapes.""" from __future__ import annotations -import math +import json +from pathlib import Path +from typing import cast +from jsonschema import Draft202012Validator # type: ignore[import-untyped] -def parse_controls(plan: dict[str, object]) -> dict[str, object]: - """Validate optional plan controls; reject bools/nonfinite/misspellings.""" - allowed = {"steps", "session_id", "on_error", "schema_version", - "read_workers", "deadline_s", "report_max_bytes"} - unknown = set(plan) - allowed - # Per-step fields are validated by the runner; only plan-level unknowns - # that look like misspelled controls are refused here by caller. - workers = plan.get("read_workers", 1) - if isinstance(workers, bool) or not isinstance(workers, int) or not 1 <= workers <= 4: - raise ValueError("read_workers must be an integer 1..4") - deadline = plan.get("deadline_s", 120) - if isinstance(deadline, bool) or not isinstance(deadline, (int, float)) \ - or not math.isfinite(deadline) or deadline <= 0: - raise ValueError("deadline_s must be a finite positive number") - budget = plan.get("report_max_bytes", 65536) - if isinstance(budget, bool) or not isinstance(budget, int) or budget < 1024: - raise ValueError("report_max_bytes must be an integer >= 1024") - version = plan.get("schema_version", 1) - if isinstance(version, bool) or not isinstance(version, int) or version not in (1, 2): - raise ValueError("unsupported plan schema_version") - return {"read_workers": workers, "deadline_s": float(deadline), - "report_max_bytes": budget, "unknown_plan_fields": sorted(unknown)} +from learning_os.domain.agent_plans import PlanInput, PlanStepError + +SCHEMA_PATH = Path(__file__).resolve().parents[4] / "system/contracts/agent-plan-input.schema.json" + +def validate_input(plan: object) -> PlanInput: + try: + body = json.dumps(plan, ensure_ascii=False, separators=(",", ":"), allow_nan=False) + except (TypeError, ValueError) as exc: + raise PlanStepError("plan must contain finite JSON values") from exc + if len(body.encode("utf-8")) > 1048576: + raise PlanStepError("plan input exceeds 1 MiB") + schema = json.loads(SCHEMA_PATH.read_text()) + errors = sorted(Draft202012Validator(schema).iter_errors(plan), key=lambda e: str(list(e.absolute_path))) + if errors: + error = errors[0] + if list(error.absolute_path) == ["schema_version"]: + raise PlanStepError("unsupported schema_version; migrate the plan to schema_version: 2") + location = ".".join(map(str, error.absolute_path)) or "plan" + raise PlanStepError(f"invalid plan at {location}: {error.message}") + return cast(PlanInput, plan) diff --git a/tools/learning_os/store/contracts/task_scope.py b/tools/learning_os/store/contracts/task_scope.py index f9501d4d..454ac4f5 100644 --- a/tools/learning_os/store/contracts/task_scope.py +++ b/tools/learning_os/store/contracts/task_scope.py @@ -46,6 +46,7 @@ class TaskScope: id: str task: str entry_read: str + entry_verb: str | None procedures: tuple[ProcedureLink, ...] procedure_text: str | None scope: tuple[str, ...] @@ -253,6 +254,13 @@ def operator_document(identifier: str, relative: str) -> None: raise TaskScopeError( f"task scope {identifier} names {verb!r}, which is not a " f"CLI command") + if "entry_verb" not in row: + raise TaskScopeError(f"task scope {identifier} must declare entry_verb (null for a boundary)") + entry_verb = row["entry_verb"] + if entry_verb is not None and (not isinstance(entry_verb, str) or entry_verb not in verbs): + raise TaskScopeError(f"task scope {identifier} entry_verb must name a CLI command") + if entry_read_verbs(entry_read) and entry_verb is None: + raise TaskScopeError(f"task scope {identifier} executable entry needs entry_verb") procedures = [] for link in row.get("procedures") or []: if not isinstance(link, dict): @@ -324,6 +332,7 @@ def operator_document(identifier: str, relative: str) -> None: id=identifier, task=task.strip(), entry_read=entry_read.strip(), + entry_verb=entry_verb, procedures=tuple(procedures), procedure_text=procedure_text.strip() if procedure_text else None, scope=tuple(scope), diff --git a/tools/learning_os/store/contracts/verb_catalogue.py b/tools/learning_os/store/contracts/verb_catalogue.py index 26d70586..dd5c9f2d 100644 --- a/tools/learning_os/store/contracts/verb_catalogue.py +++ b/tools/learning_os/store/contracts/verb_catalogue.py @@ -79,6 +79,7 @@ class TaskRow: id: str task: str entry_read: str + entry_verb: str | None procedures: tuple[str, ...] procedure_text: str | None scope: tuple[str, ...] @@ -88,6 +89,7 @@ def as_dict(self) -> dict[str, object]: "id": self.id, "task": self.task, "entry_read": self.entry_read, + "entry_verb": self.entry_verb, "procedures": list(self.procedures), "procedure_text": self.procedure_text, "scope": list(self.scope), @@ -312,6 +314,7 @@ def build_verb_catalogue(root: Path) -> VerbCatalogue: id=task.id, task=task.task, entry_read=task.entry_read, + entry_verb=task.entry_verb, procedures=tuple(link.target for link in task.procedures), procedure_text=task.procedure_text, scope=task.scope, diff --git a/tools/learning_os/store/session_ledger.py b/tools/learning_os/store/session_ledger.py index 195c3c91..2bcf2154 100644 --- a/tools/learning_os/store/session_ledger.py +++ b/tools/learning_os/store/session_ledger.py @@ -9,6 +9,7 @@ from __future__ import annotations import contextlib +import contextvars import datetime as _dt import hashlib import json @@ -211,18 +212,31 @@ def _is_member(value: object, choices: frozenset) -> bool: return False +_INVOCATION_SESSION: contextvars.ContextVar[str | None] = contextvars.ContextVar("learningos_invocation_session", default=None) + + +@contextlib.contextmanager +def invocation_session(session_id: str | None): + """Bind the in-process caller's session without modifying environment.""" + token = _INVOCATION_SESSION.set(session_id) + try: + yield + finally: + _INVOCATION_SESSION.reset(token) + + def resolve_session_identity(*, channel: str | None = None, explicit: str | None = None ) -> tuple[str, str]: """The session identity every ledger operation resolves, and its source. Resolution order: an explicit id (the `--session-id` flag), then the - sealed gateway envelope's `session_id`, then the `LOS_SESSION_ID` - environment, then the gateway channel — so two actors that name + sealed gateway envelope's `session_id`, then the scoped invocation session, + then the `LOS_SESSION_ID` environment, then the gateway channel — two actors that name nothing still land in separate ledgers by channel (`channel:ui` vs `channel:operator`), while one named session shares a single ledger whatever channel its writes used. The source is one of `explicit`, - `envelope`, `environment`, or `channel`. + `envelope`, `invocation`, `environment`, or `channel`. """ if explicit is not None and explicit.strip(): return explicit.strip(), "explicit" @@ -231,6 +245,9 @@ def resolve_session_identity(*, channel: str | None = None, sealed = (request.session_id or "").strip() if sealed: return sealed, "envelope" + scoped = _INVOCATION_SESSION.get() + if scoped is not None and scoped.strip(): + return scoped.strip(), "invocation" env = os.environ.get(SESSION_ID_ENV, "").strip() if env: return env, "environment" diff --git a/tools/release_pair_receipt.py b/tools/release_pair_receipt.py index a5f694a7..94859034 100644 --- a/tools/release_pair_receipt.py +++ b/tools/release_pair_receipt.py @@ -185,6 +185,7 @@ def generate( workflow_run_id: str, workflow_run_attempt: str, live_install_scope: str, + system_check_passed: bool = False, ) -> dict: """Build one schema-validated receipt from the current, already-built pair. @@ -270,7 +271,10 @@ def generate( "bundle_sha256": build_info["bundle_sha256"], "stylesheet_sha256": build_info["stylesheet_sha256"], "shipped_asset_sha256": shipped_asset_sha256, - "system_check_passed": True, + # Caller-asserted, never self-proven: the receipt is an + # artifact-integrity record. Hosted CI acceptance is the + # successful workflow run named below, checked separately. + "system_check_passed": bool(system_check_passed), "stress_scope": "not-run-materials-unprovisioned", "live_install_scope": live_install_scope, "workflow_run_id": str(workflow_run_id), @@ -355,6 +359,7 @@ def _cli_generate(args: argparse.Namespace) -> int: workflow_run_id=args.workflow_run_id, workflow_run_attempt=args.workflow_run_attempt, live_install_scope=args.live_install_scope, + system_check_passed=args.system_check_passed, ) except ReleasePairReceiptError as exc: print(f"release-pair-receipt: {exc}", file=sys.stderr) @@ -402,6 +407,10 @@ def build_parser() -> argparse.ArgumentParser: "--live-install-scope", required=True, help="whether the paired gate ran the live_install tests or deselected them: " "not-run-live-install-deselected (CI) or full (the live installation)") + generate_parser.add_argument( + "--system-check-passed", action="store_true", + help="assert that the caller's own system check passed; the receipt " + "records the assertion, it does not prove hosted CI success") generate_parser.add_argument("--out", required=True) generate_parser.set_defaults(func=_cli_generate)