prizmkit 1.1.156 → 1.1.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/adapters/codebuddy/settings-adapter.js +76 -25
  3. package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +9 -2
  4. package/bundled/dev-pipeline/prizmkit_runtime/reset.py +1 -1
  5. package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +20 -11
  6. package/bundled/dev-pipeline/prizmkit_runtime/runtime_commit.py +42 -15
  7. package/bundled/dev-pipeline/scripts/update-feature-status.py +7 -0
  8. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +1 -1
  9. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +1 -1
  10. package/bundled/dev-pipeline/templates/sections/runtime-commit-handoff.md +6 -6
  11. package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +4 -3
  12. package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +2 -2
  13. package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +2 -2
  14. package/bundled/dev-pipeline/tests/test_python_runner_parity.py +115 -4
  15. package/bundled/dev-pipeline/tests/test_reset_modes.py +137 -0
  16. package/bundled/dev-pipeline/tests/test_runtime_commit.py +68 -13
  17. package/bundled/dev-pipeline/tests/test_unified_cli.py +12 -7
  18. package/bundled/rules/prizm/prizm-commit-workflow.md +7 -7
  19. package/bundled/rules/prizm/prizm-documentation.md +24 -65
  20. package/bundled/rules/prizm/prizm-progressive-loading.md +9 -8
  21. package/bundled/skills/_metadata.json +1 -1
  22. package/bundled/skills/prizmkit/SKILL.md +1 -13
  23. package/bundled/skills/prizmkit-code-review/SKILL.md +29 -10
  24. package/bundled/skills/prizmkit-code-review/references/independent-code-review.md +5 -4
  25. package/bundled/skills/prizmkit-code-review/references/review-report-template.md +15 -0
  26. package/bundled/skills/prizmkit-code-review/scripts/render_review_report.py +61 -0
  27. package/bundled/skills/prizmkit-committer/SKILL.md +50 -38
  28. package/bundled/skills/prizmkit-deploy/SKILL.md +172 -198
  29. package/bundled/skills/prizmkit-deploy/references/capability-contract.md +137 -0
  30. package/bundled/skills/prizmkit-deploy/references/deploy-record-schema.json +1053 -0
  31. package/bundled/skills/prizmkit-deploy/references/deployment-declaration-schema.json +291 -0
  32. package/bundled/skills/prizmkit-deploy/references/legacy-migration.md +90 -0
  33. package/bundled/skills/prizmkit-deploy/references/policy-and-execution.md +170 -0
  34. package/bundled/skills/prizmkit-deploy/references/real-resource-test-policy.md +73 -0
  35. package/bundled/skills/prizmkit-deploy/references/verification-and-recovery.md +164 -0
  36. package/bundled/skills/prizmkit-deploy/scripts/validate-deploy-artifact.py +371 -0
  37. package/bundled/skills/prizmkit-implement/SKILL.md +2 -2
  38. package/bundled/skills/prizmkit-init/SKILL.md +38 -42
  39. package/bundled/skills/prizmkit-init/references/config-schema.md +11 -7
  40. package/bundled/skills/prizmkit-init/references/rules/layer-detection.md +3 -3
  41. package/bundled/skills/prizmkit-init/references/update-supplement.md +5 -5
  42. package/bundled/skills/prizmkit-plan/SKILL.md +5 -4
  43. package/bundled/skills/prizmkit-plan/assets/plan-template.md +4 -1
  44. package/bundled/skills/prizmkit-plan/references/verification-checklist.md +3 -2
  45. package/bundled/skills/prizmkit-prizm-docs/SKILL.md +17 -11
  46. package/bundled/skills/prizmkit-prizm-docs/assets/prizm-docs-format.md +95 -155
  47. package/bundled/skills/prizmkit-prizm-docs/references/op-init.md +6 -5
  48. package/bundled/skills/prizmkit-prizm-docs/references/op-rebuild.md +4 -2
  49. package/bundled/skills/prizmkit-prizm-docs/references/op-status.md +9 -10
  50. package/bundled/skills/prizmkit-prizm-docs/references/op-update.md +6 -5
  51. package/bundled/skills/prizmkit-prizm-docs/references/op-validate.md +13 -12
  52. package/bundled/skills/prizmkit-retrospective/SKILL.md +3 -3
  53. package/bundled/skills/prizmkit-test/SKILL.md +26 -13
  54. package/bundled/skills/prizmkit-test/references/boundary-contract-and-test-double-guidance.md +8 -4
  55. package/bundled/skills/prizmkit-test/references/independent-test-review.md +7 -3
  56. package/bundled/skills/prizmkit-test/references/test-coverage-model.md +33 -10
  57. package/bundled/skills/prizmkit-test/references/test-report-template.md +33 -11
  58. package/bundled/skills/prizmkit-workflow/SKILL.md +33 -3
  59. package/bundled/skills/prizmkit-workflow/references/workflow-state-protocol.md +23 -5
  60. package/bundled/templates/hooks/commit-intent-status.py +9 -41
  61. package/bundled/templates/hooks/commit-intent.json +3 -3
  62. package/bundled/templates/hooks/diff-prizm-docs.py +3 -1
  63. package/bundled/templates/hooks/prizm-pre-commit.py +32 -6
  64. package/bundled/templates/hooks/run-python-hook.cjs +44 -0
  65. package/bundled/templates/hooks/validate-prizm-docs.py +399 -173
  66. package/bundled/templates/project-memory-template.md +19 -19
  67. package/package.json +1 -1
  68. package/src/clean.js +6 -7
  69. package/src/gitignore-template.js +8 -12
  70. package/src/scaffold.js +125 -71
  71. package/bundled/skills/prizmkit/references/workflow-state-protocol.md +0 -178
  72. package/bundled/skills/prizmkit-deploy/assets/deploy-document-template.md +0 -89
  73. package/bundled/skills/prizmkit-deploy/references/ci-cd-workflows.md +0 -145
  74. package/bundled/skills/prizmkit-deploy/references/cloud-platform-deploy.md +0 -109
  75. package/bundled/skills/prizmkit-deploy/references/data-safety-examples.md +0 -120
  76. package/bundled/skills/prizmkit-deploy/references/database-setup.md +0 -65
  77. package/bundled/skills/prizmkit-deploy/references/deploy-config-schema.md +0 -150
  78. package/bundled/skills/prizmkit-deploy/references/deploy-history-schema.md +0 -78
  79. package/bundled/skills/prizmkit-deploy/references/deploy-metadata-schema.json +0 -49
  80. package/bundled/skills/prizmkit-deploy/references/deployment-modes.md +0 -50
  81. package/bundled/skills/prizmkit-deploy/references/direct-upload.md +0 -26
  82. package/bundled/skills/prizmkit-deploy/references/dns-setup.md +0 -42
  83. package/bundled/skills/prizmkit-deploy/references/docker-deploy.md +0 -31
  84. package/bundled/skills/prizmkit-deploy/references/firewall-setup.md +0 -37
  85. package/bundled/skills/prizmkit-deploy/references/live-validation-notes.md +0 -21
  86. package/bundled/skills/prizmkit-deploy/references/nginx-blue-green.md +0 -59
  87. package/bundled/skills/prizmkit-deploy/references/pending-input-schema.json +0 -164
  88. package/bundled/skills/prizmkit-deploy/references/ssh-adapter-flow.md +0 -221
  89. package/bundled/skills/prizmkit-deploy/references/ssh-bootstrap-flow.md +0 -49
  90. package/bundled/skills/prizmkit-deploy/references/ssh-execution-flow.md +0 -41
  91. package/bundled/skills/prizmkit-deploy/references/ssh-takeover.md +0 -20
  92. package/bundled/skills/prizmkit-deploy/references/ssl-setup.md +0 -56
