materialise_bundle
Write an emitted execution’s bundle into the target repo’s .panto/ store, unpacked. Composes request_review under the hood, but adds a hard binding to an execution_id (recorded by
petrova record-executionfrom panto-cloud’sbuild.js --check-run --json) instead of a diagnosis, per docs/decisions/0009-materialiser-verb-and-store.md in panto-cloud.
Upholds: MR-7 · MR-12
Side effects: Same as request_review: branch + PR. Plus: PR body includes the execution_id and the bundle’s derivation_hash. Restricted to writing under .panto/.
Constraints
Section titled “Constraints”REPO_IN_REGISTRY— target_repo must appear in registry.yaml.EXECUTION_EXISTS— execution_id must reference an execution recorded bypetrova record-executionwithin the last 24 hours, from abuild.js --check-run --jsonrun that reported a bundle.FILES_NONEMPTY— proposed_changes must contain ≥1 entry.TEST_PLAN_NONEMPTY— test_plan must list ≥1 verification step.GROUNDING_NONEMPTY— mr_grounding must cite at least one MR or one decision doc / spec section explaining why the change is correct.NO_PRIVILEGED_PATHS— Same privileged-path rejection as request_review.
Input shape
Section titled “Input shape”execution_idstring(required)titlestring(required)rationalestring(required)proposed_changesarray(required)- items:
pathstring(required)operationstring(required) enum:create,modify,deletecontentsstringpatchstringedit_rationalestring— Per-file rationale; reviewer-readable.
- items:
test_planarray(required)mr_groundingarray(required)- items:
kindstring(required) enum:meta_rule,decision_doc,spec,north_star,finding,cupel_ticket,cupel_tracerefstring(required)claimstring— What this grounding source claims that justifies the change.
- items:
merge_strategystringenum:request_review,request_merge_when_green— Whether to compose request_review (default, human merges) or request_merge_when_green (profile-permitting, auto-merge).
Output shape
Section titled “Output shape”execution_idstringpr→PRRefdiff_preview→DiffPreviewcomposed_verbstringenum:request_review,request_merge_when_green
Example
Section titled “Example”Input:
{ "envelope": { "verb": "materialise_bundle", "target_repo": "panto-cloud", "idempotency_key": "2b7ffa28f53ee7791c25d4e8f9012b3c4d5e6f7a8b9c0d1e2f30415263748596", "dry_run": true, "actor": "human:cli", "triggered_by": { "kind": "human_request", "ref": "exec-515" } }, "params": { "execution_id": "exec-515", "title": "chore(.panto): materialise bundle from execution 515", "rationale": "0009 ruling 1/2: .panto/ is the bundle store; execution 515 emitted panto-cloud-claude-project-bundle.zip.", "proposed_changes": [ { "path": ".panto/AGENTS.xml", "operation": "create", "contents": "...", "edit_rationale": "Unpacked member of execution 515's bundle." } ], "test_plan": [ "diff .panto/ against the unpacked bundle contents" ], "mr_grounding": [ { "kind": "decision_doc", "ref": "panto-cloud/docs/decisions/0009-materialiser-verb-and-store.md", "claim": "Ruling 1 names this verb; ruling 2 names .panto/ as the store." } ] }}Output (output_dry_run):
{ "envelope": { "verb": "materialise_bundle", "status": "dry_run", "idempotency_key": "2b7ffa28f53ee7791c25d4e8f9012b3c4d5e6f7a8b9c0d1e2f30415263748596", "mr_citations": [ "MR-7", "MR-12" ] }, "result": { "execution_id": "exec-515", "composed_verb": "request_review", "diff_preview": { "files": [ { "path": ".panto/AGENTS.xml", "operation": "create" } ], "branch": "petrova/materialise-bundle/2b7ffa28", "commit_message": "chore(.panto): materialise bundle from execution 515" } }}Recipe
Section titled “Recipe”(no recipe yet — see SKILL guide)