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.
- package/bundled/VERSION.json +3 -3
- package/bundled/adapters/codebuddy/settings-adapter.js +76 -25
- package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +9 -2
- package/bundled/dev-pipeline/prizmkit_runtime/reset.py +1 -1
- package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +20 -11
- package/bundled/dev-pipeline/prizmkit_runtime/runtime_commit.py +42 -15
- package/bundled/dev-pipeline/scripts/update-feature-status.py +7 -0
- package/bundled/dev-pipeline/templates/bootstrap-prompt.md +1 -1
- package/bundled/dev-pipeline/templates/bootstrap-tier3.md +1 -1
- package/bundled/dev-pipeline/templates/sections/runtime-commit-handoff.md +6 -6
- package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +4 -3
- package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +2 -2
- package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +2 -2
- package/bundled/dev-pipeline/tests/test_python_runner_parity.py +115 -4
- package/bundled/dev-pipeline/tests/test_reset_modes.py +137 -0
- package/bundled/dev-pipeline/tests/test_runtime_commit.py +68 -13
- package/bundled/dev-pipeline/tests/test_unified_cli.py +12 -7
- package/bundled/rules/prizm/prizm-commit-workflow.md +7 -7
- package/bundled/rules/prizm/prizm-documentation.md +24 -65
- package/bundled/rules/prizm/prizm-progressive-loading.md +9 -8
- package/bundled/skills/_metadata.json +1 -1
- package/bundled/skills/prizmkit/SKILL.md +1 -13
- package/bundled/skills/prizmkit-code-review/SKILL.md +29 -10
- package/bundled/skills/prizmkit-code-review/references/independent-code-review.md +5 -4
- package/bundled/skills/prizmkit-code-review/references/review-report-template.md +15 -0
- package/bundled/skills/prizmkit-code-review/scripts/render_review_report.py +61 -0
- package/bundled/skills/prizmkit-committer/SKILL.md +50 -38
- package/bundled/skills/prizmkit-deploy/SKILL.md +172 -198
- package/bundled/skills/prizmkit-deploy/references/capability-contract.md +137 -0
- package/bundled/skills/prizmkit-deploy/references/deploy-record-schema.json +1053 -0
- package/bundled/skills/prizmkit-deploy/references/deployment-declaration-schema.json +291 -0
- package/bundled/skills/prizmkit-deploy/references/legacy-migration.md +90 -0
- package/bundled/skills/prizmkit-deploy/references/policy-and-execution.md +170 -0
- package/bundled/skills/prizmkit-deploy/references/real-resource-test-policy.md +73 -0
- package/bundled/skills/prizmkit-deploy/references/verification-and-recovery.md +164 -0
- package/bundled/skills/prizmkit-deploy/scripts/validate-deploy-artifact.py +371 -0
- package/bundled/skills/prizmkit-implement/SKILL.md +2 -2
- package/bundled/skills/prizmkit-init/SKILL.md +38 -42
- package/bundled/skills/prizmkit-init/references/config-schema.md +11 -7
- package/bundled/skills/prizmkit-init/references/rules/layer-detection.md +3 -3
- package/bundled/skills/prizmkit-init/references/update-supplement.md +5 -5
- package/bundled/skills/prizmkit-plan/SKILL.md +5 -4
- package/bundled/skills/prizmkit-plan/assets/plan-template.md +4 -1
- package/bundled/skills/prizmkit-plan/references/verification-checklist.md +3 -2
- package/bundled/skills/prizmkit-prizm-docs/SKILL.md +17 -11
- package/bundled/skills/prizmkit-prizm-docs/assets/prizm-docs-format.md +95 -155
- package/bundled/skills/prizmkit-prizm-docs/references/op-init.md +6 -5
- package/bundled/skills/prizmkit-prizm-docs/references/op-rebuild.md +4 -2
- package/bundled/skills/prizmkit-prizm-docs/references/op-status.md +9 -10
- package/bundled/skills/prizmkit-prizm-docs/references/op-update.md +6 -5
- package/bundled/skills/prizmkit-prizm-docs/references/op-validate.md +13 -12
- package/bundled/skills/prizmkit-retrospective/SKILL.md +3 -3
- package/bundled/skills/prizmkit-test/SKILL.md +26 -13
- package/bundled/skills/prizmkit-test/references/boundary-contract-and-test-double-guidance.md +8 -4
- package/bundled/skills/prizmkit-test/references/independent-test-review.md +7 -3
- package/bundled/skills/prizmkit-test/references/test-coverage-model.md +33 -10
- package/bundled/skills/prizmkit-test/references/test-report-template.md +33 -11
- package/bundled/skills/prizmkit-workflow/SKILL.md +33 -3
- package/bundled/skills/prizmkit-workflow/references/workflow-state-protocol.md +23 -5
- package/bundled/templates/hooks/commit-intent-status.py +9 -41
- package/bundled/templates/hooks/commit-intent.json +3 -3
- package/bundled/templates/hooks/diff-prizm-docs.py +3 -1
- package/bundled/templates/hooks/prizm-pre-commit.py +32 -6
- package/bundled/templates/hooks/run-python-hook.cjs +44 -0
- package/bundled/templates/hooks/validate-prizm-docs.py +399 -173
- package/bundled/templates/project-memory-template.md +19 -19
- package/package.json +1 -1
- package/src/clean.js +6 -7
- package/src/gitignore-template.js +8 -12
- package/src/scaffold.js +125 -71
- package/bundled/skills/prizmkit/references/workflow-state-protocol.md +0 -178
- package/bundled/skills/prizmkit-deploy/assets/deploy-document-template.md +0 -89
- package/bundled/skills/prizmkit-deploy/references/ci-cd-workflows.md +0 -145
- package/bundled/skills/prizmkit-deploy/references/cloud-platform-deploy.md +0 -109
- package/bundled/skills/prizmkit-deploy/references/data-safety-examples.md +0 -120
- package/bundled/skills/prizmkit-deploy/references/database-setup.md +0 -65
- package/bundled/skills/prizmkit-deploy/references/deploy-config-schema.md +0 -150
- package/bundled/skills/prizmkit-deploy/references/deploy-history-schema.md +0 -78
- package/bundled/skills/prizmkit-deploy/references/deploy-metadata-schema.json +0 -49
- package/bundled/skills/prizmkit-deploy/references/deployment-modes.md +0 -50
- package/bundled/skills/prizmkit-deploy/references/direct-upload.md +0 -26
- package/bundled/skills/prizmkit-deploy/references/dns-setup.md +0 -42
- package/bundled/skills/prizmkit-deploy/references/docker-deploy.md +0 -31
- package/bundled/skills/prizmkit-deploy/references/firewall-setup.md +0 -37
- package/bundled/skills/prizmkit-deploy/references/live-validation-notes.md +0 -21
- package/bundled/skills/prizmkit-deploy/references/nginx-blue-green.md +0 -59
- package/bundled/skills/prizmkit-deploy/references/pending-input-schema.json +0 -164
- package/bundled/skills/prizmkit-deploy/references/ssh-adapter-flow.md +0 -221
- package/bundled/skills/prizmkit-deploy/references/ssh-bootstrap-flow.md +0 -49
- package/bundled/skills/prizmkit-deploy/references/ssh-execution-flow.md +0 -41
- package/bundled/skills/prizmkit-deploy/references/ssh-takeover.md +0 -20
- 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
|
-
| `
|
|
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
|
|
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
|
|
39
|
-
5.
|
|
40
|
-
6.
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
- `.
|
|
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
|
-
|
|
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
|
|
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
|
|
76
|
-
4. Verify the staged
|
|
77
|
-
5.
|
|
78
|
-
6.
|
|
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
|
|
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
|
-
"
|
|
98
|
-
"
|
|
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`
|
|
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
|
|
108
|
-
- no path escapes the checkout
|
|
109
|
-
-
|
|
110
|
-
|
|
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
|
|
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
|
|