{
  "artifactDir": ".pi/pi-materia",
  "limits": {
    "maxSocketVisits": 50,
    "maxEdgeTraversals": 25
  },
  "budget": {
    "maxTokens": 10000000,
    "maxCostUsd": 20,
    "warnAtPercent": 75,
    "stopAtLimit": true
  },
  "activeLoadout": "Full-Auto",
  "eventing": {
    "enabled": false,
    "sinks": {},
    "heartbeatIntervalMs": 30000,
    "presets": []
  },
  "loadouts": {
    "Full-Auto": {
      "id": "default:full-auto",
      "source": "default",
      "entry": "Socket-1",
      "loops": {
        "loopSelection": {
          "consumes": {
            "from": "Socket-8",
            "output": "workItems"
          },
          "exit": {
            "from": "Socket-6",
            "when": "satisfied",
            "to": "end"
          },
          "exits": [
            {
              "id": "exit:Socket-6:always",
              "from": "Socket-6",
              "condition": "always",
              "targetSocketId": "Socket-7"
            }
          ],
          "sockets": [
            "Socket-4",
            "Socket-5",
            "Socket-6"
          ]
        }
      },
      "layout": {
        "sockets": {
          "Socket-1": {
            "x": 0.525480769231,
            "y": 0
          },
          "Socket-2": {
            "x": 1.729807692308,
            "y": 0.011904761905
          },
          "Socket-3": {
            "x": 2.622596153846,
            "y": 1.202380952381
          },
          "Socket-4": {
            "x": 0.802884615385,
            "y": 1.532738095238
          },
          "Socket-5": {
            "x": 0.0375,
            "y": 2.845238095238
          },
          "Socket-6": {
            "x": 1.669711538462,
            "y": 2.821428571429
          },
          "Socket-7": {
            "x": 3.032692307692,
            "y": 2.934523809524
          },
          "Socket-8": {
            "x": 1.766346153846,
            "y": 1.395833333333
          }
        }
      },
      "sockets": {
        "Socket-1": {
          "edges": [
            {
              "when": "always",
              "to": "Socket-2"
            }
          ],
          "socketKind": "entry",
          "materia": "Ignore-Artifacts"
        },
        "Socket-2": {
          "edges": [
            {
              "when": "always",
              "to": "Socket-3"
            }
          ],
          "socketKind": "normal",
          "materia": "Detect-VCS"
        },
        "Socket-3": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "always",
              "to": "Socket-8"
            }
          ],
          "materia": "Auto-Plan",
          "empty": false
        },
        "Socket-4": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "always",
              "to": "Socket-5"
            }
          ],
          "materia": "Build",
          "parse": "text",
          "empty": false
        },
        "Socket-5": {
          "parse": "json",
          "assign": {
            "lastFeedback": "$.context",
            "lastCheck": "$"
          },
          "edges": [
            {
              "when": "satisfied",
              "to": "Socket-6"
            },
            {
              "when": "not_satisfied",
              "to": "Socket-4",
              "maxTraversals": 3
            }
          ],
          "materia": "Auto-Eval",
          "socketKind": "normal"
        },
        "Socket-6": {
          "parse": "json",
          "assign": {
            "lastMaintain": "$"
          },
          "edges": [
            {
              "when": "always",
              "to": "Socket-4"
            }
          ],
          "materia": "Maintain",
          "socketKind": "normal",
          "advance": {
            "cursor": "workItemIndex",
            "items": "state.workItems",
            "done": "end",
            "when": "satisfied"
          }
        },
        "Socket-7": {
          "socketKind": "normal",
          "materia": "Narrate",
          "parse": "text",
          "empty": false
        },
        "Socket-8": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "always",
              "to": "Socket-4"
            }
          ],
          "materia": "Auto-Architect",
          "empty": false
        }
      }
    },
    "Planning-Consult": {
      "id": "default:planning-consult",
      "source": "default",
      "entry": "Socket-1",
      "loops": {
        "taskIteration": {
          "exit": {
            "from": "Socket-6",
            "when": "satisfied",
            "to": "end"
          },
          "consumes": {
            "from": "Socket-3",
            "output": "workItems"
          },
          "sockets": [
            "Socket-4",
            "Socket-5",
            "Socket-6"
          ]
        }
      },
      "sockets": {
        "Socket-1": {
          "edges": [
            {
              "when": "always",
              "to": "Socket-2"
            }
          ],
          "socketKind": "entry",
          "materia": "Ignore-Artifacts"
        },
        "Socket-2": {
          "edges": [
            {
              "when": "always",
              "to": "Socket-3"
            }
          ],
          "socketKind": "normal",
          "materia": "Detect-VCS"
        },
        "Socket-3": {
          "materia": "Interactive-Plan",
          "edges": [
            {
              "when": "always",
              "to": "Socket-4"
            }
          ],
          "socketKind": "normal"
        },
        "Socket-4": {
          "parse": "text",
          "materia": "Build",
          "edges": [
            {
              "when": "always",
              "to": "Socket-5"
            }
          ],
          "socketKind": "normal"
        },
        "Socket-5": {
          "parse": "json",
          "assign": {
            "lastFeedback": "$.context",
            "lastCheck": "$"
          },
          "edges": [
            {
              "when": "satisfied",
              "to": "Socket-6"
            },
            {
              "when": "not_satisfied",
              "to": "Socket-4",
              "maxTraversals": 3
            }
          ],
          "materia": "Auto-Eval",
          "socketKind": "normal"
        },
        "Socket-6": {
          "parse": "json",
          "advance": {
            "cursor": "workItemIndex",
            "items": "state.workItems",
            "done": "end",
            "when": "satisfied"
          },
          "assign": {
            "lastMaintain": "$"
          },
          "edges": [
            {
              "when": "always",
              "to": "Socket-4"
            }
          ],
          "materia": "Maintain",
          "socketKind": "normal"
        }
      }
    },
    "Hojo-Consult": {
      "entry": "Socket-1",
      "loops": {
        "loopSelection": {
          "consumes": {
            "from": "Socket-4",
            "output": "workItems"
          },
          "exit": {
            "from": "Socket-7",
            "when": "satisfied",
            "to": "end"
          },
          "exits": [
            {
              "id": "exit:Socket-7:always",
              "from": "Socket-7",
              "condition": "always",
              "targetSocketId": "Socket-8"
            }
          ],
          "sockets": [
            "Socket-5",
            "Socket-6",
            "Socket-7"
          ]
        }
      },
      "layout": {
        "sockets": {
          "Socket-1": {
            "x": 0.004807692308,
            "y": 0.008928571429
          },
          "Socket-2": {
            "x": 1,
            "y": 0
          },
          "Socket-3": {
            "x": 2.360576923077,
            "y": 0.446428571429
          },
          "Socket-4": {
            "x": 1.038461538462,
            "y": 0.964285714286
          },
          "Socket-5": {
            "x": 0.401442307692,
            "y": 2.589285714286
          },
          "Socket-6": {
            "x": 2.382211538462,
            "y": 2.559523809524
          },
          "Socket-7": {
            "x": 1.384615384615,
            "y": 3.985119047619
          },
          "Socket-8": {
            "x": 2.411057692308,
            "y": 3.886904761905
          }
        }
      },
      "sockets": {
        "Socket-1": {
          "socketKind": "entry",
          "empty": false,
          "edges": [
            {
              "when": "always",
              "to": "Socket-2"
            }
          ],
          "materia": "Ignore-Artifacts"
        },
        "Socket-2": {
          "socketKind": "normal",
          "empty": false,
          "edges": [
            {
              "when": "always",
              "to": "Socket-3"
            }
          ],
          "materia": "Detect-VCS"
        },
        "Socket-3": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "always",
              "to": "Socket-4"
            }
          ],
          "materia": "Interactive-Plan",
          "empty": false
        },
        "Socket-4": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "always",
              "to": "Socket-5"
            }
          ],
          "materia": "Auto-Architect",
          "empty": false
        },
        "Socket-5": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "always",
              "to": "Socket-6"
            }
          ],
          "materia": "Build",
          "parse": "text",
          "empty": false
        },
        "Socket-6": {
          "socketKind": "normal",
          "edges": [
            {
              "when": "satisfied",
              "to": "Socket-7"
            },
            {
              "to": "Socket-5",
              "when": "not_satisfied"
            }
          ],
          "materia": "Auto-Eval",
          "parse": "json",
          "empty": false
        },
        "Socket-7": {
          "socketKind": "normal",
          "edges": [
            {
              "to": "Socket-5",
              "when": "always"
            }
          ],
          "materia": "Maintain",
          "parse": "json",
          "empty": false,
          "advance": {
            "cursor": "workItemIndex",
            "items": "state.workItems",
            "done": "end",
            "when": "satisfied"
          }
        },
        "Socket-8": {
          "socketKind": "normal",
          "materia": "Narrate",
          "parse": "text",
          "empty": false
        }
      }
    }
  },
  "materia": {
    "Auto-Architect": {
      "type": "agent",
      "tools": "readOnly",
      "prompt": "You are a software architect materia. Review planned workItems and provide pragmatic architecture guidance before downstream implementation.\n\nResponsibilities:\n- Assess patterns, boundaries, data models, scalability, maintainability, and performance implications.\n- Prefer simple, evolvable designs over overengineering.\n- Clarify architectural constraints, dependencies, risks, and decisions that affect implementation.\n- Refine and augment existing workItems so they are actionable and architecturally sound.\n- Include top-level context only for useful cross-cutting information when relevant.\n- Think carefully before introducing new abstractions.\n- Be tactical when its pragmatic (fit neatly into and work with established patterns), and strategic when its warranted (i.e. cross-cutting changes that require new abstractions).\n\nOperating style:\n- Be concise, concrete, and implementation-aware.\n- Highlight tradeoffs and pragmatic recommendations.\n- Refine workItems directly; put per-item architecture guidance in each workItem.context string.\n- Record cross-cutting choices or concerns in top-level context only when relevant to the socket.\n- If required information is absent, explain it in context without blocking useful guidance.\n- Examine the existing code and documentation and use that to inform your architectural directions.\n- Explanatory notes belong in top-level context; do not emit a top-level text field for this socket.\n",
      "color": "materia-color-cyan",
      "parse": "json",
      "generator": true
    },
    "Interactive-Plan": {
      "type": "agent",
      "tools": "readOnly",
      "prompt": "You are the pi-materia interactive planning materia. Collaborate with the user over multiple turns to refine goals, constraints, work-item ordering, and acceptance criteria before work is finalized. During refinement, ask concise clarifying questions when useful and summarize proposed plan changes in normal conversation. Do not emit final workItems JSON during refinement. /materia continue is the only way to finalize this multi-turn materia; if the plan appears complete or the conversation is stalling, prompt the user to run /materia continue. After /materia continue is run, return compact JSON with the socket-relevant plan fields.\n\nCollaboratively refine an implementation plan for this request through normal conversation before producing work item artifacts. Start by briefly summarizing your understanding of the request and any known repository context. Ask concise clarifying questions when useful, propose and refine work-item breakdowns and acceptance criteria conversationally, and incorporate the user's feedback over multiple turns. Keep repository bootstrap considerations in mind: if the repository appears empty or missing project hygiene beyond version-control setup, include a bootstrap work item in the eventual finalized plan. Do not create manual VCS setup tasks solely to initialize jj/git or prepare a jj working commit; deterministic utility bootstrap handles that repository state. Artifact ignore hygiene for .pi/pi-materia/ has already run via the visible default utility bootstrap. Detected VCS state: {{state.vcs}}. Any finalized project bootstrap work item should focus on language/build ignore rules, the expected project skeleton for the requested language/framework, and basic run/test commands. Do not emit the structured workItems JSON during refinement. Treat all normal user messages as refinement input, even if they say continue, ready, finalize, or look good. Only after the user runs /materia continue, return compact JSON with workItems and optional socket-relevant context. Each workItem must contain only title:string and context:string; put per-item architecture direction in the context text. Include no markdown or extra commentary, and do not emit a top-level text field; explanatory notes belong in context.\n\nRequest: {{request}}",
      "color": "materia-color-cyan",
      "parse": "json",
      "multiTurn": true,
      "generator": true
    },
    "Build": {
      "type": "agent",
      "tools": "coding",
      "prompt": "You are the pi-materia Build Materia materia. Implement exactly the assigned work item supplied by the current node/socket adapter. Prefer small, safe edits. Consume the current workItem and its context as the implementation scope; treat global guidance from the adapter context as separate cross-cutting guidance, not as part of the current workItem. Do not infer graph placement, routing, assignment, or iteration responsibilities from this reusable materia prompt. Run relevant checks. Stop when the item is complete or blocked.\n\nAVOID creating god modules.\nAVOID tight coupling.\nFollow established patterns.\nKeep code well-organized.\n\nBuild the work item now using normal Pi tools. Run relevant checks and summarize what changed.",
      "color": "materia-color-green",
      "parse": "text"
    },
    "Auto-Plan": {
      "type": "agent",
      "tools": "readOnly",
      "prompt": "You are the pi-materia planning materia. Break high-level software requests into small, ordered implementation work items with objective acceptance criteria.\n\nCreate an implementation plan for this request. Be directive about project bootstrap, but do not create manual VCS setup tasks solely to initialize jj/git or prepare a jj working commit; deterministic utility bootstrap handles that repository state. If the repository appears empty or missing common project hygiene beyond version-control setup, make the first workItem a project bootstrap work item. Bootstrap work items should add or update ignore rules for language/build artifacts, create the expected project skeleton for the requested language/framework, and document basic run/test commands. Include generated work items in workItems. Each workItem must contain only title:string and context:string; put per-item architecture direction in the context text. Use optional top-level context for cross-cutting notes when useful. Do not emit a top-level text field; put explanatory notes in context.",
      "color": "materia-color-blue",
      "parse": "json",
      "generator": true
    },
    "Maintain": {
      "type": "agent",
      "tools": "coding",
      "prompt": "You are the pi-materia Maintain Materia materia. Autonomously maintain/checkpoint each accepted work item; do not ask the user for permission. Prefer jj when command -v jj succeeds. Always inspect repository state before checkpointing (jj status and jj diff for jj; git status and git diff for git). If there are no meaningful repository changes, do not run jj describe, jj new, git add, git commit, or any empty checkpoint/commit command; explain the skipped no-op in context. No-op work items must not create empty commits/checkpoints. If meaningful changes exist and inside a jj repo, describe the current change with jj describe -m \"message\" using a concise item-specific message, and immediately run jj new to create a fresh empty working-copy commit for the next task. Do not stop after jj describe when meaningful changes exist; jj describe alone is not a complete checkpoint because later work would be added to the same jj change. If meaningful changes exist and jj is unavailable but git is available, stage and commit with git add -A && git commit -m \"message\". If no VCS exists but meaningful changes exist, initialize jj when available, otherwise git, then checkpoint; for jj, create the post-checkpoint empty commit with jj new. Never commit .pi/pi-materia artifacts. When finished, return compact JSON with only satisfied and explanatory context.\n\nThe current work item was accepted by verification. Maintain the project state before the next task begins.\n\nAvoid putting numbered workItems or prefixing commit messages except with feat, chore, fix, enhancement when useful. Just provide a brief description of the changes.\n\nInspect the repository state first (for jj, use jj status and jj diff; for git, use git status and git diff). If there are no meaningful repository changes for this task, do not run any jj/git checkpoint, describe, commit, or empty-checkpoint command. Treat no-op work items as successful maintenance and explain the skipped checkpoint in context. If meaningful changes exist, summarize the changes for this task and autonomously create an appropriate VCS maintain/checkpoint description or commit message. Do not ask the user for permission.\n\nAfter maintenance is complete, set satisfied false only if required maintenance/checkpointing for meaningful changes could not be completed. Otherwise set satisfied true and include a concise context summary. Do not emit a top-level text field; explanatory notes belong in context.",
      "color": "materia-color-purple",
      "parse": "json"
    },
    "Narrate": {
      "type": "agent",
      "tools": "readOnly",
      "prompt": "You are the pi-materia Narrate materia: a cast artifact summarizer. Produce a user-facing markdown summary of the entire current cast, not just the\nmost recent turn.\n\nYou have access to synthetic cast context and may also inspect the cast artifact directory:\n\n.pi/pi-materia/<DATETIME>/\n\nUse both sources:\n- Treat any synthetic cast context as the cast index and high-level map.\n- Treat on-disk cast artifacts as source-of-truth details when available.\n- Reconcile synthetic context with artifacts instead of relying only on the latest message or latest node output.\n\nYour primary responsibility is to summarize all meaningful work performed across the cast.\n\nRequired review scope:\n   - Review the full synthetic context provided for this cast.\n   - Identify all `workItems` created or refined during the cast.\n   - Review relevant artifacts for planner, architect, build, eval, maintain, refinement, utility, context, and node outputs when present.\n   - Review the cast manifest/events when available to understand execution order.\n   - For each work item, determine its outcome: completed, evaluated, maintained/checkpointed, skipped/no-op, blocked, failed, or unresolved.\n   - Do not summarize only the last build loop turn.\n\nResponsibilities:\n   - Summarize accomplished work across the whole cast.\n   - Address every work item that appears in the cast context or artifacts.\n   - Mention notable generated artifacts, modified files, tests/checks, commands, checkpoints, and maintenance outcomes when supported.\n   - Highlight high-level decisions, architectural choices, implementation patterns, and tradeoffs.\n   - Call out risks, limitations, failed checks, missing artifacts, unresolved questions, or follow-up opportunities when evident.\n   - Preserve useful context without overexplaining implementation details.\n\n   Accuracy rules:\n   - Do not invent work, decisions, tests, commits, or outcomes not supported by synthetic context or artifacts.\n   - If synthetic context and artifacts disagree, note the ambiguity briefly and prefer artifact evidence.\n   - If artifacts are missing or incomplete, say so briefly.\n   - If a work item lacks evidence of implementation or verification, mark it as unresolved rather than assuming completion.\n\n   Operating style:\n   - Be accurate, neutral, and user-facing.\n   - Prefer clear sections and concise bullets.\n   - Focus on outcomes, not raw logs.\n   - Mention work item IDs/titles when available.\n   - Do not include meta-commentary about your process.\n\n   Expected output:\n   - Return markdown text only.\n\n   Suggested structure:\n\n   ## Summary\n\n   Brief overall summary of the full cast.\n\n   ## Work Items\n\n   - ** title**: status and concise outcome.\n   - ** title**: status and concise outcome.\n\n   ## Notable Artifacts and Changes\n\n   - Important generated artifacts, files changed, tests/checks, and maintenance/checkpoint outcomes.\n\n   ## Decisions and Tradeoffs\n\n   - Key architectural or implementation decisions.\n\n   ## Risks and Follow-ups\n\n   - Missing evidence, failed checks, unresolved items, risks, or suggested next steps.",
      "color": "materia-color-cyan",
      "parse": "text"
    },
    "Auto-Eval": {
      "type": "agent",
      "tools": {
        "type": "custom",
        "tools": [
          "read",
          "grep",
          "find",
          "ls",
          "bash"
        ]
      },
      "prompt": "You are the pi-materia Auto-Eval Materia materia. Verify whether the work satisfies the item and acceptance criteria. Be strict, ensure acceptance criteria is adequately satisfied.\n\nEvaluate whether the current work item is complete. Inspect the repository as needed. Bash is available for evaluation commands such as running tests, but do not use it to modify project files. Run relevant tests and ensure they pass. Return compact JSON with satisfied and explanatory context; put your verification summary in the top-level context string. Do not emit a top-level text field for this socket; explanatory notes belong in context.",
      "color": "materia-color-yellow",
      "parse": "json"
    },
    "GitMaintain": {
      "type": "agent",
      "tools": "coding",
      "color": "materia-color-black-gray",
      "parse": "json",
      "prompt": "You are the pi-materia Git Maintain Materia materia. Autonomously maintain/checkpoint each accepted work item; do not ask the user for permission. Inspect repository state before committing with git status and git diff. If there are no meaningful repository changes, do not run git add, git commit, or any empty commit command; explain the skipped no-op in context. No-op work items must not create empty commits/checkpoints. If meaningful changes exist, stage and commit with git add -A && git commit -m \"message\" using a concise item-specific message. If no git repo exists but meaningful changes exist, initialize git first. Never commit .pi/pi-materia artifacts. Do not use jj commands. When finished, return compact JSON with only satisfied and explanatory context. If deterministic maintenance details are needed, they belong in utility state, not agent handoff JSON. Do not emit checkpointCreated, commands, commitMessage, reason, vcs, feedback, or missing fields. Do not emit a top-level text field; explanatory notes belong in context."
    },
    "Detect-VCS": {
      "type": "utility",
      "label": "Detect-VCS",
      "description": "Detects jj/git availability and the current project version-control root.",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "detect-vcs.mjs",
        "runtime": "node"
      }
    },
    "Blackbelt-Bootstrap": {
      "type": "utility",
      "label": "Blackbelt-Bootstrap",
      "description": "Deterministically bootstrap jj version control for the current project, ensure an empty working commit for maintenance flows, and create a stable blackbelt/ bookmark for pull-request-driven workflows.",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "blackbelt-bootstrap.mjs",
        "runtime": "node"
      }
    },
    "Blackbelt-Maintain": {
      "type": "utility",
      "label": "Blackbelt-Maintain",
      "description": "Autonomously checkpoint accepted work items using jj only (no git fallback). Reads state.blackbeltBootstrap.bookmarkName and advances the blackbelt/ bookmark with each checkpoint.",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "blackbelt-maintain.mjs",
        "runtime": "node"
      }
    },
    "Blackbelt-GH-PR": {
      "type": "utility",
      "label": "Blackbelt-GH-PR",
      "description": "Deterministic jj-only GitHub pull request utility. Pushes a blackbelt/ bookmark and creates a PR via the GitHub API. Auth via configurable env var (default GITHUB_TOKEN).",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "blackbelt-gh-pr.mjs",
        "runtime": "node"
      }
    },
    "Mime-Bootstrap": {
      "type": "utility",
      "label": "Mime-Bootstrap",
      "description": "Deterministically bootstrap git version control branch setup for the current project and create a stable mime/ branch for git-based workflows.",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "mime-bootstrap.mjs",
        "runtime": "node"
      }
    },
    "Mime-Maintain": {
      "type": "utility",
      "label": "Mime-Maintain",
      "description": "Autonomously stage and commit changes using only git (no jj dependency). Reads state.mimeBootstrap.branchName and commits with the work item title as the commit message.",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "mime-maintain.mjs",
        "runtime": "node"
      }
    },
    "Mime-GH-PR": {
      "type": "utility",
      "label": "Mime-GH-PR",
      "description": "Deterministic git-only GitHub pull request utility. Pushes the active git branch and creates a PR via the GitHub API. Auth via configurable env var (default GITHUB_TOKEN).",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "mime-gh-pr.mjs",
        "runtime": "node"
      }
    },
    "Blackbelt-ADO-PR": {
      "type": "utility",
      "label": "Blackbelt-ADO-PR",
      "description": "Deterministic jj-only Azure DevOps pull request utility. Pushes a blackbelt/ bookmark and creates a PR via the Azure DevOps REST API. Auth via configurable env var (default AZURE_DEVOPS_EXT_PAT).",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "blackbelt-ado-pr.mjs",
        "runtime": "node"
      }
    },
    "Mime-ADO-PR": {
      "type": "utility",
      "label": "Mime-ADO-PR",
      "description": "Deterministic git-only Azure DevOps pull request utility. Pushes the active git branch and creates a PR via the Azure DevOps REST API. Auth via configurable env var (default AZURE_DEVOPS_EXT_PAT).",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "script": {
        "kind": "shippedUtility",
        "name": "mime-ado-pr.mjs",
        "runtime": "node"
      }
    },
    "Commit-Sigil": {
      "type": "utility",
      "label": "Commit-Sigil",
      "description": "Pass-through generator validator for Conventional Commit work item titles. Generator: true because it produces canonical top-level workItems for downstream generator/loop semantics. Consumes state.workItems, validates each title against the Conventional Commit format, echoes the input workItems array unchanged, and emits satisfied/context for routing. Utility state stays separate under state; the workItems / satisfied / context contract matches agent generator output.",
      "group": "Utility",
      "color": "materia-color-black-gray",
      "parse": "json",
      "generator": true,
      "assign": {
        "lastFeedback": "$.context"
      },
      "script": {
        "kind": "shippedUtility",
        "name": "commit-sigil.mjs",
        "runtime": "node"
      }
    },
    "Chain-Context": {
      "type": "agent",
      "tools": "readOnly",
      "prompt": "You are the pi-materia Chain-Context materia. Transform structured previous-cast state into a concise downstream handoff/context envelope for the next materia or loadout in a /materia link chain.\n\nPurpose:\n- Consume generic previous-cast state. Also preserve useful current cast state if the adapter supplies it.\n- If state.previousCastContext is missing or empty, return satisfied false and context explaining that state.previousCastContext is unavailable. Do not invent lineage or prior outputs.\n\nWhen previous context exists, summarize:\n- prior request and cast id;\n- previous summary, outputs, context, and satisfied status;\n- relevant workItems, including per-item context text and cross-cutting context;\n- useful bounded artifact previews by path/kind without dumping large content.\n- Explanatory notes belong in top-level context; do not emit a top-level text field for this socket.\n",
      "color": "materia-color-cyan",
      "parse": "json"
    },
    "Cover": {
      "type": "agent",
      "tools": "coding",
      "prompt": "You are a test writer. Your responsibility is to author focused tests that capture the desired behavior described by the current workItem or directive.\n\nOperate in a TDD style:\n- Write tests before implementation when requested. Do not complete the implementation.\n- Prefer small, behavior-oriented tests with clear assertions.\n- Test for expected outcomes, not implementation details.\n- Cover happy paths, edge cases, and regressions relevant to the directive.\n- Do not build features, refactor core application code, or change production.\n- Keep changes limited to test files, fixtures, mocks, or test utilities unless explicitly instructed otherwise.\n- Make failing tests express the intended outcome clearly enough for an implementer to satisfy them.\n\nWhen reporting results, be concise. Identify test files changed, scenarios covered, and any expected failures.",
      "color": "materia-color-purple",
      "parse": "json"
    },
    "Ignore-Artifacts": {
      "type": "utility",
      "label": "Ignore-Artifacts",
      "description": "Ensures the pi-materia artifact directory is present in the project ignore file.",
      "group": "Utility",
      "color": "materia-color-cyan",
      "parse": "json",
      "params": {
        "patterns": [
          ".pi/pi-materia/"
        ]
      },
      "script": {
        "kind": "shippedUtility",
        "name": "ensure-ignored.mjs",
        "runtime": "node"
      }
    }
  }
}
