diff --git a/.chronomemory/events.wal b/.chronomemory/events.wal index cc853cea..d1ee1b89 100644 --- a/.chronomemory/events.wal +++ b/.chronomemory/events.wal @@ -7,3 +7,167 @@ {"seq": 790, "ts": "2026-06-29T18:32:43Z", "op": "upsert", "record_id": "WI-43BF4538", "record": {"id": "WI-43BF4538", "kind": "work_item", "status": "active", "label": "When specsmith run is active inside Warp terminal, Warp shows the coding agent toolbar and emits desktop notifications for key governance events", "confidence": 0.85, "source_type": "observed", "evidence": [], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"status": "open", "kind": "feature", "verified": false, "promoted_to_req": "", "blast_radius_estimate": "", "created_at": "2026-06-29T18:32:43Z", "updated_at": "2026-06-29T18:32:43Z", "closed_reason": ""}}, "prev_hash": "e0f78712047803ebc89afd57a7e1b80ada3b2d87d6f19146707250ae769bc896", "hash": "4271c2f8268f4d72cacbc7ae47976bf920f24b23d13aef4f137b1bf7ca2553ef", "recursion_depth": 0} {"seq": 791, "ts": "2026-06-29T18:32:43Z", "op": "upsert", "record_id": "PF-WI-43BF4538", "record": {"id": "PF-WI-43BF4538", "kind": "preflight_decision", "status": "active", "label": "Read-only ask; no governance changes required.", "confidence": 0.85, "source_type": "observed", "evidence": [], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"decision": "accepted", "intent": "read_only_ask", "work_item_id": "WI-43BF4538", "test_case_ids": [], "instruction": "Read-only ask; no governance changes required.", "ai_disclosure": {"governed_by": "specsmith", "governance_gated": true, "provider": "local/heuristic", "model": "deterministic-broker", "spec_version": "0.20.1"}}}, "prev_hash": "4271c2f8268f4d72cacbc7ae47976bf920f24b23d13aef4f137b1bf7ca2553ef", "hash": "7f7c58b0a8100f310b847d00d81936b7baae83a4531e63bc74d26d747a424051", "recursion_depth": 0} {"seq": 792, "ts": "2026-06-29T18:39:20Z", "op": "upsert", "record_id": "MET-S-3F68DF53", "record": {"id": "MET-S-3F68DF53", "kind": "session_metric", "status": "active", "label": "S-3F68DF53: tokens=0 passed=True", "confidence": 0.8, "source_type": "observed", "evidence": [], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"session_id": "S-3F68DF53", "timestamp": "2026-06-29T18:39:20Z", "input_tokens": 0, "output_tokens": 0, "cost_usd": 0.0, "quality_score": 0.0, "passed": true, "rework_turns": 1, "work_item_id": "", "model": "", "command": "save", "notes": "", "tokens_total": 0}}, "prev_hash": "7f7c58b0a8100f310b847d00d81936b7baae83a4531e63bc74d26d747a424051", "hash": "49034f5e35ba0892c26cd5ed5c646db4bdf3d5e12a79d931ab11577ed0a41722", "recursion_depth": 0} +{"seq": 793, "ts": "2026-07-13T23:46:09Z", "op": "upsert", "record_id": "WI-093974D5", "record": {"id": "WI-093974D5", "kind": "work_item", "status": "active", "label": "Implement issues #299 and #300: return an explicit non-blocking out-of-scope decision for environment-only SpecSmith CLI upgrades, and ensure every --help invocation is read-only with no migration or ", "confidence": 0.9, "source_type": "observed", "evidence": [], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"status": "open", "kind": "feature", "verified": false, "promoted_to_req": "", "blast_radius_estimate": "", "created_at": "2026-07-13T23:46:09Z", "updated_at": "2026-07-13T23:46:09Z", "closed_reason": ""}}, "prev_hash": "49034f5e35ba0892c26cd5ed5c646db4bdf3d5e12a79d931ab11577ed0a41722", "hash": "2e418ef4330777a2066949b5000fb380b15f71d36862034446c952f4db73e331", "recursion_depth": 0} +{"seq": 794, "ts": "2026-07-13T23:46:09Z", "op": "upsert", "record_id": "PF-WI-093974D5", "record": {"id": "PF-WI-093974D5", "kind": "preflight_decision", "status": "active", "label": "Release operations require explicit confirmation. Specify the target version and channel, or cite a release-management requirement via --req REQ-050 / --req REQ-051.", "confidence": 0.9, "source_type": "observed", "evidence": [], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"decision": "needs_clarification", "intent": "release", "work_item_id": "WI-093974D5", "test_case_ids": [], "instruction": "Release operations require explicit confirmation. Specify the target version and channel, or cite a release-management requirement via --req REQ-050 / --req REQ-051.", "ai_disclosure": {"governed_by": "specsmith", "governance_gated": true, "provider": "local/heuristic", "model": "deterministic-broker", "spec_version": "0.22.1"}}}, "prev_hash": "2e418ef4330777a2066949b5000fb380b15f71d36862034446c952f4db73e331", "hash": "c37b12ef43c71d0ae69a4ef0ea698aeea756b6c8b0737b5dc3e50b6fe5ea6021", "recursion_depth": 0} +{"seq": 795, "ts": "2026-07-13T23:47:57Z", "op": "upsert", "record_id": "WI-003B068E", "record": {"id": "WI-003B068E", "kind": "work_item", "status": "active", "label": "Fix issues #299 and #300 under REQ-369 and REQ-418: classify pipx-managed CLI upgrades as environment-only without a clarification loop, and make preflight help read-only. [REQ-369 REQ-418]", "confidence": 0.8, "source_type": "observed", "evidence": ["REQ-369", "REQ-418", "TEST-370", "TEST-428"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"status": "open", "kind": "feature", "verified": false, "promoted_to_req": "", "blast_radius_estimate": "", "created_at": "2026-07-13T23:47:57Z", "updated_at": "2026-07-13T23:47:57Z", "closed_reason": ""}}, "prev_hash": "c37b12ef43c71d0ae69a4ef0ea698aeea756b6c8b0737b5dc3e50b6fe5ea6021", "hash": "4e68fad4f2f94f44dc10ee662fccf0e13edb27e59b4139eb0208a1bca0feb41d", "recursion_depth": 0} +{"seq": 796, "ts": "2026-07-13T23:47:57Z", "op": "upsert", "record_id": "PF-WI-003B068E", "record": {"id": "PF-WI-003B068E", "kind": "preflight_decision", "status": "active", "label": "Change request matched existing governance scope. Proceed under Specsmith verification.", "confidence": 0.8, "source_type": "observed", "evidence": ["REQ-369", "REQ-418"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"decision": "accepted", "intent": "change", "work_item_id": "WI-003B068E", "test_case_ids": ["TEST-370", "TEST-428"], "instruction": "Change request matched existing governance scope. Proceed under Specsmith verification.", "ai_disclosure": {"governed_by": "specsmith", "governance_gated": true, "provider": "local/heuristic", "model": "deterministic-broker", "spec_version": "0.22.1"}}}, "prev_hash": "4e68fad4f2f94f44dc10ee662fccf0e13edb27e59b4139eb0208a1bca0feb41d", "hash": "f3a8e5385555c2a1750d3c2e46c95da79e2fee2fbd1f4b68364576adb02d4f10", "recursion_depth": 0} +{"seq": 797, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-065", "record": {"id": "REQ-065", "kind": "requirement", "status": "active", "label": "GitHub Release Creation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-065", "version": 1, "title": "GitHub Release Creation", "description": "Allow specsmith to create GitHub releases for tagged versions with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-065"]}}, "prev_hash": "f3a8e5385555c2a1750d3c2e46c95da79e2fee2fbd1f4b68364576adb02d4f10", "hash": "a1928cc35df20cac5f348960cf087a93640742b9fa04d49a7d0c764acd2f1a35", "recursion_depth": 0} +{"seq": 798, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-066", "record": {"id": "REQ-066", "kind": "requirement", "status": "active", "label": "PyPI Deployment", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-066", "version": 1, "title": "PyPI Deployment", "description": "Allow specsmith to trigger PyPI package deployment with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-066"]}}, "prev_hash": "a1928cc35df20cac5f348960cf087a93640742b9fa04d49a7d0c764acd2f1a35", "hash": "b566d04667f24dcbbc0c779462290f1f2c611f425bbc46821f7d81098d57e0ea", "recursion_depth": 0} +{"seq": 799, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-067", "record": {"id": "REQ-067", "kind": "requirement", "status": "active", "label": "CI Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-067", "version": 1, "title": "CI Management", "description": "Allow specsmith to manage CI workflows with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-067", "TEST-473"]}}, "prev_hash": "b566d04667f24dcbbc0c779462290f1f2c611f425bbc46821f7d81098d57e0ea", "hash": "f40d70fcdb9d99ba75a21081f1486414d913f6f9b1865adf709195370e437166", "recursion_depth": 0} +{"seq": 800, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-068", "record": {"id": "REQ-068", "kind": "requirement", "status": "active", "label": "Pull Request Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-068", "version": 1, "title": "Pull Request Management", "description": "Allow specsmith to manage PRs, merges, and issue creation with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-068"]}}, "prev_hash": "f40d70fcdb9d99ba75a21081f1486414d913f6f9b1865adf709195370e437166", "hash": "96d9ad6b89719a09cb04f15d52535ef6ee9ef221327f5eb9f5e9a44bc185399d", "recursion_depth": 0} +{"seq": 801, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-071", "record": {"id": "REQ-071", "kind": "requirement", "status": "active", "label": "Release Notes Generation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-071", "version": 1, "title": "Release Notes Generation", "description": "Allow specsmith to automatically generate release notes from commit history with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-071"]}}, "prev_hash": "96d9ad6b89719a09cb04f15d52535ef6ee9ef221327f5eb9f5e9a44bc185399d", "hash": "acb9f87d4340e44e114ffc694a079a4c319476101baf8894a7c16f83702f0816", "recursion_depth": 0} +{"seq": 802, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-072", "record": {"id": "REQ-072", "kind": "requirement", "status": "active", "label": "Release Tag Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-072", "version": 1, "title": "Release Tag Management", "description": "Allow specsmith to manage release tags including creation, deletion, and modification with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-072"]}}, "prev_hash": "acb9f87d4340e44e114ffc694a079a4c319476101baf8894a7c16f83702f0816", "hash": "734e3ae76f068cd829142ba0aec5ac00baaaeb59cd1c04e075da6394b65cfe85", "recursion_depth": 0} +{"seq": 803, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-073", "record": {"id": "REQ-073", "kind": "requirement", "status": "active", "label": "Artifact Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-073", "version": 1, "title": "Artifact Management", "description": "Allow specsmith to manage release artifacts including uploads, downloads, and cleanup with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-073"]}}, "prev_hash": "734e3ae76f068cd829142ba0aec5ac00baaaeb59cd1c04e075da6394b65cfe85", "hash": "be3e8b6817ca9e170d0be6c0baa73a42003eb1e46e5d6c91a90401553932eac8", "recursion_depth": 0} +{"seq": 804, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-074", "record": {"id": "REQ-074", "kind": "requirement", "status": "active", "label": "Release Branch Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-074", "version": 1, "title": "Release Branch Management", "description": "Allow specsmith to manage release branches including creation, merging, and deletion with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-074"]}}, "prev_hash": "be3e8b6817ca9e170d0be6c0baa73a42003eb1e46e5d6c91a90401553932eac8", "hash": "0381e929de41851d88ab01ad7634aa5e6e4b32f64e84b26b2ade60a3b5f6b987", "recursion_depth": 0} +{"seq": 805, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-075", "record": {"id": "REQ-075", "kind": "requirement", "status": "active", "label": "Release Validation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-075", "version": 1, "title": "Release Validation", "description": "Allow specsmith to perform automated validation checks before release creation with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-075"]}}, "prev_hash": "0381e929de41851d88ab01ad7634aa5e6e4b32f64e84b26b2ade60a3b5f6b987", "hash": "4a978dfe4a0b24460b91291a9401566947b4c4d60cf25741be2bf9036a4a212c", "recursion_depth": 0} +{"seq": 806, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-076", "record": {"id": "REQ-076", "kind": "requirement", "status": "active", "label": "Release Rollback", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-076", "version": 1, "title": "Release Rollback", "description": "Allow specsmith to rollback to previous releases with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-076"]}}, "prev_hash": "4a978dfe4a0b24460b91291a9401566947b4c4d60cf25741be2bf9036a4a212c", "hash": "bb29b8b3721504bbe5628e9228210e01f50823fd2572f78b625d58a522faf99e", "recursion_depth": 0} +{"seq": 807, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-077", "record": {"id": "REQ-077", "kind": "requirement", "status": "active", "label": "Release Promotion", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-077", "version": 1, "title": "Release Promotion", "description": "Allow specsmith to promote releases between environments (dev, staging, prod) with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-077"]}}, "prev_hash": "bb29b8b3721504bbe5628e9228210e01f50823fd2572f78b625d58a522faf99e", "hash": "11a1cd006f7e8fce58161c8b1247ee5fd0a31cb60009652bcbd6d0a8d081c769", "recursion_depth": 0} +{"seq": 808, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-078", "record": {"id": "REQ-078", "kind": "requirement", "status": "active", "label": "Release Metadata Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-078", "version": 1, "title": "Release Metadata Management", "description": "Allow specsmith to manage release metadata including version, date, and author information with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-078"]}}, "prev_hash": "11a1cd006f7e8fce58161c8b1247ee5fd0a31cb60009652bcbd6d0a8d081c769", "hash": "7789bccb6b1c554bbbe4d247a77e2a9ed6b484fce1d9f8ef9b382c0d816c88ef", "recursion_depth": 0} +{"seq": 809, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-079", "record": {"id": "REQ-079", "kind": "requirement", "status": "active", "label": "Git Platform Agnostic Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-079", "version": 1, "title": "Git Platform Agnostic Management", "description": "Allow specsmith to manage Git repositories across multiple platforms (GitHub, GitLab, Bitbucket, etc.) with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-079"]}}, "prev_hash": "7789bccb6b1c554bbbe4d247a77e2a9ed6b484fce1d9f8ef9b382c0d816c88ef", "hash": "062c5c6e317f93f1822665d18a47f3ec52722182dc80157d7c590a5b39ad02ca", "recursion_depth": 0} +{"seq": 810, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-080", "record": {"id": "REQ-080", "kind": "requirement", "status": "active", "label": "GitHub Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-080", "version": 1, "title": "GitHub Platform Management", "description": "Allow specsmith to manage GitHub repositories, issues, pull requests, and releases with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-080"]}}, "prev_hash": "062c5c6e317f93f1822665d18a47f3ec52722182dc80157d7c590a5b39ad02ca", "hash": "845b0da883ecc868a5c2df98906c19ef1875f657b7c1dd3829127555491cd4b2", "recursion_depth": 0} +{"seq": 811, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-081", "record": {"id": "REQ-081", "kind": "requirement", "status": "active", "label": "GitLab Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-081", "version": 1, "title": "GitLab Platform Management", "description": "Allow specsmith to manage GitLab repositories, issues, merge requests, and releases with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-081"]}}, "prev_hash": "845b0da883ecc868a5c2df98906c19ef1875f657b7c1dd3829127555491cd4b2", "hash": "d5fabfb3d9e7b691c801cb7a0327cf84c89a68aa30402e958f238ec662be0e39", "recursion_depth": 0} +{"seq": 812, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-082", "record": {"id": "REQ-082", "kind": "requirement", "status": "active", "label": "Bitbucket Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-082", "version": 1, "title": "Bitbucket Platform Management", "description": "Allow specsmith to manage Bitbucket repositories, issues, pull requests, and releases with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-082"]}}, "prev_hash": "d5fabfb3d9e7b691c801cb7a0327cf84c89a68aa30402e958f238ec662be0e39", "hash": "7d82cad5f6cef4cf29cde916d895c2e1fa93d723e4612b7ace163ab4a82eec67", "recursion_depth": 0} +{"seq": 813, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-083", "record": {"id": "REQ-083", "kind": "requirement", "status": "active", "label": "Azure DevOps Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-083", "version": 1, "title": "Azure DevOps Platform Management", "description": "Allow specsmith to manage Azure DevOps repositories, issues, pull requests, and releases with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-083"]}}, "prev_hash": "7d82cad5f6cef4cf29cde916d895c2e1fa93d723e4612b7ace163ab4a82eec67", "hash": "1a19b9c73067b39585198bcb879836ab1adba00cbbd5d3f96da5c4786583f474", "recursion_depth": 0} +{"seq": 814, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-084", "record": {"id": "REQ-084", "kind": "requirement", "status": "active", "label": "Git Platform Authentication Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-084", "version": 1, "title": "Git Platform Authentication Management", "description": "Allow specsmith to manage authentication credentials for multiple Git platforms with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-084"]}}, "prev_hash": "1a19b9c73067b39585198bcb879836ab1adba00cbbd5d3f96da5c4786583f474", "hash": "660b4f36afa74fff29700c984ac8cc204060f29143706f0bf97aa927483f1093", "recursion_depth": 0} +{"seq": 815, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-085", "record": {"id": "REQ-085", "kind": "requirement", "status": "active", "label": "Git Platform Configuration Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-085", "version": 1, "title": "Git Platform Configuration Management", "description": "Allow specsmith to configure platform-specific settings and webhooks for multiple Git platforms with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-085"]}}, "prev_hash": "660b4f36afa74fff29700c984ac8cc204060f29143706f0bf97aa927483f1093", "hash": "bc734ccc4cb7d3dd2ef606d434885c361b0c32d7e16c97a6c0e06cd2c3c6de3a", "recursion_depth": 0} +{"seq": 816, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-086", "record": {"id": "REQ-086", "kind": "requirement", "status": "active", "label": "Git Platform Repository Creation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-086", "version": 1, "title": "Git Platform Repository Creation", "description": "Allow specsmith to create repositories on multiple Git platforms with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-086"]}}, "prev_hash": "bc734ccc4cb7d3dd2ef606d434885c361b0c32d7e16c97a6c0e06cd2c3c6de3a", "hash": "cd6056d02b22d8e8799a94710655d65ba1b9304a3e5ea66db3a5534b57bdb8f6", "recursion_depth": 0} +{"seq": 817, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-087", "record": {"id": "REQ-087", "kind": "requirement", "status": "active", "label": "Git Platform Repository Deletion", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-087", "version": 1, "title": "Git Platform Repository Deletion", "description": "Allow specsmith to delete repositories on multiple Git platforms with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-087"]}}, "prev_hash": "cd6056d02b22d8e8799a94710655d65ba1b9304a3e5ea66db3a5534b57bdb8f6", "hash": "dcc608ccd8ee75ff9505ddee25b731aec474a8a0c53a40e93eab15387af81f86", "recursion_depth": 0} +{"seq": 818, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-088", "record": {"id": "REQ-088", "kind": "requirement", "status": "active", "label": "Git Platform Repository Cloning", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-088", "version": 1, "title": "Git Platform Repository Cloning", "description": "Allow specsmith to clone repositories from multiple Git platforms with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-088"]}}, "prev_hash": "dcc608ccd8ee75ff9505ddee25b731aec474a8a0c53a40e93eab15387af81f86", "hash": "dedb48dc0f414fb6b0c6e2b1b4dd6303b549b851c0d5bcd6188d4ac850176403", "recursion_depth": 0} +{"seq": 819, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-089", "record": {"id": "REQ-089", "kind": "requirement", "status": "active", "label": "Local Command Execution Policy", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-089", "version": 1, "title": "Local Command Execution Policy", "description": "Allow specsmith to execute local commands with a default permissive policy from a local repo standpoint, with configurable whitelists and blacklists", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-089"]}}, "prev_hash": "dedb48dc0f414fb6b0c6e2b1b4dd6303b549b851c0d5bcd6188d4ac850176403", "hash": "3dd5bfcb7c98035c328ab871a087f3e8f7a3dcf0909deba1a4feba199f5a56e1", "recursion_depth": 0} +{"seq": 820, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-090", "record": {"id": "REQ-090", "kind": "requirement", "status": "active", "label": "Local Command Whitelist Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-090", "version": 1, "title": "Local Command Whitelist Management", "description": "Allow specsmith to manage whitelisted commands for local execution with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-090"]}}, "prev_hash": "3dd5bfcb7c98035c328ab871a087f3e8f7a3dcf0909deba1a4feba199f5a56e1", "hash": "f76e2e7c2d888909d57bc90f87e8ff7fee8b6ac7cd3ab446a46e97bf8f42dae3", "recursion_depth": 0} +{"seq": 821, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-091", "record": {"id": "REQ-091", "kind": "requirement", "status": "active", "label": "Local Command Blacklist Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-091", "version": 1, "title": "Local Command Blacklist Management", "description": "Allow specsmith to manage blacklisted commands for local execution with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-091"]}}, "prev_hash": "f76e2e7c2d888909d57bc90f87e8ff7fee8b6ac7cd3ab446a46e97bf8f42dae3", "hash": "356ad1c96075141d7952cf8b1436a4dd8609759c0d58079737113b5ed8bd8f4d", "recursion_depth": 0} +{"seq": 822, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-092", "record": {"id": "REQ-092", "kind": "requirement", "status": "active", "label": "Local Command Override Capability", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-092", "version": 1, "title": "Local Command Override Capability", "description": "Allow specsmith to override execution policies with human approval, enabling execution of commands not in default policy", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-092"]}}, "prev_hash": "356ad1c96075141d7952cf8b1436a4dd8609759c0d58079737113b5ed8bd8f4d", "hash": "7454978ce411149ecad828dcde375ccc5289dca5649489d36611584ecfbc1ceb", "recursion_depth": 0} +{"seq": 823, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-093", "record": {"id": "REQ-093", "kind": "requirement", "status": "active", "label": "Pip Execution Override", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-093", "version": 1, "title": "Pip Execution Override", "description": "Allow specsmith to execute pip commands with override capability, using only local pip from the local environment in workspace", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-093"]}}, "prev_hash": "7454978ce411149ecad828dcde375ccc5289dca5649489d36611584ecfbc1ceb", "hash": "45f6c021275a5328cd6813566f410753d381bd0310b56a695ceaeaf6b3ec9ed5", "recursion_depth": 0} +{"seq": 824, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-094", "record": {"id": "REQ-094", "kind": "requirement", "status": "active", "label": "Pip Execution Safety Checks", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-094", "version": 1, "title": "Pip Execution Safety Checks", "description": "When pip execution is overridden, specsmith must warn and ensure only local pip from workspace environment is used", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-094"]}}, "prev_hash": "45f6c021275a5328cd6813566f410753d381bd0310b56a695ceaeaf6b3ec9ed5", "hash": "103f55e7f0b24150d703829914ad2e5e9b80a433a5322ea4f09845fc5d69a909", "recursion_depth": 0} +{"seq": 825, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-095", "record": {"id": "REQ-095", "kind": "requirement", "status": "active", "label": "Virtual Environment Creation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-095", "version": 1, "title": "Virtual Environment Creation", "description": "Allow specsmith to create virtual environments for projects with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-095"]}}, "prev_hash": "103f55e7f0b24150d703829914ad2e5e9b80a433a5322ea4f09845fc5d69a909", "hash": "a3dd9255efff7957fb5986bd19f22d237ac5451d17b8aeb41581c65d02fa536c", "recursion_depth": 0} +{"seq": 826, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-096", "record": {"id": "REQ-096", "kind": "requirement", "status": "active", "label": "Virtual Environment Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-096", "version": 1, "title": "Virtual Environment Management", "description": "Allow specsmith to manage virtual environments including activation, deactivation, and cleanup with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-096"]}}, "prev_hash": "a3dd9255efff7957fb5986bd19f22d237ac5451d17b8aeb41581c65d02fa536c", "hash": "e123aeee75d86450098ae0907c4c1b2ac1cb2911f8f57a83a25e4feb6db0e7bc", "recursion_depth": 0} +{"seq": 827, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-097", "record": {"id": "REQ-097", "kind": "requirement", "status": "active", "label": "Virtual Environment Validation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-097", "version": 1, "title": "Virtual Environment Validation", "description": "When creating or using virtual environments, specsmith must validate that they are properly configured and safe to use", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-097"]}}, "prev_hash": "e123aeee75d86450098ae0907c4c1b2ac1cb2911f8f57a83a25e4feb6db0e7bc", "hash": "c41560bad84bcc53d7c02a89f32b9c0fdc19ee89f5c882e2ff1656eefc5d3bb9", "recursion_depth": 0} +{"seq": 828, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-098", "record": {"id": "REQ-098", "kind": "requirement", "status": "active", "label": "Virtual Environment Warning System", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-098", "version": 1, "title": "Virtual Environment Warning System", "description": "When projects attempt to use non-pipx versions of specsmith, specsmith must warn and offer to create new venv if one doesn't exist", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-098"]}}, "prev_hash": "c41560bad84bcc53d7c02a89f32b9c0fdc19ee89f5c882e2ff1656eefc5d3bb9", "hash": "295ec4c83872361ccda66bcedaa8b1369c6226782dda19c020beda08a9c4ca1a", "recursion_depth": 0} +{"seq": 829, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-099", "record": {"id": "REQ-099", "kind": "requirement", "status": "active", "label": "Local Environment Isolation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-099", "version": 1, "title": "Local Environment Isolation", "description": "Specsmith must ensure local command execution is isolated to the project workspace environment with appropriate warnings", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-099"]}}, "prev_hash": "295ec4c83872361ccda66bcedaa8b1369c6226782dda19c020beda08a9c4ca1a", "hash": "790d0607881f33303bad5137c42d65c6b4f0f4af6255c3ca4352c6613ccb9e31", "recursion_depth": 0} +{"seq": 830, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-100", "record": {"id": "REQ-100", "kind": "requirement", "status": "active", "label": "Execution Policy Configuration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-100", "version": 1, "title": "Execution Policy Configuration", "description": "Allow specsmith to configure execution policies including default permissive mode, whitelists, blacklists, and override rules", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-100"]}}, "prev_hash": "790d0607881f33303bad5137c42d65c6b4f0f4af6255c3ca4352c6613ccb9e31", "hash": "d5dad326dd45c9532318c1252ce024e201018c5a263ce29d8929166260ed3502", "recursion_depth": 0} +{"seq": 831, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-101", "record": {"id": "REQ-101", "kind": "requirement", "status": "active", "label": "Playwright Testing Framework", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-101", "version": 1, "title": "Playwright Testing Framework", "description": "Allow specsmith projects to use Playwright for end-to-end browser testing with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-101"]}}, "prev_hash": "d5dad326dd45c9532318c1252ce024e201018c5a263ce29d8929166260ed3502", "hash": "a3a3c6527f581b637025afbe91a7577eff6d351ee41ea10f4e56402da4f20ef7", "recursion_depth": 0} +{"seq": 832, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-102", "record": {"id": "REQ-102", "kind": "requirement", "status": "active", "label": "Testing Framework Configuration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-102", "version": 1, "title": "Testing Framework Configuration", "description": "Allow specsmith projects to configure testing frameworks including Playwright, pytest, and others with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-102"]}}, "prev_hash": "a3a3c6527f581b637025afbe91a7577eff6d351ee41ea10f4e56402da4f20ef7", "hash": "d3de9b9fd0fc20034f4eabfc904e43915bb1497f00b6be7617c6fab672113331", "recursion_depth": 0} +{"seq": 833, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-103", "record": {"id": "REQ-103", "kind": "requirement", "status": "active", "label": "Testing Environment Isolation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-103", "version": 1, "title": "Testing Environment Isolation", "description": "Ensure testing environments are properly isolated from development environments with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-103"]}}, "prev_hash": "d3de9b9fd0fc20034f4eabfc904e43915bb1497f00b6be7617c6fab672113331", "hash": "4986d1a842df7fa2a469dcb710cd1a7232c553799a9a59f9c8ca0bd97cd73c25", "recursion_depth": 0} +{"seq": 834, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-104", "record": {"id": "REQ-104", "kind": "requirement", "status": "active", "label": "Testing Artifact Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-104", "version": 1, "title": "Testing Artifact Management", "description": "Allow specsmith projects to manage test artifacts including screenshots, videos, and logs with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-104"]}}, "prev_hash": "4986d1a842df7fa2a469dcb710cd1a7232c553799a9a59f9c8ca0bd97cd73c25", "hash": "cdcc4da0b0e0018b855fac2242111fabad64df48d9b46bc5beeef10934694b63", "recursion_depth": 0} +{"seq": 835, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-105", "record": {"id": "REQ-105", "kind": "requirement", "status": "active", "label": "Testing Report Generation", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-105", "version": 1, "title": "Testing Report Generation", "description": "Allow specsmith projects to automatically generate test reports with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-105"]}}, "prev_hash": "cdcc4da0b0e0018b855fac2242111fabad64df48d9b46bc5beeef10934694b63", "hash": "78fe3fa75fc262bcbe4f1822d045b74ebe05a781175605dc012c178286e37870", "recursion_depth": 0} +{"seq": 836, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-106", "record": {"id": "REQ-106", "kind": "requirement", "status": "active", "label": "Testing Integration with CI/CD", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-106", "version": 1, "title": "Testing Integration with CI/CD", "description": "Allow specsmith projects to integrate testing frameworks with CI/CD pipelines with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-106"]}}, "prev_hash": "78fe3fa75fc262bcbe4f1822d045b74ebe05a781175605dc012c178286e37870", "hash": "fae425fd0cafbe25a09fc8bc87833b77057380c14b8c25a4f598f2d2406090a0", "recursion_depth": 0} +{"seq": 837, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-107", "record": {"id": "REQ-107", "kind": "requirement", "status": "active", "label": "Testing Parallel Execution", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-107", "version": 1, "title": "Testing Parallel Execution", "description": "Allow specsmith projects to execute tests in parallel with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-107"]}}, "prev_hash": "fae425fd0cafbe25a09fc8bc87833b77057380c14b8c25a4f598f2d2406090a0", "hash": "13e04e814dcde87c92676c37cd5c28db165d61093253338e927bdffadd5988d1", "recursion_depth": 0} +{"seq": 838, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-108", "record": {"id": "REQ-108", "kind": "requirement", "status": "active", "label": "Testing Coverage Reporting", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-108", "version": 1, "title": "Testing Coverage Reporting", "description": "Allow specsmith projects to generate and track test coverage reports with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-108"]}}, "prev_hash": "13e04e814dcde87c92676c37cd5c28db165d61093253338e927bdffadd5988d1", "hash": "9d59583917095ce49b6e17391b0aa1ddcac75c56803ac842f1cf73565cd40ea2", "recursion_depth": 0} +{"seq": 839, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-109", "record": {"id": "REQ-109", "kind": "requirement", "status": "active", "label": "WebUI Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-109", "version": 1, "title": "WebUI Platform Integration", "description": "Allow specsmith projects to integrate with WebUI platforms for AI model serving with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-109"]}}, "prev_hash": "9d59583917095ce49b6e17391b0aa1ddcac75c56803ac842f1cf73565cd40ea2", "hash": "e070f52dd8e9eedf405d5ad097f21cf71bde402080ce0b511a319e2826f85982", "recursion_depth": 0} +{"seq": 840, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-110", "record": {"id": "REQ-110", "kind": "requirement", "status": "active", "label": "VLLM Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-110", "version": 1, "title": "VLLM Platform Integration", "description": "Allow specsmith projects to integrate with VLLM for large language model serving with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-110"]}}, "prev_hash": "e070f52dd8e9eedf405d5ad097f21cf71bde402080ce0b511a319e2826f85982", "hash": "bd9abbba77f2827775685a4b8bfee1d27daab04ad9e447736baaa84acc6260ff", "recursion_depth": 0} +{"seq": 841, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-111", "record": {"id": "REQ-111", "kind": "requirement", "status": "active", "label": "LMStudio Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-111", "version": 1, "title": "LMStudio Platform Integration", "description": "Allow specsmith projects to integrate with LMStudio for local AI model serving with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-111"]}}, "prev_hash": "bd9abbba77f2827775685a4b8bfee1d27daab04ad9e447736baaa84acc6260ff", "hash": "9c523307022e8edd82ee26275b4c5fd368648fbd24e7fb1c8e743674b78c21b2", "recursion_depth": 0} +{"seq": 842, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-112", "record": {"id": "REQ-112", "kind": "requirement", "status": "active", "label": "Ollama Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-112", "version": 1, "title": "Ollama Platform Integration", "description": "Allow specsmith projects to integrate with Ollama for local AI model serving with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-112"]}}, "prev_hash": "9c523307022e8edd82ee26275b4c5fd368648fbd24e7fb1c8e743674b78c21b2", "hash": "9b6402057afd91995d4ac8a5a3f39fbd7d486004f64845e73690cc6aaad0d085", "recursion_depth": 0} +{"seq": 843, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-113", "record": {"id": "REQ-113", "kind": "requirement", "status": "active", "label": "OpenTerminal Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-113", "version": 1, "title": "OpenTerminal Platform Integration", "description": "Allow specsmith projects to integrate with OpenTerminal for AI terminal interfaces with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-113"]}}, "prev_hash": "9b6402057afd91995d4ac8a5a3f39fbd7d486004f64845e73690cc6aaad0d085", "hash": "fe40dcf369ffdedb13c88f76f66d79817021c5c8762e8f12d513fd5ffd7acde7", "recursion_depth": 0} +{"seq": 844, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-114", "record": {"id": "REQ-114", "kind": "requirement", "status": "active", "label": "Platform Skill Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-114", "version": 1, "title": "Platform Skill Management", "description": "Allow specsmith projects to manage skills for different AI platforms with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-114"]}}, "prev_hash": "fe40dcf369ffdedb13c88f76f66d79817021c5c8762e8f12d513fd5ffd7acde7", "hash": "8e7a59a8b59cbf3784755b4296831046f94509e4d2a50d87f09b7fe39dbbbb9b", "recursion_depth": 0} +{"seq": 845, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-115", "record": {"id": "REQ-115", "kind": "requirement", "status": "active", "label": "Platform Configuration Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-115", "version": 1, "title": "Platform Configuration Management", "description": "Allow specsmith projects to configure AI platform settings and parameters with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-115"]}}, "prev_hash": "8e7a59a8b59cbf3784755b4296831046f94509e4d2a50d87f09b7fe39dbbbb9b", "hash": "30364277bc41f0ac5cc8eb202b1aad550a72912d8f311658b9a80807c6e209f7", "recursion_depth": 0} +{"seq": 846, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-116", "record": {"id": "REQ-116", "kind": "requirement", "status": "active", "label": "Platform Resource Management", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-116", "version": 1, "title": "Platform Resource Management", "description": "Allow specsmith projects to manage platform resources including memory, GPU, and compute with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-116"]}}, "prev_hash": "30364277bc41f0ac5cc8eb202b1aad550a72912d8f311658b9a80807c6e209f7", "hash": "73782b745071a915632675c85f5b1ea0f1e4a7d2db277e231be0a44df30d1557", "recursion_depth": 0} +{"seq": 847, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-117", "record": {"id": "REQ-117", "kind": "requirement", "status": "active", "label": "Platform Security Controls", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-117", "version": 1, "title": "Platform Security Controls", "description": "Ensure AI platform integrations follow security best practices with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-117"]}}, "prev_hash": "73782b745071a915632675c85f5b1ea0f1e4a7d2db277e231be0a44df30d1557", "hash": "7476f302cc027d6fffe7a3a065f724a9b7ee0a63d354a8b81d5d1033f15be2d0", "recursion_depth": 0} +{"seq": 848, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-118", "record": {"id": "REQ-118", "kind": "requirement", "status": "active", "label": "Platform Monitoring and Logging", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-118", "version": 1, "title": "Platform Monitoring and Logging", "description": "Allow specsmith projects to monitor and log AI platform activities with human approval", "source": "specsmith governance", "status": "planned", "test_ids": ["TEST-118"]}}, "prev_hash": "7476f302cc027d6fffe7a3a065f724a9b7ee0a63d354a8b81d5d1033f15be2d0", "hash": "545cfefb84315d186db710a0569bb0e30f461b792b96f2c0dcf0558d77561310", "recursion_depth": 0} +{"seq": 849, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-190", "record": {"id": "REQ-190", "kind": "requirement", "status": "active", "label": "Terminal Connects via HTTP/WebSocket", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-190", "version": 1, "title": "Terminal Connects via HTTP/WebSocket", "description": "The terminal MUST connect to `specsmith serve` over HTTP/WebSocket for all governance operations.", "source": "docs/PLANNED-REQUIREMENTS.md (SRV-005)", "status": "implemented", "test_ids": ["TEST-190"]}}, "prev_hash": "545cfefb84315d186db710a0569bb0e30f461b792b96f2c0dcf0558d77561310", "hash": "a95dd22e6968fc521cb14ed1a5f207485474b557868c8ce0d3de849492d9c201", "recursion_depth": 0} +{"seq": 850, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-258", "record": {"id": "REQ-258", "kind": "requirement", "status": "active", "label": "ESDB Settings Page", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-258", "version": 1, "title": "ESDB Settings Page", "description": "The settings sidebar MUST include an ESDB page under the Specsmith umbrella group. The page MUST display current ESDB status (record count, backend, chain validity) and provide action buttons for Refresh, Export JSON, Import, Backup, Rollback, and Compact.", "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": ["TEST-258"]}}, "prev_hash": "a95dd22e6968fc521cb14ed1a5f207485474b557868c8ce0d3de849492d9c201", "hash": "fd4cc56fc389101740b5aa11208dec0796e0b7d9845ab8eeb2bc7905f9e5ff80", "recursion_depth": 0} +{"seq": 851, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-259", "record": {"id": "REQ-259", "kind": "requirement", "status": "active", "label": "Skills Settings Page", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-259", "version": 1, "title": "Skills Settings Page", "description": "The settings sidebar MUST include a Skills page under the Specsmith umbrella group. The page MUST display a description of the Skills system and instructions for using specsmith skills build and related commands.", "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": ["TEST-259"]}}, "prev_hash": "fd4cc56fc389101740b5aa11208dec0796e0b7d9845ab8eeb2bc7905f9e5ff80", "hash": "a0bbeaab8c845986dd96db3683d8b322275c2b1178f2d087f017ac1b9652a946", "recursion_depth": 0} +{"seq": 852, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-260", "record": {"id": "REQ-260", "kind": "requirement", "status": "active", "label": "Eval Settings Page", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-260", "version": 1, "title": "Eval Settings Page", "description": "The settings sidebar MUST include an Eval page under the Specsmith umbrella group. The page MUST describe the evaluation tracking system and direct users to specsmith eval run for generating reports.", "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": ["TEST-260"]}}, "prev_hash": "a0bbeaab8c845986dd96db3683d8b322275c2b1178f2d087f017ac1b9652a946", "hash": "4bd7d23e1bb8a88271fd4f30073f75f0b6010b832933b0a9b4f42065c7d94dfd", "recursion_depth": 0} +{"seq": 853, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-261", "record": {"id": "REQ-261", "kind": "requirement", "status": "active", "label": "AI Providers Table Without Column Overflow", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-261", "version": 1, "title": "AI Providers Table Without Column Overflow", "description": "The Agents > Providers settings page MUST display AI models in a table with fixed-width columns (Name: 200px, Model ID: 220px, Context: 80px, Output: 80px) using ConstrainedBox + Clipped elements. Long model names such as o4-mini-deep-research MUST NOT overflow into adjacent columns.", "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": ["TEST-261"]}}, "prev_hash": "4bd7d23e1bb8a88271fd4f30073f75f0b6010b832933b0a9b4f42065c7d94dfd", "hash": "87664b84ccb38b6435ee657e983c5424afda36848ea5a3b168e5b793762b6291", "recursion_depth": 0} +{"seq": 854, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-262", "record": {"id": "REQ-262", "kind": "requirement", "status": "active", "label": "MCP AI Builder Card", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-262", "version": 1, "title": "MCP AI Builder Card", "description": "The Agents > MCP servers list page MUST include a collapsible AI Builder card that accepts a natural-language server description, calls specsmith mcp generate --json, displays the generated JSON stub, and offers an 'Add to ~/.specsmith/mcp.json' button that appends the stub to the user's MCP config file.", "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": ["TEST-262"]}}, "prev_hash": "87664b84ccb38b6435ee657e983c5424afda36848ea5a3b168e5b793762b6291", "hash": "d31e27e053a1df592a7121d627cbd01d02f7c20a98ab775e40595a27481b063c", "recursion_depth": 0} +{"seq": 855, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-281", "record": {"id": "REQ-281", "kind": "requirement", "status": "active", "label": "AI Settings Bucket Score Display", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-281", "version": 1, "title": "AI Settings Bucket Score Display", "description": "The Agents > Providers settings page MUST display bucket scores (reasoning, conversational, longform) retrieved from `GET /api/model-intel/scores/{model}` for each configured provider. Scores MUST be shown as compact numeric badges. A Sync button MUST call `POST /api/model-intel/sync`.", "source": "ARCHITECTURE.md §20–21 [KAI-001]", "status": "implemented", "test_ids": ["TEST-281"]}}, "prev_hash": "d31e27e053a1df592a7121d627cbd01d02f7c20a98ab775e40595a27481b063c", "hash": "d7b1ca7bab4a9f1fbe372cca6807a3fc91e556a4b49488766355a4cd2032574f", "recursion_depth": 0} +{"seq": 856, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-332", "record": {"id": "REQ-332", "kind": "requirement", "status": "active", "label": "Live DAG Graph Panel", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-332", "version": 1, "title": "Live DAG Graph Panel", "description": "MUST render a DispatchPanelView that subscribes to GET /api/dispatch/events SSE and renders an SVG DAG graph with nodes coloured by status (pending=grey, running=blue, completed=green, failed=red, blocked=amber) and directed edges showing dependencies. A node click MUST open a side panel with role, summary, files changed, and ESDB record ID.", "source": "ARCHITECTURE.md §Multi-Agent DAG Dispatcher", "status": "implemented", "test_ids": ["TEST-332"]}}, "prev_hash": "d7b1ca7bab4a9f1fbe372cca6807a3fc91e556a4b49488766355a4cd2032574f", "hash": "5d393ac4f73c13a6ed70bcaa70db2d3f5d3359376c454d1c65861648b7fbcf42", "recursion_depth": 0} +{"seq": 857, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-333", "record": {"id": "REQ-333", "kind": "requirement", "status": "active", "label": "Gantt Timeline Strip", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-333", "version": 1, "title": "Gantt Timeline Strip", "description": "MUST render a GanttStrip alongside the DAG graph showing a horizontal timeline bar per node, filled as the node transitions from pending to running to completed, visually indicating parallel execution overlap.", "source": "ARCHITECTURE.md §Multi-Agent DAG Dispatcher", "status": "implemented", "test_ids": ["TEST-333"]}}, "prev_hash": "5d393ac4f73c13a6ed70bcaa70db2d3f5d3359376c454d1c65861648b7fbcf42", "hash": "e16b6519683d9f8c7eae432fc1e7af40f9029b3d21d239b4686724e2a52f0ba8", "recursion_depth": 0} +{"seq": 858, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-334", "record": {"id": "REQ-334", "kind": "requirement", "status": "active", "label": "Per-Node Retry and Abort Controls", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-334", "version": 1, "title": "Per-Node Retry and Abort Controls", "description": "MUST provide a Retry button on FAILED and BLOCKED nodes (calls POST /api/dispatch/retry) and an Abort button on RUNNING nodes (calls POST /api/dispatch/abort). Retry and Abort MUST be disabled when not applicable to the node status.", "source": "ARCHITECTURE.md §Multi-Agent DAG Dispatcher", "status": "implemented", "test_ids": ["TEST-334"]}}, "prev_hash": "e16b6519683d9f8c7eae432fc1e7af40f9029b3d21d239b4686724e2a52f0ba8", "hash": "06dc334a6dd81d6eedc7e3edf80e812586e73afe967a51bbaee59cbbbe747ed9", "recursion_depth": 0} +{"seq": 859, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-423", "record": {"id": "REQ-423", "kind": "requirement", "status": "active", "label": "Governed benchmark agents must achieve 100% pass rate across all tasks and conditions", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-423", "version": 1, "title": "Governed benchmark agents must achieve 100% pass rate across all tasks and conditions", "description": "All specsmith conditions (LIGHT, FULL, DISPATCH) must pass all benchmark tasks including T13 CLI tasks with stdout discipline and T10 route-ordering traps", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-433"]}}, "prev_hash": "06dc334a6dd81d6eedc7e3edf80e812586e73afe967a51bbaee59cbbbe747ed9", "hash": "97973bce2b0aea46a3cdba965e13ed9f3fb2be80696e04ac19d26465563ee68a", "recursion_depth": 0} +{"seq": 860, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-424", "record": {"id": "REQ-424", "kind": "requirement", "status": "active", "label": "CI pipeline must produce zero CodeQL static analysis alerts on every run", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-424", "version": 1, "title": "CI pipeline must produce zero CodeQL static analysis alerts on every run", "description": "Promoted from WI-0CEA445B. The codebase must produce zero CodeQL static analysis alerts on every CI run", "source": "WI-0CEA445B", "status": "planned", "test_ids": ["TEST-434"]}}, "prev_hash": "97973bce2b0aea46a3cdba965e13ed9f3fb2be80696e04ac19d26465563ee68a", "hash": "95e759c777613ba67d90e04b1ef850b17d1cd642b3cc02fd86e9ca3599227334", "recursion_depth": 0} +{"seq": 861, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-425", "record": {"id": "REQ-425", "kind": "requirement", "status": "active", "label": "Governed agents must autonomously resolve preflight needs_clarification without blocking", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-425", "version": 1, "title": "Governed agents must autonomously resolve preflight needs_clarification without blocking", "description": "Promoted from WI-B73B339B. The benchmark harness must never deadlock on preflight needs_clarification — governed agents must autonomously resolve missing requirements and always produce a passing implementation", "source": "WI-B73B339B", "status": "planned", "test_ids": ["TEST-435"]}}, "prev_hash": "95e759c777613ba67d90e04b1ef850b17d1cd642b3cc02fd86e9ca3599227334", "hash": "bfcaa77be74682ccf01ce0f89b81163aebc9f6f75e019fe4d637087db3142aa9", "recursion_depth": 0} +{"seq": 862, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-426", "record": {"id": "REQ-426", "kind": "requirement", "status": "active", "label": "Benchmark harness completion token budget must allow reasoning models to produce tool calls", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-426", "version": 1, "title": "Benchmark harness completion token budget must allow reasoning models to produce tool calls", "description": "max_completion_tokens must be at least 32768 for gpt-5.x and o-series models to prevent reasoning token exhaustion truncating tool call output", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-436"]}}, "prev_hash": "bfcaa77be74682ccf01ce0f89b81163aebc9f6f75e019fe4d637087db3142aa9", "hash": "dfc85febeae43bffc6de340b6ad8247369cb0e64f1982f27d81518f189b02a27", "recursion_depth": 0} +{"seq": 863, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-427", "record": {"id": "REQ-427", "kind": "requirement", "status": "active", "label": "GovernanceBench metrics/report statistical and leaderboard outputs", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-427", "version": 1, "title": "GovernanceBench metrics/report statistical and leaderboard outputs", "description": "GovernanceBench metrics/report shall compute Wilson pass-rate confidence intervals, bootstrap cost-of-pass confidence intervals, first-pass and consistency statistics, scaffold-lift vs UNGOVERNED, model-tier mapping, democratization and Pareto summaries, and Hugging Face leaderboard JSON/rendered report sections.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-437", "TEST-438", "TEST-440", "TEST-441"]}}, "prev_hash": "dfc85febeae43bffc6de340b6ad8247369cb0e64f1982f27d81518f189b02a27", "hash": "879d9c23e8f142645e6394176e4e782e07eafb0859239c35d0d3eec66d7d3d53", "recursion_depth": 0} +{"seq": 864, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-428", "record": {"id": "REQ-428", "kind": "requirement", "status": "active", "label": "gitignore normalizer must enforce disjoint allow/deny policy and untrack diverged paths", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-428", "version": 1, "title": "gitignore normalizer must enforce disjoint allow/deny policy and untrack diverged paths", "description": "normalize_esdb_gitignore_policy in sync.py must (a) separate tracked paths from ignored paths in two disjoint sets, (b) never emit a bare ignore rule for a path it also allows, (c) run git rm --cached for any deny-listed path found in git ls-files, and (d) make esdb_migration_manifest.json explicitly tracked", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-439"]}}, "prev_hash": "879d9c23e8f142645e6394176e4e782e07eafb0859239c35d0d3eec66d7d3d53", "hash": "9e1ef109b44c90b4389af835582be4f5f90ec01df4e93aa86dad2126dddf8d0b", "recursion_depth": 0} +{"seq": 865, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-429", "record": {"id": "REQ-429", "kind": "requirement", "status": "active", "label": "checkpoint ESDB field must reflect active backend: show SQLite record count and chain status when chronomemory is unavailable, ChronoMemory count otherwise, and N/A when no ESDB is present", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-429", "version": 1, "title": "checkpoint ESDB field must reflect active backend: show SQLite record count and chain status when chronomemory is unavailable, ChronoMemory count otherwise, and N/A when no ESDB is present", "description": "The 'specsmith checkpoint' GOVERNANCE ANCHOR box must accurately show the active ESDB backend. When chronomemory (commercial) is the active backend and WAL exists, show record count and chain validity as now. When SQLite is the active backend (chronomemory absent or WAL missing), show 'SQLite (N recs, ✓ chain)' with actual SqliteStore record count and chain_valid() result. When no ESDB is present at all, show 'N/A'. The current 0-record default is misleading for SQLite-only installations.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-442"]}}, "prev_hash": "9e1ef109b44c90b4389af835582be4f5f90ec01df4e93aa86dad2126dddf8d0b", "hash": "68e4fc7ae17ae01baff294466af92c9128beb99790cf973262e35db6b070cad9", "recursion_depth": 0} +{"seq": 866, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-430", "record": {"id": "REQ-430", "kind": "requirement", "status": "active", "label": "preflight release classifier must distinguish release execution from release tooling edits", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-430", "version": 1, "title": "preflight release classifier must distinguish release execution from release tooling edits", "description": "The deterministic broker must not classify edits to release.yml, packaging scripts, dist files, and release documentation as intent=release. Only utterances that explicitly execute a release (cut, publish, ship, tag vX.Y.Z, bump version) should trigger the release gate. Maintenance of release tooling must fall through to CHANGE classification so it can be accepted by scope-matching.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-443", "TEST-445"]}}, "prev_hash": "68e4fc7ae17ae01baff294466af92c9128beb99790cf973262e35db6b070cad9", "hash": "90ef99175aededdf9b2dbbbff20d23463dce5ee64973226fa1f631172dd74586", "recursion_depth": 0} +{"seq": 867, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-431", "record": {"id": "REQ-431", "kind": "requirement", "status": "active", "label": "preflight release intent must accept when known scope matched or explicit REQ cited, and always allocate a work item", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-431", "version": 1, "title": "preflight release intent must accept when known scope matched or explicit REQ cited, and always allocate a work item", "description": "When intent=release is classified: (a) if the utterance contains explicit release-management REQ IDs (e.g. REQ-050, REQ-051) or the scope confidence >= 0.6, the decision must be accepted as a governed change; (b) needs_clarification must still allocate a work_item_id so specsmith approve --work-item can proceed; (c) the instruction must reference --req flag for explicit override. The current dead-end (needs_clarification + empty work_item_id) makes approve impossible.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-444"]}}, "prev_hash": "90ef99175aededdf9b2dbbbff20d23463dce5ee64973226fa1f631172dd74586", "hash": "d8e9127977d550e31dc5281dc705bf7c44c677ccbca8b19a78a23a6e2de73594", "recursion_depth": 0} +{"seq": 868, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-432", "record": {"id": "REQ-432", "kind": "requirement", "status": "active", "label": "audit must flag empty or fallback-only governance YAML rule sets", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-432", "version": 1, "title": "audit must flag empty or fallback-only governance YAML rule sets", "description": "check_governance_yaml_content must iterate .specsmith/governance/*.yaml; fail audit if any file has rules: [] or rules: [{note: ...}] only. Gate on presence of governance dir. m001 silent-skip when source_md missing must become a loud warning.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-446", "TEST-452"]}}, "prev_hash": "d8e9127977d550e31dc5281dc705bf7c44c677ccbca8b19a78a23a6e2de73594", "hash": "d51062d7268064216c86bd7e80e743e0cf12094e9e9c698c4f85be162ffe0f3a", "recursion_depth": 0} +{"seq": 869, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-433", "record": {"id": "REQ-433", "kind": "requirement", "status": "active", "label": "sync must warn when REQUIREMENTS.md contains REQ IDs absent from docs/requirements YAML files", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-433", "version": 1, "title": "sync must warn when REQUIREMENTS.md contains REQ IDs absent from docs/requirements YAML files", "description": "In YAML-first mode run_sync must compare IDs in docs/REQUIREMENTS.md against those loaded from docs/requirements/*.yml; emit SyncWarning for any ID present in markdown but absent from YAML with hint to add to yml and re-run sync. Same pattern for TESTS.md vs docs/tests/*.yml.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-447", "TEST-448"]}}, "prev_hash": "d51062d7268064216c86bd7e80e743e0cf12094e9e9c698c4f85be162ffe0f3a", "hash": "9cb5c9436349a83667e1b271fd4a0f92f01215bc38522c0a172af462364628c8", "recursion_depth": 0} +{"seq": 870, "ts": "2026-07-13T23:50:01Z", "op": "upsert", "record_id": "REQ-434", "record": {"id": "REQ-434", "kind": "requirement", "status": "active", "label": "CLI verify_cmd must wire equilibrium to WI mark_implemented and files_touched", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-434", "version": 1, "title": "CLI verify_cmd must wire equilibrium to WI mark_implemented and files_touched", "description": "verify_cmd (cli.py) computes equilibrium but never calls WorkItemStore.mark_implemented or sets files_touched on the WI, unlike governance_logic.run_verify. verify_cmd must call run_verify from governance_logic or mirror the WI-update logic so WI status advances to implemented on equilibrium.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-449"]}}, "prev_hash": "9cb5c9436349a83667e1b271fd4a0f92f01215bc38522c0a172af462364628c8", "hash": "295114dad1f5287329823dca22c5a75e36b39bf36dd59d5f13cf33feb78a4362", "recursion_depth": 0} +{"seq": 871, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-435", "record": {"id": "REQ-435", "kind": "requirement", "status": "active", "label": "infer_scope must apply a minimum relevance score threshold to drop incidental matches", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-435", "version": 1, "title": "infer_scope must apply a minimum relevance score threshold to drop incidental matches", "description": "infer_scope currently returns up to top_k=3 results with no minimum score floor (only overlap>0). Add min_score=0.15 parameter; filter out matches below threshold before returning. Update run_preflight to pass min_score=0.15 so only genuinely related requirements are associated with work items.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-450"]}}, "prev_hash": "295114dad1f5287329823dca22c5a75e36b39bf36dd59d5f13cf33feb78a4362", "hash": "e2e6dfe8824bae5663b49486b275d7785fcf98b1661f898bcc22ae25255b74ef", "recursion_depth": 0} +{"seq": 872, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-436", "record": {"id": "REQ-436", "kind": "requirement", "status": "active", "label": "session_metrics.jsonl must record real token counts, cost, model, and work_item_id per turn", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-436", "version": 1, "title": "session_metrics.jsonl must record real token counts, cost, model, and work_item_id per turn", "description": "session_metrics.jsonl auto-save path passes only command=save with all telemetry defaults zero. Real per-turn token usage is captured in ESDB token_metric via write_token_metric (runner.py:614). Add flush_session_metrics helper that reads the most recent ESDB token_metric record and appends a populated MetricsRecord to session_metrics.jsonl after write_token_metric is called.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-451"]}}, "prev_hash": "e2e6dfe8824bae5663b49486b275d7785fcf98b1661f898bcc22ae25255b74ef", "hash": "d12885082173a13a7c4abd34920590decdbaf6a404770724c62067aaa544002f", "recursion_depth": 0} +{"seq": 873, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-437", "record": {"id": "REQ-437", "kind": "requirement", "status": "active", "label": "Datasource adapters must define retrieval contracts, resilience behavior, and citation normalization guarantees", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-437", "version": 1, "title": "Datasource adapters must define retrieval contracts, resilience behavior, and citation normalization guarantees", "description": "The datasources module (src/specsmith/datasources/) provides patent, publication, and citation adapters. Each adapter must declare a typed retrieval contract, handle transient failures with retry/backoff, and normalize citation output to a canonical schema. Absence of these guarantees makes adapter output unpredictable for governance evidence packs.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-453"]}}, "prev_hash": "d12885082173a13a7c4abd34920590decdbaf6a404770724c62067aaa544002f", "hash": "d5024af9e607001c84056d66adea673882a5cb7dbf2c73be7123a0f12df945da", "recursion_depth": 0} +{"seq": 874, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-438", "record": {"id": "REQ-438", "kind": "requirement", "status": "active", "label": "GUI commands and views must provide governed parity with core CLI state and error semantics", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-438", "version": 1, "title": "GUI commands and views must provide governed parity with core CLI state and error semantics", "description": "The GUI surface (src/specsmith/gui/) exposes governance state visually. Every GUI action that maps to a CLI command must produce identical governance outcomes (preflight, audit, sync). GUI error messages must be derived from the same error taxonomy as the CLI. No silent failures.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-454"]}}, "prev_hash": "d5024af9e607001c84056d66adea673882a5cb7dbf2c73be7123a0f12df945da", "hash": "12162351d610e4226c6b7edb9cb8cd8955693e64c0de094fdb63d1b5013d59b4", "recursion_depth": 0} +{"seq": 875, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-439", "record": {"id": "REQ-439", "kind": "requirement", "status": "active", "label": "IDE integration adapters must implement a uniform capability and error-handling contract", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-439", "version": 1, "title": "IDE integration adapters must implement a uniform capability and error-handling contract", "description": "Integration adapters (src/specsmith/integrations/: aider, copilot, cursor, gemini, windsurf, claude) must each declare supported operations, degrade gracefully when the target tool is unavailable, and surface errors through specsmith governance events rather than silent fallbacks.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-455"]}}, "prev_hash": "12162351d610e4226c6b7edb9cb8cd8955693e64c0de094fdb63d1b5013d59b4", "hash": "0e3924e7e45a1a93217955c816db790bcd24d61d99b6120e9a8c72e7e684ebe4", "recursion_depth": 0} +{"seq": 876, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-440", "record": {"id": "REQ-440", "kind": "requirement", "status": "active", "label": "Plugin management must define install, list, remove, and compatibility validation requirements", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-440", "version": 1, "title": "Plugin management must define install, list, remove, and compatibility validation requirements", "description": "The plugin lifecycle (specsmith plugin command + src/specsmith/plugins.py) must: enumerate installed plugins (list), validate manifests on install, reject incompatible plugin versions, and support removal without leaving orphaned state. Plugin errors must not propagate to core governance commands.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-456"]}}, "prev_hash": "0e3924e7e45a1a93217955c816db790bcd24d61d99b6120e9a8c72e7e684ebe4", "hash": "201c4569d2aa6bcd515fee7a2f1169fe299a4dfe5754472621f0d99416eaf710", "recursion_depth": 0} +{"seq": 877, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-441", "record": {"id": "REQ-441", "kind": "requirement", "status": "active", "label": "specsmith plugin CLI must document and enforce plugin command surface (list, validate, install, remove)", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-441", "version": 1, "title": "specsmith plugin CLI must document and enforce plugin command surface (list, validate, install, remove)", "description": "The specsmith plugin command is a CLI surface with no explicit REQ. It must: list all installed entry-point and manifest plugins (plugin list), validate plugin manifests before activation (plugin validate), and provide clear error messages when plugins fail to load.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-457"]}}, "prev_hash": "201c4569d2aa6bcd515fee7a2f1169fe299a4dfe5754472621f0d99416eaf710", "hash": "21d8cc8e987af83c11d562cec0314eee8e6d843d79844eaf26c7fd146c5e4030", "recursion_depth": 0} +{"seq": 878, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-442", "record": {"id": "REQ-442", "kind": "requirement", "status": "active", "label": "specsmith pr CLI must cover governed pull request creation, status, and merge workflows", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-442", "version": 1, "title": "specsmith pr CLI must cover governed pull request creation, status, and merge workflows", "description": "The specsmith pr (create-pr/governed-pr) command surface has no explicit REQ. It must: create PRs with governance comment blocks, evaluate PR governance status against open WIs, and block merge on policy violations when --required-check is set.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-458"]}}, "prev_hash": "21d8cc8e987af83c11d562cec0314eee8e6d843d79844eaf26c7fd146c5e4030", "hash": "f1890c657bd160684e1db72ef61aa030ae470be51de5b910f269d44db1131850", "recursion_depth": 0} +{"seq": 879, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-443", "record": {"id": "REQ-443", "kind": "requirement", "status": "active", "label": "specsmith ps CLI must surface process and session state for all tracked agent runs", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-443", "version": 1, "title": "specsmith ps CLI must surface process and session state for all tracked agent runs", "description": "The specsmith ps command has no explicit REQ. It must list all tracked PIDs from .specsmith/pids/, report status (running/stopped/unknown) for each, and integrate with kill-session so process cleanup is auditable and idempotent.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-459"]}}, "prev_hash": "f1890c657bd160684e1db72ef61aa030ae470be51de5b910f269d44db1131850", "hash": "dc41f2a4033a9b5c6db978928720caf46e56d0a9dd446a5a5172388bc584ae1c", "recursion_depth": 0} +{"seq": 880, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-444", "record": {"id": "REQ-444", "kind": "requirement", "status": "active", "label": "Native Warp integration", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-444", "version": 1, "title": "Native Warp integration", "description": "specsmith provides a first-class Warp integration: a 'warp' integration adapter (specsmith integrate warp) that generates Warp-native artifacts (MCP governance server config, a Tab Config for a governed session, and a governance skill) so Warp's agent is governed by specsmith; and the 'specsmith run' REPL detects when it runs inside Warp (TERM_PROGRAM/WARP_*) and adapts its banner/ready frame accordingly.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-460"]}}, "prev_hash": "dc41f2a4033a9b5c6db978928720caf46e56d0a9dd446a5a5172388bc584ae1c", "hash": "d428dab449d71047f90497d7efb8ead806cc08ba9eb4cd530461f104765d2d0a", "recursion_depth": 0} +{"seq": 881, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-445", "record": {"id": "REQ-445", "kind": "requirement", "status": "active", "label": "VRAM-aware local model recommendations", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-445", "version": 1, "title": "VRAM-aware local model recommendations", "description": "First-class Ollama model recommendation engine: a model catalog with approximate Q4 VRAM footprints and a recommend_models(vram_gb)/recommend_for_hardware() API that selects a role lineup (default/coding, fast scratch, harder pass/reasoning, general) keyed by the detected GPU VRAM tier, with per-model fit assessment (fits/tight/spills-to-RAM). Exposed via 'specsmith local-model recommend' (+ --json). Must not change existing detect_local_model/detect_local_models behavior.", "source": "docs/requirements/", "status": "planned", "test_ids": ["TEST-461"]}}, "prev_hash": "d428dab449d71047f90497d7efb8ead806cc08ba9eb4cd530461f104765d2d0a", "hash": "2d5df0aa8b4576b3a7b669cc00aa17ddfbd01843e424d045bac793265e7ba4ef", "recursion_depth": 0} +{"seq": 882, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-446", "record": {"id": "REQ-446", "kind": "requirement", "status": "active", "label": "Epistemic chat condensation and agent handoff", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-446", "version": 1, "title": "Epistemic chat condensation and agent handoff", "description": "Specsmith shall safely condense chat/session context into provenance-preserving ESDB artifacts that retain source identifiers, confidence, uncertainty, unresolved decisions, active work items, and validation status; reject or flag unsupported claims; restore usable context after compaction; and export/import a portable handoff envelope interoperable with Specsmith agents and Zoo-Code.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-462"]}}, "prev_hash": "2d5df0aa8b4576b3a7b669cc00aa17ddfbd01843e424d045bac793265e7ba4ef", "hash": "550e375dfc43f5f1dcff445713ead01dd87b9aa948d7ffa4bdd1fd90ff8a7482", "recursion_depth": 0} +{"seq": 883, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-447", "record": {"id": "REQ-447", "kind": "requirement", "status": "active", "label": "Git-safe ESDB session persistence", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-447", "version": 1, "title": "Git-safe ESDB session persistence", "description": "Specsmith shall store session and ESDB history in a deterministic, append-friendly, text-based canonical representation that can be merged across branches without lost or duplicated events; local SQLite databases and WAL sidecars shall be derived caches that can be rebuilt safely with validated schema, integrity, and recovery reporting.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-463", "TEST-471"]}}, "prev_hash": "550e375dfc43f5f1dcff445713ead01dd87b9aa948d7ffa4bdd1fd90ff8a7482", "hash": "cc1aaa63f2850ebed2e682054578d55158fbb69d564cbc3331ee6dbc3dc2c2e5", "recursion_depth": 0} +{"seq": 884, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-448", "record": {"id": "REQ-448", "kind": "requirement", "status": "active", "label": "Windows launcher resolution diagnostics", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-448", "version": 1, "title": "Windows launcher resolution diagnostics", "description": "On Windows, Specsmith shall detect multiple or shadowed specsmith executables, report the active executable and package version, provide safe pipx-focused remediation, and support PowerShell stderr redirection without a launcher failure.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-464"]}}, "prev_hash": "cc1aaa63f2850ebed2e682054578d55158fbb69d564cbc3331ee6dbc3dc2c2e5", "hash": "6b61d1f05489897516ddf8641607f208b3ab28fb4058379f748408122daed946", "recursion_depth": 0} +{"seq": 885, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-449", "record": {"id": "REQ-449", "kind": "requirement", "status": "active", "label": "Reachable version-mismatch recovery", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-449", "version": 1, "title": "Reachable version-mismatch recovery", "description": "When a project requires a newer development or prerelease Specsmith version than the stable channel provides, Specsmith shall diagnose the channel mismatch, provide an exact supported pipx remediation command, and distinguish it from a normal stable upgrade without permitting backward migration.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-465"]}}, "prev_hash": "6b61d1f05489897516ddf8641607f208b3ab28fb4058379f748408122daed946", "hash": "0937f6ad1b8222c3c33b049bd64d51cc01fc08d207e8342403e75c654c2da347", "recursion_depth": 0} +{"seq": 886, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-450", "record": {"id": "REQ-450", "kind": "requirement", "status": "active", "label": "Stable release channel integrity", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-450", "version": 1, "title": "Stable release channel integrity", "description": "Specsmith release automation shall reject PEP 440 development, prerelease, and local versions before stable PyPI upload, publish such artifacts only through an explicit development channel, and verify the stable install and upgrade path in CI.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-466"]}}, "prev_hash": "0937f6ad1b8222c3c33b049bd64d51cc01fc08d207e8342403e75c654c2da347", "hash": "abca2c7d60e89d2cbd92b1e31ad8df578eb036afc2d143129956bba514d7c47a", "recursion_depth": 0} +{"seq": 887, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-451", "record": {"id": "REQ-451", "kind": "requirement", "status": "active", "label": "Contained work-item persistence paths", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-451", "version": 1, "title": "Contained work-item persistence paths", "description": "Specsmith shall normalize every work-item persistence path with os.path.realpath, reject values outside the project root before filesystem access, and provide the same containment behavior on Windows, Linux, and macOS.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-467"]}}, "prev_hash": "abca2c7d60e89d2cbd92b1e31ad8df578eb036afc2d143129956bba514d7c47a", "hash": "370b252fd897fbb33edacf140d800a2a3f6f6baa7a8ef295303ad17577e2c4fc", "recursion_depth": 0} +{"seq": 888, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-452", "record": {"id": "REQ-452", "kind": "requirement", "status": "active", "label": "CodeQL-clean report rendering", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-452", "version": 1, "title": "CodeQL-clean report rendering", "description": "Specsmith shall render quality reports without CodeQL implicit string concatenation findings while preserving the report content and formatting.", "source": "docs/requirements/", "status": "implemented", "test_ids": ["TEST-468"]}}, "prev_hash": "370b252fd897fbb33edacf140d800a2a3f6f6baa7a8ef295303ad17577e2c4fc", "hash": "7f7b8c69b3dbfec1f3ff21c0c11db752ca9902568dc99b976c99460cc2cc6e27", "recursion_depth": 0} +{"seq": 889, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-453", "record": {"id": "REQ-453", "kind": "requirement", "status": "active", "label": "Release candidate quality gates", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-453", "version": 1, "title": "Release candidate quality gates", "description": "Before release, Specsmith shall pass strict linting, formatting, type checking, the complete test suite, strict documentation build, runtime dependency audit, and governance audit without unresolved issues.", "source": "CI, release workflow, and release validation", "status": "implemented", "test_ids": ["TEST-469"]}}, "prev_hash": "7f7b8c69b3dbfec1f3ff21c0c11db752ca9902568dc99b976c99460cc2cc6e27", "hash": "40edcb45fd5233272eabcedf9395e3833d9b10e85c75d8c6f14471021158afa3", "recursion_depth": 0} +{"seq": 890, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-454", "record": {"id": "REQ-454", "kind": "requirement", "status": "active", "label": "Single-branch workflow default", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-454", "version": 1, "title": "Single-branch workflow default", "description": "Specsmith shall default new projects to a single-branch workflow on the configured default branch, refuse branch creation until a different branching strategy is explicitly enabled through specsmith, and preserve GitFlow, trunk-based, and GitHub-flow behavior after opt-in.", "source": "Git workflow governance", "status": "implemented", "test_ids": ["TEST-470"]}}, "prev_hash": "40edcb45fd5233272eabcedf9395e3833d9b10e85c75d8c6f14471021158afa3", "hash": "71251141579b7f548ec65bd195db551872ec161a5bd658feb8ccaab7eac5bc70", "recursion_depth": 0} +{"seq": 891, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "REQ-455", "record": {"id": "REQ-455", "kind": "requirement", "status": "active", "label": "Environment-only SpecSmith CLI upgrades are non-blocking", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-455", "version": 1, "title": "Environment-only SpecSmith CLI upgrades are non-blocking", "description": "A preflight request limited to upgrading or installing the pipx-managed local SpecSmith CLI MUST return the explicit environment_only decision with exit code 0, no work item, no ESDB or ledger record, and instructions to use pipx. It MUST NOT require repository requirement matching or clarification.", "source": "GitHub issue #299", "status": "planned", "test_ids": []}}, "prev_hash": "71251141579b7f548ec65bd195db551872ec161a5bd658feb8ccaab7eac5bc70", "hash": "419ad5bcffb4eb0c8ebb08af691da2b8970dbf90d6fde44e98eec48ec372b89b", "recursion_depth": 0} +{"seq": 892, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-106", "record": {"id": "TEST-106", "kind": "testcase", "status": "active", "label": "Governance Page Surfaces Preflight/Verify/Trace", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-106", "version": 1, "title": "Governance Page Surfaces Preflight/Verify/Trace", "description": "The Governance settings page shows the governance-serve health status, the BYOE endpoint URL, and the specsmith updater.", "requirement_id": "REQ-106", "type": "integration", "verification_method": "evaluator", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "419ad5bcffb4eb0c8ebb08af691da2b8970dbf90d6fde44e98eec48ec372b89b", "hash": "6e573de910d092d8d684869ea659358c2fedba5c22a057bafd3b3cf20da8cb7d", "recursion_depth": 0} +{"seq": 893, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-118", "record": {"id": "TEST-118", "kind": "testcase", "status": "active", "label": "BYOE Proxy Consumes Chat Stream", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-118", "version": 1, "title": "BYOE Proxy Consumes Chat Stream", "description": "The governance proxy at `http://127.0.0.1:7700/v1/chat/completions` accepts agent requests and forwards them through specsmith preflight/verify. *The legacy openChat command test has been retired.*", "requirement_id": "REQ-118", "type": "integration", "verification_method": "evaluator", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "6e573de910d092d8d684869ea659358c2fedba5c22a057bafd3b3cf20da8cb7d", "hash": "308fe33364cb44b7af5585c4c91355f1dc0a8da428214bd472078857b8d4e7fd", "recursion_depth": 0} +{"seq": 894, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-190", "record": {"id": "TEST-190", "kind": "testcase", "status": "active", "label": "Terminal Connects via HTTP/WebSocket", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-190", "version": 1, "title": "Terminal Connects via HTTP/WebSocket", "description": "The terminal MUST connect to `specsmith serve` over HTTP/WebSocket for all governance operations.", "requirement_id": "REQ-190", "type": "unit", "verification_method": "evaluator", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "308fe33364cb44b7af5585c4c91355f1dc0a8da428214bd472078857b8d4e7fd", "hash": "e8be9c67c5888b91a7c57670e6031dc470e31e4a46e6044c36a480e744ef4795", "recursion_depth": 0} +{"seq": 895, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-258", "record": {"id": "TEST-258", "kind": "testcase", "status": "active", "label": "ESDB Settings Page Renders Without Overflow", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-258", "version": 1, "title": "ESDB Settings Page Renders Without Overflow", "description": "The Settings > Specsmith > ESDB page renders the status row, action buttons (Refresh, Export JSON, Import, Backup, Rollback, Compact) without layout errors.", "requirement_id": "REQ-258", "type": "integration", "verification_method": "manual (Rust UI build required)", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "e8be9c67c5888b91a7c57670e6031dc470e31e4a46e6044c36a480e744ef4795", "hash": "901464b0e960e13347812934bae5a942616bb355224e29437b223569c9cf20e0", "recursion_depth": 0} +{"seq": 896, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-259", "record": {"id": "TEST-259", "kind": "testcase", "status": "active", "label": "Skills Settings Page Renders", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-259", "version": 1, "title": "Skills Settings Page Renders", "description": "The Settings > Specsmith > Skills page renders header, description, and CLI hint without errors.", "requirement_id": "REQ-259", "type": "integration", "verification_method": "manual (Rust UI build required)", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "901464b0e960e13347812934bae5a942616bb355224e29437b223569c9cf20e0", "hash": "9012aebc01213c67509f00a5d218c8352f71ccb34422803d5bb6a429e7662f49", "recursion_depth": 0} +{"seq": 897, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-260", "record": {"id": "TEST-260", "kind": "testcase", "status": "active", "label": "Eval Settings Page Renders", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-260", "version": 1, "title": "Eval Settings Page Renders", "description": "The Settings > Specsmith > Eval page renders header, description, and CLI hint without errors.", "requirement_id": "REQ-260", "type": "integration", "verification_method": "manual (Rust UI build required)", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "9012aebc01213c67509f00a5d218c8352f71ccb34422803d5bb6a429e7662f49", "hash": "df41f677ed378ea0392a61e2eb25e653f5f806cc1a7ecaedc10ed61a462542d5", "recursion_depth": 0} +{"seq": 898, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-261", "record": {"id": "TEST-261", "kind": "testcase", "status": "active", "label": "AI Providers Table Does Not Overflow Long Model Names", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-261", "version": 1, "title": "AI Providers Table Does Not Overflow Long Model Names", "description": "In the Agents > Providers table, the model name \"o4-mini-deep-research\" is clipped to its column width (200px) and does not bleed into the Model ID column.", "requirement_id": "REQ-261", "type": "integration", "verification_method": "manual (Rust UI build + visual inspection)", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "df41f677ed378ea0392a61e2eb25e653f5f806cc1a7ecaedc10ed61a462542d5", "hash": "9497c0166bf088e18be789edb704948a4c257e12d246caba2a9fc432bdb56d94", "recursion_depth": 0} +{"seq": 899, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-262", "record": {"id": "TEST-262", "kind": "testcase", "status": "active", "label": "MCP AI Builder Card Generates And Saves Stub", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-262", "version": 1, "title": "MCP AI Builder Card Generates And Saves Stub", "description": "In the Agents > MCP servers list, the AI Builder card accepts a description, generates a stub via specsmith, displays JSON, and appends to ~/.specsmith/mcp.json on 'Add to config' click.", "requirement_id": "REQ-262", "type": "integration", "verification_method": "manual (Rust UI build required)", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "9497c0166bf088e18be789edb704948a4c257e12d246caba2a9fc432bdb56d94", "hash": "721824c08b9e7ab454cfe4c121ed519f8b614586c72d1d3fe5cde5326059e800", "recursion_depth": 0} +{"seq": 900, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-280", "record": {"id": "TEST-280", "kind": "testcase", "status": "active", "label": "Model Intel Governance Endpoint", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-280", "version": 1, "title": "Model Intel Governance Endpoint", "description": "The specsmith governance HTTP server (GovernanceHTTPServer) exposes `GET /api/model-intel/scores` returning `{\"scores\": [...]}` and `GET /api/model-intel/recommendations` returning `{\"recommendations\": [...], \"bucket\": \"reasoning\"}`.", "requirement_id": "REQ-268", "type": "integration", "verification_method": "pytest (HTTP client against test server)", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "721824c08b9e7ab454cfe4c121ed519f8b614586c72d1d3fe5cde5326059e800", "hash": "93bc5fc4652135793e3a339c73df1df1f4fd322353f1fd79789c4d975ad9d6d5", "recursion_depth": 0} +{"seq": 901, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-281", "record": {"id": "TEST-281", "kind": "testcase", "status": "active", "label": "AI Providers Bucket Score Section Compiles", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-281", "version": 1, "title": "AI Providers Bucket Score Section Compiles", "description": "The updated `ai_providers_page.py` in specsmith compiles without errors under `python -m py_compile`. The file must contain `model_intel` function call or `bucket_score` field rendering code.", "requirement_id": "REQ-281", "type": "build", "verification_method": "cargo check", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "93bc5fc4652135793e3a339c73df1df1f4fd322353f1fd79789c4d975ad9d6d5", "hash": "6a9078fcc559eb5a7e2a888c0fc2277f68f0830b7ae04c98c88ab241fd6543e8", "recursion_depth": 0} +{"seq": 902, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-332", "record": {"id": "TEST-332", "kind": "testcase", "status": "active", "label": "Live DAG Graph Panel", "confidence": 0.85, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-332", "version": 1, "title": "Live DAG Graph Panel", "description": "DispatchApp renders a DAG graph panel subscribed to the SSE stream. Nodes are coloured by status. A node click opens a side panel with role, summary, ESDB record ID.", "requirement_id": "REQ-332", "type": "integration", "verification_method": "evaluator", "input": "DispatchApp with mock SSE events for each NodeStatus variant", "expected_behavior": "Each node rendered in correct colour; side panel opens on click showing node metadata", "confidence": 0.85}}, "prev_hash": "6a9078fcc559eb5a7e2a888c0fc2277f68f0830b7ae04c98c88ab241fd6543e8", "hash": "6535d8c3de68c813ffd2dfc8f31f15a038c8cd00570584a3603550372c94817f", "recursion_depth": 0} +{"seq": 903, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-333", "record": {"id": "TEST-333", "kind": "testcase", "status": "active", "label": "Gantt Timeline Strip", "confidence": 0.85, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-333", "version": 1, "title": "Gantt Timeline Strip", "description": "GanttStrip renders one row per node with a time-proportional bar. Nodes with overlapping started_at/finished_at ranges show visual concurrency.", "requirement_id": "REQ-333", "type": "integration", "verification_method": "evaluator", "input": "GanttStrip with 2 nodes having overlapping start/end times", "expected_behavior": "Both nodes show bars; bar widths proportional to duration; overlap visible", "confidence": 0.85}}, "prev_hash": "6535d8c3de68c813ffd2dfc8f31f15a038c8cd00570584a3603550372c94817f", "hash": "97614a5c13007c10e30366f9b478d087bfdc8148efc86d698a991778646fa88a", "recursion_depth": 0} +{"seq": 904, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-334", "record": {"id": "TEST-334", "kind": "testcase", "status": "active", "label": "Per-Node Retry and Abort Controls", "confidence": 0.9, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-334", "version": 1, "title": "Per-Node Retry and Abort Controls", "description": "ControlsPanel Retry button is enabled for FAILED/BLOCKED nodes and disabled for others. Abort button is enabled only for RUNNING nodes. Clicking calls the correct POST endpoint.", "requirement_id": "REQ-334", "type": "unit", "verification_method": "evaluator", "input": "ControlsPanel for each NodeStatus (Pending/Running/Completed/Failed/Blocked)", "expected_behavior": "Retry enabled only for Failed/Blocked; Abort enabled only for Running; click invokes correct action callback", "confidence": 0.9}}, "prev_hash": "97614a5c13007c10e30366f9b478d087bfdc8148efc86d698a991778646fa88a", "hash": "ffa876a0b51229db34bdbd81260e173d8c187aa076aa59521fe42ff5e5040cf0", "recursion_depth": 0} +{"seq": 905, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-433", "record": {"id": "TEST-433", "kind": "testcase", "status": "active", "label": "Governed benchmark agents achieve 100% pass rate across all tasks and conditions", "confidence": 0.9, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-433", "version": 1, "title": "Governed benchmark agents achieve 100% pass rate across all tasks and conditions", "description": "All specsmith conditions (LIGHT, FULL, DISPATCH) must achieve 100% pass rate across all benchmark tasks (T1, T2, T6, T7, T10, T11, T13). T13 requires correct stdout discipline (click.echo err=True) and T10 requires correct route ordering.", "requirement_id": "REQ-423", "type": "script", "verification_method": "scripts/govern_bench/run_benchmark.py", "input": "SPECSMITH_LIGHT, SPECSMITH_FULL, SPECSMITH_DISPATCH conditions × all tasks × 3 reps", "expected_behavior": "pass_rate == 1.0 for every (task, condition) pair; zero CoP drift from baseline", "confidence": 0.9}}, "prev_hash": "ffa876a0b51229db34bdbd81260e173d8c187aa076aa59521fe42ff5e5040cf0", "hash": "376d4b85353987422d798f152e21b1d2b04399187201f2088119f43a71418ea1", "recursion_depth": 0} +{"seq": 906, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-434", "record": {"id": "TEST-434", "kind": "testcase", "status": "active", "label": "CI CodeQL scan produces zero alerts on every run", "confidence": 0.95, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-434", "version": 1, "title": "CI CodeQL scan produces zero alerts on every run", "description": "The GitHub Actions CodeQL workflow must complete with zero open alerts for the specsmith codebase. This covers py/unreachable-statement, py/import-and-import-from, and py/path-injection patterns documented in AGENTS.md CodeQL Safe Patterns.", "requirement_id": "REQ-424", "type": "build", "verification_method": "gh api repos/specsmith-dev/specsmith/code-scanning/alerts", "input": "GitHub Actions CodeQL workflow run on develop branch", "expected_behavior": "Zero open CodeQL alerts; workflow exits with code 0", "confidence": 0.95}}, "prev_hash": "376d4b85353987422d798f152e21b1d2b04399187201f2088119f43a71418ea1", "hash": "5dc17a29e76da094b93df736069ad92c1ef88f39a0df80d0e87137d6d3d5f5c0", "recursion_depth": 0} +{"seq": 907, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-435", "record": {"id": "TEST-435", "kind": "testcase", "status": "active", "label": "Governed agent autonomously resolves preflight needs_clarification without blocking", "confidence": 0.9, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-435", "version": 1, "title": "Governed agent autonomously resolves preflight needs_clarification without blocking", "description": "When specsmith preflight returns needs_clarification, a governed benchmark agent must add a requirement via 'specsmith req add --title ...' and retry the preflight without human intervention. The agent must never block or deadlock waiting for clarification. Validated by T13 SPECSMITH_LIGHT and SPECSMITH_FULL benchmark conditions.", "requirement_id": "REQ-425", "type": "integration", "verification_method": "scripts/govern_bench/run_benchmark.py (T13 condition)", "input": "T13 benchmark task with SPECSMITH_LIGHT and SPECSMITH_FULL conditions; preflight intentionally returns needs_clarification on first call", "expected_behavior": "Agent adds requirement and retries; task completes with pass_rate == 1.0; no deadlock", "confidence": 0.9}}, "prev_hash": "5dc17a29e76da094b93df736069ad92c1ef88f39a0df80d0e87137d6d3d5f5c0", "hash": "351040f74ed03cbd8a14a8738a3f3917f94a4a475c9861916cec674c96b1f9af", "recursion_depth": 0} +{"seq": 908, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-436", "record": {"id": "TEST-436", "kind": "testcase", "status": "active", "label": "Harness max_completion_tokens >= 32768 for reasoning models", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-436", "version": 1, "title": "Harness max_completion_tokens >= 32768 for reasoning models", "description": "harness.py must set max_completion_tokens >= 32768 for gpt-5.x and o-series models to prevent reasoning token exhaustion", "requirement_id": "REQ-426", "type": "script", "verification_method": "grep -r 'max_completion_tokens' scripts/govern_bench/harness.py | grep '32768\\|65536'", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "351040f74ed03cbd8a14a8738a3f3917f94a4a475c9861916cec674c96b1f9af", "hash": "1c3919717834b4c4e5924fbc34f69ab2e67590c2c333cf2e013effa7552d041f", "recursion_depth": 0} +{"seq": 909, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-437", "record": {"id": "TEST-437", "kind": "testcase", "status": "active", "label": "GovernanceBench metrics include Wilson CI and bootstrap CoP confidence intervals", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-437", "version": 1, "title": "GovernanceBench metrics include Wilson CI and bootstrap CoP confidence intervals", "description": "govern_bench/metrics.py must export wilson_ci() and bootstrap_cop_ci() functions that return (lower, upper) tuples", "requirement_id": "REQ-427", "type": "script", "verification_method": "python -c 'from govern_bench.metrics import wilson_ci, bootstrap_cop_ci; print(wilson_ci(8,10), bootstrap_cop_ci([1.0,0.8]))'", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "1c3919717834b4c4e5924fbc34f69ab2e67590c2c333cf2e013effa7552d041f", "hash": "15eda9cad725601644bfd325369b52fcbfa519be601adbca0d5b7c5b7abac07f", "recursion_depth": 0} +{"seq": 910, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-438", "record": {"id": "TEST-438", "kind": "testcase", "status": "active", "label": "GovernanceBench tasks.py defines all 27 tasks across expanded project domains", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-438", "version": 1, "title": "GovernanceBench tasks.py defines all 27 tasks across expanded project domains", "description": "tasks.py must define tasks T1-T27 including new domains: data_pipeline, verilog_module, patent_draft, shell_scripts", "requirement_id": "REQ-427", "type": "script", "verification_method": "python -c 'from govern_bench.tasks import TASK_CATALOGUE; assert len(TASK_CATALOGUE) >= 27'", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "15eda9cad725601644bfd325369b52fcbfa519be601adbca0d5b7c5b7abac07f", "hash": "b5e36fcc92caf3bbd2131601c1db8a6175397cbc51f4a82d3074a12885115496", "recursion_depth": 0} +{"seq": 911, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-439", "record": {"id": "TEST-439", "kind": "testcase", "status": "active", "label": "gitignore normalizer enforces disjoint allow/deny policy and untracks diverged paths", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-439", "version": 1, "title": "gitignore normalizer enforces disjoint allow/deny policy and untracks diverged paths", "description": "normalize_esdb_gitignore_policy must (a) keep _GIT_TRACKED_POLICY and _GIT_IGNORED_POLICY disjoint, (b) untrack paths in git index that belong to deny list, (c) be idempotent on repeated runs", "requirement_id": "REQ-428", "type": "unit", "verification_method": "PYTHONPATH=src python -m pytest tests/test_esdb_enforcement.py -k 'disjoint or idempotent or untrack' -q", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "b5e36fcc92caf3bbd2131601c1db8a6175397cbc51f4a82d3074a12885115496", "hash": "e12b5dfec34aea841866234e46d8cf2981e179eedf6d9ea822d7fcbd52587183", "recursion_depth": 0} +{"seq": 912, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-440", "record": {"id": "TEST-440", "kind": "testcase", "status": "active", "label": "Multi-provider harness dispatches by provider_name field", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-440", "version": 1, "title": "Multi-provider harness dispatches by provider_name field", "description": "govern_bench/harness.py must export _dispatch_llm or equivalent that routes by provider_name to openai, anthropic, or google providers", "requirement_id": "REQ-427", "type": "script", "verification_method": "python -c 'from govern_bench.harness import _dispatch_llm; print(\"ok\")'", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "e12b5dfec34aea841866234e46d8cf2981e179eedf6d9ea822d7fcbd52587183", "hash": "25776740f16c4ab2522b176f41e3ce08249c6d0f8bd2b248a5f1fb7b24953f81", "recursion_depth": 0} +{"seq": 913, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-441", "record": {"id": "TEST-441", "kind": "testcase", "status": "active", "label": "GovernanceBench HF leaderboard artifacts exist and are schema-valid", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-441", "version": 1, "title": "GovernanceBench HF leaderboard artifacts exist and are schema-valid", "description": "scripts/govern_bench/leaderboard_schema.json and docs/govern_bench/hf_card.md must exist; schema must contain required leaderboard fields", "requirement_id": "REQ-427", "type": "script", "verification_method": "python -c \"import json,pathlib; s=json.loads(pathlib.Path('scripts/govern_bench/leaderboard_schema.json').read_text()); assert 'properties' in s\"", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "25776740f16c4ab2522b176f41e3ce08249c6d0f8bd2b248a5f1fb7b24953f81", "hash": "3ca11137d48467a8e469451795f4b7671941ced0ef370d923e04c5c00cb8232e", "recursion_depth": 0} +{"seq": 914, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-442", "record": {"id": "TEST-442", "kind": "testcase", "status": "active", "label": "checkpoint ESDB field shows correct backend label and record count", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-442", "version": 1, "title": "checkpoint ESDB field shows correct backend label and record count", "description": "checkpoint --json must include esdb_backend field ('chronomemory', 'sqlite', or 'n/a') and esdb_records/esdb_chain_valid must be None when backend is n/a; SQLite backend must read actual record count from SqliteStore", "requirement_id": "REQ-429", "type": "unit", "verification_method": "PYTHONPATH=src python -m specsmith checkpoint --json | python -c \"import json,sys; d=json.load(sys.stdin); assert d['esdb_backend'] in ('chronomemory','sqlite','n/a')\"", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "3ca11137d48467a8e469451795f4b7671941ced0ef370d923e04c5c00cb8232e", "hash": "c75394031a4902ba9c4cf9a545b784f9cb85fcf6f60e7c1699178ef0d862e122", "recursion_depth": 0} +{"seq": 915, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-443", "record": {"id": "TEST-443", "kind": "testcase", "status": "active", "label": "release tooling edits classify as CHANGE not RELEASE", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-443", "version": 1, "title": "release tooling edits classify as CHANGE not RELEASE", "description": "classify_intent must return CHANGE (not RELEASE) for: fix release.yml, update release pipeline, edit release notes, patch package_dist.ps1, update .github/workflows/release.yml", "requirement_id": "REQ-430", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_nexus.py -k 'classify_intent or release_tooling_patterns' -q", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "c75394031a4902ba9c4cf9a545b784f9cb85fcf6f60e7c1699178ef0d862e122", "hash": "f2a7da3cca200df44d36a26a367947013a6e0b3ca4cc392b228bcaa56c2fc088", "recursion_depth": 0} +{"seq": 916, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-444", "record": {"id": "TEST-444", "kind": "testcase", "status": "active", "label": "release intent with explicit REQ ID accepts and WI allocated for needs_clarification", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-444", "version": 1, "title": "release intent with explicit REQ ID accepts and WI allocated for needs_clarification", "description": "run_preflight with release-intent utterance + [REQ-051] suffix must return accepted; unscoped release must return needs_clarification with --req mentioned in instruction", "requirement_id": "REQ-431", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_nexus.py -k 'release_tooling_edit_with_explicit or release_without_scope' -q", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "f2a7da3cca200df44d36a26a367947013a6e0b3ca4cc392b228bcaa56c2fc088", "hash": "989f442b0d8c346daef2702c0b5e4c1d2e793027c9577d0866154615f3327a74", "recursion_depth": 0} +{"seq": 917, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-445", "record": {"id": "TEST-445", "kind": "testcase", "status": "active", "label": "preflight --req flag injects REQ IDs into scope and unblocks release tooling", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-445", "version": 1, "title": "preflight --req flag injects REQ IDs into scope and unblocks release tooling", "description": "CLI: specsmith preflight 'update release.yml' --req REQ-051 must return accepted because REQ-051 is injected and picked up by scope-matching", "requirement_id": "REQ-430", "type": "integration", "verification_method": "PYTHONPATH=src python -m specsmith preflight 'update release.yml' --req REQ-051 --json --predict-only | python -c \"import json,sys; d=json.load(sys.stdin); assert d['decision']=='accepted','got '+d['decision']\"", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "989f442b0d8c346daef2702c0b5e4c1d2e793027c9577d0866154615f3327a74", "hash": "36a85dd7e05f08547b9b11213eff62f18212285253517e82cd8414885a3a3cb1", "recursion_depth": 0} +{"seq": 918, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-446", "record": {"id": "TEST-446", "kind": "testcase", "status": "active", "label": "check_governance_yaml_content validates YAML file structure and rejects empty/fallback entries", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-446", "version": 1, "title": "check_governance_yaml_content validates YAML file structure and rejects empty/fallback entries", "description": "", "requirement_id": "REQ-432", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_audit_governance.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "36a85dd7e05f08547b9b11213eff62f18212285253517e82cd8414885a3a3cb1", "hash": "094798bf486c8626e10c3f8c3044810e404a52bcfe9f785d05b1cdeba68fccc1", "recursion_depth": 0} +{"seq": 919, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-447", "record": {"id": "TEST-447", "kind": "testcase", "status": "active", "label": "sync warns when REQUIREMENTS.md/TESTS.md IDs are absent from YAML source", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-447", "version": 1, "title": "sync warns when REQUIREMENTS.md/TESTS.md IDs are absent from YAML source", "description": "", "requirement_id": "REQ-433", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_sync_reconcile.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "094798bf486c8626e10c3f8c3044810e404a52bcfe9f785d05b1cdeba68fccc1", "hash": "901590bdfa92a09f52797c67917f10536f30ecea8a04e24b1445db18dae3f853", "recursion_depth": 0} +{"seq": 920, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-448", "record": {"id": "TEST-448", "kind": "testcase", "status": "active", "label": "rebuild_workitems.py encodes unicode correctly with ensure_ascii=False", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-448", "version": 1, "title": "rebuild_workitems.py encodes unicode correctly with ensure_ascii=False", "description": "", "requirement_id": "REQ-433", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_sync_reconcile.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "901590bdfa92a09f52797c67917f10536f30ecea8a04e24b1445db18dae3f853", "hash": "debd6892ce58911a794ca52af8c8727f1896022295c542502f08679e03dbd634", "recursion_depth": 0} +{"seq": 921, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-449", "record": {"id": "TEST-449", "kind": "testcase", "status": "active", "label": "verify_cmd is wired to run_verify; approve_cmd sets human_review_status; files_touched persisted", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-449", "version": 1, "title": "verify_cmd is wired to run_verify; approve_cmd sets human_review_status; files_touched persisted", "description": "", "requirement_id": "REQ-434", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_wi_lifecycle_extended.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "debd6892ce58911a794ca52af8c8727f1896022295c542502f08679e03dbd634", "hash": "700c022d497bab9f7c31759755f51bfccf94c577dd6de99ccb1360587bbbed2e", "recursion_depth": 0} +{"seq": 922, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-450", "record": {"id": "TEST-450", "kind": "testcase", "status": "active", "label": "broker infer_scope applies min_score=0.15 threshold and rejects low-confidence scope", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-450", "version": 1, "title": "broker infer_scope applies min_score=0.15 threshold and rejects low-confidence scope", "description": "", "requirement_id": "REQ-435", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_broker_scope.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "700c022d497bab9f7c31759755f51bfccf94c577dd6de99ccb1360587bbbed2e", "hash": "6cef3bf5f61508d8364aa1d231f669a0eed0c0411ffb63b304d7245177909107", "recursion_depth": 0} +{"seq": 923, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-451", "record": {"id": "TEST-451", "kind": "testcase", "status": "active", "label": "flush_session_metrics writes token usage to session_metrics.jsonl after run completion", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-451", "version": 1, "title": "flush_session_metrics writes token usage to session_metrics.jsonl after run completion", "description": "", "requirement_id": "REQ-436", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_metrics_flush.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "6cef3bf5f61508d8364aa1d231f669a0eed0c0411ffb63b304d7245177909107", "hash": "de3fe7dac2e9e80e74325c63f12b86e21bee70cd3be5f2c2ac403b06a91d3470", "recursion_depth": 0} +{"seq": 924, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-452", "record": {"id": "TEST-452", "kind": "testcase", "status": "active", "label": "check_governance_yaml_content accepts m001 content-blob format (content+kind keys)", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-452", "version": 1, "title": "check_governance_yaml_content accepts m001 content-blob format (content+kind keys)", "description": "", "requirement_id": "REQ-432", "type": "unit", "verification_method": "PYTHONPATH=src pytest tests/test_audit_governance.py::test_check_governance_yaml_content_passes_m001_content_blob", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "de3fe7dac2e9e80e74325c63f12b86e21bee70cd3be5f2c2ac403b06a91d3470", "hash": "73f75ac37afe915bd87f85112d8667a926a91bb370a887b625a30de5f0e9c8a6", "recursion_depth": 0} +{"seq": 925, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-453", "record": {"id": "TEST-453", "kind": "testcase", "status": "active", "label": "Datasource adapter retrieval contract and citation normalization is validated by integration test", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-453", "version": 1, "title": "Datasource adapter retrieval contract and citation normalization is validated by integration test", "description": "", "requirement_id": "REQ-437", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "73f75ac37afe915bd87f85112d8667a926a91bb370a887b625a30de5f0e9c8a6", "hash": "842e10b94cb28a7c81c143bc7337b2daa5ad7d09c9bce42287e9d8406e23c964", "recursion_depth": 0} +{"seq": 926, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-454", "record": {"id": "TEST-454", "kind": "testcase", "status": "active", "label": "GUI governance parity with CLI is verified by functional test", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-454", "version": 1, "title": "GUI governance parity with CLI is verified by functional test", "description": "", "requirement_id": "REQ-438", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "842e10b94cb28a7c81c143bc7337b2daa5ad7d09c9bce42287e9d8406e23c964", "hash": "c8848cc18ef00dd0a9e131249e25d40e6788746049979c53a96026ff78535068", "recursion_depth": 0} +{"seq": 927, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-455", "record": {"id": "TEST-455", "kind": "testcase", "status": "active", "label": "IDE integration adapter uniform capability contract is verified by adapter unit tests", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-455", "version": 1, "title": "IDE integration adapter uniform capability contract is verified by adapter unit tests", "description": "", "requirement_id": "REQ-439", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "c8848cc18ef00dd0a9e131249e25d40e6788746049979c53a96026ff78535068", "hash": "b508c0394e2b21e0737acd06b8d5968ff00b65b52a0fdbadb944e4353c5522c7", "recursion_depth": 0} +{"seq": 928, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-456", "record": {"id": "TEST-456", "kind": "testcase", "status": "active", "label": "Plugin management lifecycle install/list/remove/validate is verified by CLI tests", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-456", "version": 1, "title": "Plugin management lifecycle install/list/remove/validate is verified by CLI tests", "description": "", "requirement_id": "REQ-440", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "b508c0394e2b21e0737acd06b8d5968ff00b65b52a0fdbadb944e4353c5522c7", "hash": "6a03ba12d0d5fb2c04ef4df3bb7e5623a260c37ce4fd2e5f8846123f3298e41a", "recursion_depth": 0} +{"seq": 929, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-457", "record": {"id": "TEST-457", "kind": "testcase", "status": "active", "label": "specsmith plugin CLI list and validate commands verified by CLI integration test", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-457", "version": 1, "title": "specsmith plugin CLI list and validate commands verified by CLI integration test", "description": "", "requirement_id": "REQ-441", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "6a03ba12d0d5fb2c04ef4df3bb7e5623a260c37ce4fd2e5f8846123f3298e41a", "hash": "0cadb9f274674bcf7c5f7af3e22a644ca9ae6892cdea0b54a8d4a9f310d204e5", "recursion_depth": 0} +{"seq": 930, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-458", "record": {"id": "TEST-458", "kind": "testcase", "status": "active", "label": "specsmith pr CLI governed PR creation and status verified by CLI integration test", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-458", "version": 1, "title": "specsmith pr CLI governed PR creation and status verified by CLI integration test", "description": "", "requirement_id": "REQ-442", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "0cadb9f274674bcf7c5f7af3e22a644ca9ae6892cdea0b54a8d4a9f310d204e5", "hash": "4a444f93d7c602507695d1ff8d8a18646c053a83bf7646a839a80a0c31eedc11", "recursion_depth": 0} +{"seq": 931, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-459", "record": {"id": "TEST-459", "kind": "testcase", "status": "active", "label": "specsmith ps CLI process state listing verified by unit test", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-459", "version": 1, "title": "specsmith ps CLI process state listing verified by unit test", "description": "", "requirement_id": "REQ-443", "type": "manual", "verification_method": "manual review of implementation", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "4a444f93d7c602507695d1ff8d8a18646c053a83bf7646a839a80a0c31eedc11", "hash": "e865f81c884087b84b6a7b37c4d78dc0b34f070535a3fa35635c6c6320d05210", "recursion_depth": 0} +{"seq": 932, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-460", "record": {"id": "TEST-460", "kind": "testcase", "status": "active", "label": "Warp adapter generates .warp artifacts and detect_terminal flags Warp", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-460", "version": 1, "title": "Warp adapter generates .warp artifacts and detect_terminal flags Warp", "description": "Covered by tests/test_integrations_warp.py and tests/test_terminal_env.py: WarpAdapter.generate() writes .warp/specsmith-mcp.json, .warp/launch_configs/specsmith-governed.yaml, and .agents/skills/SKILL.md; detect_terminal() identifies Warp via TERM_PROGRAM/WARP_* and AgentRunner surfaces it.", "requirement_id": "REQ-444", "type": "unit", "verification_method": "pytest", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "e865f81c884087b84b6a7b37c4d78dc0b34f070535a3fa35635c6c6320d05210", "hash": "bad32760bce6cee546d4ad417b9878a3ca9d27dcb29f2d8513697d663c7b7dff", "recursion_depth": 0} +{"seq": 933, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-461", "record": {"id": "TEST-461", "kind": "testcase", "status": "active", "label": "recommend_models/recommend_for_hardware follow detected GPU VRAM tier with fit assessment", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-461", "version": 1, "title": "recommend_models/recommend_for_hardware follow detected GPU VRAM tier with fit assessment", "description": "Covered by tests/test_local_model.py (TestAssessFit, TestRecommendModels, TestRecommendForHardware, TestLocalModelRecommendCLI): recommend_models(vram_gb) selects 7b/14b/32b tiers by VRAM, includes deepseek-coder-v2:16b harder slot, assess_fit returns fits/tight/spills, recommend_for_hardware detects Apple Silicon then NVIDIA, and 'specsmith local-model recommend' emits human + --json output.", "requirement_id": "REQ-445", "type": "unit", "verification_method": "pytest", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "bad32760bce6cee546d4ad417b9878a3ca9d27dcb29f2d8513697d663c7b7dff", "hash": "a95cd044c299058650835c91164f323eb85551f725267ddd0b4b5fa761146178", "recursion_depth": 0} +{"seq": 934, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-462", "record": {"id": "TEST-462", "kind": "testcase", "status": "active", "label": "Validate epistemic chat handoff and Zoo-Code export", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-462", "version": 1, "title": "Validate epistemic chat handoff and Zoo-Code export", "description": "Verify extractive source IDs, ESDB persistence, context compaction, and portable Zoo-Code export.", "requirement_id": "REQ-446", "type": "integration", "verification_method": "pytest tests/test_chat_handoff.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "a95cd044c299058650835c91164f323eb85551f725267ddd0b4b5fa761146178", "hash": "2433dcd55e2927b590cd3495b4ca3cd56aa458bcc3d3883ecbcb81e39d629376", "recursion_depth": 0} +{"seq": 935, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-463", "record": {"id": "TEST-463", "kind": "testcase", "status": "active", "label": "Merge and rebuild canonical ESDB session events", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-463", "version": 1, "title": "Merge and rebuild canonical ESDB session events", "description": "Verify divergent event histories replay without loss or duplicate events and rebuild local SQLite state.", "requirement_id": "REQ-447", "type": "integration", "verification_method": "pytest tests/test_session_store.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "2433dcd55e2927b590cd3495b4ca3cd56aa458bcc3d3883ecbcb81e39d629376", "hash": "15995ba66c950946616a5ddb65e5ee308250191b7af7cee779be384f1b3bfa19", "recursion_depth": 0} +{"seq": 936, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-464", "record": {"id": "TEST-464", "kind": "testcase", "status": "active", "label": "Diagnose Windows launcher shadowing and redirected stderr", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-464", "version": 1, "title": "Diagnose Windows launcher shadowing and redirected stderr", "description": "Verify duplicate executable diagnostics and PowerShell-compatible launcher behavior.", "requirement_id": "REQ-448", "type": "cli", "verification_method": "pytest tests/test_windows_launcher.py tests/test_migrations_skill_shell.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "15995ba66c950946616a5ddb65e5ee308250191b7af7cee779be384f1b3bfa19", "hash": "4539add01e34356e17d00ff9b00c4ef7be6b9108a1a9b51bb4c710c85a9c764f", "recursion_depth": 0} +{"seq": 937, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-465", "record": {"id": "TEST-465", "kind": "testcase", "status": "active", "label": "Offer reachable development-version recovery", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-465", "version": 1, "title": "Offer reachable development-version recovery", "description": "Verify version mismatch diagnostics provide exact pipx recovery guidance without allowing downgrade.", "requirement_id": "REQ-449", "type": "cli", "verification_method": "pytest tests/test_updater.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "4539add01e34356e17d00ff9b00c4ef7be6b9108a1a9b51bb4c710c85a9c764f", "hash": "1fe7cb4f08ef04712c903032fb4099d750b17a87d78cf7861e584a2cc8045ac1", "recursion_depth": 0} +{"seq": 938, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-466", "record": {"id": "TEST-466", "kind": "testcase", "status": "active", "label": "Reject non-stable versions from stable release publishing", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-466", "version": 1, "title": "Reject non-stable versions from stable release publishing", "description": "Verify PEP 440 dev prerelease and local versions cannot enter the stable release workflow.", "requirement_id": "REQ-450", "type": "build", "verification_method": "pytest tests/test_release_guard.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "1fe7cb4f08ef04712c903032fb4099d750b17a87d78cf7861e584a2cc8045ac1", "hash": "f7a8046ad9513e3662a0256c5a2e1a9559e1dd0b723146581845e70bc9857d5a", "recursion_depth": 0} +{"seq": 939, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-467", "record": {"id": "TEST-467", "kind": "testcase", "status": "active", "label": "Reject work-item persistence paths outside project root", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-467", "version": 1, "title": "Reject work-item persistence paths outside project root", "description": "Verify normalized work-item state and file paths cannot escape the supplied project root.", "requirement_id": "REQ-451", "type": "unit", "verification_method": "pytest tests/test_wi_lifecycle.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "f7a8046ad9513e3662a0256c5a2e1a9559e1dd0b723146581845e70bc9857d5a", "hash": "645d30db9680d5c4622201758254bce13abf412ce0d4792a56bd6cf7edaeb60a", "recursion_depth": 0} +{"seq": 940, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-468", "record": {"id": "TEST-468", "kind": "testcase", "status": "active", "label": "Render quality report footer without implicit concatenation", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-468", "version": 1, "title": "Render quality report footer without implicit concatenation", "description": "Verify the generated footer retains its expected report content while the renderer remains CodeQL-clean.", "requirement_id": "REQ-452", "type": "unit", "verification_method": "pytest tests/test_quality_report.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "645d30db9680d5c4622201758254bce13abf412ce0d4792a56bd6cf7edaeb60a", "hash": "4c3358b09ffefb7ead447642f7a5c505fa8d857510c26a1e648da24f023914b8", "recursion_depth": 0} +{"seq": 941, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-469", "record": {"id": "TEST-469", "kind": "testcase", "status": "active", "label": "Verify release candidate quality gates", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-469", "version": 1, "title": "Verify release candidate quality gates", "description": "Verify every local and CI release-candidate quality gate passes without lint, type, test, documentation, dependency-security, or governance failures.", "requirement_id": "REQ-453", "type": "build", "verification_method": "ruff check src/ tests/ && ruff format --check src/ tests/ && mypy src/specsmith/ && pytest --cov=specsmith --cov-report=term-missing && mkdocs build --strict && pip-audit && specsmith audit --project-dir .", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "4c3358b09ffefb7ead447642f7a5c505fa8d857510c26a1e648da24f023914b8", "hash": "3b61cea1a01d50651962f92af388f0883eb19c5b226ef4e0f2bf5e165a2865f4", "recursion_depth": 0} +{"seq": 942, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-470", "record": {"id": "TEST-470", "kind": "testcase", "status": "active", "label": "Enforce and configure the single-branch default", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-470", "version": 1, "title": "Enforce and configure the single-branch default", "description": "Verify single-branch is the default, branch creation is refused until an explicit workflow selection, and specsmith can enable GitFlow or another configured strategy.", "requirement_id": "REQ-454", "type": "cli", "verification_method": "pytest tests/test_branch_workflow.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "3b61cea1a01d50651962f92af388f0883eb19c5b226ef4e0f2bf5e165a2865f4", "hash": "4fc410390e5782dffb4c246c196ce1dc17d1b9f81c9b4186590a3d2c3c152ec3", "recursion_depth": 0} +{"seq": 943, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-471", "record": {"id": "TEST-471", "kind": "testcase", "status": "active", "label": "Preserve canonical ESDB state when saving a governed Git worktree", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-471", "version": 1, "title": "Preserve canonical ESDB state when saving a governed Git worktree", "description": "Verify save normalizes the Git policy, commits no SQLite cache, migration backup, marker, state, or agent migration artifact, and retains the mergeable session event log as canonical source of truth.", "requirement_id": "REQ-447", "type": "integration", "verification_method": "pytest tests/test_esdb_enforcement.py -k save_does_not_commit", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "4fc410390e5782dffb4c246c196ce1dc17d1b9f81c9b4186590a3d2c3c152ec3", "hash": "6c98d779c96df6008939d4fe86c457a5d166407eb882ff7f7b8c5d3354157297", "recursion_depth": 0} +{"seq": 944, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-472", "record": {"id": "TEST-472", "kind": "testcase", "status": "active", "label": "Base package metadata includes cryptography for ESDB license activation", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-472", "version": 1, "title": "Base package metadata includes cryptography for ESDB license activation", "description": "Verify pyproject.toml lists cryptography in base project dependencies, so a clean pipx install can execute specsmith esdb enable without a manual pipx inject.", "requirement_id": "REQ-366", "type": "unit", "verification_method": "pytest tests/test_esdb_license.py::test_base_install_includes_cryptography_for_license_verification", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "6c98d779c96df6008939d4fe86c457a5d166407eb882ff7f7b8c5d3354157297", "hash": "46a32242ddd5b6e009327712f1eff8dab8d868402cb51ff14057b0c311792d52", "recursion_depth": 0} +{"seq": 945, "ts": "2026-07-13T23:50:02Z", "op": "upsert", "record_id": "TEST-473", "record": {"id": "TEST-473", "kind": "testcase", "status": "active", "label": "RTD deployment workflow configures canonical repository and main latest branch", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-473", "version": 1, "title": "RTD deployment workflow configures canonical repository and main latest branch", "description": "Verify the RTD deployment workflow updates the RTD project to layer1labs/specsmith on main, synchronizes versions, and fails on rejected project, version, or build API responses.", "requirement_id": "REQ-067", "type": "unit", "verification_method": "pytest tests/test_rtd_deploy_workflow.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "46a32242ddd5b6e009327712f1eff8dab8d868402cb51ff14057b0c311792d52", "hash": "8ccea65453cb71610aa121facd51502f8054773c820dd44758ab5c9bb8f95296", "recursion_depth": 0} +{"seq": 946, "ts": "2026-07-13T23:50:17Z", "op": "upsert", "record_id": "REQ-456", "record": {"id": "REQ-456", "kind": "requirement", "status": "active", "label": "SpecSmith CLI help is side-effect free", "confidence": 0.7, "source_type": "observed", "evidence": ["synced from requirements.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "REQ-456", "version": 1, "title": "SpecSmith CLI help is side-effect free", "description": "Every SpecSmith CLI invocation containing --help MUST return usage without project migration, update checks, ledger writes, ESDB writes, work-item allocation, or project-file creation or modification. Migration remains available only through an explicit operational command.", "source": "GitHub issue #300", "status": "planned", "test_ids": []}}, "prev_hash": "8ccea65453cb71610aa121facd51502f8054773c820dd44758ab5c9bb8f95296", "hash": "8dc1414f1dbcb8ec11121ae27d9f969a76c7530c370c34e879e108dc03e0b985", "recursion_depth": 0} +{"seq": 947, "ts": "2026-07-13T23:50:56Z", "op": "upsert", "record_id": "TEST-474", "record": {"id": "TEST-474", "kind": "testcase", "status": "active", "label": "Pipx SpecSmith upgrades return a non-blocking environment-only preflight decision", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-474", "version": 1, "title": "Pipx SpecSmith upgrades return a non-blocking environment-only preflight decision", "description": "Verify pipx-managed local SpecSmith upgrade language returns environment_only, exits successfully, and does not create governance state.", "requirement_id": "REQ-455", "type": "cli", "verification_method": "pytest tests/test_nexus.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "8dc1414f1dbcb8ec11121ae27d9f969a76c7530c370c34e879e108dc03e0b985", "hash": "4916d77bdc32fe93434bf33a4880f2b6c823fab815aaa9cd790a8af1de5a0d41", "recursion_depth": 0} +{"seq": 948, "ts": "2026-07-13T23:51:11Z", "op": "upsert", "record_id": "TEST-475", "record": {"id": "TEST-475", "kind": "testcase", "status": "active", "label": "Preflight help does not mutate an outdated project", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-475", "version": 1, "title": "Preflight help does not mutate an outdated project", "description": "Verify specsmith preflight --help leaves an older governed project byte-for-byte unchanged and does not create governance files.", "requirement_id": "REQ-456", "type": "cli", "verification_method": "pytest tests/test_cli.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "4916d77bdc32fe93434bf33a4880f2b6c823fab815aaa9cd790a8af1de5a0d41", "hash": "a121c94ffa2dc835d5f4a290ead1e35da471cff464916edc78eed1b0a577833a", "recursion_depth": 0} +{"seq": 949, "ts": "2026-07-13T23:56:08Z", "op": "upsert", "record_id": "LED-5150944C185C", "record": {"id": "LED-5150944C185C", "kind": "ledger_event", "status": "active", "label": "KILL SWITCH ACTIVATED: emergency stop", "confidence": 0.9, "source_type": "observed", "evidence": ["REG-005"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"description": "KILL SWITCH ACTIVATED: emergency stop", "entry_type": "kill-switch", "author": "specsmith-operator", "reqs": "REG-005", "status": "complete", "epistemic_status": "high", "belief_artifacts": "", "entry_hash": "57304a968224a8ca6848db6bd6c82d667efd5c761c61c556c0e962475df7aeba", "timestamp": "2026-07-13T23:56:08.231062+00:00"}}, "prev_hash": "a121c94ffa2dc835d5f4a290ead1e35da471cff464916edc78eed1b0a577833a", "hash": "4616130a24aca653521fc0c15f98b9ce097f3c0c17bddc99a1627f6ea7bfce9f", "recursion_depth": 0} +{"seq": 950, "ts": "2026-07-13T23:58:31Z", "op": "upsert", "record_id": "WI-4EE3E2A6", "record": {"id": "WI-4EE3E2A6", "kind": "work_item", "status": "active", "label": "Fix #301 under REQ-369 so released wheel metadata, runtime version, and project schema agree; fix #302 under REQ-336 so save resolves and reports the supplied worktree branch; fix #303 under REQ-305 b", "confidence": 0.8, "source_type": "observed", "evidence": ["REQ-369", "REQ-336", "REQ-305", "REQ-351", "TEST-305", "TEST-336", "TEST-351", "TEST-370"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"status": "open", "kind": "feature", "verified": false, "promoted_to_req": "", "blast_radius_estimate": "", "created_at": "2026-07-13T23:58:31Z", "updated_at": "2026-07-13T23:58:31Z", "closed_reason": ""}}, "prev_hash": "4616130a24aca653521fc0c15f98b9ce097f3c0c17bddc99a1627f6ea7bfce9f", "hash": "d3acaaa52113bcd811965c44b79448ca19e797aa45377afff1729130c8a8c05d", "recursion_depth": 0} +{"seq": 951, "ts": "2026-07-13T23:58:31Z", "op": "upsert", "record_id": "PF-WI-4EE3E2A6", "record": {"id": "PF-WI-4EE3E2A6", "kind": "preflight_decision", "status": "active", "label": "Change request matched existing governance scope. Proceed under Specsmith verification.", "confidence": 0.8, "source_type": "observed", "evidence": ["REQ-369", "REQ-336", "REQ-305", "REQ-351"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"decision": "accepted", "intent": "change", "work_item_id": "WI-4EE3E2A6", "test_case_ids": ["TEST-305", "TEST-336", "TEST-351", "TEST-370"], "instruction": "Change request matched existing governance scope. Proceed under Specsmith verification.", "ai_disclosure": {"governed_by": "specsmith", "governance_gated": true, "provider": "local/heuristic", "model": "deterministic-broker", "spec_version": "0.22.1"}}}, "prev_hash": "d3acaaa52113bcd811965c44b79448ca19e797aa45377afff1729130c8a8c05d", "hash": "dfddb58dceed03bb1060bd59f5f79732a80e8d9040799e89901e11d0c1778e40", "recursion_depth": 0} +{"seq": 952, "ts": "2026-07-14T09:34:43Z", "op": "upsert", "record_id": "TEST-476", "record": {"id": "TEST-476", "kind": "testcase", "status": "active", "label": "Release metadata and embedded project schema versions agree", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-476", "version": 1, "title": "Release metadata and embedded project schema versions agree", "description": "Verify pyproject metadata, source fallback, default scaffold schema, and shipped wheel metadata use the same release version.", "requirement_id": "REQ-369", "type": "build", "verification_method": "pytest tests/test_release_version_contract.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "dfddb58dceed03bb1060bd59f5f79732a80e8d9040799e89901e11d0c1778e40", "hash": "5397c5d190320d041498934eb0ec1c2cc801bc30fdfc2282bc321d152e3c4ee7", "recursion_depth": 0} +{"seq": 953, "ts": "2026-07-14T09:35:09Z", "op": "upsert", "record_id": "TEST-477", "record": {"id": "TEST-477", "kind": "testcase", "status": "active", "label": "Save falls back to the symbolic branch in the supplied worktree", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-477", "version": 1, "title": "Save falls back to the symbolic branch in the supplied worktree", "description": "Verify save push resolves main from the supplied Git worktree when git branch --show-current returns no value and reports the inspected worktree if no branch exists.", "requirement_id": "REQ-336", "type": "unit", "verification_method": "pytest tests/test_vcs_commands.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "5397c5d190320d041498934eb0ec1c2cc801bc30fdfc2282bc321d152e3c4ee7", "hash": "d64af022d79195f8d08806a4b47bb7446026a2c5e5184786b7108eae481f293f", "recursion_depth": 0} +{"seq": 954, "ts": "2026-07-14T09:35:34Z", "op": "upsert", "record_id": "TEST-478", "record": {"id": "TEST-478", "kind": "testcase", "status": "active", "label": "ESDB migration repairs a verified legacy ChronoMemory WAL chain", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-478", "version": 1, "title": "ESDB migration repairs a verified legacy ChronoMemory WAL chain", "description": "Verify an invalid ChronoStore chain is backed up, compacted, revalidated, and recorded in the migration manifest.", "requirement_id": "REQ-305", "type": "unit", "verification_method": "pytest tests/test_esdb_migrate_wal_repair.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "d64af022d79195f8d08806a4b47bb7446026a2c5e5184786b7108eae481f293f", "hash": "422df45e44f7cb33d04686f9b4b0f07dcec8213318137b45b23100473717b7fd", "recursion_depth": 0} +{"seq": 955, "ts": "2026-07-14T09:35:52Z", "op": "upsert", "record_id": "LED-FEBAF78EA7FC", "record": {"id": "LED-FEBAF78EA7FC", "kind": "ledger_event", "status": "active", "label": "KILL SWITCH ACTIVATED: emergency stop", "confidence": 0.9, "source_type": "observed", "evidence": ["REG-005"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"description": "KILL SWITCH ACTIVATED: emergency stop", "entry_type": "kill-switch", "author": "specsmith-operator", "reqs": "REG-005", "status": "complete", "epistemic_status": "high", "belief_artifacts": "", "entry_hash": "71fb0a17514b368a94e3ea16db15d0e0f6780faad3b030b944076a894929dfe9", "timestamp": "2026-07-14T09:35:52.573379+00:00"}}, "prev_hash": "422df45e44f7cb33d04686f9b4b0f07dcec8213318137b45b23100473717b7fd", "hash": "4d9706487ded3e490e862d8e865c8e7c689a73960b6b39232406403a5a6cd514", "recursion_depth": 0} +{"seq": 956, "ts": "2026-07-14T09:36:00Z", "op": "upsert", "record_id": "TEST-479", "record": {"id": "TEST-479", "kind": "testcase", "status": "active", "label": "Governance checkpoint anchor uses ASCII fixed-width rows", "confidence": 1.0, "source_type": "observed", "evidence": ["synced from testcases.json"], "epistemic_boundary": [], "is_hypothesis": false, "model_assumptions": {}, "recursion_depth": 0, "data": {"id": "TEST-479", "version": 1, "title": "Governance checkpoint anchor uses ASCII fixed-width rows", "description": "Verify human checkpoint output uses ASCII borders and status words only, with every row the same fixed width.", "requirement_id": "REQ-351", "type": "cli", "verification_method": "pytest tests/test_cli.py", "input": {}, "expected_behavior": {}, "confidence": 1.0}}, "prev_hash": "4d9706487ded3e490e862d8e865c8e7c689a73960b6b39232406403a5a6cd514", "hash": "7859f1c70c27a47d0a27fe1fa970eba3f7f06a6d563b6b42bb2f2969b97786e5", "recursion_depth": 0} diff --git a/.chronomemory/snapshot.json b/.chronomemory/snapshot.json index c8b46e9b..1fbad467 100644 --- a/.chronomemory/snapshot.json +++ b/.chronomemory/snapshot.json @@ -1,7 +1,7 @@ { - "seq": 783, - "last_hash": "9f8045a92b0c7692ecd5b987e7a8b0c7e1233a17f6e88ab021f17953bd5123ea", - "ts": "2026-06-26T22:35:25Z", + "seq": 896, + "last_hash": "9012aebc01213c67509f00a5d218c8352f71ccb34422803d5bb6a429e7662f49", + "ts": "2026-07-13T23:50:02Z", "records": [ { "id": "REQ-001", @@ -1607,11 +1607,11 @@ "id": "REQ-065", "kind": "requirement", "status": "active", - "label": "WI Lifecycle States", + "label": "GitHub Release Creation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1619,10 +1619,11 @@ "recursion_depth": 0, "data": { "id": "REQ-065", - "title": "WI Lifecycle States", - "description": "Every Work Item must move through a defined set of states: open, implemented, promoted, closed, archived, rejected. The allowed transitions are enforced by WorkItemStore.", - "source": "wi_store.py", - "status": "implemented", + "version": 1, + "title": "GitHub Release Creation", + "description": "Allow specsmith to create GitHub releases for tagged versions with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-065" ] @@ -1632,11 +1633,11 @@ "id": "REQ-066", "kind": "requirement", "status": "active", - "label": "WI-to-REQ Promotion", + "label": "PyPI Deployment", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1644,10 +1645,11 @@ "recursion_depth": 0, "data": { "id": "REQ-066", - "title": "WI-to-REQ Promotion", - "description": "A Work Item in the open or implemented state may be promoted to a formal requirement via specsmith wi promote, which creates a new REQ-NNN entry in the target requirements YAML and records promoted_to_req on the WI.", - "source": "wi_store.py", - "status": "implemented", + "version": 1, + "title": "PyPI Deployment", + "description": "Allow specsmith to trigger PyPI package deployment with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-066" ] @@ -1657,11 +1659,11 @@ "id": "REQ-067", "kind": "requirement", "status": "active", - "label": "WI Status Persistence", + "label": "CI Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1669,12 +1671,14 @@ "recursion_depth": 0, "data": { "id": "REQ-067", - "title": "WI Status Persistence", - "description": "Work Item state is persisted to .specsmith/workitems.json using an atomic write (write-then-rename) so crashes never leave the store corrupt.", - "source": "wi_store.py", - "status": "implemented", + "version": 1, + "title": "CI Management", + "description": "Allow specsmith to manage CI workflows with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ - "TEST-067" + "TEST-067", + "TEST-473" ] } }, @@ -1682,11 +1686,11 @@ "id": "REQ-068", "kind": "requirement", "status": "active", - "label": "WI Auto-Implementation on Verify Equilibrium", + "label": "Pull Request Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1694,10 +1698,11 @@ "recursion_depth": 0, "data": { "id": "REQ-068", - "title": "WI Auto-Implementation on Verify Equilibrium", - "description": "When specsmith verify reaches equilibrium for a given work_item_id, the WI is automatically transitioned from open to implemented. This wiring is best-effort and never blocks the verify result.", - "source": "governance_logic.py", - "status": "implemented", + "version": 1, + "title": "Pull Request Management", + "description": "Allow specsmith to manage PRs, merges, and issue creation with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-068" ] @@ -1757,11 +1762,11 @@ "id": "REQ-071", "kind": "requirement", "status": "active", - "label": "Nexus Must Index the Repository", + "label": "Release Notes Generation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1769,10 +1774,11 @@ "recursion_depth": 0, "data": { "id": "REQ-071", - "title": "Nexus Must Index the Repository", - "description": "Nexus must populate .repo-index/ with files.json, tags, test_commands.json, architecture.md, and conventions.md as available.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Notes Generation", + "description": "Allow specsmith to automatically generate release notes from commit history with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-071" ] @@ -1782,11 +1788,11 @@ "id": "REQ-072", "kind": "requirement", "status": "active", - "label": "Nexus REPL Must Support Slash Commands", + "label": "Release Tag Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1794,10 +1800,11 @@ "recursion_depth": 0, "data": { "id": "REQ-072", - "title": "Nexus REPL Must Support Slash Commands", - "description": "The Nexus REPL must support /plan, /ask, /fix, /test, /commit, /pr, /undo, /context, /exit.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Tag Management", + "description": "Allow specsmith to manage release tags including creation, deletion, and modification with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-072" ] @@ -1807,11 +1814,11 @@ "id": "REQ-073", "kind": "requirement", "status": "active", - "label": "Nexus Output Contract", + "label": "Artifact Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1819,10 +1826,11 @@ "recursion_depth": 0, "data": { "id": "REQ-073", - "title": "Nexus Output Contract", - "description": "Each Nexus task response must include sections Plan, Commands to run, Files changed, Diff, Test results, and Next action.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Artifact Management", + "description": "Allow specsmith to manage release artifacts including uploads, downloads, and cleanup with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-073" ] @@ -1832,11 +1840,11 @@ "id": "REQ-074", "kind": "requirement", "status": "active", - "label": "vLLM Image Must Be Pinned", + "label": "Release Branch Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1844,10 +1852,11 @@ "recursion_depth": 0, "data": { "id": "REQ-074", - "title": "vLLM Image Must Be Pinned", - "description": "The Nexus docker-compose.yml must pin the vLLM image to a specific tag (vllm/vllm-openai:v0.8.5) and not use latest.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Branch Management", + "description": "Allow specsmith to manage release branches including creation, merging, and deletion with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-074" ] @@ -1857,11 +1866,11 @@ "id": "REQ-075", "kind": "requirement", "status": "active", - "label": "vLLM Must Serve l1-nexus Model", + "label": "Release Validation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1869,10 +1878,11 @@ "recursion_depth": 0, "data": { "id": "REQ-075", - "title": "vLLM Must Serve l1-nexus Model", - "description": "The Nexus docker-compose.yml must publish the served model as l1-nexus and use the Hermes tool-call parser.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Validation", + "description": "Allow specsmith to perform automated validation checks before release creation with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-075" ] @@ -1882,11 +1892,11 @@ "id": "REQ-076", "kind": "requirement", "status": "active", - "label": "Nexus Tool Executor Registration Must Be Unique", + "label": "Release Rollback", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1894,10 +1904,11 @@ "recursion_depth": 0, "data": { "id": "REQ-076", - "title": "Nexus Tool Executor Registration Must Be Unique", - "description": "Each Nexus tool must be registered with the AG2 executor exactly once; LLM-side tool signatures may be attached to multiple caller agents but the execution function must not be re-registered to avoid AG2 override warnings.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Rollback", + "description": "Allow specsmith to rollback to previous releases with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-076" ] @@ -1907,11 +1918,11 @@ "id": "REQ-077", "kind": "requirement", "status": "active", - "label": "Safe Cleanup Must Default to Dry-Run", + "label": "Release Promotion", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1919,10 +1930,11 @@ "recursion_depth": 0, "data": { "id": "REQ-077", - "title": "Safe Cleanup Must Default to Dry-Run", - "description": "The Specsmith safe-cleanup capability must default to dry-run mode and only delete files when an explicit apply flag is provided.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Promotion", + "description": "Allow specsmith to promote releases between environments (dev, staging, prod) with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-077" ] @@ -1932,11 +1944,11 @@ "id": "REQ-078", "kind": "requirement", "status": "active", - "label": "Safe Cleanup Must Use a Hard-Coded Target List", + "label": "Release Metadata Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1944,10 +1956,11 @@ "recursion_depth": 0, "data": { "id": "REQ-078", - "title": "Safe Cleanup Must Use a Hard-Coded Target List", - "description": "Safe cleanup must only consider the canonical built-in target list and must reject user-supplied arbitrary paths.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Release Metadata Management", + "description": "Allow specsmith to manage release metadata including version, date, and author information with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-078" ] @@ -1957,11 +1970,11 @@ "id": "REQ-079", "kind": "requirement", "status": "active", - "label": "Safe Cleanup Must Protect Governance and Source", + "label": "Git Platform Agnostic Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1969,10 +1982,11 @@ "recursion_depth": 0, "data": { "id": "REQ-079", - "title": "Safe Cleanup Must Protect Governance and Source", - "description": "Safe cleanup must refuse to delete .git, .specsmith, governance markdown files, pyproject.toml, README.md, LICENSE, CHANGELOG.md, src/, tests/, docs/, scripts/, .repo-index/, .github/, .vscode/, third-party agent integration directories (such as .agents/), and project configuration dotfiles.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Git Platform Agnostic Management", + "description": "Allow specsmith to manage Git repositories across multiple platforms (GitHub, GitLab, Bitbucket, etc.) with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-079" ] @@ -1982,11 +1996,11 @@ "id": "REQ-080", "kind": "requirement", "status": "active", - "label": "Safe Cleanup Must Emit a Structured Report", + "label": "GitHub Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -1994,10 +2008,11 @@ "recursion_depth": 0, "data": { "id": "REQ-080", - "title": "Safe Cleanup Must Emit a Structured Report", - "description": "Safe cleanup must return a report containing the lists of removed paths, skipped paths with reasons, and total bytes reclaimed, suitable for inclusion as ledger evidence.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "GitHub Platform Management", + "description": "Allow specsmith to manage GitHub repositories, issues, pull requests, and releases with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-080" ] @@ -2007,11 +2022,11 @@ "id": "REQ-081", "kind": "requirement", "status": "active", - "label": "Safe Cleanup Must Be Exposed via Specsmith CLI", + "label": "GitLab Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2019,10 +2034,11 @@ "recursion_depth": 0, "data": { "id": "REQ-081", - "title": "Safe Cleanup Must Be Exposed via Specsmith CLI", - "description": "The Specsmith CLI must expose the safe cleanup capability as `specsmith clean`, supporting `--apply`, `--json`, and `--project-dir`. When `--apply` is used and `LEDGER.md` exists, the run must be recorded as a `cleanup` ledger event tagged with REQ-077..REQ-080.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "GitLab Platform Management", + "description": "Allow specsmith to manage GitLab repositories, issues, merge requests, and releases with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-081" ] @@ -2032,11 +2048,11 @@ "id": "REQ-082", "kind": "requirement", "status": "active", - "label": "CLI Console Must Be UTF-8 Safe Across Platforms", + "label": "Bitbucket Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2044,10 +2060,11 @@ "recursion_depth": 0, "data": { "id": "REQ-082", - "title": "CLI Console Must Be UTF-8 Safe Across Platforms", - "description": "All Specsmith CLI output (rich Console) must render UTF-8 glyphs (such as warning, arrow, check, cross) without raising UnicodeEncodeError on Windows code pages such as cp1252. The console factory must reconfigure stdout/stderr to UTF-8 and disable rich's legacy_windows renderer.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Bitbucket Platform Management", + "description": "Allow specsmith to manage Bitbucket repositories, issues, pull requests, and releases with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-082" ] @@ -2057,11 +2074,11 @@ "id": "REQ-083", "kind": "requirement", "status": "active", - "label": "Canonical Test Specification File Is TESTS.md", + "label": "Azure DevOps Platform Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2069,10 +2086,11 @@ "recursion_depth": 0, "data": { "id": "REQ-083", - "title": "Canonical Test Specification File Is TESTS.md", - "description": "The canonical test specification file is named `TESTS.md` (replacing the legacy names `TESTS.md`, `TEST-SPEC.md`, and `TEST-SPECS.md`). Specsmith code, governance documents, templates, scaffolder output, importer overlay, auditor checks, retrieval index, exporter, validator, REPL skill files, ReadTheDocs site, and CLI help must all reference `TESTS.md`. Legacy filenames must not be created by new scaffolds, must be auto-renamed by `specsmith migrate-project`, and must not be referenced in user-facing docs.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Azure DevOps Platform Management", + "description": "Allow specsmith to manage Azure DevOps repositories, issues, pull requests, and releases with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-083" ] @@ -2082,11 +2100,11 @@ "id": "REQ-084", "kind": "requirement", "status": "active", - "label": "Natural-Language Governance Broker", + "label": "Git Platform Authentication Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2094,10 +2112,11 @@ "recursion_depth": 0, "data": { "id": "REQ-084", - "title": "Natural-Language Governance Broker", - "description": "Specsmith must expose a Nexus broker module (`specsmith.agent.broker`) that translates plain-language user utterances into Specsmith-governed work without the user reasoning about REQ IDs, TEST IDs, or work items. The broker must classify intent (read-only ask vs change vs release), infer affected scope from the local `.repo-index` and existing requirements, invoke `specsmith preflight` and `specsmith verify` as the only sources of governance decisions, render plain-language plans and outcomes, hide REQ/TEST/work-item IDs by default (revealed only on `/why`, `/show-governance`, or `--verbose`), bound retries per REQ-014, escalate to a single user clarification on stop-and-align (REQ-063), and never invent governance content (REQ/TEST drafting requires explicit user confirmation).", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Git Platform Authentication Management", + "description": "Allow specsmith to manage authentication credentials for multiple Git platforms with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-084" ] @@ -2107,11 +2126,11 @@ "id": "REQ-085", "kind": "requirement", "status": "active", - "label": "specsmith preflight CLI Subcommand", + "label": "Git Platform Configuration Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2119,10 +2138,11 @@ "recursion_depth": 0, "data": { "id": "REQ-085", - "title": "specsmith preflight CLI Subcommand", - "description": "The Specsmith CLI must expose a `specsmith preflight ` subcommand that reads `REQUIREMENTS.md` and `.specsmith/` state, classifies intent and infers scope, and emits a JSON object with at least the keys `decision` (one of `accepted`, `needs_clarification`, `blocked`, `rejected`), `work_item_id`, `requirement_ids`, `test_case_ids`, `confidence_target`, and `instruction`. Read-only asks accept by default, destructive intents require clarification, and changes with no matching scope return `needs_clarification` with a one-sentence question. The CLI must support `--project-dir`, `--json`, and `--verbose`.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Git Platform Configuration Management", + "description": "Allow specsmith to configure platform-specific settings and webhooks for multiple Git platforms with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-085" ] @@ -2132,11 +2152,11 @@ "id": "REQ-086", "kind": "requirement", "status": "active", - "label": "Nexus REPL Must Gate Execution on Preflight Acceptance", + "label": "Git Platform Repository Creation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2144,10 +2164,11 @@ "recursion_depth": 0, "data": { "id": "REQ-086", - "title": "Nexus REPL Must Gate Execution on Preflight Acceptance", - "description": "When a non-slash utterance flows through the broker, the Nexus REPL must only invoke the AG2 orchestrator's `run_task` if the preflight decision is `accepted`. For any other decision (`needs_clarification`, `blocked`, `rejected`), the REPL must print the broker's plain-language clarification or rejection and return to the prompt without executing.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Git Platform Repository Creation", + "description": "Allow specsmith to create repositories on multiple Git platforms with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-086" ] @@ -2157,11 +2178,11 @@ "id": "REQ-087", "kind": "requirement", "status": "active", - "label": "Nexus REPL Must Drive Execution Through the Bounded-Retry Harness", + "label": "Git Platform Repository Deletion", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2169,10 +2190,11 @@ "recursion_depth": 0, "data": { "id": "REQ-087", - "title": "Nexus REPL Must Drive Execution Through the Bounded-Retry Harness", - "description": "When the preflight decision is `accepted`, the Nexus REPL must drive the AG2 orchestrator through `specsmith.agent.broker.execute_with_governance`, supplying an executor that wraps `orchestrator.run_task` and synthesizes a result dict (`equilibrium`, `confidence`, `summary`). The harness must honor `DEFAULT_RETRY_BUDGET` (REQ-014), surface the single clarifying question on stop-and-align (REQ-063), and never call `run_task` directly outside the harness.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Git Platform Repository Deletion", + "description": "Allow specsmith to delete repositories on multiple Git platforms with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-087" ] @@ -2182,11 +2204,11 @@ "id": "REQ-088", "kind": "requirement", "status": "active", - "label": "specsmith preflight Must Resolve Test Case IDs From Machine State", + "label": "Git Platform Repository Cloning", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2194,10 +2216,11 @@ "recursion_depth": 0, "data": { "id": "REQ-088", - "title": "specsmith preflight Must Resolve Test Case IDs From Machine State", - "description": "The `specsmith preflight` CLI must populate `test_case_ids` in its JSON payload by joining the matched `requirement_ids` against `.specsmith/testcases.json` (or `TESTS.md` when the JSON is unavailable). When the resolved set is non-empty the CLI must include every matching `TEST-NNN` id and must never invent ids not present in machine state.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Git Platform Repository Cloning", + "description": "Allow specsmith to clone repositories from multiple Git platforms with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-088" ] @@ -2207,11 +2230,11 @@ "id": "REQ-089", "kind": "requirement", "status": "active", - "label": "Nexus Live l1-nexus Smoke Test", + "label": "Local Command Execution Policy", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2219,10 +2242,11 @@ "recursion_depth": 0, "data": { "id": "REQ-089", - "title": "Nexus Live l1-nexus Smoke Test", - "description": "Specsmith must ship a `scripts/nexus_smoke.py` script that POSTs a minimal chat-completions request to a running vLLM `l1-nexus` container at `http://localhost:8000/v1/chat/completions` and reports whether the model responded with a well-formed `choices[0].message.content`. A pytest integration test must invoke the script and skip unless the environment variable `NEXUS_LIVE=1` is set, so the suite stays green offline but is verifiable when the container is up.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Local Command Execution Policy", + "description": "Allow specsmith to execute local commands with a default permissive policy from a local repo standpoint, with configurable whitelists and blacklists", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-089" ] @@ -2232,11 +2256,11 @@ "id": "REQ-090", "kind": "requirement", "status": "active", - "label": "Nexus Documentation Must Describe Broker, Preflight, and Gated Execution", + "label": "Local Command Whitelist Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2244,10 +2268,11 @@ "recursion_depth": 0, "data": { "id": "REQ-090", - "title": "Nexus Documentation Must Describe Broker, Preflight, and Gated Execution", - "description": "`ARCHITECTURE.md`, `README.md`, and `docs/` must describe the natural-language broker (REQ-084), the `specsmith preflight` CLI (REQ-085), the REPL execution gate (REQ-086), and the bounded-retry harness (REQ-087), including the `/why` toggle and an end-to-end example flow. Documentation must not surface REQ/TEST/WI tokens to the user except inside the explicit `/why` block.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Local Command Whitelist Management", + "description": "Allow specsmith to manage whitelisted commands for local execution with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-090" ] @@ -2257,11 +2282,11 @@ "id": "REQ-091", "kind": "requirement", "status": "active", - "label": "Orchestrator Must Return a Structured TaskResult", + "label": "Local Command Blacklist Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2269,10 +2294,11 @@ "recursion_depth": 0, "data": { "id": "REQ-091", - "title": "Orchestrator Must Return a Structured TaskResult", - "description": "`orchestrator.run_task` must return a `TaskResult` dataclass with at least the fields `equilibrium: bool`, `confidence: float`, `summary: str`, `files_changed: list[str]`, and `test_results: dict`. The Nexus REPL's broker branch must consume this dataclass directly when feeding `execute_with_governance` (REQ-087); the broker must not synthesize `equilibrium` from a boolean cast of the summary string.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Local Command Blacklist Management", + "description": "Allow specsmith to manage blacklisted commands for local execution with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-091" ] @@ -2282,11 +2308,11 @@ "id": "REQ-092", "kind": "requirement", "status": "active", - "label": "specsmith preflight CLI Must Use Decision-Specific Exit Codes", + "label": "Local Command Override Capability", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2294,10 +2320,11 @@ "recursion_depth": 0, "data": { "id": "REQ-092", - "title": "specsmith preflight CLI Must Use Decision-Specific Exit Codes", - "description": "The `specsmith preflight` CLI must exit `0` for `accepted`, `2` for `needs_clarification`, and `3` for `blocked` or `rejected` decisions, so CI pipelines and shell wrappers can branch on intent without parsing the JSON payload. The JSON payload must continue to print on stdout for both success and non-zero exits.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Local Command Override Capability", + "description": "Allow specsmith to override execution policies with human approval, enabling execution of commands not in default policy", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-092" ] @@ -2307,11 +2334,11 @@ "id": "REQ-093", "kind": "requirement", "status": "active", - "label": "Accepted preflight Must Record a Ledger Event", + "label": "Pip Execution Override", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2319,10 +2346,11 @@ "recursion_depth": 0, "data": { "id": "REQ-093", - "title": "Accepted preflight Must Record a Ledger Event", - "description": "When `specsmith preflight` produces an `accepted` decision and `LEDGER.md` exists in the project root, the CLI must append a `preflight` ledger event tagged with `REQ-085` plus the resolved `requirement_ids`. The event must record the utterance, the assigned `work_item_id`, and the `confidence_target`, so every accepted preflight is traceable end-to-end.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Pip Execution Override", + "description": "Allow specsmith to execute pip commands with override capability, using only local pip from the local environment in workspace", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-093" ] @@ -2332,11 +2360,11 @@ "id": "REQ-094", "kind": "requirement", "status": "active", - "label": "/why Must Surface Post-Run Governance in the REPL", + "label": "Pip Execution Safety Checks", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2344,10 +2372,11 @@ "recursion_depth": 0, "data": { "id": "REQ-094", - "title": "/why Must Surface Post-Run Governance in the REPL", - "description": "When `verbose_governance` is on (toggled by `/why` or `/show-governance`), after the REPL drives `execute_with_governance` for an accepted utterance it must print a single `[/why]` block summarizing the assigned `work_item_id`, the matched `requirement_ids` and `test_case_ids`, the post-run confidence, and whether the bounded-retry harness reached equilibrium. When verbose mode is off, the post-run governance block must not be emitted.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Pip Execution Safety Checks", + "description": "When pip execution is overridden, specsmith must warn and ensure only local pip from workspace environment is used", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-094" ] @@ -2357,11 +2386,11 @@ "id": "REQ-095", "kind": "requirement", "status": "active", - "label": "Nexus Live Smoke Run Must Be Reproducible Evidence", + "label": "Virtual Environment Creation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2369,10 +2398,11 @@ "recursion_depth": 0, "data": { "id": "REQ-095", - "title": "Nexus Live Smoke Run Must Be Reproducible Evidence", - "description": "A live or honestly-skipped invocation of `scripts/nexus_smoke.py` must be captured under `.specsmith/runs/WI-NEXUS-011/logs.txt` so the project ledger preserves at least one reproducible record of the broker -> preflight -> orchestrator -> vLLM end-to-end path (or a documented reason the live container could not be reached in the current environment).", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Virtual Environment Creation", + "description": "Allow specsmith to create virtual environments for projects with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-095" ] @@ -2382,11 +2412,11 @@ "id": "REQ-096", "kind": "requirement", "status": "active", - "label": "Bounded-Retry Harness Must Map Failures to Retry Strategies", + "label": "Virtual Environment Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2394,10 +2424,11 @@ "recursion_depth": 0, "data": { "id": "REQ-096", - "title": "Bounded-Retry Harness Must Map Failures to Retry Strategies", - "description": "When `execute_with_governance` exhausts its retry budget (REQ-014), it must classify the last executor report against the canonical retry strategy mapping (REQ-028): `narrow_scope`, `expand_scope`, `fix_tests`, `rollback`, or `stop`. The classification must be exposed on `RunResult.strategy` and surfaced in the clarifying question (REQ-063) so the user gets one concrete next-action label rather than only a free-form sentence.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Virtual Environment Management", + "description": "Allow specsmith to manage virtual environments including activation, deactivation, and cleanup with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-096" ] @@ -2407,11 +2438,11 @@ "id": "REQ-097", "kind": "requirement", "status": "active", - "label": "specsmith verify CLI Subcommand", + "label": "Virtual Environment Validation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2419,10 +2450,11 @@ "recursion_depth": 0, "data": { "id": "REQ-097", - "title": "specsmith verify CLI Subcommand", - "description": "The Specsmith CLI must expose a `specsmith verify` subcommand that consumes the verification input contract (REQ-027): file diffs, test results, execution logs, and changed files (paths or `--stdin` JSON). The subcommand must emit a JSON object with at least `equilibrium`, `confidence`, `summary`, `files_changed`, `test_results`, and `retry_strategy`. Exit code 0 on equilibrium with confidence ≥ the configured threshold, 2 when retry is recommended, and 3 when stop-and-align is required.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Virtual Environment Validation", + "description": "When creating or using virtual environments, specsmith must validate that they are properly configured and safe to use", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-097" ] @@ -2432,11 +2464,11 @@ "id": "REQ-098", "kind": "requirement", "status": "active", - "label": "Confidence Threshold Must Be Read From .specsmith/config.yml", + "label": "Virtual Environment Warning System", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2444,10 +2476,11 @@ "recursion_depth": 0, "data": { "id": "REQ-098", - "title": "Confidence Threshold Must Be Read From .specsmith/config.yml", - "description": "Both `specsmith preflight` and the broker's `run_preflight` helper must consult `.specsmith/config.yml` for the `epistemic.confidence_threshold` value (REQ-058) and use it as the floor for the JSON `confidence_target` field whenever it is greater than the heuristic default. When the config file is absent or unparseable, the existing heuristic defaults must continue to apply.", - "source": ".specsmith/config.yml, ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Virtual Environment Warning System", + "description": "When projects attempt to use non-pipx versions of specsmith, specsmith must warn and offer to create new venv if one doesn't exist", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-098" ] @@ -2457,11 +2490,11 @@ "id": "REQ-099", "kind": "requirement", "status": "active", - "label": "Accepted Preflight Must Record a Distinct work_proposal Event", + "label": "Local Environment Isolation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2469,10 +2502,11 @@ "recursion_depth": 0, "data": { "id": "REQ-099", - "title": "Accepted Preflight Must Record a Distinct work_proposal Event", - "description": "When `specsmith preflight` produces an `accepted` decision and assigns a brand-new `work_item_id`, the CLI must append a `work_proposal` ledger event in addition to the existing `preflight` event (REQ-044). The `work_proposal` entry must reference REQ-044 and REQ-085, include the `work_item_id` and matched `requirement_ids`, and must NOT be emitted when the underlying `work_item_id` already appears in `LEDGER.md` (no duplicate proposals).", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Local Environment Isolation", + "description": "Specsmith must ensure local command execution is isolated to the project workspace environment with appropriate warnings", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-099" ] @@ -2482,11 +2516,11 @@ "id": "REQ-100", "kind": "requirement", "status": "active", - "label": "Broker Scope Inference May Surface Stress-Test Critical Failures", + "label": "Execution Policy Configuration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2494,10 +2528,11 @@ "recursion_depth": 0, "data": { "id": "REQ-100", - "title": "Broker Scope Inference May Surface Stress-Test Critical Failures", - "description": "When the user passes `--stress` to `specsmith preflight` and the matched requirements set is non-empty, the CLI must invoke the existing AEE `StressTester` against those belief artifacts and surface any critical failures in the JSON payload as a `stress_warnings` list. The narration (verbose mode) must include a one-sentence plain-English warning when at least one critical failure is found. The flag must default off so unrelated tests continue to pass.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Execution Policy Configuration", + "description": "Allow specsmith to configure execution policies including default permissive mode, whitelists, blacklists, and override rules", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-100" ] @@ -2507,11 +2542,11 @@ "id": "REQ-101", "kind": "requirement", "status": "active", - "label": "Lint Baseline Must Be Clean", + "label": "Playwright Testing Framework", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2519,10 +2554,11 @@ "recursion_depth": 0, "data": { "id": "REQ-101", - "title": "Lint Baseline Must Be Clean", - "description": "`ruff check src/ tests/` and `ruff format --check src/ tests/` must both exit zero on `develop`. The lint job in `.github/workflows/ci.yml` enforces this contract. Per-file ignores in `pyproject.toml` are reserved for documentation modules whose long lines are intentional (e.g. `toolrules.py`, `tool_installer.py`).", - "source": ".github/workflows/ci.yml, pyproject.toml", - "status": "implemented", + "version": 1, + "title": "Playwright Testing Framework", + "description": "Allow specsmith projects to use Playwright for end-to-end browser testing with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-101" ] @@ -2532,11 +2568,11 @@ "id": "REQ-102", "kind": "requirement", "status": "active", - "label": "Type-Check Baseline Must Be Clean", + "label": "Testing Framework Configuration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2544,10 +2580,11 @@ "recursion_depth": 0, "data": { "id": "REQ-102", - "title": "Type-Check Baseline Must Be Clean", - "description": "`mypy src/specsmith/` must exit zero on `develop`. Strict-mypy is preserved for the historically-typed modules; dynamically-typed modules in `specsmith.agent.*`, `specsmith.console_utils`, `specsmith.serve`, and the agent-orchestrator surface are explicitly enumerated in the `[[tool.mypy.overrides]]` `ignore_errors=true` block of `pyproject.toml` until they are individually annotated.", - "source": ".github/workflows/ci.yml, pyproject.toml", - "status": "implemented", + "version": 1, + "title": "Testing Framework Configuration", + "description": "Allow specsmith projects to configure testing frameworks including Playwright, pytest, and others with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-102" ] @@ -2557,11 +2594,11 @@ "id": "REQ-103", "kind": "requirement", "status": "active", - "label": "Security Baseline Tolerates Unfixed pip Advisory", + "label": "Testing Environment Isolation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2569,10 +2606,11 @@ "recursion_depth": 0, "data": { "id": "REQ-103", - "title": "Security Baseline Tolerates Unfixed pip Advisory", - "description": "The CI security job must upgrade pip to the latest release before invoking `pip-audit`, and must pass the `--ignore-vuln CVE-2026-3219` flag for the unfixed pip advisory so the runner's own pip version does not block PRs. Specsmith's actual runtime dependencies (click, jinja2, pyyaml, pydantic, rich) must remain pip-audit clean; any new advisory against them must trigger a dependency bump rather than another ignore-flag.", - "source": ".github/workflows/ci.yml", - "status": "implemented", + "version": 1, + "title": "Testing Environment Isolation", + "description": "Ensure testing environments are properly isolated from development environments with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-103" ] @@ -2582,11 +2620,11 @@ "id": "REQ-104", "kind": "requirement", "status": "active", - "label": "Work Items Must Mirror Implemented REQs", + "label": "Testing Artifact Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2594,10 +2632,11 @@ "recursion_depth": 0, "data": { "id": "REQ-104", - "title": "Work Items Must Mirror Implemented REQs", - "description": "`.specsmith/workitems.json` must derive from `.specsmith/requirements.json` and `.specsmith/testcases.json`. For each REQ-N there must be a matching WORK-N entry with `requirement_id=REQ-N`, `test_case_ids` listing every TEST joined by `requirement_id`, and `status=complete` when the REQ is implemented in source. The `scripts/sync_workitems.py` helper is the canonical sync.", - "source": "scripts/sync_workitems.py, .specsmith/workitems.json", - "status": "implemented", + "version": 1, + "title": "Testing Artifact Management", + "description": "Allow specsmith projects to manage test artifacts including screenshots, videos, and logs with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-104" ] @@ -2607,11 +2646,11 @@ "id": "REQ-105", "kind": "requirement", "status": "active", - "label": "Live Smoke Evidence Must Be Reproducible Or Honestly Skipped", + "label": "Testing Report Generation", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2619,10 +2658,11 @@ "recursion_depth": 0, "data": { "id": "REQ-105", - "title": "Live Smoke Evidence Must Be Reproducible Or Honestly Skipped", - "description": "A live or honestly-skipped invocation of `scripts/nexus_smoke.py` against the configured `l1-nexus` model must be captured under `.specsmith/runs/WI-NEXUS-011/logs.txt`. The skip note must include a fresh probe attempt, a timestamp, and the hardware/environment reason the live container could not be reached.", - "source": ".specsmith/runs/WI-NEXUS-011/logs.txt, scripts/nexus_smoke.py", - "status": "implemented", + "version": 1, + "title": "Testing Report Generation", + "description": "Allow specsmith projects to automatically generate test reports with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-105" ] @@ -2632,11 +2672,11 @@ "id": "REQ-106", "kind": "requirement", "status": "active", - "label": "Kairos Must Surface Governance Commands", + "label": "Testing Integration with CI/CD", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2644,10 +2684,11 @@ "recursion_depth": 0, "data": { "id": "REQ-106", - "title": "Kairos Must Surface Governance Commands", - "description": "The Kairos terminal client must provide UI access to the three primary governance operations: preflight gate, verify, and governance trace (`/why`). These are surfaced via the Governance settings page and the BYOE proxy at `http://127.0.0.1:7700`.", - "source": "app/src/settings_view/governance_page.rs, kairos_governance crate", - "status": "implemented", + "version": 1, + "title": "Testing Integration with CI/CD", + "description": "Allow specsmith projects to integrate testing frameworks with CI/CD pipelines with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-106" ] @@ -2657,11 +2698,11 @@ "id": "REQ-107", "kind": "requirement", "status": "active", - "label": "ARCHITECTURE.md Must Reflect Current State", + "label": "Testing Parallel Execution", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2669,10 +2710,11 @@ "recursion_depth": 0, "data": { "id": "REQ-107", - "title": "ARCHITECTURE.md Must Reflect Current State", - "description": "`ARCHITECTURE.md` must contain a 'Current State' section listing the realized broker, harness, retry strategies, CI baseline, Kairos governance integration, live-smoke evidence note, and documentation surface. The section is the source of truth for 'the system as built' and must be updated each time a release is cut.", - "source": "ARCHITECTURE.md", - "status": "implemented", + "version": 1, + "title": "Testing Parallel Execution", + "description": "Allow specsmith projects to execute tests in parallel with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-107" ] @@ -2682,11 +2724,11 @@ "id": "REQ-108", "kind": "requirement", "status": "active", - "label": "Real Verifier Signal Must Drive Confidence", + "label": "Testing Coverage Reporting", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2694,10 +2736,11 @@ "recursion_depth": 0, "data": { "id": "REQ-108", - "title": "Real Verifier Signal Must Drive Confidence", - "description": "`Orchestrator._build_task_result` must derive `TaskResult.confidence` and `equilibrium` from a real verifier (`src/specsmith/agent/verifier.py`) that inspects test results, ruff output, and mypy output for the changed files. The hardcoded 0.85 / 0.4 / 0.0 placeholder must be removed.", - "source": "src/specsmith/agent/verifier.py, src/specsmith/agent/orchestrator.py", - "status": "implemented", + "version": 1, + "title": "Testing Coverage Reporting", + "description": "Allow specsmith projects to generate and track test coverage reports with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-108" ] @@ -2707,11 +2750,11 @@ "id": "REQ-109", "kind": "requirement", "status": "active", - "label": "Live `l1-nexus` Smoke Overlay Must Produce ok=true on 7B Hardware", + "label": "WebUI Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2719,10 +2762,11 @@ "recursion_depth": 0, "data": { "id": "REQ-109", - "title": "Live `l1-nexus` Smoke Overlay Must Produce ok=true on 7B Hardware", - "description": "Specsmith ships a `docker-compose.smoke.yml` overlay that swaps `l1-nexus` to a 7B GPTQ-Int4 model fitting <=8 GB VRAM, and `.specsmith/runs/WI-NEXUS-029/logs.txt` documents how to capture an `ok: true` smoke result with `NEXUS_LIVE=1` against that overlay.", - "source": "docker-compose.smoke.yml, .specsmith/runs/WI-NEXUS-029/logs.txt", - "status": "implemented", + "version": 1, + "title": "WebUI Platform Integration", + "description": "Allow specsmith projects to integrate with WebUI platforms for AI model serving with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-109" ] @@ -2732,11 +2776,11 @@ "id": "REQ-110", "kind": "requirement", "status": "active", - "label": "End-to-End Nexus Path Must Be Integration-Tested", + "label": "VLLM Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2744,10 +2788,11 @@ "recursion_depth": 0, "data": { "id": "REQ-110", - "title": "End-to-End Nexus Path Must Be Integration-Tested", - "description": "`tests/test_e2e_nexus.py` exercises the broker -> preflight -> harness -> orchestrator -> verifier path with a `FakeOrchestrator` and asserts ledger events, `RunResult.success`, and retry-strategy classification on a scripted failure-then-recovery sequence.", - "source": "tests/test_e2e_nexus.py", - "status": "implemented", + "version": 1, + "title": "VLLM Platform Integration", + "description": "Allow specsmith projects to integrate with VLLM for large language model serving with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-110" ] @@ -2757,11 +2802,11 @@ "id": "REQ-111", "kind": "requirement", "status": "active", - "label": "Mypy Strict Carveout Must Shrink Toward Zero", + "label": "LMStudio Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2769,10 +2814,11 @@ "recursion_depth": 0, "data": { "id": "REQ-111", - "title": "Mypy Strict Carveout Must Shrink Toward Zero", - "description": "At least the four newly-annotated dynamic agent modules (`broker`, `safety`, `console_utils`, `indexer`) are fully type-annotated and removed from the `[[tool.mypy.overrides]] ignore_errors=true` block in `pyproject.toml`. The remaining carveout (orchestrator, repl, tools, cleanup, serve) is documented as a 1.x cleanup target.", - "source": "pyproject.toml, src/specsmith/agent/*.py, src/specsmith/console_utils.py", - "status": "implemented", + "version": 1, + "title": "LMStudio Platform Integration", + "description": "Allow specsmith projects to integrate with LMStudio for local AI model serving with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-111" ] @@ -2782,11 +2828,11 @@ "id": "REQ-112", "kind": "requirement", "status": "active", - "label": "Streaming Token Bridge Must Emit JSONL Events", + "label": "Ollama Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2794,10 +2840,11 @@ "recursion_depth": 0, "data": { "id": "REQ-112", - "title": "Streaming Token Bridge Must Emit JSONL Events", - "description": "A new `specsmith chat --json-events` CLI subcommand drives the broker + harness end-to-end and emits a JSONL event stream on stdout with at least the event types `block_start`, `token`, `tool_call`, `tool_result`, `block_complete`, and `task_complete`. Each event is a single JSON object on its own line.", - "source": "src/specsmith/cli.py, src/specsmith/agent/events.py", - "status": "implemented", + "version": 1, + "title": "Ollama Platform Integration", + "description": "Allow specsmith projects to integrate with Ollama for local AI model serving with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-112" ] @@ -2807,11 +2854,11 @@ "id": "REQ-113", "kind": "requirement", "status": "active", - "label": "Block-Based Output Schema", + "label": "OpenTerminal Platform Integration", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2819,10 +2866,11 @@ "recursion_depth": 0, "data": { "id": "REQ-113", - "title": "Block-Based Output Schema", - "description": "Every `block_start` event carries a `block_id`, `kind` (one of `plan`, `message`, `tool_call`, `tool_result`, `diff`, `test_results`, `verdict`), `agent`, and `timestamp`. The corresponding `block_complete` reuses the same `block_id`. Schema is documented in `docs/site/chat-events.md`.", - "source": "src/specsmith/agent/events.py, docs/site/chat-events.md", - "status": "implemented", + "version": 1, + "title": "OpenTerminal Platform Integration", + "description": "Allow specsmith projects to integrate with OpenTerminal for AI terminal interfaces with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-113" ] @@ -2832,11 +2880,11 @@ "id": "REQ-114", "kind": "requirement", "status": "active", - "label": "Plan Block Must Surface Steps", + "label": "Platform Skill Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2844,10 +2892,11 @@ "recursion_depth": 0, "data": { "id": "REQ-114", - "title": "Plan Block Must Surface Steps", - "description": "When the broker classifies an utterance as a `change` and preflight is `accepted`, the chat stream must emit a `plan` block whose payload is a list of `{step_id, title, status}` items. Status transitions (`pending` -> `running` -> `done` / `failed`) are emitted as `plan_step` events keyed by `step_id`.", - "source": "src/specsmith/agent/events.py", - "status": "implemented", + "version": 1, + "title": "Platform Skill Management", + "description": "Allow specsmith projects to manage skills for different AI platforms with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-114" ] @@ -2857,11 +2906,11 @@ "id": "REQ-115", "kind": "requirement", "status": "active", - "label": "Permission/Autonomy Tier Must Be Honored End-to-End", + "label": "Platform Configuration Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2869,10 +2918,11 @@ "recursion_depth": 0, "data": { "id": "REQ-115", - "title": "Permission/Autonomy Tier Must Be Honored End-to-End", - "description": "`specsmith chat` accepts `--profile {safe,standard,open,admin}` (default reads `scaffold.yml`). Under `safe`, every tool call emits a `tool_request` event and waits for an inbound `tool_decision` line on stdin (`{decision: 'approve'|'deny'}`). Under `standard` / `open` the harness proceeds without prompting. The selected profile is recorded in the ledger entry.", - "source": "src/specsmith/cli.py, src/specsmith/profiles.py", - "status": "implemented", + "version": 1, + "title": "Platform Configuration Management", + "description": "Allow specsmith projects to configure AI platform settings and parameters with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-115" ] @@ -2882,11 +2932,11 @@ "id": "REQ-116", "kind": "requirement", "status": "active", - "label": "Inline Diff Review Must Round-Trip Comments", + "label": "Platform Resource Management", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2894,10 +2944,11 @@ "recursion_depth": 0, "data": { "id": "REQ-116", - "title": "Inline Diff Review Must Round-Trip Comments", - "description": "`specsmith chat` emits a `diff` block per file changed by the orchestrator; subsequent stdin lines of the form `{type: 'comment', block_id, path, line, body}` are stored in the session memory and surfaced to the bounded-retry harness as additional context on the next attempt. `--comment` flag on `specsmith verify` does the equivalent for non-streaming use.", - "source": "src/specsmith/agent/events.py, src/specsmith/cli.py", - "status": "implemented", + "version": 1, + "title": "Platform Resource Management", + "description": "Allow specsmith projects to manage platform resources including memory, GPU, and compute with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-116" ] @@ -2907,11 +2958,11 @@ "id": "REQ-117", "kind": "requirement", "status": "active", - "label": "Predict-Only Preflight Must Not Allocate a Work Item", + "label": "Platform Security Controls", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2919,10 +2970,11 @@ "recursion_depth": 0, "data": { "id": "REQ-117", - "title": "Predict-Only Preflight Must Not Allocate a Work Item", - "description": "`specsmith preflight --predict-only --json` returns the same JSON shape as the canonical `preflight` (intent, requirement_ids, instruction, etc.) but with `work_item_id == ''`, no ledger event written, and a new `predicted_refinement` field that suggests a tightened utterance. Used by IDE autocomplete.", - "source": "src/specsmith/cli.py", - "status": "implemented", + "version": 1, + "title": "Platform Security Controls", + "description": "Ensure AI platform integrations follow security best practices with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-117" ] @@ -2932,11 +2984,11 @@ "id": "REQ-118", "kind": "requirement", "status": "active", - "label": "Kairos Must Surface specsmith chat Stream", + "label": "Platform Monitoring and Logging", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -2944,10 +2996,11 @@ "recursion_depth": 0, "data": { "id": "REQ-118", - "title": "Kairos Must Surface specsmith chat Stream", - "description": "The Kairos governance proxy (`/v1/chat/completions`) consumes the `specsmith chat --json-events` JSONL stream and exposes it to the agent session.", - "source": "app/src/settings_view/governance_page.rs, kairos_governance crate", - "status": "implemented", + "version": 1, + "title": "Platform Monitoring and Logging", + "description": "Allow specsmith projects to monitor and log AI platform activities with human approval", + "source": "specsmith governance", + "status": "planned", "test_ids": [ "TEST-118" ] @@ -4707,11 +4760,11 @@ "id": "REQ-190", "kind": "requirement", "status": "active", - "label": "Kairos Terminal Connects via HTTP/WebSocket", + "label": "Terminal Connects via HTTP/WebSocket", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -4719,8 +4772,9 @@ "recursion_depth": 0, "data": { "id": "REQ-190", - "title": "Kairos Terminal Connects via HTTP/WebSocket", - "description": "The Kairos terminal MUST connect to `specsmith serve` over HTTP/WebSocket for all governance operations.", + "version": 1, + "title": "Terminal Connects via HTTP/WebSocket", + "description": "The terminal MUST connect to `specsmith serve` over HTTP/WebSocket for all governance operations.", "source": "docs/PLANNED-REQUIREMENTS.md (SRV-005)", "status": "implemented", "test_ids": [ @@ -5833,11 +5887,11 @@ "id": "REQ-258", "kind": "requirement", "status": "active", - "label": "Kairos ESDB Settings Page", + "label": "ESDB Settings Page", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -5845,9 +5899,10 @@ "recursion_depth": 0, "data": { "id": "REQ-258", - "title": "Kairos ESDB Settings Page", - "description": "The Kairos settings sidebar MUST include an ESDB page under the Specsmith umbrella group. The page MUST display current ESDB status (record count, backend, chain validity) and provide action buttons for Refresh, Export JSON, Import, Backup, Rollback, and Compact.", - "source": "ARCHITECTURE.md [Kairos Settings Extensions]", + "version": 1, + "title": "ESDB Settings Page", + "description": "The settings sidebar MUST include an ESDB page under the Specsmith umbrella group. The page MUST display current ESDB status (record count, backend, chain validity) and provide action buttons for Refresh, Export JSON, Import, Backup, Rollback, and Compact.", + "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": [ "TEST-258" @@ -5858,11 +5913,11 @@ "id": "REQ-259", "kind": "requirement", "status": "active", - "label": "Kairos Skills Settings Page", + "label": "Skills Settings Page", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -5870,9 +5925,10 @@ "recursion_depth": 0, "data": { "id": "REQ-259", - "title": "Kairos Skills Settings Page", - "description": "The Kairos settings sidebar MUST include a Skills page under the Specsmith umbrella group. The page MUST display a description of the Skills system and instructions for using specsmith skills build and related commands.", - "source": "ARCHITECTURE.md [Kairos Settings Extensions]", + "version": 1, + "title": "Skills Settings Page", + "description": "The settings sidebar MUST include a Skills page under the Specsmith umbrella group. The page MUST display a description of the Skills system and instructions for using specsmith skills build and related commands.", + "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": [ "TEST-259" @@ -5883,11 +5939,11 @@ "id": "REQ-260", "kind": "requirement", "status": "active", - "label": "Kairos Eval Settings Page", + "label": "Eval Settings Page", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -5895,9 +5951,10 @@ "recursion_depth": 0, "data": { "id": "REQ-260", - "title": "Kairos Eval Settings Page", - "description": "The Kairos settings sidebar MUST include an Eval page under the Specsmith umbrella group. The page MUST describe the evaluation tracking system and direct users to specsmith eval run for generating reports.", - "source": "ARCHITECTURE.md [Kairos Settings Extensions]", + "version": 1, + "title": "Eval Settings Page", + "description": "The settings sidebar MUST include an Eval page under the Specsmith umbrella group. The page MUST describe the evaluation tracking system and direct users to specsmith eval run for generating reports.", + "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": [ "TEST-260" @@ -5908,11 +5965,11 @@ "id": "REQ-261", "kind": "requirement", "status": "active", - "label": "Kairos AI Providers Table Without Column Overflow", + "label": "AI Providers Table Without Column Overflow", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -5920,9 +5977,10 @@ "recursion_depth": 0, "data": { "id": "REQ-261", - "title": "Kairos AI Providers Table Without Column Overflow", - "description": "The Kairos Agents > Providers settings page MUST display AI models in a table with fixed-width columns (Name: 200px, Model ID: 220px, Context: 80px, Output: 80px) using ConstrainedBox + Clipped elements. Long model names such as o4-mini-deep-research MUST NOT overflow into adjacent columns.", - "source": "ARCHITECTURE.md [Kairos Settings Extensions]", + "version": 1, + "title": "AI Providers Table Without Column Overflow", + "description": "The Agents > Providers settings page MUST display AI models in a table with fixed-width columns (Name: 200px, Model ID: 220px, Context: 80px, Output: 80px) using ConstrainedBox + Clipped elements. Long model names such as o4-mini-deep-research MUST NOT overflow into adjacent columns.", + "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": [ "TEST-261" @@ -5933,11 +5991,11 @@ "id": "REQ-262", "kind": "requirement", "status": "active", - "label": "Kairos MCP AI Builder Card", + "label": "MCP AI Builder Card", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -5945,9 +6003,10 @@ "recursion_depth": 0, "data": { "id": "REQ-262", - "title": "Kairos MCP AI Builder Card", - "description": "The Kairos Agents > MCP servers list page MUST include a collapsible AI Builder card that accepts a natural-language server description, calls specsmith mcp generate --json, displays the generated JSON stub, and offers an 'Add to ~/.specsmith/mcp.json' button that appends the stub to the user's MCP config file.", - "source": "ARCHITECTURE.md [Kairos Settings Extensions]", + "version": 1, + "title": "MCP AI Builder Card", + "description": "The Agents > MCP servers list page MUST include a collapsible AI Builder card that accepts a natural-language server description, calls specsmith mcp generate --json, displays the generated JSON stub, and offers an 'Add to ~/.specsmith/mcp.json' button that appends the stub to the user's MCP config file.", + "source": "ARCHITECTURE.md [Settings Extensions]", "status": "implemented", "test_ids": [ "TEST-262" @@ -6410,11 +6469,11 @@ "id": "REQ-281", "kind": "requirement", "status": "active", - "label": "Kairos AI Settings Bucket Score Display", + "label": "AI Settings Bucket Score Display", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -6422,8 +6481,9 @@ "recursion_depth": 0, "data": { "id": "REQ-281", - "title": "Kairos AI Settings Bucket Score Display", - "description": "The Kairos Agents > Providers settings page MUST display bucket scores (reasoning, conversational, longform) retrieved from `GET /api/model-intel/scores/{model}` for each configured provider. Scores MUST be shown as compact numeric badges. A Sync button MUST call `POST /api/model-intel/sync`.", + "version": 1, + "title": "AI Settings Bucket Score Display", + "description": "The Agents > Providers settings page MUST display bucket scores (reasoning, conversational, longform) retrieved from `GET /api/model-intel/scores/{model}` for each configured provider. Scores MUST be shown as compact numeric badges. A Sync button MUST call `POST /api/model-intel/sync`.", "source": "ARCHITECTURE.md §20–21 [KAI-001]", "status": "implemented", "test_ids": [ @@ -7236,11 +7296,11 @@ "id": "REQ-332", "kind": "requirement", "status": "active", - "label": "Kairos Live DAG Graph Panel", + "label": "Live DAG Graph Panel", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -7248,8 +7308,9 @@ "recursion_depth": 0, "data": { "id": "REQ-332", - "title": "Kairos Live DAG Graph Panel", - "description": "Kairos MUST render a DispatchPanelView that subscribes to GET /api/dispatch/events SSE and renders an SVG DAG graph with nodes coloured by status (pending=grey, running=blue, completed=green, failed=red, blocked=amber) and directed edges showing dependencies. A node click MUST open a side panel with role, summary, files changed, and ESDB record ID.", + "version": 1, + "title": "Live DAG Graph Panel", + "description": "MUST render a DispatchPanelView that subscribes to GET /api/dispatch/events SSE and renders an SVG DAG graph with nodes coloured by status (pending=grey, running=blue, completed=green, failed=red, blocked=amber) and directed edges showing dependencies. A node click MUST open a side panel with role, summary, files changed, and ESDB record ID.", "source": "ARCHITECTURE.md §Multi-Agent DAG Dispatcher", "status": "implemented", "test_ids": [ @@ -7261,11 +7322,11 @@ "id": "REQ-333", "kind": "requirement", "status": "active", - "label": "Kairos Gantt Timeline Strip", + "label": "Gantt Timeline Strip", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -7273,8 +7334,9 @@ "recursion_depth": 0, "data": { "id": "REQ-333", - "title": "Kairos Gantt Timeline Strip", - "description": "Kairos MUST render a GanttStrip alongside the DAG graph showing a horizontal timeline bar per node, filled as the node transitions from pending to running to completed, visually indicating parallel execution overlap.", + "version": 1, + "title": "Gantt Timeline Strip", + "description": "MUST render a GanttStrip alongside the DAG graph showing a horizontal timeline bar per node, filled as the node transitions from pending to running to completed, visually indicating parallel execution overlap.", "source": "ARCHITECTURE.md §Multi-Agent DAG Dispatcher", "status": "implemented", "test_ids": [ @@ -7286,11 +7348,11 @@ "id": "REQ-334", "kind": "requirement", "status": "active", - "label": "Kairos Per-Node Retry and Abort Controls", + "label": "Per-Node Retry and Abort Controls", "confidence": 0.7, "source_type": "observed", "evidence": [ - "migrated from requirements.json" + "synced from requirements.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -7298,8 +7360,9 @@ "recursion_depth": 0, "data": { "id": "REQ-334", - "title": "Kairos Per-Node Retry and Abort Controls", - "description": "Kairos MUST provide a Retry button on FAILED and BLOCKED nodes (calls POST /api/dispatch/retry) and an Abort button on RUNNING nodes (calls POST /api/dispatch/abort). Retry and Abort MUST be disabled when not applicable to the node status.", + "version": 1, + "title": "Per-Node Retry and Abort Controls", + "description": "MUST provide a Retry button on FAILED and BLOCKED nodes (calls POST /api/dispatch/retry) and an Abort button on RUNNING nodes (calls POST /api/dispatch/abort). Retry and Abort MUST be disabled when not applicable to the node status.", "source": "ARCHITECTURE.md §Multi-Agent DAG Dispatcher", "status": "implemented", "test_ids": [ @@ -10867,11 +10930,11 @@ "id": "TEST-106", "kind": "testcase", "status": "active", - "label": "Kairos Governance Page Surfaces Preflight/Verify/Trace", + "label": "Governance Page Surfaces Preflight/Verify/Trace", "confidence": 1.0, "source_type": "observed", "evidence": [ - "migrated from testcases.json" + "synced from testcases.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -10879,8 +10942,9 @@ "recursion_depth": 0, "data": { "id": "TEST-106", - "title": "Kairos Governance Page Surfaces Preflight/Verify/Trace", - "description": "The Kairos Governance settings page shows the governance-serve health status, the BYOE endpoint URL, and the specsmith updater.", + "version": 1, + "title": "Governance Page Surfaces Preflight/Verify/Trace", + "description": "The Governance settings page shows the governance-serve health status, the BYOE endpoint URL, and the specsmith updater.", "requirement_id": "REQ-106", "type": "integration", "verification_method": "evaluator", @@ -11179,11 +11243,11 @@ "id": "TEST-118", "kind": "testcase", "status": "active", - "label": "Kairos BYOE Proxy Consumes Chat Stream", + "label": "BYOE Proxy Consumes Chat Stream", "confidence": 1.0, "source_type": "observed", "evidence": [ - "migrated from testcases.json" + "synced from testcases.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -11191,8 +11255,9 @@ "recursion_depth": 0, "data": { "id": "TEST-118", - "title": "Kairos BYOE Proxy Consumes Chat Stream", - "description": "The Kairos governance proxy at `http://127.0.0.1:7700/v1/chat/completions` accepts agent requests and forwards them through specsmith preflight/verify. *The legacy openChat command test has been retired.*", + "version": 1, + "title": "BYOE Proxy Consumes Chat Stream", + "description": "The governance proxy at `http://127.0.0.1:7700/v1/chat/completions` accepts agent requests and forwards them through specsmith preflight/verify. *The legacy openChat command test has been retired.*", "requirement_id": "REQ-118", "type": "integration", "verification_method": "evaluator", @@ -13025,11 +13090,11 @@ "id": "TEST-190", "kind": "testcase", "status": "active", - "label": "Kairos Terminal Connects via HTTP/WebSocket", + "label": "Terminal Connects via HTTP/WebSocket", "confidence": 1.0, "source_type": "observed", "evidence": [ - "migrated from testcases.json" + "synced from testcases.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -13037,8 +13102,9 @@ "recursion_depth": 0, "data": { "id": "TEST-190", - "title": "Kairos Terminal Connects via HTTP/WebSocket", - "description": "The Kairos terminal MUST connect to `specsmith serve` over HTTP/WebSocket for all governance operations.", + "version": 1, + "title": "Terminal Connects via HTTP/WebSocket", + "description": "The terminal MUST connect to `specsmith serve` over HTTP/WebSocket for all governance operations.", "requirement_id": "REQ-190", "type": "unit", "verification_method": "evaluator", @@ -14221,11 +14287,11 @@ "id": "TEST-258", "kind": "testcase", "status": "active", - "label": "Kairos ESDB Settings Page Renders Without Overflow", + "label": "ESDB Settings Page Renders Without Overflow", "confidence": 1.0, "source_type": "observed", "evidence": [ - "migrated from testcases.json" + "synced from testcases.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -14233,8 +14299,9 @@ "recursion_depth": 0, "data": { "id": "TEST-258", - "title": "Kairos ESDB Settings Page Renders Without Overflow", - "description": "The Kairos Settings > Specsmith > ESDB page renders the status row, action buttons (Refresh, Export JSON, Import, Backup, Rollback, Compact) without layout errors.", + "version": 1, + "title": "ESDB Settings Page Renders Without Overflow", + "description": "The Settings > Specsmith > ESDB page renders the status row, action buttons (Refresh, Export JSON, Import, Backup, Rollback, Compact) without layout errors.", "requirement_id": "REQ-258", "type": "integration", "verification_method": "manual (Rust UI build required)", @@ -14247,11 +14314,11 @@ "id": "TEST-259", "kind": "testcase", "status": "active", - "label": "Kairos Skills Settings Page Renders", + "label": "Skills Settings Page Renders", "confidence": 1.0, "source_type": "observed", "evidence": [ - "migrated from testcases.json" + "synced from testcases.json" ], "epistemic_boundary": [], "is_hypothesis": false, @@ -14259,8 +14326,9 @@ "recursion_depth": 0, "data": { "id": "TEST-259", - "title": "Kairos Skills Settings Page Renders", - "description": "The Kairos Settings > Specsmith > Skills page renders header, description, and CLI hint without errors.", + "version": 1, + "title": "Skills Settings Page Renders", + "description": "The Settings > Specsmith > Skills page renders header, description, and CLI hint without errors.", "requirement_id": "REQ-259", "type": "integration", "verification_method": "manual (Rust UI build required)", @@ -19912,6 +19980,1188 @@ "spec_version": "0.17.1" } } + }, + { + "id": "LED-FBC090B5C988", + "kind": "ledger_event", + "status": "active", + "label": "specsmith migration: 0.19.2 → 0.20.1", + "confidence": 0.9, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "description": "specsmith migration: 0.19.2 → 0.20.1", + "entry_type": "migration", + "author": "specsmith", + "reqs": "", + "status": "complete", + "epistemic_status": "unknown", + "belief_artifacts": "", + "entry_hash": "087ee05e1059ce808421e8c2ca68cb50034083cc1164b614b566309e2f4c5e95", + "timestamp": "2026-06-29T18:07:15.254736+00:00" + } + }, + { + "id": "MET-S-A4976835", + "kind": "session_metric", + "status": "active", + "label": "S-A4976835: tokens=0 passed=True", + "confidence": 0.8, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "session_id": "S-A4976835", + "timestamp": "2026-06-29T18:10:29Z", + "input_tokens": 0, + "output_tokens": 0, + "cost_usd": 0.0, + "quality_score": 0.0, + "passed": true, + "rework_turns": 1, + "work_item_id": "", + "model": "", + "command": "save", + "notes": "", + "tokens_total": 0 + } + }, + { + "id": "WI-0F3467ED", + "kind": "work_item", + "status": "active", + "label": "When a user reads README.md or the RTD docs they can find step-by-step instructions for using specsmith as a standalone CLI and for integrating it with Warp, Cursor, Windsurf, Claude Code, Gemini CLI,", + "confidence": 0.85, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "status": "open", + "kind": "feature", + "verified": false, + "promoted_to_req": "", + "blast_radius_estimate": "", + "created_at": "2026-06-29T18:15:32Z", + "updated_at": "2026-06-29T18:15:32Z", + "closed_reason": "" + } + }, + { + "id": "PF-WI-0F3467ED", + "kind": "preflight_decision", + "status": "active", + "label": "Read-only ask; no governance changes required.", + "confidence": 0.85, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "decision": "accepted", + "intent": "read_only_ask", + "work_item_id": "WI-0F3467ED", + "test_case_ids": [], + "instruction": "Read-only ask; no governance changes required.", + "ai_disclosure": { + "governed_by": "specsmith", + "governance_gated": true, + "provider": "local/heuristic", + "model": "deterministic-broker", + "spec_version": "0.20.1" + } + } + }, + { + "id": "MET-S-5A6A4208", + "kind": "session_metric", + "status": "active", + "label": "S-5A6A4208: tokens=0 passed=True", + "confidence": 0.8, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "session_id": "S-5A6A4208", + "timestamp": "2026-06-29T18:22:32Z", + "input_tokens": 0, + "output_tokens": 0, + "cost_usd": 0.0, + "quality_score": 0.0, + "passed": true, + "rework_turns": 1, + "work_item_id": "", + "model": "", + "command": "save", + "notes": "", + "tokens_total": 0 + } + }, + { + "id": "WI-43BF4538", + "kind": "work_item", + "status": "active", + "label": "When specsmith run is active inside Warp terminal, Warp shows the coding agent toolbar and emits desktop notifications for key governance events", + "confidence": 0.85, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "status": "open", + "kind": "feature", + "verified": false, + "promoted_to_req": "", + "blast_radius_estimate": "", + "created_at": "2026-06-29T18:32:43Z", + "updated_at": "2026-06-29T18:32:43Z", + "closed_reason": "" + } + }, + { + "id": "PF-WI-43BF4538", + "kind": "preflight_decision", + "status": "active", + "label": "Read-only ask; no governance changes required.", + "confidence": 0.85, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "decision": "accepted", + "intent": "read_only_ask", + "work_item_id": "WI-43BF4538", + "test_case_ids": [], + "instruction": "Read-only ask; no governance changes required.", + "ai_disclosure": { + "governed_by": "specsmith", + "governance_gated": true, + "provider": "local/heuristic", + "model": "deterministic-broker", + "spec_version": "0.20.1" + } + } + }, + { + "id": "MET-S-3F68DF53", + "kind": "session_metric", + "status": "active", + "label": "S-3F68DF53: tokens=0 passed=True", + "confidence": 0.8, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "session_id": "S-3F68DF53", + "timestamp": "2026-06-29T18:39:20Z", + "input_tokens": 0, + "output_tokens": 0, + "cost_usd": 0.0, + "quality_score": 0.0, + "passed": true, + "rework_turns": 1, + "work_item_id": "", + "model": "", + "command": "save", + "notes": "", + "tokens_total": 0 + } + }, + { + "id": "WI-093974D5", + "kind": "work_item", + "status": "active", + "label": "Implement issues #299 and #300: return an explicit non-blocking out-of-scope decision for environment-only SpecSmith CLI upgrades, and ensure every --help invocation is read-only with no migration or ", + "confidence": 0.9, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "status": "open", + "kind": "feature", + "verified": false, + "promoted_to_req": "", + "blast_radius_estimate": "", + "created_at": "2026-07-13T23:46:09Z", + "updated_at": "2026-07-13T23:46:09Z", + "closed_reason": "" + } + }, + { + "id": "PF-WI-093974D5", + "kind": "preflight_decision", + "status": "active", + "label": "Release operations require explicit confirmation. Specify the target version and channel, or cite a release-management requirement via --req REQ-050 / --req REQ-051.", + "confidence": 0.9, + "source_type": "observed", + "evidence": [], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "decision": "needs_clarification", + "intent": "release", + "work_item_id": "WI-093974D5", + "test_case_ids": [], + "instruction": "Release operations require explicit confirmation. Specify the target version and channel, or cite a release-management requirement via --req REQ-050 / --req REQ-051.", + "ai_disclosure": { + "governed_by": "specsmith", + "governance_gated": true, + "provider": "local/heuristic", + "model": "deterministic-broker", + "spec_version": "0.22.1" + } + } + }, + { + "id": "WI-003B068E", + "kind": "work_item", + "status": "active", + "label": "Fix issues #299 and #300 under REQ-369 and REQ-418: classify pipx-managed CLI upgrades as environment-only without a clarification loop, and make preflight help read-only. [REQ-369 REQ-418]", + "confidence": 0.8, + "source_type": "observed", + "evidence": [ + "REQ-369", + "REQ-418", + "TEST-370", + "TEST-428" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "status": "open", + "kind": "feature", + "verified": false, + "promoted_to_req": "", + "blast_radius_estimate": "", + "created_at": "2026-07-13T23:47:57Z", + "updated_at": "2026-07-13T23:47:57Z", + "closed_reason": "" + } + }, + { + "id": "PF-WI-003B068E", + "kind": "preflight_decision", + "status": "active", + "label": "Change request matched existing governance scope. Proceed under Specsmith verification.", + "confidence": 0.8, + "source_type": "observed", + "evidence": [ + "REQ-369", + "REQ-418" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "decision": "accepted", + "intent": "change", + "work_item_id": "WI-003B068E", + "test_case_ids": [ + "TEST-370", + "TEST-428" + ], + "instruction": "Change request matched existing governance scope. Proceed under Specsmith verification.", + "ai_disclosure": { + "governed_by": "specsmith", + "governance_gated": true, + "provider": "local/heuristic", + "model": "deterministic-broker", + "spec_version": "0.22.1" + } + } + }, + { + "id": "REQ-423", + "kind": "requirement", + "status": "active", + "label": "Governed benchmark agents must achieve 100% pass rate across all tasks and conditions", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-423", + "version": 1, + "title": "Governed benchmark agents must achieve 100% pass rate across all tasks and conditions", + "description": "All specsmith conditions (LIGHT, FULL, DISPATCH) must pass all benchmark tasks including T13 CLI tasks with stdout discipline and T10 route-ordering traps", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-433" + ] + } + }, + { + "id": "REQ-424", + "kind": "requirement", + "status": "active", + "label": "CI pipeline must produce zero CodeQL static analysis alerts on every run", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-424", + "version": 1, + "title": "CI pipeline must produce zero CodeQL static analysis alerts on every run", + "description": "Promoted from WI-0CEA445B. The codebase must produce zero CodeQL static analysis alerts on every CI run", + "source": "WI-0CEA445B", + "status": "planned", + "test_ids": [ + "TEST-434" + ] + } + }, + { + "id": "REQ-425", + "kind": "requirement", + "status": "active", + "label": "Governed agents must autonomously resolve preflight needs_clarification without blocking", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-425", + "version": 1, + "title": "Governed agents must autonomously resolve preflight needs_clarification without blocking", + "description": "Promoted from WI-B73B339B. The benchmark harness must never deadlock on preflight needs_clarification — governed agents must autonomously resolve missing requirements and always produce a passing implementation", + "source": "WI-B73B339B", + "status": "planned", + "test_ids": [ + "TEST-435" + ] + } + }, + { + "id": "REQ-426", + "kind": "requirement", + "status": "active", + "label": "Benchmark harness completion token budget must allow reasoning models to produce tool calls", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-426", + "version": 1, + "title": "Benchmark harness completion token budget must allow reasoning models to produce tool calls", + "description": "max_completion_tokens must be at least 32768 for gpt-5.x and o-series models to prevent reasoning token exhaustion truncating tool call output", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-436" + ] + } + }, + { + "id": "REQ-427", + "kind": "requirement", + "status": "active", + "label": "GovernanceBench metrics/report statistical and leaderboard outputs", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-427", + "version": 1, + "title": "GovernanceBench metrics/report statistical and leaderboard outputs", + "description": "GovernanceBench metrics/report shall compute Wilson pass-rate confidence intervals, bootstrap cost-of-pass confidence intervals, first-pass and consistency statistics, scaffold-lift vs UNGOVERNED, model-tier mapping, democratization and Pareto summaries, and Hugging Face leaderboard JSON/rendered report sections.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-437", + "TEST-438", + "TEST-440", + "TEST-441" + ] + } + }, + { + "id": "REQ-428", + "kind": "requirement", + "status": "active", + "label": "gitignore normalizer must enforce disjoint allow/deny policy and untrack diverged paths", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-428", + "version": 1, + "title": "gitignore normalizer must enforce disjoint allow/deny policy and untrack diverged paths", + "description": "normalize_esdb_gitignore_policy in sync.py must (a) separate tracked paths from ignored paths in two disjoint sets, (b) never emit a bare ignore rule for a path it also allows, (c) run git rm --cached for any deny-listed path found in git ls-files, and (d) make esdb_migration_manifest.json explicitly tracked", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-439" + ] + } + }, + { + "id": "REQ-429", + "kind": "requirement", + "status": "active", + "label": "checkpoint ESDB field must reflect active backend: show SQLite record count and chain status when chronomemory is unavailable, ChronoMemory count otherwise, and N/A when no ESDB is present", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-429", + "version": 1, + "title": "checkpoint ESDB field must reflect active backend: show SQLite record count and chain status when chronomemory is unavailable, ChronoMemory count otherwise, and N/A when no ESDB is present", + "description": "The 'specsmith checkpoint' GOVERNANCE ANCHOR box must accurately show the active ESDB backend. When chronomemory (commercial) is the active backend and WAL exists, show record count and chain validity as now. When SQLite is the active backend (chronomemory absent or WAL missing), show 'SQLite (N recs, ✓ chain)' with actual SqliteStore record count and chain_valid() result. When no ESDB is present at all, show 'N/A'. The current 0-record default is misleading for SQLite-only installations.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-442" + ] + } + }, + { + "id": "REQ-430", + "kind": "requirement", + "status": "active", + "label": "preflight release classifier must distinguish release execution from release tooling edits", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-430", + "version": 1, + "title": "preflight release classifier must distinguish release execution from release tooling edits", + "description": "The deterministic broker must not classify edits to release.yml, packaging scripts, dist files, and release documentation as intent=release. Only utterances that explicitly execute a release (cut, publish, ship, tag vX.Y.Z, bump version) should trigger the release gate. Maintenance of release tooling must fall through to CHANGE classification so it can be accepted by scope-matching.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-443", + "TEST-445" + ] + } + }, + { + "id": "REQ-431", + "kind": "requirement", + "status": "active", + "label": "preflight release intent must accept when known scope matched or explicit REQ cited, and always allocate a work item", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-431", + "version": 1, + "title": "preflight release intent must accept when known scope matched or explicit REQ cited, and always allocate a work item", + "description": "When intent=release is classified: (a) if the utterance contains explicit release-management REQ IDs (e.g. REQ-050, REQ-051) or the scope confidence >= 0.6, the decision must be accepted as a governed change; (b) needs_clarification must still allocate a work_item_id so specsmith approve --work-item can proceed; (c) the instruction must reference --req flag for explicit override. The current dead-end (needs_clarification + empty work_item_id) makes approve impossible.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-444" + ] + } + }, + { + "id": "REQ-432", + "kind": "requirement", + "status": "active", + "label": "audit must flag empty or fallback-only governance YAML rule sets", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-432", + "version": 1, + "title": "audit must flag empty or fallback-only governance YAML rule sets", + "description": "check_governance_yaml_content must iterate .specsmith/governance/*.yaml; fail audit if any file has rules: [] or rules: [{note: ...}] only. Gate on presence of governance dir. m001 silent-skip when source_md missing must become a loud warning.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-446", + "TEST-452" + ] + } + }, + { + "id": "REQ-433", + "kind": "requirement", + "status": "active", + "label": "sync must warn when REQUIREMENTS.md contains REQ IDs absent from docs/requirements YAML files", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-433", + "version": 1, + "title": "sync must warn when REQUIREMENTS.md contains REQ IDs absent from docs/requirements YAML files", + "description": "In YAML-first mode run_sync must compare IDs in docs/REQUIREMENTS.md against those loaded from docs/requirements/*.yml; emit SyncWarning for any ID present in markdown but absent from YAML with hint to add to yml and re-run sync. Same pattern for TESTS.md vs docs/tests/*.yml.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-447", + "TEST-448" + ] + } + }, + { + "id": "REQ-434", + "kind": "requirement", + "status": "active", + "label": "CLI verify_cmd must wire equilibrium to WI mark_implemented and files_touched", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-434", + "version": 1, + "title": "CLI verify_cmd must wire equilibrium to WI mark_implemented and files_touched", + "description": "verify_cmd (cli.py) computes equilibrium but never calls WorkItemStore.mark_implemented or sets files_touched on the WI, unlike governance_logic.run_verify. verify_cmd must call run_verify from governance_logic or mirror the WI-update logic so WI status advances to implemented on equilibrium.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-449" + ] + } + }, + { + "id": "REQ-435", + "kind": "requirement", + "status": "active", + "label": "infer_scope must apply a minimum relevance score threshold to drop incidental matches", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-435", + "version": 1, + "title": "infer_scope must apply a minimum relevance score threshold to drop incidental matches", + "description": "infer_scope currently returns up to top_k=3 results with no minimum score floor (only overlap>0). Add min_score=0.15 parameter; filter out matches below threshold before returning. Update run_preflight to pass min_score=0.15 so only genuinely related requirements are associated with work items.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-450" + ] + } + }, + { + "id": "REQ-436", + "kind": "requirement", + "status": "active", + "label": "session_metrics.jsonl must record real token counts, cost, model, and work_item_id per turn", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-436", + "version": 1, + "title": "session_metrics.jsonl must record real token counts, cost, model, and work_item_id per turn", + "description": "session_metrics.jsonl auto-save path passes only command=save with all telemetry defaults zero. Real per-turn token usage is captured in ESDB token_metric via write_token_metric (runner.py:614). Add flush_session_metrics helper that reads the most recent ESDB token_metric record and appends a populated MetricsRecord to session_metrics.jsonl after write_token_metric is called.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-451" + ] + } + }, + { + "id": "REQ-437", + "kind": "requirement", + "status": "active", + "label": "Datasource adapters must define retrieval contracts, resilience behavior, and citation normalization guarantees", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-437", + "version": 1, + "title": "Datasource adapters must define retrieval contracts, resilience behavior, and citation normalization guarantees", + "description": "The datasources module (src/specsmith/datasources/) provides patent, publication, and citation adapters. Each adapter must declare a typed retrieval contract, handle transient failures with retry/backoff, and normalize citation output to a canonical schema. Absence of these guarantees makes adapter output unpredictable for governance evidence packs.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-453" + ] + } + }, + { + "id": "REQ-438", + "kind": "requirement", + "status": "active", + "label": "GUI commands and views must provide governed parity with core CLI state and error semantics", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-438", + "version": 1, + "title": "GUI commands and views must provide governed parity with core CLI state and error semantics", + "description": "The GUI surface (src/specsmith/gui/) exposes governance state visually. Every GUI action that maps to a CLI command must produce identical governance outcomes (preflight, audit, sync). GUI error messages must be derived from the same error taxonomy as the CLI. No silent failures.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-454" + ] + } + }, + { + "id": "REQ-439", + "kind": "requirement", + "status": "active", + "label": "IDE integration adapters must implement a uniform capability and error-handling contract", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-439", + "version": 1, + "title": "IDE integration adapters must implement a uniform capability and error-handling contract", + "description": "Integration adapters (src/specsmith/integrations/: aider, copilot, cursor, gemini, windsurf, claude) must each declare supported operations, degrade gracefully when the target tool is unavailable, and surface errors through specsmith governance events rather than silent fallbacks.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-455" + ] + } + }, + { + "id": "REQ-440", + "kind": "requirement", + "status": "active", + "label": "Plugin management must define install, list, remove, and compatibility validation requirements", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-440", + "version": 1, + "title": "Plugin management must define install, list, remove, and compatibility validation requirements", + "description": "The plugin lifecycle (specsmith plugin command + src/specsmith/plugins.py) must: enumerate installed plugins (list), validate manifests on install, reject incompatible plugin versions, and support removal without leaving orphaned state. Plugin errors must not propagate to core governance commands.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-456" + ] + } + }, + { + "id": "REQ-441", + "kind": "requirement", + "status": "active", + "label": "specsmith plugin CLI must document and enforce plugin command surface (list, validate, install, remove)", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-441", + "version": 1, + "title": "specsmith plugin CLI must document and enforce plugin command surface (list, validate, install, remove)", + "description": "The specsmith plugin command is a CLI surface with no explicit REQ. It must: list all installed entry-point and manifest plugins (plugin list), validate plugin manifests before activation (plugin validate), and provide clear error messages when plugins fail to load.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-457" + ] + } + }, + { + "id": "REQ-442", + "kind": "requirement", + "status": "active", + "label": "specsmith pr CLI must cover governed pull request creation, status, and merge workflows", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-442", + "version": 1, + "title": "specsmith pr CLI must cover governed pull request creation, status, and merge workflows", + "description": "The specsmith pr (create-pr/governed-pr) command surface has no explicit REQ. It must: create PRs with governance comment blocks, evaluate PR governance status against open WIs, and block merge on policy violations when --required-check is set.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-458" + ] + } + }, + { + "id": "REQ-443", + "kind": "requirement", + "status": "active", + "label": "specsmith ps CLI must surface process and session state for all tracked agent runs", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-443", + "version": 1, + "title": "specsmith ps CLI must surface process and session state for all tracked agent runs", + "description": "The specsmith ps command has no explicit REQ. It must list all tracked PIDs from .specsmith/pids/, report status (running/stopped/unknown) for each, and integrate with kill-session so process cleanup is auditable and idempotent.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-459" + ] + } + }, + { + "id": "REQ-444", + "kind": "requirement", + "status": "active", + "label": "Native Warp integration", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-444", + "version": 1, + "title": "Native Warp integration", + "description": "specsmith provides a first-class Warp integration: a 'warp' integration adapter (specsmith integrate warp) that generates Warp-native artifacts (MCP governance server config, a Tab Config for a governed session, and a governance skill) so Warp's agent is governed by specsmith; and the 'specsmith run' REPL detects when it runs inside Warp (TERM_PROGRAM/WARP_*) and adapts its banner/ready frame accordingly.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-460" + ] + } + }, + { + "id": "REQ-445", + "kind": "requirement", + "status": "active", + "label": "VRAM-aware local model recommendations", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-445", + "version": 1, + "title": "VRAM-aware local model recommendations", + "description": "First-class Ollama model recommendation engine: a model catalog with approximate Q4 VRAM footprints and a recommend_models(vram_gb)/recommend_for_hardware() API that selects a role lineup (default/coding, fast scratch, harder pass/reasoning, general) keyed by the detected GPU VRAM tier, with per-model fit assessment (fits/tight/spills-to-RAM). Exposed via 'specsmith local-model recommend' (+ --json). Must not change existing detect_local_model/detect_local_models behavior.", + "source": "docs/requirements/", + "status": "planned", + "test_ids": [ + "TEST-461" + ] + } + }, + { + "id": "REQ-446", + "kind": "requirement", + "status": "active", + "label": "Epistemic chat condensation and agent handoff", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-446", + "version": 1, + "title": "Epistemic chat condensation and agent handoff", + "description": "Specsmith shall safely condense chat/session context into provenance-preserving ESDB artifacts that retain source identifiers, confidence, uncertainty, unresolved decisions, active work items, and validation status; reject or flag unsupported claims; restore usable context after compaction; and export/import a portable handoff envelope interoperable with Specsmith agents and Zoo-Code.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-462" + ] + } + }, + { + "id": "REQ-447", + "kind": "requirement", + "status": "active", + "label": "Git-safe ESDB session persistence", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-447", + "version": 1, + "title": "Git-safe ESDB session persistence", + "description": "Specsmith shall store session and ESDB history in a deterministic, append-friendly, text-based canonical representation that can be merged across branches without lost or duplicated events; local SQLite databases and WAL sidecars shall be derived caches that can be rebuilt safely with validated schema, integrity, and recovery reporting.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-463", + "TEST-471" + ] + } + }, + { + "id": "REQ-448", + "kind": "requirement", + "status": "active", + "label": "Windows launcher resolution diagnostics", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-448", + "version": 1, + "title": "Windows launcher resolution diagnostics", + "description": "On Windows, Specsmith shall detect multiple or shadowed specsmith executables, report the active executable and package version, provide safe pipx-focused remediation, and support PowerShell stderr redirection without a launcher failure.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-464" + ] + } + }, + { + "id": "REQ-449", + "kind": "requirement", + "status": "active", + "label": "Reachable version-mismatch recovery", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-449", + "version": 1, + "title": "Reachable version-mismatch recovery", + "description": "When a project requires a newer development or prerelease Specsmith version than the stable channel provides, Specsmith shall diagnose the channel mismatch, provide an exact supported pipx remediation command, and distinguish it from a normal stable upgrade without permitting backward migration.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-465" + ] + } + }, + { + "id": "REQ-450", + "kind": "requirement", + "status": "active", + "label": "Stable release channel integrity", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-450", + "version": 1, + "title": "Stable release channel integrity", + "description": "Specsmith release automation shall reject PEP 440 development, prerelease, and local versions before stable PyPI upload, publish such artifacts only through an explicit development channel, and verify the stable install and upgrade path in CI.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-466" + ] + } + }, + { + "id": "REQ-451", + "kind": "requirement", + "status": "active", + "label": "Contained work-item persistence paths", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-451", + "version": 1, + "title": "Contained work-item persistence paths", + "description": "Specsmith shall normalize every work-item persistence path with os.path.realpath, reject values outside the project root before filesystem access, and provide the same containment behavior on Windows, Linux, and macOS.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-467" + ] + } + }, + { + "id": "REQ-452", + "kind": "requirement", + "status": "active", + "label": "CodeQL-clean report rendering", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-452", + "version": 1, + "title": "CodeQL-clean report rendering", + "description": "Specsmith shall render quality reports without CodeQL implicit string concatenation findings while preserving the report content and formatting.", + "source": "docs/requirements/", + "status": "implemented", + "test_ids": [ + "TEST-468" + ] + } + }, + { + "id": "REQ-453", + "kind": "requirement", + "status": "active", + "label": "Release candidate quality gates", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-453", + "version": 1, + "title": "Release candidate quality gates", + "description": "Before release, Specsmith shall pass strict linting, formatting, type checking, the complete test suite, strict documentation build, runtime dependency audit, and governance audit without unresolved issues.", + "source": "CI, release workflow, and release validation", + "status": "implemented", + "test_ids": [ + "TEST-469" + ] + } + }, + { + "id": "REQ-454", + "kind": "requirement", + "status": "active", + "label": "Single-branch workflow default", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-454", + "version": 1, + "title": "Single-branch workflow default", + "description": "Specsmith shall default new projects to a single-branch workflow on the configured default branch, refuse branch creation until a different branching strategy is explicitly enabled through specsmith, and preserve GitFlow, trunk-based, and GitHub-flow behavior after opt-in.", + "source": "Git workflow governance", + "status": "implemented", + "test_ids": [ + "TEST-470" + ] + } + }, + { + "id": "REQ-455", + "kind": "requirement", + "status": "active", + "label": "Environment-only SpecSmith CLI upgrades are non-blocking", + "confidence": 0.7, + "source_type": "observed", + "evidence": [ + "synced from requirements.json" + ], + "epistemic_boundary": [], + "is_hypothesis": false, + "model_assumptions": {}, + "recursion_depth": 0, + "data": { + "id": "REQ-455", + "version": 1, + "title": "Environment-only SpecSmith CLI upgrades are non-blocking", + "description": "A preflight request limited to upgrading or installing the pipx-managed local SpecSmith CLI MUST return the explicit environment_only decision with exit code 0, no work item, no ESDB or ledger record, and instructions to use pipx. It MUST NOT require repository requirement matching or clarification.", + "source": "GitHub issue #299", + "status": "planned", + "test_ids": [] + } } ] } \ No newline at end of file diff --git a/.specsmith/requirements.json b/.specsmith/requirements.json index a450190b..6a9135e3 100644 --- a/.specsmith/requirements.json +++ b/.specsmith/requirements.json @@ -2893,7 +2893,8 @@ "source": "ARCHITECTURE.md §ESDB / ChronoStore", "status": "implemented", "test_ids": [ - "TEST-305" + "TEST-305", + "TEST-478" ] }, { @@ -3234,7 +3235,8 @@ "source": "ARCHITECTURE.md §CI Automation Manager — save/load Commands", "status": "implemented", "test_ids": [ - "TEST-336" + "TEST-336", + "TEST-477" ] }, { @@ -3399,7 +3401,8 @@ "source": "ARCHITECTURE.md §Session Governance Protocol", "status": "implemented", "test_ids": [ - "TEST-351" + "TEST-351", + "TEST-479" ] }, { @@ -3600,7 +3603,8 @@ "source": "user requirement", "status": "accepted", "test_ids": [ - "TEST-370" + "TEST-370", + "TEST-476" ] }, { @@ -4546,5 +4550,27 @@ "test_ids": [ "TEST-470" ] + }, + { + "id": "REQ-455", + "version": 1, + "title": "Environment-only SpecSmith CLI upgrades are non-blocking", + "description": "A preflight request limited to upgrading or installing the pipx-managed local SpecSmith CLI MUST return the explicit environment_only decision with exit code 0, no work item, no ESDB or ledger record, and instructions to use pipx. It MUST NOT require repository requirement matching or clarification.", + "source": "GitHub issue #299", + "status": "implemented", + "test_ids": [ + "TEST-474" + ] + }, + { + "id": "REQ-456", + "version": 1, + "title": "SpecSmith CLI help is side-effect free", + "description": "Every SpecSmith CLI invocation containing --help MUST return usage without project migration, update checks, ledger writes, ESDB writes, work-item allocation, or project-file creation or modification. Migration remains available only through an explicit operational command.", + "source": "GitHub issue #300", + "status": "implemented", + "test_ids": [ + "TEST-475" + ] } ] \ No newline at end of file diff --git a/.specsmith/testcases.json b/.specsmith/testcases.json index e60f1d42..da0eea56 100644 --- a/.specsmith/testcases.json +++ b/.specsmith/testcases.json @@ -5134,5 +5134,77 @@ "input": {}, "expected_behavior": {}, "confidence": 1.0 + }, + { + "id": "TEST-474", + "version": 1, + "title": "Pipx SpecSmith upgrades return a non-blocking environment-only preflight decision", + "description": "Verify pipx-managed local SpecSmith upgrade language returns environment_only, exits successfully, and does not create governance state.", + "requirement_id": "REQ-455", + "type": "cli", + "verification_method": "pytest tests/test_nexus.py", + "input": {}, + "expected_behavior": {}, + "confidence": 1.0 + }, + { + "id": "TEST-475", + "version": 1, + "title": "Preflight help does not mutate an outdated project", + "description": "Verify specsmith preflight --help leaves an older governed project byte-for-byte unchanged and does not create governance files.", + "requirement_id": "REQ-456", + "type": "cli", + "verification_method": "pytest tests/test_cli.py", + "input": {}, + "expected_behavior": {}, + "confidence": 1.0 + }, + { + "id": "TEST-476", + "version": 1, + "title": "Release metadata and embedded project schema versions agree", + "description": "Verify pyproject metadata, source fallback, default scaffold schema, and shipped wheel metadata use the same release version.", + "requirement_id": "REQ-369", + "type": "build", + "verification_method": "pytest tests/test_release_version_contract.py", + "input": {}, + "expected_behavior": {}, + "confidence": 1.0 + }, + { + "id": "TEST-477", + "version": 1, + "title": "Save falls back to the symbolic branch in the supplied worktree", + "description": "Verify save push resolves main from the supplied Git worktree when git branch --show-current returns no value and reports the inspected worktree if no branch exists.", + "requirement_id": "REQ-336", + "type": "unit", + "verification_method": "pytest tests/test_vcs_commands.py", + "input": {}, + "expected_behavior": {}, + "confidence": 1.0 + }, + { + "id": "TEST-478", + "version": 1, + "title": "ESDB migration repairs a verified legacy ChronoMemory WAL chain", + "description": "Verify an invalid ChronoStore chain is backed up, compacted, revalidated, and recorded in the migration manifest.", + "requirement_id": "REQ-305", + "type": "unit", + "verification_method": "pytest tests/test_esdb_migrate_wal_repair.py", + "input": {}, + "expected_behavior": {}, + "confidence": 1.0 + }, + { + "id": "TEST-479", + "version": 1, + "title": "Governance checkpoint anchor uses ASCII fixed-width rows", + "description": "Verify human checkpoint output uses ASCII borders and status words only, with every row the same fixed width.", + "requirement_id": "REQ-351", + "type": "cli", + "verification_method": "pytest tests/test_cli.py", + "input": {}, + "expected_behavior": {}, + "confidence": 1.0 } ] \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d5260203..276a179c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,10 +10,25 @@ consolidated into the next published release. ## [Unreleased] +## [0.22.2] - 2026-07-14 + ### Fixed - **Read the Docs latest deployment** - The manual RTD workflow now configures the canonical `layer1labs/specsmith` repository and `main` default branch, synchronizes versions, verifies `latest` maps to `main`, and fails on rejected API responses. +- **Environment-only preflight loop** (#299) - `pipx`-managed local SpecSmith CLI + maintenance now returns a non-blocking `environment_only` decision without creating + project work items, ledger entries, or ESDB records. +- **Mutating help path** (#300) - `--help` now bypasses automatic migration and update + checks, keeping help invocations side-effect free even for an outdated project. +- **Release/schema provenance** (#301) - release metadata, source fallback, and the + default project schema are covered by a single version-parity contract. +- **Save branch detection** (#302) - `save` falls back to Git's symbolic HEAD branch + and reports the inspected worktree when HEAD is genuinely detached. +- **Legacy ChronoMemory WAL repair** (#303) - `esdb migrate` backs up and compacts a + detected invalid legacy chain, revalidates it, and records the outcome in its manifest. +- **Governance anchor rendering** - checkpoint output now uses ASCII-only borders and + fixed-width rows with `OK`/`FAIL` status words. ## [0.22.1] - 2026-07-13 ### Fixed @@ -933,7 +948,8 @@ See git history for per-commit details on intermediate versions. --- -[Unreleased]: https://github.com/layer1labs/specsmith/compare/v0.22.1...HEAD +[Unreleased]: https://github.com/layer1labs/specsmith/compare/v0.22.2...HEAD +[0.22.2]: https://github.com/layer1labs/specsmith/compare/v0.22.1...v0.22.2 [0.22.1]: https://github.com/layer1labs/specsmith/compare/v0.22.0...v0.22.1 [0.22.0]: https://github.com/layer1labs/specsmith/compare/v0.20.1...v0.22.0 [0.20.1]: https://github.com/layer1labs/specsmith/compare/v0.20.0...v0.20.1 diff --git a/README.md b/README.md index 3f730d71..ca7b9fbb 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,10 @@ pipx upgrade specsmith # preferred — upgrades the pipx-isolated CLI specsmith self-update # alternative: self-update from within specsmith ``` +An intent limited to maintaining the local pipx CLI is returned as the non-blocking +`environment_only` preflight decision. It exits successfully and creates no project +work item, ledger entry, or ESDB record. All `--help` invocations are read-only. + --- ## Quick Start diff --git a/docs/COMPLIANCE.md b/docs/COMPLIANCE.md index 7648c1ae..56073ece 100644 --- a/docs/COMPLIANCE.md +++ b/docs/COMPLIANCE.md @@ -8,7 +8,7 @@ - **Type**: python - **Language**: python - **VCS Platform**: github -- **Spec Version**: 0.22.1 +- **Spec Version**: 0.22.2 ## Verification Tools diff --git a/docs/LEDGER.md b/docs/LEDGER.md index 38d8b63e..ee04c676 100644 --- a/docs/LEDGER.md +++ b/docs/LEDGER.md @@ -1,481 +1,134 @@ # Ledger — specsmith -## Archived (39 entries) +## Archived (51 entries) + +*Archived on 2026-07-14* + +- ## Archived (39 entries) — — +- ## 2026-06-23T14:05 — specsmith migration: 0.16.0 → 0.16.2 — — +- ## 2026-06-24T12:29 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-24T21:26 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-24T22:10 — specsmith migration: 0.16.2 → 0.16.5 — — +- ## 2026-06-24T22:12 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-24T22:36 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-25T04:00 — WI-BEAADF17: YAML-first governance, ESDB auto-promotion, BA Interview, cleanup (REQ-371–REQ-379) — — +- ## 2026-06-25T07:39 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-25T08:51 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-25T09:05 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-25T14:09 — specsmith migration: 0.17.0 → 0.2.6.dev591 — — +- ## 2026-06-25T14:09 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-25T14:16 — specsmith migration: 0.2.6.dev591 → 0.17.0 — — +- ## 2026-06-25T14:58 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-25T19:57 — ESDB Full Coverage: docs/ARCHITECTURE.md §19 record kinds table + §41 appended; chronomemory-esdb skill updated with write-path table, record kinds, M008 note; all ruff violations fixed; 15/15 tests pass — — +- ## 2026-06-25T20:44 — wi_archive WI-C6FAA737: ESDB full coverage implemented and verified: TEST-404..411 and tests in test_esdb_writer.py + test_esdb_integration.py cover REQ-395..402. — — +- ## 2026-06-25T21:12 — wi_close WI-9A9A9E22: REQ-084 implemented: governance_logic.run_preflight delegates from CLI; 1885 tests passing. — — +- ## 2026-06-25T21:12 — wi_close WI-B6A6E24A: REQ-085 implemented: pipx install-origin guard active; SPECSMITH_ALLOW_NON_PIPX override for CI. — — +- ## 2026-06-25T21:12 — wi_close WI-BEAADF17: REQ-371..374 implemented: ESDB auto-promotion, switch-backend, m007 YAML migration, cleanup command all present and tested. — — +- ## 2026-06-26T10:36 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-26T13:24 — specsmith migration: 0.17.0 → 0.17.1 — — +- ## 2026-06-26T13:25 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-27T17:43 — specsmith migration: 0.17.1 → 0.18.0 — — +- ## 2026-06-28T11:11 — wi_promote WI-0CEA445B → REQ-424: CI pipeline must produce zero CodeQL static analysis alerts on every run — — +- ## 2026-06-28T11:11 — wi_promote WI-B73B339B → REQ-425: Governed agents must autonomously resolve preflight needs_clarification without blocking — — +- ## 2026-06-28T11:11 — wi_promote WI-122A76C4 → REQ-426: Benchmark governance conditions must achieve 100% pass rate across all tasks — — +- ## 2026-06-28T13:56 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-28T14:34 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-28T15:53 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-29T10:44 — wi_close WI-0CB81412: done — — +- ## 2026-06-29T14:07 — specsmith migration: 0.19.2 → 0.20.1 — — +- ## 2026-07-05T11:18 — specsmith cleanup --apply removed 7 target(s), 2495138 bytes reclaimed. — — +- ## 2026-07-05T15:52 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-10T18:38 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T07:33 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T10:30 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T11:12 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T11:23 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T11:31 — wi_archive WI-2B89DD4E: Deferred: governance requires the user to explicitly confirm deletion of refs/heads/feat/zoo-roo-mcp-integration. — — +- ## 2026-07-13T11:31 — wi_archive WI-0DA3685B: Deferred: governance requires the user to explicitly confirm deletion of refs/heads/feat/zoo-roo-mcp-integration. — — +- ## 2026-07-13T11:31 — wi_archive WI-71E9EDBB: Deferred: GitHub rejects authors approving their own protected pull request; an independent code owner is required. — — +- ## 2026-07-13T11:32 — wi_close WI-094C4FE3: Published archive/feat-zoo-roo-mcp-integration-20260713 at the closed branch head after verification. — — +- ## 2026-07-13T14:38 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T14:42 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T14:59 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-07-13T15:14 — test-ran TEST-467: passed (status: pending → implemented) — — +- ## 2026-07-13T15:14 — test-ran TEST-470: passed (status: pending → implemented) — — +- ## 2026-07-13T15:30 — test-ran TEST-371: passed (status: pending → implemented) — — +- ## 2026-07-13T15:30 — test-ran TEST-470: passed (status: pending → implemented) — — +- ## 2026-07-13T15:47 — KILL SWITCH ACTIVATED: emergency stop — — -*Archived on 2026-06-25* - -- ## Archived (32 entries) — — -- ## 2026-04-27T20:20 — WI-NEXUS-021: ruff lint + format baseline clean on develop (REQ-101) — — -- ## 2026-04-27T20:20 — WI-NEXUS-022: mypy typecheck baseline clean (69 source files) on develop (REQ-102) — — -- ## 2026-04-27T20:20 — WI-NEXUS-023: CI security baseline upgraded; pip-audit ignore-vuln CVE-2026-3219 documented; no open Dependabot alerts (REQ-103) — — -- ## 2026-04-27T20:53 — WI-NEXUS-024: workitems.json synced via scripts/sync_workitems.py - 107 work items mirrored to REQ-001..REQ-107 (REQ-104) — — -- ## 2026-04-27T20:53 — WI-NEXUS-025: live l1-nexus smoke evidence refreshed at .specsmith/runs/WI-NEXUS-011/logs.txt - skip with documented hardware reason (12GB GPU vs ~20GB needed) (REQ-105) — — -- ## 2026-04-27T20:53 — WI-NEXUS-026: VS Code extension parity - specsmith.runPreflight, specsmith.runVerify, specsmith.toggleWhy commands shipped in specsmith-vscode PR #28 (REQ-106) — — -- ## 2026-04-27T20:53 — WI-NEXUS-027: ARCHITECTURE.md gained 'Current State (post-WI-NEXUS-023)' section listing realized broker, harness, retry strategies, CI baseline, VS Code parity, smoke evidence, and docs surface (REQ-107) — — -- ## 2026-04-27T20:53 — WI-NEXUS-028: bumped pyproject.toml to 0.4.0; CHANGELOG [Unreleased] -> [0.4.0]; release prep complete (REQ-049, REQ-050) — — -- ## 2026-04-28T09:05 — Nexus 1.0 roadmap groundwork landed (REQ-108..REQ-129): real verifier signal, JSONL chat block protocol (chat/notebook subcommands), persistent session memory, MCP loader, dynamic router, project-rules auto-injection, --predict-only and --comment flags, doctor --onboarding, perf smoke harness, e2e+unit tests, API-stability doc. Pre-1.0; no version bump. — — -- ## 2026-05-07T08:10 — specsmith migration: 0.3.13 → 0.10.1 — — -- ## 2026-05-11T17:45 --- WI-0511: Sprint complete (REQ-248..REQ-262) — — -- ## 2026-05-12T13:00 --- WI-0512-AI: Glossa-lab AI patterns ported to specsmith (REQ-263..REQ-281) — — -- ## 2026-05-14T16:00 --- WI-0514c: Phase 2 Token/Context UX — REQ-020/021/022 — — -- ## 2026-05-14T12:42 --- WI-0514b: specsmith issue group + bug report page (REQ-303, REQ-304) — — -- ## 2026-05-14T10:55 --- WI-0514: v0.11.3 release prep (REQ-302) — — -- ## 2026-05-15T14:08 --- WI-0516: EU/NA compliance, governance consolidation, AGENTS.md slim, migration framework — — -- ## 2026-05-15T13:30 --- WI-0515-INFRA: ESDB write layer, CI/CD automation, context orchestration, session persistence, OEA hardening — — -- ## 2026-05-15T12:42 --- WI-0515-GOV: Governance H15–H22 + OEA paper integration — — -- ## 2026-05-12T13:06 --- WI-0512-GAPS: Arch/req/test gap audit + TEST-282/TEST-283 added (REQ-263, REQ-265) — — -- ## 2026-05-17T15:45 — Implemented multi-agent DAG dispatcher (REQ-321..REQ-334): dispatch/ package with TaskDAG/AgentDispatcher/EventEmitter, orchestrator.run_dispatch(), spawner.spawn_worker(), CLI dispatch group, serve.py SSE+REST dispatch endpoints. Added compiler/tool support: run_gcc, run_arm_gcc, run_aarch64_gcc, run_iar_compiler, run_intel_compiler, run_clang_format, run_clang_tidy, run_vsg. — — -- ## 2026-05-17T16:01 — Full traceability sweep: added docs/requirements/dispatch.yml + docs/tests/dispatch.yml (YAML source for REQ-321..334), ran specsmith sync (0 errors, 0 warnings), fixed ARCHITECTURE.md section numbering (duplicate 15/16 corrected), added REQ-313..320 reservation note, updated README.md (dispatch+compiler sections), CHANGELOG.md (v0.11.3-post2), docs/site/commands.md (dispatch group + compiler tools), docs/site/tool-registry.md (agent tools + ROLE_TOOLS). All tests: 777 passed. — — -- ## 2026-05-17T16:12 — Final gap sweep: added apply_diff/search_web/search_repo tool stubs to close ROLE_TOOLS vs AVAILABLE_TOOLS mismatch (23 tools total, no refs missing); added Dispatch to README 50+ CLI Commands section; restored yaml_governance.yml row in ARCHITECTURE.md domain table (REQ-300..312); fixed post_action to spawn background thread (no UI-thread blocking on retry/abort POST). — — -- ## 2026-05-17T16:31 — Resolved all deferred items: (1) abort mid-LLM-call via _invoke_worker_monitored sub-thread with 0.5s abort polling; (2) CLI dispatch run uses Orchestrator._call_planner when AG2 available (Path A/B fallback); (3) topological DAG layout with depends_on payload, compute_levels(), bezier edge drawing; (4) REQ-313..320 compliance plan 5939f743 implemented and tested. — — -- ## 2026-05-17T16:53 — Removed all specsmith-vscode / VS Code extension references across specsmith docs. Deleted docs/site/vscode-extension.md. Updated mkdocs.yml nav. Fixed index.md, quickstart.md, commands.md, getting-started.md, troubleshooting.md, endpoints.md, PRIVACY.md, runner.py, core.py, events.py, suggester.py, languages.py, cli.py, agent.yml REQs/TESTs, README.md. The specsmith client is now the sole documented client. — — -- ## 2026-05-22T18:53 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-05-24T09:55 — specsmith migration: 0.11.3.dev420 → 0.11.6 — — -- ## 2026-05-24T11:08 — specsmith migration: 0.11.6 → 0.11.7 — — -- ## 2026-06-11T20:45 — specsmith migration: 0.11.7 → 0.13.0 — — -- ## 2026-06-11T20:45 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-11T22:22 — specsmith migration: 0.14.0 → 0.13.0 — — -- ## 2026-06-14T14:00 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-14T19:51 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-14T22:42 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-14T22:42 — specsmith migration: 0.14.1 → 0.15.3 — — -- ## 2026-06-14T23:08 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-15T11:08 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-22T07:41 — KILL SWITCH ACTIVATED: emergency stop — — -- ## 2026-06-23T14:00 — KILL SWITCH ACTIVATED: emergency stop — — - -## 2026-06-23T14:05 — specsmith migration: 0.16.0 → 0.16.2 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `ffa59e79424ae198...` - - -## 2026-06-24T12:29 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `106b11e4e66d5a38...` - - -## 2026-06-24T21:26 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `303499039d2651b9...` - - -## 2026-06-24T22:10 — specsmith migration: 0.16.2 → 0.16.5 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `4cd715ea85f416ce...` - - -## 2026-06-24T22:12 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `80b7af3000e19013...` - - -## 2026-06-24T22:36 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `ed801f6f42ba86ed...` - - -## 2026-06-25T04:00 — WI-BEAADF17: YAML-first governance, ESDB auto-promotion, BA Interview, cleanup (REQ-371–REQ-379) -- **Author**: oz-agent -- **Type**: feature -- **REQs affected**: REQ-371,REQ-372,REQ-373,REQ-374,REQ-375,REQ-376,REQ-377,REQ-378,REQ-379 -- **Status**: complete -- **Chain hash**: auto -- **Description**: Major YAML-first governance and epistemic architecture sprint: - - **YAML-first mode (REQ-373, REQ-378)**: `scaffold_project()` now writes `.specsmith/governance-mode=yaml` - and creates `docs/requirements/core.yml` + `docs/tests/core.yml` starter files so all new projects - are in YAML-first mode from day one. Markdown mode remains supported but emits a `DeprecationWarning` - and auto-triggers m007 migration. - - **m007 migration**: `src/specsmith/migrations/m007_yaml_first.py` converts REQUIREMENTS.md/TESTS.md - to YAML source files. Idempotent and non-destructive (MD files not deleted). - - **ESDB auto-promotion (REQ-371)**: `esdb/__init__.py` adds `_maybe_promote_sqlite_to_chrono()` that - prompts to migrate SQLite records into ChronoStore when ChronoStore is empty. Auto-accepts in - non-interactive/agent mode. - - **`specsmith esdb switch-backend` (REQ-372)**: New `esdb` subcommand migrates records between - SQLite and ChronoStore. `--to sqlite` requires `--confirm-data-loss`. - - **`specsmith cleanup` (REQ-374)**: New top-level command removes runtime cache dirs (runs, sessions, - chat, perf, recovery, logs, dispatch, pids, agent-reports, migration-backups, chronomemory/backup, - Python caches). Dry-run by default, `--apply` to delete, `--json` for machine output. Protected - files (requirements.json, testcases.json, governance-mode, docs/) never removed. - - **Epistemic BA Interview (REQ-375–377)**: `src/specsmith/architect.py` gains `run_interview()`, - `run_gap_analysis()`, `run_arch_update()`. Tracks 9 architectural dimensions with confidence scoring. - CLI: `specsmith architect interview/gap/update`. SKILL.md created at - `.agents/skills/specsmith-architect/SKILL.md`. - - **Auditor mode-aware (REQ-379)**: yaml-requirements-dir/yaml-tests-dir checks now only fail for - projects in YAML mode; legacy markdown-mode projects get an informational pass. - - **Test coverage**: 4 new test files: test_markdown_deprecation.py, test_esdb_backend_switch.py, - test_cleanup_cmd.py, test_architect_interview.py (116 new tests). All 1347 tests pass. - ruff: zero violations. specsmith audit: Healthy. - - -## 2026-06-25T07:39 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `6e3248c993d07e12...` - - -## 2026-06-25T08:51 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `e0d0855229c3ad17...` - - -## 2026-06-25T09:05 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `1c187a5124c9f25e...` - -## 2026-06-25T14:09 — specsmith migration: 0.17.0 → 0.2.6.dev591 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `d1731eab603f6f26...` - -## 2026-06-25T14:09 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `b67602aceddb8387...` - -## 2026-06-25T14:16 — specsmith migration: 0.2.6.dev591 → 0.17.0 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `a5fba06634f05138...` - -## 2026-06-25T14:58 — KILL SWITCH ACTIVATED: emergency stop +## 2026-07-13T16:07 — KILL SWITCH ACTIVATED: emergency stop - **Author**: specsmith-operator - **Type**: kill-switch - **REQs affected**: REG-005 - **Status**: complete - **Epistemic status**: high -- **Chain hash**: `dc451c3e0c2ef776...` +- **Chain hash**: `07c2f32732b2ca93...` -## 2026-06-25T19:57 — ESDB Full Coverage: docs/ARCHITECTURE.md §19 record kinds table + §41 appended; chronomemory-esdb skill updated with write-path table, record kinds, M008 note; all ruff violations fixed; 15/15 tests pass -- **Author**: agent -- **Type**: task -- **Status**: complete -- **Chain hash**: `1e9d9f99eb4f4088...` -## 2026-06-25T20:44 — wi_archive WI-C6FAA737: ESDB full coverage implemented and verified: TEST-404..411 and tests in test_esdb_writer.py + test_esdb_integration.py cover REQ-395..402. -- **Author**: specsmith -- **Type**: wi_archive -- **Status**: complete -- **Chain hash**: `0ca9ac14a5f3fcbd...` - -## 2026-06-25T21:12 — wi_close WI-9A9A9E22: REQ-084 implemented: governance_logic.run_preflight delegates from CLI; 1885 tests passing. +## 2026-07-13T16:45 — wi_close WI-DA14F483: Release-readiness review completed; full validation evidence recorded. - **Author**: specsmith - **Type**: wi_close - **Status**: complete -- **Chain hash**: `7cbe46a5cf3b7756...` +- **Chain hash**: `ff9df0399f80ac97...` -## 2026-06-25T21:12 — wi_close WI-B6A6E24A: REQ-085 implemented: pipx install-origin guard active; SPECSMITH_ALLOW_NON_PIPX override for CI. -- **Author**: specsmith -- **Type**: wi_close -- **Status**: complete -- **Chain hash**: `1f4fc87febc37b92...` -## 2026-06-25T21:12 — wi_close WI-BEAADF17: REQ-371..374 implemented: ESDB auto-promotion, switch-backend, m007 YAML migration, cleanup command all present and tested. +## 2026-07-13T16:45 — wi_close WI-8F467602: Release plan clarified and superseded by WI-5C560143. - **Author**: specsmith - **Type**: wi_close - **Status**: complete -- **Chain hash**: `531f877f5d72b2f9...` - -## 2026-06-26T10:36 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `ace65defe939991d...` - -## 2026-06-26T13:24 — specsmith migration: 0.17.0 → 0.17.1 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `e8034ede0d786d14...` - -## 2026-06-26T13:25 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `c481074e0b828d95...` - -## 2026-06-27T17:43 — specsmith migration: 0.17.1 → 0.18.0 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `3bf0f8567e3120e0...` - -## 2026-06-28T11:11 — wi_promote WI-0CEA445B → REQ-424: CI pipeline must produce zero CodeQL static analysis alerts on every run -- **Author**: specsmith -- **Type**: wi_promote -- **Status**: complete -- **Chain hash**: `297b1aa2359c38f5...` - -## 2026-06-28T11:11 — wi_promote WI-B73B339B → REQ-425: Governed agents must autonomously resolve preflight needs_clarification without blocking -- **Author**: specsmith -- **Type**: wi_promote -- **Status**: complete -- **Chain hash**: `a1595baa2a82e9c2...` - -## 2026-06-28T11:11 — wi_promote WI-122A76C4 → REQ-426: Benchmark governance conditions must achieve 100% pass rate across all tasks -- **Author**: specsmith -- **Type**: wi_promote -- **Status**: complete -- **Chain hash**: `e8a20807f2c5b195...` - -## 2026-06-28T13:56 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `cbfea526acb6bc39...` - -## 2026-06-28T14:34 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `c68bf6b1ac640968...` +- **Chain hash**: `f558c2338dc69263...` -## 2026-06-28T15:53 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `820f2a813c365cde...` -## 2026-06-29T10:44 — wi_close WI-0CB81412: done +## 2026-07-13T17:01 — wi_close WI-5C560143: v0.22.0 published to PyPI and GitHub; RTD stable and latest builds finished successfully. - **Author**: specsmith - **Type**: wi_close - **Status**: complete -- **Chain hash**: `6705d87a2a6a2059...` - -## 2026-06-29T14:07 — specsmith migration: 0.19.2 → 0.20.1 -- **Author**: specsmith -- **Type**: migration -- **Status**: complete -- **Chain hash**: `087ee05e1059ce80...` - -## 2026-07-05T11:18 — specsmith cleanup --apply removed 7 target(s), 2495138 bytes reclaimed. -- **Author**: specsmith -- **Type**: cleanup -- **REQs affected**: REQ-374 -- **Status**: complete -- **Chain hash**: `1c1c68ddafb6b809...` - -## 2026-07-05T15:52 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `cf98c08d1f8ceb46...` - -## 2026-07-10T18:38 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `faaf06ea12574c6a...` - -## 2026-07-13T07:33 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `07ad8108e3860a7c...` - -## 2026-07-13T10:30 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `b864898ee975ecce...` +- **Chain hash**: `f3bbad392d19900e...` -## 2026-07-13T11:12 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `b960aeeee661d07c...` -## 2026-07-13T11:23 — KILL SWITCH ACTIVATED: emergency stop +## 2026-07-13T18:08 — KILL SWITCH ACTIVATED: emergency stop - **Author**: specsmith-operator - **Type**: kill-switch - **REQs affected**: REG-005 - **Status**: complete - **Epistemic status**: high -- **Chain hash**: `82c26ea54d1780a8...` - -## 2026-07-13T11:31 — wi_archive WI-2B89DD4E: Deferred: governance requires the user to explicitly confirm deletion of refs/heads/feat/zoo-roo-mcp-integration. -- **Author**: specsmith -- **Type**: wi_archive -- **Status**: complete -- **Chain hash**: `050e3319e536e818...` +- **Chain hash**: `46ed7529d803de9b...` -## 2026-07-13T11:31 — wi_archive WI-0DA3685B: Deferred: governance requires the user to explicitly confirm deletion of refs/heads/feat/zoo-roo-mcp-integration. -- **Author**: specsmith -- **Type**: wi_archive -- **Status**: complete -- **Chain hash**: `7aca009cad3ae1a1...` -## 2026-07-13T11:31 — wi_archive WI-71E9EDBB: Deferred: GitHub rejects authors approving their own protected pull request; an independent code owner is required. +## 2026-07-13T18:35 — wi_archive WI-6C92EE21: Superseded by WI-260B314F, which implements issue #295 under REQ-366 with TEST-472 coverage. - **Author**: specsmith - **Type**: wi_archive - **Status**: complete -- **Chain hash**: `f2361802e838e239...` +- **Chain hash**: `f43dc947dfb44117...` -## 2026-07-13T11:32 — wi_close WI-094C4FE3: Published archive/feat-zoo-roo-mcp-integration-20260713 at the closed branch head after verification. -- **Author**: specsmith -- **Type**: wi_close -- **Status**: complete -- **Chain hash**: `b19ddba9a15b5658...` -## 2026-07-13T14:38 — KILL SWITCH ACTIVATED: emergency stop +## 2026-07-13T19:56 — KILL SWITCH ACTIVATED: emergency stop - **Author**: specsmith-operator - **Type**: kill-switch - **REQs affected**: REG-005 - **Status**: complete - **Epistemic status**: high -- **Chain hash**: `0fcf05a9931e039e...` +- **Chain hash**: `57304a968224a8ca...` -## 2026-07-13T14:42 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `1d6d373b06cfc948...` -## 2026-07-13T14:59 — KILL SWITCH ACTIVATED: emergency stop +## 2026-07-14T05:35 — KILL SWITCH ACTIVATED: emergency stop - **Author**: specsmith-operator - **Type**: kill-switch - **REQs affected**: REG-005 - **Status**: complete - **Epistemic status**: high -- **Chain hash**: `c16a7c48273e40f7...` - -## 2026-07-13T15:14 — test-ran TEST-467: passed (status: pending → implemented) -- **Author**: specsmith -- **Type**: test-ran -- **REQs affected**: TEST-467 -- **Status**: complete -- **Chain hash**: `15ebd5761b79a512...` +- **Chain hash**: `71fb0a17514b368a...` -## 2026-07-13T15:14 — test-ran TEST-470: passed (status: pending → implemented) -- **Author**: specsmith -- **Type**: test-ran -- **REQs affected**: TEST-470 -- **Status**: complete -- **Chain hash**: `3b3775a522076719...` -## 2026-07-13T15:30 — test-ran TEST-371: passed (status: pending → implemented) +## 2026-07-14T06:05 — wi_archive WI-093974D5: Superseded rejected clarification preflight; accepted replacement WIs contain the implemented and tested work. - **Author**: specsmith -- **Type**: test-ran -- **REQs affected**: TEST-371 -- **Status**: complete -- **Chain hash**: `92ad46273e1a25c0...` - -## 2026-07-13T15:30 — test-ran TEST-470: passed (status: pending → implemented) -- **Author**: specsmith -- **Type**: test-ran -- **REQs affected**: TEST-470 -- **Status**: complete -- **Chain hash**: `77af924fed83a344...` - -## 2026-07-13T15:47 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `702e7876aafc9f6b...` - -## 2026-07-13T16:07 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `07c2f32732b2ca93...` - -## 2026-07-13T16:45 — wi_close WI-DA14F483: Release-readiness review completed; full validation evidence recorded. -- **Author**: specsmith -- **Type**: wi_close -- **Status**: complete -- **Chain hash**: `ff9df0399f80ac97...` - -## 2026-07-13T16:45 — wi_close WI-8F467602: Release plan clarified and superseded by WI-5C560143. -- **Author**: specsmith -- **Type**: wi_close -- **Status**: complete -- **Chain hash**: `f558c2338dc69263...` - -## 2026-07-13T17:01 — wi_close WI-5C560143: v0.22.0 published to PyPI and GitHub; RTD stable and latest builds finished successfully. -- **Author**: specsmith -- **Type**: wi_close +- **Type**: wi_archive - **Status**: complete -- **Chain hash**: `f3bbad392d19900e...` +- **Chain hash**: `0cc6af01eeb9c5d7...` -## 2026-07-13T18:08 — KILL SWITCH ACTIVATED: emergency stop -- **Author**: specsmith-operator -- **Type**: kill-switch -- **REQs affected**: REG-005 -- **Status**: complete -- **Epistemic status**: high -- **Chain hash**: `46ed7529d803de9b...` -## 2026-07-13T18:35 — wi_archive WI-6C92EE21: Superseded by WI-260B314F, which implements issue #295 under REQ-366 with TEST-472 coverage. +## 2026-07-14T06:05 — wi_archive WI-B8AADA46: Administrative archival operation; it introduced no product change or test obligation. - **Author**: specsmith - **Type**: wi_archive - **Status**: complete -- **Chain hash**: `f43dc947dfb44117...` +- **Chain hash**: `45fd62de2f460885...` diff --git a/docs/SPECSMITH.yml b/docs/SPECSMITH.yml index 45e724b1..59fd9e6a 100644 --- a/docs/SPECSMITH.yml +++ b/docs/SPECSMITH.yml @@ -9,7 +9,7 @@ description: | through governance, traceability, and automated compliance checking. type: python -version: 0.22.1 +version: 0.22.2 license: MIT author: Layer1 Labs url: https://github.com/layer1labs/specsmith diff --git a/docs/ledger-archive.md b/docs/ledger-archive.md index 86503d15..6d7d25a4 100644 --- a/docs/ledger-archive.md +++ b/docs/ledger-archive.md @@ -1162,3 +1162,493 @@ Phase 4: feature flags, instinct/learning, eval harness, agent memory, multi-age - **Epistemic status**: high - **Chain hash**: `36a1aa7c382e4a8e...` +## Archived (39 entries) + +*Archived on 2026-06-25* + +- ## Archived (32 entries) — — +- ## 2026-04-27T20:20 — WI-NEXUS-021: ruff lint + format baseline clean on develop (REQ-101) — — +- ## 2026-04-27T20:20 — WI-NEXUS-022: mypy typecheck baseline clean (69 source files) on develop (REQ-102) — — +- ## 2026-04-27T20:20 — WI-NEXUS-023: CI security baseline upgraded; pip-audit ignore-vuln CVE-2026-3219 documented; no open Dependabot alerts (REQ-103) — — +- ## 2026-04-27T20:53 — WI-NEXUS-024: workitems.json synced via scripts/sync_workitems.py - 107 work items mirrored to REQ-001..REQ-107 (REQ-104) — — +- ## 2026-04-27T20:53 — WI-NEXUS-025: live l1-nexus smoke evidence refreshed at .specsmith/runs/WI-NEXUS-011/logs.txt - skip with documented hardware reason (12GB GPU vs ~20GB needed) (REQ-105) — — +- ## 2026-04-27T20:53 — WI-NEXUS-026: VS Code extension parity - specsmith.runPreflight, specsmith.runVerify, specsmith.toggleWhy commands shipped in specsmith-vscode PR #28 (REQ-106) — — +- ## 2026-04-27T20:53 — WI-NEXUS-027: ARCHITECTURE.md gained 'Current State (post-WI-NEXUS-023)' section listing realized broker, harness, retry strategies, CI baseline, VS Code parity, smoke evidence, and docs surface (REQ-107) — — +- ## 2026-04-27T20:53 — WI-NEXUS-028: bumped pyproject.toml to 0.4.0; CHANGELOG [Unreleased] -> [0.4.0]; release prep complete (REQ-049, REQ-050) — — +- ## 2026-04-28T09:05 — Nexus 1.0 roadmap groundwork landed (REQ-108..REQ-129): real verifier signal, JSONL chat block protocol (chat/notebook subcommands), persistent session memory, MCP loader, dynamic router, project-rules auto-injection, --predict-only and --comment flags, doctor --onboarding, perf smoke harness, e2e+unit tests, API-stability doc. Pre-1.0; no version bump. — — +- ## 2026-05-07T08:10 — specsmith migration: 0.3.13 → 0.10.1 — — +- ## 2026-05-11T17:45 --- WI-0511: Sprint complete (REQ-248..REQ-262) — — +- ## 2026-05-12T13:00 --- WI-0512-AI: Glossa-lab AI patterns ported to specsmith (REQ-263..REQ-281) — — +- ## 2026-05-14T16:00 --- WI-0514c: Phase 2 Token/Context UX — REQ-020/021/022 — — +- ## 2026-05-14T12:42 --- WI-0514b: specsmith issue group + bug report page (REQ-303, REQ-304) — — +- ## 2026-05-14T10:55 --- WI-0514: v0.11.3 release prep (REQ-302) — — +- ## 2026-05-15T14:08 --- WI-0516: EU/NA compliance, governance consolidation, AGENTS.md slim, migration framework — — +- ## 2026-05-15T13:30 --- WI-0515-INFRA: ESDB write layer, CI/CD automation, context orchestration, session persistence, OEA hardening — — +- ## 2026-05-15T12:42 --- WI-0515-GOV: Governance H15–H22 + OEA paper integration — — +- ## 2026-05-12T13:06 --- WI-0512-GAPS: Arch/req/test gap audit + TEST-282/TEST-283 added (REQ-263, REQ-265) — — +- ## 2026-05-17T15:45 — Implemented multi-agent DAG dispatcher (REQ-321..REQ-334): dispatch/ package with TaskDAG/AgentDispatcher/EventEmitter, orchestrator.run_dispatch(), spawner.spawn_worker(), CLI dispatch group, serve.py SSE+REST dispatch endpoints. Added compiler/tool support: run_gcc, run_arm_gcc, run_aarch64_gcc, run_iar_compiler, run_intel_compiler, run_clang_format, run_clang_tidy, run_vsg. — — +- ## 2026-05-17T16:01 — Full traceability sweep: added docs/requirements/dispatch.yml + docs/tests/dispatch.yml (YAML source for REQ-321..334), ran specsmith sync (0 errors, 0 warnings), fixed ARCHITECTURE.md section numbering (duplicate 15/16 corrected), added REQ-313..320 reservation note, updated README.md (dispatch+compiler sections), CHANGELOG.md (v0.11.3-post2), docs/site/commands.md (dispatch group + compiler tools), docs/site/tool-registry.md (agent tools + ROLE_TOOLS). All tests: 777 passed. — — +- ## 2026-05-17T16:12 — Final gap sweep: added apply_diff/search_web/search_repo tool stubs to close ROLE_TOOLS vs AVAILABLE_TOOLS mismatch (23 tools total, no refs missing); added Dispatch to README 50+ CLI Commands section; restored yaml_governance.yml row in ARCHITECTURE.md domain table (REQ-300..312); fixed post_action to spawn background thread (no UI-thread blocking on retry/abort POST). — — +- ## 2026-05-17T16:31 — Resolved all deferred items: (1) abort mid-LLM-call via _invoke_worker_monitored sub-thread with 0.5s abort polling; (2) CLI dispatch run uses Orchestrator._call_planner when AG2 available (Path A/B fallback); (3) topological DAG layout with depends_on payload, compute_levels(), bezier edge drawing; (4) REQ-313..320 compliance plan 5939f743 implemented and tested. — — +- ## 2026-05-17T16:53 — Removed all specsmith-vscode / VS Code extension references across specsmith docs. Deleted docs/site/vscode-extension.md. Updated mkdocs.yml nav. Fixed index.md, quickstart.md, commands.md, getting-started.md, troubleshooting.md, endpoints.md, PRIVACY.md, runner.py, core.py, events.py, suggester.py, languages.py, cli.py, agent.yml REQs/TESTs, README.md. The specsmith client is now the sole documented client. — — +- ## 2026-05-22T18:53 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-05-24T09:55 — specsmith migration: 0.11.3.dev420 → 0.11.6 — — +- ## 2026-05-24T11:08 — specsmith migration: 0.11.6 → 0.11.7 — — +- ## 2026-06-11T20:45 — specsmith migration: 0.11.7 → 0.13.0 — — +- ## 2026-06-11T20:45 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-11T22:22 — specsmith migration: 0.14.0 → 0.13.0 — — +- ## 2026-06-14T14:00 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-14T19:51 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-14T22:42 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-14T22:42 — specsmith migration: 0.14.1 → 0.15.3 — — +- ## 2026-06-14T23:08 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-15T11:08 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-22T07:41 — KILL SWITCH ACTIVATED: emergency stop — — +- ## 2026-06-23T14:00 — KILL SWITCH ACTIVATED: emergency stop — — + + +## 2026-06-23T14:05 — specsmith migration: 0.16.0 → 0.16.2 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `ffa59e79424ae198...` + + + +## 2026-06-24T12:29 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `106b11e4e66d5a38...` + + + +## 2026-06-24T21:26 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `303499039d2651b9...` + + + +## 2026-06-24T22:10 — specsmith migration: 0.16.2 → 0.16.5 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `4cd715ea85f416ce...` + + + +## 2026-06-24T22:12 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `80b7af3000e19013...` + + + +## 2026-06-24T22:36 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `ed801f6f42ba86ed...` + + + +## 2026-06-25T04:00 — WI-BEAADF17: YAML-first governance, ESDB auto-promotion, BA Interview, cleanup (REQ-371–REQ-379) +- **Author**: oz-agent +- **Type**: feature +- **REQs affected**: REQ-371,REQ-372,REQ-373,REQ-374,REQ-375,REQ-376,REQ-377,REQ-378,REQ-379 +- **Status**: complete +- **Chain hash**: auto +- **Description**: Major YAML-first governance and epistemic architecture sprint: + + **YAML-first mode (REQ-373, REQ-378)**: `scaffold_project()` now writes `.specsmith/governance-mode=yaml` + and creates `docs/requirements/core.yml` + `docs/tests/core.yml` starter files so all new projects + are in YAML-first mode from day one. Markdown mode remains supported but emits a `DeprecationWarning` + and auto-triggers m007 migration. + + **m007 migration**: `src/specsmith/migrations/m007_yaml_first.py` converts REQUIREMENTS.md/TESTS.md + to YAML source files. Idempotent and non-destructive (MD files not deleted). + + **ESDB auto-promotion (REQ-371)**: `esdb/__init__.py` adds `_maybe_promote_sqlite_to_chrono()` that + prompts to migrate SQLite records into ChronoStore when ChronoStore is empty. Auto-accepts in + non-interactive/agent mode. + + **`specsmith esdb switch-backend` (REQ-372)**: New `esdb` subcommand migrates records between + SQLite and ChronoStore. `--to sqlite` requires `--confirm-data-loss`. + + **`specsmith cleanup` (REQ-374)**: New top-level command removes runtime cache dirs (runs, sessions, + chat, perf, recovery, logs, dispatch, pids, agent-reports, migration-backups, chronomemory/backup, + Python caches). Dry-run by default, `--apply` to delete, `--json` for machine output. Protected + files (requirements.json, testcases.json, governance-mode, docs/) never removed. + + **Epistemic BA Interview (REQ-375–377)**: `src/specsmith/architect.py` gains `run_interview()`, + `run_gap_analysis()`, `run_arch_update()`. Tracks 9 architectural dimensions with confidence scoring. + CLI: `specsmith architect interview/gap/update`. SKILL.md created at + `.agents/skills/specsmith-architect/SKILL.md`. + + **Auditor mode-aware (REQ-379)**: yaml-requirements-dir/yaml-tests-dir checks now only fail for + projects in YAML mode; legacy markdown-mode projects get an informational pass. + + **Test coverage**: 4 new test files: test_markdown_deprecation.py, test_esdb_backend_switch.py, + test_cleanup_cmd.py, test_architect_interview.py (116 new tests). All 1347 tests pass. + ruff: zero violations. specsmith audit: Healthy. + + + +## 2026-06-25T07:39 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `6e3248c993d07e12...` + + + +## 2026-06-25T08:51 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `e0d0855229c3ad17...` + + + +## 2026-06-25T09:05 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `1c187a5124c9f25e...` + + +## 2026-06-25T14:09 — specsmith migration: 0.17.0 → 0.2.6.dev591 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `d1731eab603f6f26...` + + +## 2026-06-25T14:09 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `b67602aceddb8387...` + + +## 2026-06-25T14:16 — specsmith migration: 0.2.6.dev591 → 0.17.0 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `a5fba06634f05138...` + + +## 2026-06-25T14:58 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `dc451c3e0c2ef776...` + + +## 2026-06-25T19:57 — ESDB Full Coverage: docs/ARCHITECTURE.md §19 record kinds table + §41 appended; chronomemory-esdb skill updated with write-path table, record kinds, M008 note; all ruff violations fixed; 15/15 tests pass +- **Author**: agent +- **Type**: task +- **Status**: complete +- **Chain hash**: `1e9d9f99eb4f4088...` + + +## 2026-06-25T20:44 — wi_archive WI-C6FAA737: ESDB full coverage implemented and verified: TEST-404..411 and tests in test_esdb_writer.py + test_esdb_integration.py cover REQ-395..402. +- **Author**: specsmith +- **Type**: wi_archive +- **Status**: complete +- **Chain hash**: `0ca9ac14a5f3fcbd...` + + +## 2026-06-25T21:12 — wi_close WI-9A9A9E22: REQ-084 implemented: governance_logic.run_preflight delegates from CLI; 1885 tests passing. +- **Author**: specsmith +- **Type**: wi_close +- **Status**: complete +- **Chain hash**: `7cbe46a5cf3b7756...` + + +## 2026-06-25T21:12 — wi_close WI-B6A6E24A: REQ-085 implemented: pipx install-origin guard active; SPECSMITH_ALLOW_NON_PIPX override for CI. +- **Author**: specsmith +- **Type**: wi_close +- **Status**: complete +- **Chain hash**: `1f4fc87febc37b92...` + + +## 2026-06-25T21:12 — wi_close WI-BEAADF17: REQ-371..374 implemented: ESDB auto-promotion, switch-backend, m007 YAML migration, cleanup command all present and tested. +- **Author**: specsmith +- **Type**: wi_close +- **Status**: complete +- **Chain hash**: `531f877f5d72b2f9...` + + +## 2026-06-26T10:36 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `ace65defe939991d...` + + +## 2026-06-26T13:24 — specsmith migration: 0.17.0 → 0.17.1 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `e8034ede0d786d14...` + + +## 2026-06-26T13:25 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `c481074e0b828d95...` + + +## 2026-06-27T17:43 — specsmith migration: 0.17.1 → 0.18.0 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `3bf0f8567e3120e0...` + + +## 2026-06-28T11:11 — wi_promote WI-0CEA445B → REQ-424: CI pipeline must produce zero CodeQL static analysis alerts on every run +- **Author**: specsmith +- **Type**: wi_promote +- **Status**: complete +- **Chain hash**: `297b1aa2359c38f5...` + + +## 2026-06-28T11:11 — wi_promote WI-B73B339B → REQ-425: Governed agents must autonomously resolve preflight needs_clarification without blocking +- **Author**: specsmith +- **Type**: wi_promote +- **Status**: complete +- **Chain hash**: `a1595baa2a82e9c2...` + + +## 2026-06-28T11:11 — wi_promote WI-122A76C4 → REQ-426: Benchmark governance conditions must achieve 100% pass rate across all tasks +- **Author**: specsmith +- **Type**: wi_promote +- **Status**: complete +- **Chain hash**: `e8a20807f2c5b195...` + + +## 2026-06-28T13:56 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `cbfea526acb6bc39...` + + +## 2026-06-28T14:34 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `c68bf6b1ac640968...` + + +## 2026-06-28T15:53 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `820f2a813c365cde...` + + +## 2026-06-29T10:44 — wi_close WI-0CB81412: done +- **Author**: specsmith +- **Type**: wi_close +- **Status**: complete +- **Chain hash**: `6705d87a2a6a2059...` + + +## 2026-06-29T14:07 — specsmith migration: 0.19.2 → 0.20.1 +- **Author**: specsmith +- **Type**: migration +- **Status**: complete +- **Chain hash**: `087ee05e1059ce80...` + + +## 2026-07-05T11:18 — specsmith cleanup --apply removed 7 target(s), 2495138 bytes reclaimed. +- **Author**: specsmith +- **Type**: cleanup +- **REQs affected**: REQ-374 +- **Status**: complete +- **Chain hash**: `1c1c68ddafb6b809...` + + +## 2026-07-05T15:52 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `cf98c08d1f8ceb46...` + + +## 2026-07-10T18:38 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `faaf06ea12574c6a...` + + +## 2026-07-13T07:33 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `07ad8108e3860a7c...` + + +## 2026-07-13T10:30 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `b864898ee975ecce...` + + +## 2026-07-13T11:12 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `b960aeeee661d07c...` + + +## 2026-07-13T11:23 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `82c26ea54d1780a8...` + + +## 2026-07-13T11:31 — wi_archive WI-2B89DD4E: Deferred: governance requires the user to explicitly confirm deletion of refs/heads/feat/zoo-roo-mcp-integration. +- **Author**: specsmith +- **Type**: wi_archive +- **Status**: complete +- **Chain hash**: `050e3319e536e818...` + + +## 2026-07-13T11:31 — wi_archive WI-0DA3685B: Deferred: governance requires the user to explicitly confirm deletion of refs/heads/feat/zoo-roo-mcp-integration. +- **Author**: specsmith +- **Type**: wi_archive +- **Status**: complete +- **Chain hash**: `7aca009cad3ae1a1...` + + +## 2026-07-13T11:31 — wi_archive WI-71E9EDBB: Deferred: GitHub rejects authors approving their own protected pull request; an independent code owner is required. +- **Author**: specsmith +- **Type**: wi_archive +- **Status**: complete +- **Chain hash**: `f2361802e838e239...` + + +## 2026-07-13T11:32 — wi_close WI-094C4FE3: Published archive/feat-zoo-roo-mcp-integration-20260713 at the closed branch head after verification. +- **Author**: specsmith +- **Type**: wi_close +- **Status**: complete +- **Chain hash**: `b19ddba9a15b5658...` + + +## 2026-07-13T14:38 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `0fcf05a9931e039e...` + + +## 2026-07-13T14:42 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `1d6d373b06cfc948...` + + +## 2026-07-13T14:59 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `c16a7c48273e40f7...` + + +## 2026-07-13T15:14 — test-ran TEST-467: passed (status: pending → implemented) +- **Author**: specsmith +- **Type**: test-ran +- **REQs affected**: TEST-467 +- **Status**: complete +- **Chain hash**: `15ebd5761b79a512...` + + +## 2026-07-13T15:14 — test-ran TEST-470: passed (status: pending → implemented) +- **Author**: specsmith +- **Type**: test-ran +- **REQs affected**: TEST-470 +- **Status**: complete +- **Chain hash**: `3b3775a522076719...` + + +## 2026-07-13T15:30 — test-ran TEST-371: passed (status: pending → implemented) +- **Author**: specsmith +- **Type**: test-ran +- **REQs affected**: TEST-371 +- **Status**: complete +- **Chain hash**: `92ad46273e1a25c0...` + + +## 2026-07-13T15:30 — test-ran TEST-470: passed (status: pending → implemented) +- **Author**: specsmith +- **Type**: test-ran +- **REQs affected**: TEST-470 +- **Status**: complete +- **Chain hash**: `77af924fed83a344...` + + +## 2026-07-13T15:47 — KILL SWITCH ACTIVATED: emergency stop +- **Author**: specsmith-operator +- **Type**: kill-switch +- **REQs affected**: REG-005 +- **Status**: complete +- **Epistemic status**: high +- **Chain hash**: `702e7876aafc9f6b...` + diff --git a/docs/requirements/overflow.yml b/docs/requirements/overflow.yml index ca98b45b..b09a13f8 100644 --- a/docs/requirements/overflow.yml +++ b/docs/requirements/overflow.yml @@ -500,3 +500,19 @@ strategy is explicitly enabled through specsmith, and preserve GitFlow, trunk-based, and GitHub-flow behavior after opt-in. source: Git workflow governance +- id: REQ-455 + title: Environment-only SpecSmith CLI upgrades are non-blocking + status: implemented + description: A preflight request limited to upgrading or installing the pipx-managed + local SpecSmith CLI MUST return the explicit environment_only decision with exit + code 0, no work item, no ESDB or ledger record, and instructions to use pipx. + It MUST NOT require repository requirement matching or clarification. + source: 'GitHub issue #299' +- id: REQ-456 + title: SpecSmith CLI help is side-effect free + status: implemented + description: Every SpecSmith CLI invocation containing --help MUST return usage + without project migration, update checks, ledger writes, ESDB writes, work-item + allocation, or project-file creation or modification. Migration remains available + only through an explicit operational command. + source: 'GitHub issue #300' diff --git a/docs/site/esdb.md b/docs/site/esdb.md index 0c0f1c95..ce4fb800 100644 --- a/docs/site/esdb.md +++ b/docs/site/esdb.md @@ -276,6 +276,12 @@ once when first setting up ESDB in an existing project. specsmith esdb migrate ``` +When an active ChronoStore WAL has a recoverable invalid legacy hash chain, +`esdb migrate` creates a backup, compacts the WAL to rebuild its chain, verifies +the result, and records the backup path and repair outcome in +`.specsmith/esdb_migration_manifest.json`. A repair failure leaves the manifest +unsuccessful with an explicit remediation error. + ### `specsmith esdb status --json` JSON output for scripting and CI: diff --git a/docs/site/standalone-cli.md b/docs/site/standalone-cli.md index a5e06668..df1e9e78 100644 --- a/docs/site/standalone-cli.md +++ b/docs/site/standalone-cli.md @@ -46,10 +46,15 @@ specsmith preflight "" --json ``` - `decision == "accepted"` → proceed; note the `work_item_id` +- `decision == "environment_only"` → proceed with local `pipx` maintenance only; + no work item, ledger entry, or ESDB record is created - `decision == "needs_clarification"` → read the `instruction` field and refine your intent Never make a code change without an accepted preflight. The work item ID links the change to governance. +All `--help` invocations are read-only: they do not migrate a project, check for updates, +or create governance files. + ### During work ```bash diff --git a/docs/tests/overflow.yml b/docs/tests/overflow.yml index 1b5a5d43..08bd1a29 100644 --- a/docs/tests/overflow.yml +++ b/docs/tests/overflow.yml @@ -650,3 +650,18 @@ description: Verify save normalizes the Git policy, commits no SQLite cache, migration backup, marker, state, or agent migration artifact, and retains the mergeable session event log as canonical source of truth. +- id: TEST-474 + title: Pipx SpecSmith upgrades return a non-blocking environment-only preflight + decision + requirement_id: REQ-455 + type: cli + verification_method: pytest tests/test_nexus.py + description: Verify pipx-managed local SpecSmith upgrade language returns environment_only, + exits successfully, and does not create governance state. +- id: TEST-475 + title: Preflight help does not mutate an outdated project + requirement_id: REQ-456 + type: cli + verification_method: pytest tests/test_cli.py + description: Verify specsmith preflight --help leaves an older governed project + byte-for-byte unchanged and does not create governance files. diff --git a/docs/tests/yaml_governance.yml b/docs/tests/yaml_governance.yml index 4dc0d266..627f042d 100644 --- a/docs/tests/yaml_governance.yml +++ b/docs/tests/yaml_governance.yml @@ -1192,3 +1192,32 @@ description: Verify pyproject.toml lists cryptography in base project dependencies, so a clean pipx install can execute specsmith esdb enable without a manual pipx inject. +- id: TEST-476 + title: Release metadata and embedded project schema versions agree + requirement_id: REQ-369 + type: build + verification_method: pytest tests/test_release_version_contract.py + description: Verify pyproject metadata, source fallback, default scaffold schema, + and shipped wheel metadata use the same release version. +- id: TEST-477 + title: Save falls back to the symbolic branch in the supplied worktree + requirement_id: REQ-336 + type: unit + verification_method: pytest tests/test_vcs_commands.py + description: Verify save push resolves main from the supplied Git worktree when + git branch --show-current returns no value and reports the inspected worktree + if no branch exists. +- id: TEST-478 + title: ESDB migration repairs a verified legacy ChronoMemory WAL chain + requirement_id: REQ-305 + type: unit + verification_method: pytest tests/test_esdb_migrate_wal_repair.py + description: Verify an invalid ChronoStore chain is backed up, compacted, revalidated, + and recorded in the migration manifest. +- id: TEST-479 + title: Governance checkpoint anchor uses ASCII fixed-width rows + requirement_id: REQ-351 + type: cli + verification_method: pytest tests/test_cli.py + description: Verify human checkpoint output uses ASCII borders and status words + only, with every row the same fixed width. diff --git a/pyproject.toml b/pyproject.toml index 2eb76c63..c443b9aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "specsmith" -version = "0.22.1" +version = "0.22.2" description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider." readme = "README.md" license = "MIT" diff --git a/src/specsmith/__init__.py b/src/specsmith/__init__.py index d2989e06..2acb5c3c 100644 --- a/src/specsmith/__init__.py +++ b/src/specsmith/__init__.py @@ -8,4 +8,4 @@ try: __version__: str = _pkg_version("specsmith") except PackageNotFoundError: # running from source without install - __version__ = "0.22.1" # fallback: keep in sync with pyproject.toml + __version__ = "0.22.2" # fallback: keep in sync with pyproject.toml diff --git a/src/specsmith/agent/broker.py b/src/specsmith/agent/broker.py index 26fb7c02..953d09c5 100644 --- a/src/specsmith/agent/broker.py +++ b/src/specsmith/agent/broker.py @@ -416,7 +416,12 @@ def from_json(cls, payload: dict[str, Any]) -> PreflightDecision: @property def accepted(self) -> bool: - return self.decision.lower() == "accepted" + return self.decision.lower() in {"accepted", "environment_only"} + + @property + def environment_only(self) -> bool: + """Whether this decision permits local tool maintenance only.""" + return self.decision.lower() == "environment_only" def _resolve_specsmith_executable() -> str: @@ -523,7 +528,11 @@ def narrate_plan( else: lines.append("No matching governance scope found; will ask before drafting anything new.") - if decision.accepted: + if decision.environment_only: + lines.append( + "Environment-only SpecSmith CLI maintenance may proceed; no project work is governed." + ) + elif decision.accepted: lines.append("Specsmith approved this work.") elif decision.decision == "needs_clarification": # Surface only one clarifying question (REQ-063 stop-and-align). diff --git a/src/specsmith/cli.py b/src/specsmith/cli.py index 91791368..c274dde9 100644 --- a/src/specsmith/cli.py +++ b/src/specsmith/cli.py @@ -130,9 +130,11 @@ def invoke(self, ctx: click.Context) -> object: warnings.simplefilter("ignore", DeprecationWarning) protected = list(ctx.protected_args) # [subcommand] in 8.x, [] in 9.0 subcommand = protected[0] if protected else (ctx.args[0] if ctx.args else "") + help_requested = any(arg in {"--help", "-h"} for arg in (*protected, *ctx.args)) skip = ( os.environ.get("SPECSMITH_NO_AUTO_UPDATE", "").strip() in ("1", "true", "yes") or subcommand in self._SKIP_COMMANDS + or help_requested ) if not skip: @@ -939,7 +941,7 @@ def preflight_cmd( # REQ-092: decision-specific exit codes so CI / shell wrappers can branch # on intent without parsing the JSON payload. - if decision_str == "accepted": + if decision_str in {"accepted", "environment_only"}: return # exit 0 if decision_str == "needs_clarification": raise SystemExit(2) @@ -3853,7 +3855,7 @@ def channel_set_cmd(channel: str) -> None: if channel == "stable" and is_prerelease_version(__version__): raise click.UsageError( "Cannot select stable while a prerelease is installed. " - f"Install a stable build first: {version_mismatch_remediation('0.22.1')}" + f"Install a stable build first: {version_mismatch_remediation('0.22.2')}" ) set_persisted_channel(channel) @@ -4100,7 +4102,7 @@ def checkpoint_cmd(project_dir: str, as_json: bool) -> None: pass # ── Phase ───────────────────────────────────────────────────────────────── - phase_key, phase_label, phase_emoji, phase_pct = "unknown", "Unknown", "", 0 + phase_key, phase_label, phase_pct = "unknown", "Unknown", 0 try: from specsmith.phase import PHASE_MAP, phase_progress_pct, read_phase @@ -4108,7 +4110,6 @@ def checkpoint_cmd(project_dir: str, as_json: bool) -> None: phase = PHASE_MAP.get(phase_key) if phase: phase_label = phase.label - phase_emoji = phase.emoji phase_pct = phase_progress_pct(phase, root) except Exception: # noqa: BLE001 pass @@ -4203,7 +4204,7 @@ def checkpoint_cmd(project_dir: str, as_json: bool) -> None: "ts": ts, "project": project_name, "phase": phase_key, - "phase_label": f"{phase_emoji} {phase_label}", + "phase_label": phase_label, "phase_pct": phase_pct, "health": "clean" if health_ok else f"{audit_failed} issues", "audit_failed": audit_failed, @@ -4223,69 +4224,37 @@ def checkpoint_cmd(project_dir: str, as_json: bool) -> None: # ── Human-readable anchor block ─────────────────────────────────────────── # Designed to be compact and survive context summarization. - _w = 57 # interior width — must match len(hbar) - hbar = "\u2550" * _w # ═══… - vbar = "\u2551" # ║ - health_icon = "\u2713" if health_ok else "\u2717" - esdb_icon = "\u2713" if esdb_ok else "\u2717" + _w = 72 + health_status = "OK" if health_ok else "FAIL" + esdb_status = "OK" if esdb_ok else "FAIL" if esdb_backend == "chronomemory": - esdb_field = f"ESDB: {esdb_records} records ({esdb_icon} chain)" + esdb_field = f"ESDB: chronomemory {esdb_records} records chain={esdb_status}" elif esdb_backend == "sqlite": - # Compact format keeps the row within the 57-char box interior. - # " REQs : NNN TESTs: NNN " = 30 chars, leaving 27 for esdb_field. - esdb_field = f"ESDB: SQLite {esdb_records} recs {esdb_icon}" + esdb_field = f"ESDB: sqlite {esdb_records} records chain={esdb_status}" else: esdb_field = "ESDB: N/A" wi_str = ", ".join(recent_wis) if recent_wis else "none seen" - def _arow(rich: str, plain: str, wide: int = 0) -> str: - """Format one anchor box row: ║ ║. + def _arow(content: str) -> str: + """Return an ASCII-only row with a stable terminal-column width.""" + ascii_content = content.encode("ascii", "backslashreplace").decode("ascii") + return f"|{ascii_content[:_w].ljust(_w)}|" - ``plain`` is the markup-free string used for width calculation. - ``wide`` is the count of 2-wide (full-width/emoji) characters in ``plain`` - that add an extra terminal column beyond their Python ``len()``. - """ - pad = " " * max(0, _w - len(plain) - wide) - return f"[bold cyan]{vbar}[/bold cyan]{rich}{pad}[bold cyan]{vbar}[/bold cyan]" - - console.print(f"[bold cyan]\u2554{hbar}\u2557[/bold cyan]") - - r1 = f" GOVERNANCE ANCHOR {ts}" - console.print(_arow(r1, r1)) - - r2_plain = f" Project : {project_name}" - console.print(_arow(f" Project : [bold]{project_name}[/bold]", r2_plain)) - - # Emoji omitted from the anchor box: full-width glyphs vary by terminal - # and break the fixed-width box alignment unpredictably (GH #align). - r3_plain = f" Phase : {phase_label} ({phase_pct}%)" - console.print(_arow(r3_plain, r3_plain)) - - r4_plain = ( - f" Health : {health_icon} clean" - if health_ok - else f" Health : {health_icon} {audit_failed} issues" - ) - r4_rich = ( - f" Health : [green]{health_icon} clean[/green]" - if health_ok - else f" Health : [red]{health_icon} {audit_failed} issues[/red]" - ) - console.print(_arow(r4_rich, r4_plain)) - - r5 = f" REQs : {req_count} TESTs: {test_count} {esdb_field}" - console.print(_arow(r5, r5)) - - r6 = f" WIs : {wi_str}" - console.print(_arow(r6, r6)) + click.echo("+" + "-" * _w + "+") + click.echo(_arow(f" GOVERNANCE ANCHOR {ts}")) + click.echo(_arow(f" Project : {project_name}")) + click.echo(_arow(f" Phase : {phase_label} ({phase_pct}%)")) + health_field = "clean" if health_ok else f"{audit_failed} issues" + click.echo(_arow(f" Health : {health_status} {health_field}")) + click.echo(_arow(f" REQs : {req_count} TESTs: {test_count} {esdb_field}")) + click.echo(_arow(f" WIs : {wi_str}")) if last_preflight: - _pf_max = _w - len(" Preflight: ") # 45 — was incorrectly 55 + _pf_max = _w - len(" Preflight: ") pf_short = last_preflight[:_pf_max] - r7 = f" Preflight: {pf_short}" - console.print(_arow(r7, r7)) + click.echo(_arow(f" Preflight: {pf_short}")) - console.print(f"[bold cyan]\u255a{hbar}\u255d[/bold cyan]") + click.echo("+" + "-" * _w + "+") console.print( "[dim]Include this block verbatim in any context summary " r"(\`specsmith checkpoint\` re-generates it).[/dim]", @@ -11975,18 +11944,50 @@ def __init__(self, d: dict) -> None: } manifest_path = root / ".specsmith" / "esdb_migration_manifest.json" - manifest_path.parent.mkdir(parents=True, exist_ok=True) - manifest_path.write_text(_json.dumps(manifest, indent=2, ensure_ascii=False), encoding="utf-8") # --- Phase 2: migrate into active ESDB backend (if validation passed) --- migrate_counts: dict[str, int] = {} + wal_repair: dict[str, Any] = {"attempted": False} if ok: try: from specsmith.esdb import open_default_store with open_default_store(root, warn=False) as store: # type: ignore[attr-defined] + from specsmith.esdb import ESDB_BACKEND + + chain_valid = getattr(store, "chain_valid", None) + is_invalid_chrono_wal = ( + ESDB_BACKEND == "chronomemory" + and callable(chain_valid) + and chain_valid() is False + ) + if is_invalid_chrono_wal: + # ChronoMemory < 0.1.3 can retain readable records in a + # WAL whose historical hash chain no longer validates. + # Back up first, then compact to rebuild the chain safely. + wal_repair = { + "attempted": True, + "detected_invalid": True, + "method": "backup_then_compact", + } + backup = getattr(store, "backup", None) + compact = getattr(store, "compact", None) + if not callable(backup) or not callable(compact): + raise RuntimeError( + "ChronoStore cannot repair a legacy WAL because backup() or " + "compact() is unavailable", + ) + backup_path = backup() + wal_repair["backup_path"] = str(backup_path) + compact() + wal_repair["chain_valid_after"] = chain_valid() is not False + if not wal_repair["chain_valid_after"]: + raise RuntimeError( + "ChronoStore compact() did not restore WAL chain validity" + ) + wal_repair["ok"] = True + migrate_counts = store.migrate_from_json(root / ".specsmith") - from specsmith.esdb import ESDB_BACKEND manifest["migrated"] = migrate_counts if ESDB_BACKEND == "chronomemory": @@ -11994,7 +11995,27 @@ def __init__(self, d: dict) -> None: else: manifest["backend"] = "SQLite (.specsmith/esdb.sqlite3)" except Exception as _me: # noqa: BLE001 + issue_kind = "legacy-wal-chain-repair" if wal_repair["attempted"] else "esdb-migration" + migration_issue = {"kind": issue_kind, "detail": str(_me)} + issues.append(migration_issue) + errors.append(migration_issue) + ok = False manifest["chrono_error"] = str(_me) + if wal_repair["attempted"]: + wal_repair["ok"] = False + + manifest["ok"] = ok + manifest["issues"] = issues + manifest["error_count"] = len(errors) + manifest["warning_count"] = len(issues) - len(errors) + manifest["wal_repair"] = wal_repair + manifest["next_step"] = ( + "Ready for ChronoMemory native ingestion." + if ok + else "Fix errors above, then re-run to update the manifest." + ) + manifest_path.parent.mkdir(parents=True, exist_ok=True) + manifest_path.write_text(_json.dumps(manifest, indent=2, ensure_ascii=False), encoding="utf-8") if as_json: click.echo(_json.dumps(manifest, indent=2)) diff --git a/src/specsmith/config.py b/src/specsmith/config.py index 7df7a64b..c1ba4985 100644 --- a/src/specsmith/config.py +++ b/src/specsmith/config.py @@ -140,7 +140,7 @@ class ProjectConfig(BaseModel): ), ) language: str = Field(default="python", description="Primary language/runtime") - spec_version: str = Field(default="0.22.1", description="Spec version to scaffold from") + spec_version: str = Field(default="0.22.2", description="Spec version to scaffold from") description: str = Field(default="", description="Short project description") # Options diff --git a/src/specsmith/governance_logic.py b/src/specsmith/governance_logic.py index ffcdd0c8..5b3c046e 100644 --- a/src/specsmith/governance_logic.py +++ b/src/specsmith/governance_logic.py @@ -19,6 +19,16 @@ from typing import Any, cast +def _is_environment_only_specsmith_upgrade(utterance: str) -> bool: + """Return whether an utterance only maintains the local pipx CLI.""" + text = utterance.casefold() + return ( + "specsmith" in text + and "pipx" in text + and any(action in text for action in ("install", "update", "upgrade")) + ) + + def _safe_resolve(path: str | Path) -> Path: """Resolve a project directory path and reject traversal sequences. @@ -88,6 +98,32 @@ def run_preflight( _safe_root = os.path.realpath(_raw) _root_str = _safe_root # alias used by helpers later in this function intent = classify_intent(utterance) + + # Local pipx maintenance is not a repository change. Return before scope + # inference and persistence so the command cannot dirty a governed project. + if _is_environment_only_specsmith_upgrade(utterance): + return { + "decision": "environment_only", + "scope": "environment_only", + "work_item_id": "", + "requirement_ids": [], + "test_case_ids": [], + "confidence_target": 1.0, + "instruction": ( + "Pipx-managed local SpecSmith CLI maintenance is outside project governance. " + "Proceed with `pipx upgrade specsmith`; no project work item or " + "records were created." + ), + "intent": intent.value, + "ai_disclosure": { + "governed_by": "specsmith", + "governance_gated": True, + "provider": os.environ.get("SPECSMITH_PROVIDER", "local/heuristic"), + "model": os.environ.get("SPECSMITH_MODEL", "deterministic-broker"), + "spec_version": __version__, + }, + } + # Requirements scope source for keyword matching in infer_scope(). # Requirements are sourced from .specsmith/requirements.json (YAML-first mode); # the REQUIREMENTS.md markdown is only a token-overlap fallback. The canonical diff --git a/src/specsmith/vcs_commands.py b/src/specsmith/vcs_commands.py index 3befa2ca..b3bf3599 100644 --- a/src/specsmith/vcs_commands.py +++ b/src/specsmith/vcs_commands.py @@ -39,9 +39,16 @@ def _run_git(root: Path, args: list[str], *, timeout: int = 30) -> GitResult: def get_current_branch(root: Path) -> str: - """Get the current git branch name.""" + """Get the current git branch name for the supplied worktree.""" result = _run_git(root, ["branch", "--show-current"]) - return result.output if result.success else "" + branch = result.output.strip() if result.success else "" + if branch: + return branch + + # ``branch --show-current`` is empty in some shell/worktree combinations + # despite HEAD being attached. ``symbolic-ref`` is the authoritative fallback. + result = _run_git(root, ["symbolic-ref", "--quiet", "--short", "HEAD"]) + return result.output.strip() if result.success else "" def has_uncommitted_changes(root: Path) -> bool: @@ -166,7 +173,12 @@ def run_push(root: Path, *, force: bool = False) -> GitResult: branch = get_current_branch(root) if not branch: - return GitResult(success=False, message="Not on any branch") + worktree = _run_git(root, ["rev-parse", "--show-toplevel"]) + inspected = worktree.output.strip() if worktree.success else str(root.resolve()) + return GitResult( + success=False, + message=f"Not on any branch in git worktree: {inspected}", + ) # Safety: check branching strategy from specsmith.paths import find_scaffold diff --git a/tests/test_cli.py b/tests/test_cli.py index e4dd8d6c..7210b6dc 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -70,6 +70,68 @@ def test_version_flag(self) -> None: assert __version__ in result.output +class TestCLIHelp: + def test_preflight_help_does_not_migrate_or_write_project_files( + self, tmp_path, monkeypatch + ) -> None: + """TEST-475: help must not mutate a project that needs migration.""" + docs = tmp_path / "docs" + docs.mkdir() + (docs / "SPECSMITH.yml").write_text( + "name: temp-specsmith-repro\ntype: cli-python\nspec_version: 0.22.0\n", + encoding="utf-8", + ) + (tmp_path / "LEDGER.md").write_text("# Ledger\n", encoding="utf-8") + before = { + path.relative_to(tmp_path): path.read_bytes() + for path in tmp_path.rglob("*") + if path.is_file() + } + + monkeypatch.chdir(tmp_path) + result = CliRunner().invoke( + main, + ["preflight", "--help"], + env={"SPECSMITH_NO_UPDATE_CHECK": "1"}, + catch_exceptions=False, + ) + + assert result.exit_code == 0, result.output + assert "Usage: " in result.output + assert "Auto-migrating" not in result.output + after = { + path.relative_to(tmp_path): path.read_bytes() + for path in tmp_path.rglob("*") + if path.is_file() + } + assert after == before + + +class TestCheckpointAnchor: + def test_checkpoint_anchor_is_ascii_and_fixed_width(self, tmp_path: Path) -> None: + """TEST-479: anchor rows must render safely in proportional-font clients.""" + result = CliRunner().invoke( + main, + ["checkpoint", "--project-dir", str(tmp_path)], + env={"SPECSMITH_NO_AUTO_UPDATE": "1"}, + catch_exceptions=False, + ) + + assert result.exit_code == 0, result.output + lines = result.output.splitlines() + top = next(index for index, line in enumerate(lines) if line.startswith("+---")) + bottom = next( + index for index, line in enumerate(lines[top + 1 :], top + 1) if line.startswith("+---") + ) + anchor = lines[top : bottom + 1] + + assert all(line.isascii() for line in anchor) + assert all(len(line) == len(anchor[0]) for line in anchor) + assert anchor[0] == anchor[-1] + assert all(line.startswith("|") and line.endswith("|") for line in anchor[1:-1]) + assert "Health : " in "\n".join(anchor) + + class TestCLIInit: def test_init_from_config(self, tmp_path: Path) -> None: config = { diff --git a/tests/test_esdb_migrate_wal_repair.py b/tests/test_esdb_migrate_wal_repair.py new file mode 100644 index 00000000..d8146974 --- /dev/null +++ b/tests/test_esdb_migrate_wal_repair.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved. +"""Regression coverage for legacy ChronoMemory WAL migration repair.""" + +from __future__ import annotations + +import json +from pathlib import Path + +from click.testing import CliRunner + +from specsmith.cli import main + + +class _LegacyChronoStore: + def __init__(self, root: Path) -> None: + self.root = root + self.compacted = False + self.backup_called = False + self.migrated = False + + def __enter__(self) -> _LegacyChronoStore: + return self + + def __exit__(self, *_args: object) -> None: + return None + + def chain_valid(self) -> bool: + return self.compacted + + def backup(self) -> Path: + self.backup_called = True + return self.root / ".chronomemory" / "backup" / "legacy-wal" + + def compact(self) -> None: + self.compacted = True + + def migrate_from_json(self, _state_dir: Path) -> dict[str, int]: + self.migrated = True + return {"requirements": 0, "testcases": 0, "skipped": 0} + + +def test_esdb_migrate_repairs_invalid_legacy_chronomemory_wal( + tmp_path: Path, + monkeypatch, +) -> None: + """TEST-478: invalid legacy chains are backed up, compacted, and recorded.""" + state_dir = tmp_path / ".specsmith" + state_dir.mkdir() + (state_dir / "requirements.json").write_text("[]", encoding="utf-8") + (state_dir / "testcases.json").write_text("[]", encoding="utf-8") + store = _LegacyChronoStore(tmp_path) + + monkeypatch.setattr("specsmith.esdb.open_default_store", lambda *_args, **_kwargs: store) + monkeypatch.setattr("specsmith.esdb.ESDB_BACKEND", "chronomemory") + + result = CliRunner().invoke( + main, + ["esdb", "migrate", "--project-dir", str(tmp_path), "--json"], + env={"SPECSMITH_NO_AUTO_UPDATE": "1"}, + catch_exceptions=False, + ) + + assert result.exit_code == 0, result.output + payload = json.loads(result.output) + assert payload["ok"] is True + assert payload["wal_repair"] == { + "attempted": True, + "detected_invalid": True, + "method": "backup_then_compact", + "backup_path": str(tmp_path / ".chronomemory" / "backup" / "legacy-wal"), + "chain_valid_after": True, + "ok": True, + } + assert store.backup_called + assert store.compacted + assert store.migrated + manifest = json.loads((state_dir / "esdb_migration_manifest.json").read_text(encoding="utf-8")) + assert manifest["wal_repair"] == payload["wal_repair"] diff --git a/tests/test_nexus.py b/tests/test_nexus.py index d89146a2..74e243ad 100644 --- a/tests/test_nexus.py +++ b/tests/test_nexus.py @@ -968,6 +968,48 @@ def test_specsmith_preflight_cli_change_with_scope_accepts(tmp_path): assert payload["requirement_ids"] # at least one matched REQ +def test_specsmith_preflight_cli_pipx_upgrade_is_environment_only(tmp_path): + """TEST-474: local pipx upgrades must not create project governance state.""" + from click.testing import CliRunner + + from specsmith.cli import main + + scaffold = tmp_path / "scaffold.yml" + scaffold.write_text("name: test\ntype: cli-python\nspec_version: 0.3.13\n", encoding="utf-8") + before = { + path.relative_to(tmp_path): path.read_bytes() + for path in tmp_path.rglob("*") + if path.is_file() + } + + result = CliRunner().invoke( + main, + [ + "preflight", + "Upgrade the pipx-managed SpecSmith CLI on this machine to the latest version", + "--project-dir", + str(tmp_path), + "--json", + ], + env={"SPECSMITH_NO_AUTO_UPDATE": "1"}, + catch_exceptions=False, + ) + + assert result.exit_code == 0, result.output + payload = json.loads(result.output) + assert payload["decision"] == "environment_only" + assert payload["scope"] == "environment_only" + assert payload["work_item_id"] == "" + assert payload["requirement_ids"] == [] + assert payload["test_case_ids"] == [] + after = { + path.relative_to(tmp_path): path.read_bytes() + for path in tmp_path.rglob("*") + if path.is_file() + } + assert after == before + + # --------------------------------------------------------------------------- # TEST-086 — REPL gates execution on preflight acceptance # --------------------------------------------------------------------------- diff --git a/tests/test_release_version_contract.py b/tests/test_release_version_contract.py new file mode 100644 index 00000000..f8ca92eb --- /dev/null +++ b/tests/test_release_version_contract.py @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved. +"""Release-version contract checks for published SpecSmith artifacts.""" + +from __future__ import annotations + +import re +from pathlib import Path + +import yaml + +ROOT = Path(__file__).resolve().parents[1] + + +def _quoted_value(path: Path, pattern: str) -> str: + match = re.search(pattern, path.read_text(encoding="utf-8"), re.MULTILINE) + assert match, f"missing release version in {path}" + return match.group(1) + + +def test_release_metadata_and_embedded_schema_versions_agree() -> None: + """TEST-476: a wheel cannot advertise a different project schema version.""" + release_version = _quoted_value(ROOT / "pyproject.toml", r'^version\s*=\s*"([^"]+)"$') + fallback_version = _quoted_value( + ROOT / "src" / "specsmith" / "__init__.py", + r'__version__\s*=\s*"([^"]+)"\s+# fallback', + ) + schema_version = _quoted_value( + ROOT / "src" / "specsmith" / "config.py", + r'spec_version:\s*str\s*=\s*Field\(default="([^"]+)"', + ) + project_schema = yaml.safe_load((ROOT / "docs" / "SPECSMITH.yml").read_text(encoding="utf-8")) + + assert fallback_version == release_version + assert schema_version == release_version + assert project_schema["version"] == release_version diff --git a/tests/test_vcs_commands.py b/tests/test_vcs_commands.py new file mode 100644 index 00000000..40014b32 --- /dev/null +++ b/tests/test_vcs_commands.py @@ -0,0 +1,57 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved. +"""Regression coverage for Git worktree branch resolution.""" + +from __future__ import annotations + +from pathlib import Path + +import specsmith.vcs_commands as vcs + + +def test_run_push_falls_back_to_symbolic_ref_for_supplied_worktree( + tmp_path: Path, + monkeypatch, +) -> None: + """TEST-477: an attached main branch must not be reported as detached.""" + calls: list[tuple[Path, list[str]]] = [] + + def fake_run_git(root: Path, args: list[str], **_kwargs: object) -> vcs.GitResult: + calls.append((root, args)) + if args == ["branch", "--show-current"]: + return vcs.GitResult(success=True, message="", output="") + if args == ["symbolic-ref", "--quiet", "--short", "HEAD"]: + return vcs.GitResult(success=True, message="main", output="main") + if args == ["push", "origin", "main"]: + return vcs.GitResult(success=True, message="pushed", output="pushed") + raise AssertionError(f"unexpected git command: {args}") + + monkeypatch.setattr(vcs, "_run_git", fake_run_git) + result = vcs.run_push(tmp_path) + + assert result.success + assert all(root == tmp_path for root, _args in calls) + assert (tmp_path, ["push", "origin", "main"]) in calls + + +def test_run_push_reports_the_worktree_when_head_is_detached( + tmp_path: Path, + monkeypatch, +) -> None: + """TEST-477: diagnostics name the Git worktree that was inspected.""" + + def fake_run_git(root: Path, args: list[str], **_kwargs: object) -> vcs.GitResult: + if args in ( + ["branch", "--show-current"], + ["symbolic-ref", "--quiet", "--short", "HEAD"], + ): + return vcs.GitResult(success=True, message="", output="") + if args == ["rev-parse", "--show-toplevel"]: + return vcs.GitResult(success=True, message=str(root), output=str(root)) + raise AssertionError(f"unexpected git command: {args}") + + monkeypatch.setattr(vcs, "_run_git", fake_run_git) + result = vcs.run_push(tmp_path) + + assert not result.success + assert str(tmp_path) in result.message