@@ -11,6 +11,7 @@ from typing import Any
11
11
 
12
12
  VERDICTS = {"PASS", "NEEDS_FIXES"}
13
13
  EVENTS = {
14
+ "scope-classification",
14
15
  "main-review-round",
15
16
  "repair-verification",
16
17
  "independent-review-round",
@@ -25,6 +26,8 @@ REVIEWER_RESULTS = {
25
26
  }
26
27
  ADJUDICATION_DECISIONS = {"accepted", "rejected", "unresolved"}
27
28
  RECHECK_STATES = {"yes", "no", "not applicable"}
29
+ ROUND_CONTINUATION_MODES = {"native", "replacement"}
30
+ DOWNGRADE_CONTINUATION_MODES = {"native", "replacement", "mixed", "not-applicable"}
28
31
  FINAL_HEADING = "## Final Result"
29
32
 
30
33
 
@@ -54,6 +57,25 @@ def _require_count(data: dict[str, Any], name: str, *, maximum: int | None = Non
54
57
  return value
55
58
 
56
59
 
60
+ def _require_text_list(data: dict[str, Any], name: str) -> list[str]:
61
+ value = data.get(name)
62
+ if not isinstance(value, list):
63
+ raise ReportStateError(f"{name} must be an array of strings")
64
+ normalized: list[str] = []
65
+ for item in value:
66
+ if not isinstance(item, str) or not item.strip():
67
+ raise ReportStateError(f"{name} must contain only non-empty strings")
68
+ text = item.strip()
69
+ if text in normalized:
70
+ raise ReportStateError(f"{name} must not contain duplicates")
71
+ normalized.append(text)
72
+ return normalized
73
+
74
+
75
+ def _render_path_list(paths: list[str]) -> list[str]:
76
+ return [f" - {path}" for path in paths] if paths else [" - None."]
77
+
78
+
57
79
  def _report_text(path: Path) -> str:
58
80
  try:
59
81
  return path.read_text(encoding="utf-8")
@@ -91,6 +113,20 @@ def _render_event(data: dict[str, Any]) -> str:
91
113
  if event not in EVENTS:
92
114
  raise ReportStateError(f"event has invalid value: {event!r}")
93
115
 
116
+ if event == "scope-classification":
117
+ in_scope = _require_text_list(data, "in_scope_paths")
118
+ excluded = _require_text_list(data, "excluded_paths")
119
+ return "\n".join(
120
+ [
121
+ "## Review Scope",
122
+ "",
123
+ "- In-Scope Paths:",
124
+ *_render_path_list(in_scope),
125
+ "- Default-Excluded Changed Paths:",
126
+ *_render_path_list(excluded),
127
+ ]
128
+ )
129
+
94
130
  if event == "main-review-round":
95
131
  round_number = _require_count(data, "round", maximum=10)
96
132
  if round_number < 1:
@@ -131,6 +167,15 @@ def _render_event(data: dict[str, Any]) -> str:
131
167
  response = _require_count(data, "response", maximum=5)
132
168
  if response < 1:
133
169
  raise ReportStateError("response must be at least 1")
170
+ capability_basis = _require_text(data, "capability_basis")
171
+ continuation_mode = _require_text(data, "continuation_mode")
172
+ if continuation_mode not in ROUND_CONTINUATION_MODES:
173
+ raise ReportStateError(
174
+ f"continuation_mode has invalid value: {continuation_mode!r}"
175
+ )
176
+ reviewer_replacements = _require_count(
177
+ data, "reviewer_replacements", maximum=1
178
+ )
134
179
  result = _require_text(data, "result")
135
180
  if result not in REVIEWER_RESULTS:
136
181
  raise ReportStateError(f"result has invalid value: {result!r}")
@@ -156,6 +201,10 @@ def _render_event(data: dict[str, Any]) -> str:
156
201
  [
157
202
  f"## Independent Review Round {response}",
158
203
  "",
204
+ "- Capability Gate: ENABLED",
205
+ f"- Capability Basis: {capability_basis}",
206
+ f"- Continuation Mode: {continuation_mode}",
207
+ f"- Reviewer Replacements: {reviewer_replacements}",
159
208
  f"- Result: {result}",
160
209
  f"- Corrections: {corrections}",
161
210
  f"- Accepted: {accepted}",
@@ -181,6 +230,15 @@ def _render_event(data: dict[str, Any]) -> str:
181
230
  )
182
231
 
183
232
  if event == "independent-review-downgrade":
233
+ capability_basis = _require_text(data, "capability_basis")
234
+ continuation_mode = _require_text(data, "continuation_mode")
235
+ if continuation_mode not in DOWNGRADE_CONTINUATION_MODES:
236
+ raise ReportStateError(
237
+ f"continuation_mode has invalid value: {continuation_mode!r}"
238
+ )
239
+ reviewer_replacements = _require_count(
240
+ data, "reviewer_replacements", maximum=1
241
+ )
184
242
  rechecked = _require_text(data, "final_state_independently_rechecked")
185
243
  if rechecked not in RECHECK_STATES:
186
244
  raise ReportStateError(
@@ -192,6 +250,9 @@ def _render_event(data: dict[str, Any]) -> str:
192
250
  "## Independent Review Downgrade",
193
251
  "",
194
252
  f"- Reason: {_require_text(data, 'reason')}",
253
+ f"- Capability Basis: {capability_basis}",
254
+ f"- Continuation Mode: {continuation_mode}",
255
+ f"- Reviewer Replacements: {reviewer_replacements}",
195
256
  f"- Fallback: {_require_text(data, 'fallback')}",
196
257
  f"- Final State Independently Rechecked: {rechecked}",
197
258
  ]
@@ -19,10 +19,12 @@ Remote publication is outside this Skill.
19
19
  | `artifact_dir` | Yes | Exact caller-supplied artifact root for this commit stage. |
20
20
  | `operation` | Yes | `interactive-commit` or `prepare-runtime-commit`. |
21
21
  | `evidence_paths` | Yes | Exact caller-supplied project-relative artifacts that establish commit readiness. |
22
- | `excluded_paths` | No | Exact caller-owned metadata paths that must remain outside the commit and are also excluded by the selected operation's consumer contract. It is not an allowlist for unrelated project changes. |
22
+ | `intended_paths` | Interactive only: Yes | Exact unique project-relative final paths approved by the caller for preview and staging. It is never inferred from workspace breadth. |
23
+ | `support_validation_evidence` | Interactive conditional | Required only for an explicit host/platform support path. Supply one exact record per support path with `path`, named semantic `contract`, completed `validation`, `result=PASS`, and an exact `evidence_path` also present in `evidence_paths`. A path is not support merely because it is under `.prizmkit/**`. |
24
+ | `excluded_paths` | No | Exact caller-owned operation metadata that the selected consumer also excludes. It cannot hide unrelated project changes. |
23
25
  | `request_path` | Preparation only | Must equal `{artifact_dir}/runtime-commit-request.json`. |
24
26
 
25
- Do not discover another artifact root or infer the operation from provider, platform, prompt style, or human availability.
27
+ Do not discover another artifact root or infer the operation from provider, platform, prompt style, tracking policy, or human availability.
26
28
 
27
29
  ## Stage Boundary
28
30
 
@@ -30,18 +32,26 @@ This Skill owns only final-change inspection and its selected commit operation.
30
32
 
31
33
  In preparation mode it must not stage, unstage, commit, amend, reset, merge, or push.
32
34
 
35
+ ## Framework Directory and Git Policy
36
+
37
+ `.prizmkit/**` is the PrizmKit framework directory, not a blanket Git exclusion. The project alone decides which paths are ignored, untracked, or tracked. A Git-visible intended path must not be rejected, specially admitted, or require documentation-specific evidence solely because it is under `.prizmkit/**`.
38
+
39
+ Ignored paths remain naturally absent. Never force-add a path, add/remove/interpret `.gitignore` entries, or require a project to track framework artifacts. Exact Runtime request/checkpoint paths and installed Runtime/state may remain outside a task commit only because of their concrete operation-owned support/bookkeeping role. Global Secret and sensitive-content checks apply to every intended path, including framework paths; this contract creates no Secret exception.
40
+
33
41
  ## Step 1: Validate Supplied Evidence and Final Change
34
42
 
35
- 1. Resolve `artifact_dir` and every `evidence_paths` entry exactly as supplied by the caller.
36
- 2. Reject missing, unreadable, stale, contradictory, blocked, or explicitly non-passing evidence.
37
- 3. Inspect staged, unstaged, untracked, deleted, and renamed files with bounded Git status/diff commands.
38
- 4. Confirm every changed path belongs to the supplied change, a concrete dependency, its tests, durable documentation, or caller-required artifacts.
39
- 5. Reject unresolved merge state and sensitive files such as real environment files, credentials, secrets, private keys, certificates, or local settings.
40
- 6. Confirm no requested task output remains to be generated after this stage.
43
+ 1. Resolve `artifact_dir` and every `evidence_paths` entry exactly as supplied. For interactive operation, also resolve every exact `intended_paths` entry without broadening it.
44
+ 2. Reject missing, unreadable, stale, contradictory, blocked, or explicitly non-passing readiness evidence.
45
+ 3. Inspect staged, unstaged, untracked, deleted, and renamed Git-visible files with bounded Git status/diff commands. Ignored files are not discovered.
46
+ 4. Confirm every intended path belongs to the supplied requirement, a concrete dependency, its tests, project documentation/configuration, a framework-managed requirement output, or an explicitly caller-owned support artifact. Unknown or unrelated Git-visible changes block rather than entering or disappearing from the manifest.
47
+ 5. For each explicit host/platform support path, require one unique `support_validation_evidence` record whose `path` equals that manifest entry, whose `evidence_path` is supplied and readable, and whose named contract, completed validation, and `result=PASS` agree with that evidence. Do not apply this requirement to a path merely because its prefix is `.prizmkit/` or `.prizmkit/prizm-docs/`.
48
+ 6. Reject unresolved merge state and scan all intended content/diffs for real environment files, credentials, Secrets, private keys, certificates, local settings, and other sensitive material.
49
+ 7. Confirm no requested task output remains to be generated after this stage.
50
+ 8. Require every intended path to be Git-visible and stageable under existing project policy. If an exact path is ignored or otherwise not stageable, report its ordinary Git visibility/policy result; never force-add or change policy.
41
51
 
42
- The caller decides which evidence is required and how the returned commit-stage result is used. This Skill validates the supplied evidence but does not infer a larger stage sequence.
52
+ The caller decides which readiness evidence is required and how the returned stage result is used. The Skill validates supplied evidence but does not infer a larger lifecycle.
43
53
 
44
- ## Step 2: Build Commit Message and Intended Path Set
54
+ ## Step 2: Classify Paths and Build the Exact Manifest
45
55
 
46
56
  Generate one concise Conventional Commit message:
47
57
 
@@ -49,33 +59,34 @@ Generate one concise Conventional Commit message:
49
59
  <type>(<scope>): <description>
50
60
  ```
51
61
 
52
- Classify every observed change before constructing the request. All paths under `.prizmkit/` are framework-internal and remain outside automated task commits.
62
+ Classify observed changes by semantic role, not by a blanket `.prizmkit/**` prefix:
63
+
64
+ - **task-owned**: justified source, tests, documentation, configuration, dependencies, and framework-managed requirement output, including safe Git-visible `.prizmkit/**` paths when they belong to the supplied change;
65
+ - **explicit interactive support**: host instruction/lock/config support named by the exact spec/plan, validated one-to-one, labeled separately, and confirmed by the user;
66
+ - **operation-owned Runtime bookkeeping/support**: exact request/checkpoint/caller-state paths, installed `.prizmkit/dev-pipeline/**`, Runtime state, installed host payloads, and local host settings that the active consumer contract identifies as support rather than task output;
67
+ - **project transient**: data naturally absent because the project's existing ignore policy excludes it;
68
+ - **sensitive**: Secrets, credentials, private environment, private keys/certificates, or local settings;
69
+ - **unknown Git-visible**: any remaining path whose task or explicit support ownership cannot be proven.
53
70
 
54
- - **task-owned**: justified source, tests, product/project documentation, configuration, and dependency changes outside recognized support namespaces;
55
- - **PrizmKit-internal**: every path under `.prizmkit/`, including config, plans, Prizm docs, lifecycle Artifacts, installed Runtime files, and state;
56
- - **platform support**: `AGENTS.md`, `skills-lock.json`, installed platform directories, and local platform settings;
57
- - **project transient**: data the project already excludes through Git ignore rules;
58
- - **unknown Git-visible**: any remaining path whose task ownership cannot be proven.
71
+ A Prizm documentation path has no separate commit-ownership class and requires no `retrospective-result.json` authorization. Retrospective may have created it, but Committer handles a Git-visible path through the same task justification, exact manifest, Secret scan, and receipt verification as any other path.
59
72
 
60
- Build a unique set of exact project-relative **task-owned** changed paths. Include intended tracked modifications, deletions, renames, new source/tests, and justified project documentation outside support namespaces. Exclude:
73
+ For `operation=interactive-commit`, validate caller-supplied `intended_paths` as the complete approved manifest. Every entry must be exact, unique, project-relative, currently Git-visible, stageable without force, and task-owned or explicitly validated support. Prohibit `.git/**`, exact operation-owned Runtime bookkeeping, installed host payload/state, Secrets, temporary files, and unrelated/unknown changes. Label explicit host support separately; do not label `.prizmkit/**` specially.
61
74
 
62
- - `.git/`;
63
- - the complete `.prizmkit/` tree;
64
- - `AGENTS.md`, `skills-lock.json`, installed platform directories, and local platform settings;
65
- - sensitive or unrelated files.
75
+ For `operation=prepare-runtime-commit`, construct a unique exact set of all justified task-owned Git-visible changed paths, including safe `.prizmkit/**` task output. Exclude only consumer-recognized semantic support/bookkeeping, sensitive, unrelated, or naturally ignored data. Exact caller metadata in `excluded_paths` is valid only when the Python Runtime independently excludes that same semantic role. Unknown Git-visible changes block.
66
76
 
67
- Unknown Git-visible paths block the operation; do not silently classify them as transient. Project-specific transient data belongs in the project's Git ignore rules, not caller-provided exclusions. Do not use wildcard pathspecs, `git add .`, or `git add -A` as an intended-path description. In preparation mode, reject an `excluded_paths` entry unless the Python Runtime independently excludes that exact caller-owned metadata class; unrelated or user-authored project changes cannot be hidden from exact-path coverage.
77
+ Never use wildcard pathspecs, broad `git add .`, broad `git add -A`, or force-add. Exact literal path staging may use Git's update semantics for a listed deletion, but the path set must remain exactly the manifest.
68
78
 
69
79
  ## Step 3A: Interactive Commit
70
80
 
71
81
  For `operation=interactive-commit`:
72
82
 
73
- 1. Present intended paths, change summary, sensitive-file warnings, diff statistics, proposed message, and intentionally excluded changes.
83
+ 1. Present exact `intended_paths`, change summary, Secret/sensitive warnings, diff statistics, proposed message, intentionally excluded semantic support, and separate labels only for admitted host support.
74
84
  2. Ask the current user to confirm that exact local commit.
75
- 3. Only after confirmation, stage tracked changes safely and new files explicitly.
76
- 4. Verify the staged diff exactly matches the confirmed path set.
77
- 5. Create the local commit and verify its hash, committed paths, and remaining workspace changes.
78
- 6. Return `COMMITTED`, the commit hash/message, committed paths, and intentional remaining changes.
85
+ 3. Only after confirmation, stage with `git add -- <exact paths>` semantics using literal exact pathspecs for tracked changes, deletions, and explicitly named Git-visible new files; never stage workspace breadth or force-add ignored content.
86
+ 4. Verify the staged path set exactly equals the confirmed manifest and no hook/incidental operation added a path.
87
+ 5. Re-run global Secret checks against the exact staged snapshot.
88
+ 6. Create the local commit and verify its hash, message, parent, committed path set, and remaining workspace changes against the confirmed manifest.
89
+ 7. Return `COMMITTED`, commit hash/message, committed paths, and intentional remaining changes.
79
90
 
80
91
  If confirmation is declined, return `COMMIT_DECLINED` without Git mutation.
81
92
 
@@ -83,9 +94,9 @@ If confirmation is declined, return `COMMIT_DECLINED` without Git mutation.
83
94
 
84
95
  For `operation=prepare-runtime-commit`:
85
96
 
86
- 1. Require `request_path={artifact_dir}/runtime-commit-request.json`.
87
- 2. Read the current full `HEAD` hash as `base_head`.
88
- 3. Write this JSON atomically:
97
+ 1. Require `request_path={artifact_dir}/runtime-commit-request.json` and exclude that exact operation-owned request plus the caller-supplied Runtime checkpoint from `intended_paths`.
98
+ 2. Read current full `HEAD` as `base_head`.
99
+ 3. Write this JSON atomically without Git mutation:
89
100
 
90
101
  ```json
91
102
  {
@@ -94,23 +105,24 @@ For `operation=prepare-runtime-commit`:
94
105
  "base_head": "<full current HEAD hash>",
95
106
  "commit_message": "feat(scope): concise description",
96
107
  "intended_paths": [
97
- "src/example.py",
98
- "tests/test_example.py"
108
+ ".prizmkit/prizm-docs/example.prizm",
109
+ "src/example.py"
99
110
  ]
100
111
  }
101
112
  ```
102
113
 
103
114
  4. Verify:
104
- - `artifact_dir` identifies the supplied artifact root;
115
+ - `artifact_dir` equals the supplied artifact root;
105
116
  - `base_head` equals current `HEAD`;
106
117
  - `commit_message` is one non-empty line;
107
- - `intended_paths` is non-empty, unique, exact, project-relative, and covers the complete task-owned Git-visible change outside recognized support namespaces;
108
- - no path escapes the checkout or enters `.prizmkit/`, another support namespace, or a sensitive location;
109
- - every unknown Git-visible path caused a block rather than an implicit exclusion.
110
- 5. Return `COMMIT_REQUEST_READY`, the request path, message, intended paths, and explicit confirmation that no Git mutation occurred.
118
+ - `intended_paths` is non-empty, unique, exact, project-relative, and equals the complete task-owned Git-visible change outside exact semantic support/bookkeeping;
119
+ - no path escapes the checkout, enters `.git/**`, names exact Runtime-owned request/checkpoint data, or contains sensitive content;
120
+ - no path was rejected solely because it is under `.prizmkit/**`;
121
+ - every unknown Git-visible path caused a block rather than implicit exclusion.
122
+ 5. Return `COMMIT_REQUEST_READY`, request path, message, intended paths, and explicit confirmation that no Git mutation occurred.
111
123
  6. Stop.
112
124
 
113
- The request is preparation data. Its consumer independently validates it before any Git mutation.
125
+ The Python Runtime independently revalidates exact changed/staged/committed sets, safety, base/message/receipt, and post-commit bookkeeping order.
114
126
 
115
127
  ## Output
116
128