{
"schema_version": 2,
"package_id": "trusty-mpm.pm.bundled-fallback",
"description": "The DEFAULT PM instruction package (#4318). This file — not a Rust literal — is the authored manifest: the section taxonomy with its customization tiers, the ordered block stream, every join, and the declared composition-time generators. Bulk prose lives in `sections/*.md` and is referenced by `file` bodies; a rule authored here rather than in a section file uses a `text` body. Composition is byte-deterministic for a given manifest and roster (see `instruction_package::InstructionPackage::compose`). Deliberately carries NO `$schema` key: every object in the format sets `additionalProperties: false` / `deny_unknown_fields`, so an unrecognised key is a hard parse error rather than dropped instruction content. Validate against `instruction-package.schema.json` out of band. #8533: `core` is the safety core; every other section is replaceable, and a block marked `pinned` (the agent-selection, memory and code-search protocols) survives an override of its section.",
"trailing_newline": false,
"sections": [
{
"id": "identity",
"title": "Identity",
"customization_tier": "project",
"description": "Who the PM is. Opens the prompt, so an IDENTITY override replaces the opening role statement in place (#8533); before #8533 the opening `## Identity` lived in `core` and an IDENTITY override landed late while the package identity still opened the prompt."
},
{
"id": "core",
"title": "Safety Core",
"customization_tier": "fixed",
"description": "The ONLY non-overridable section (#8533): Memory & Instruction Sources and the Customization Surface — the rules that protect the instruction system itself. Also owns the host-computed stack-profile and project-addendum blocks."
},
{
"id": "pm-allowlist",
"title": "PM Allowlist",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "delegation-mechanics",
"title": "Delegation Mechanics",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "agent-routing",
"title": "Agent Routing and Delegating Well",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "subagent-re-engagement",
"title": "Parked-Subagent Re-Engagement",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "phases",
"title": "Workflow (5-phase)",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "qa-gate",
"title": "QA Verification Gate",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "git-file-tracking",
"title": "Git File Tracking Protocol",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "tickets-prs-releases",
"title": "Tickets, PRs, and Releases",
"customization_tier": "project",
"description": "Split out of `core` by #8533."
},
{
"id": "messages-reports-sessions",
"title": "Messages, Reports, Sessions",
"customization_tier": "project",
"description": "Split out of `core` by #8533, with the prose-style pointer and the clickable-references rule."
},
{
"id": "autonomous-execution",
"title": "Autonomous Execution",
"customization_tier": "project",
"description": "When the PM runs the pipeline without stopping, and the conditions on which it may stop and ask. Was prose inside `core` until #8361: `core` is tier `fixed`, so no project could set its own comfort level — on a session resume the PM had one rule telling it to continue and a skill telling it to confirm, with no override surface to settle the two."
},
{
"id": "memory",
"title": "Memory Protocol",
"customization_tier": "project",
"description": "The recall/remember protocol is a pinned block (#8533); a MEMORY override replaces only the elaboration."
},
{
"id": "search",
"title": "Code Search Protocol",
"customization_tier": "project",
"description": "The search-before-reading protocol is a pinned block (#8533); a SEARCH override adds project guidance after it."
},
{
"id": "workflow",
"title": "Workflow",
"customization_tier": "project",
"description": "The phase workflow, including the sprint-then-harden doctrine."
},
{
"id": "agent-delegation",
"title": "Agent Delegation",
"customization_tier": "project",
"description": "Routing doctrine. The agent-selection note is pinned and the live roster is generated, so an AGENT-DELEGATION override replaces the doctrine only (#8533)."
},
{
"id": "enforcement",
"title": "Delegation Enforcement",
"customization_tier": "project",
"description": "The canonical Prohibitions and Circuit Breakers tables — the PM's entire delegation-enforcement authority. Was tier `project` inside `core` until #4573, where a three-line `CLAUDE.md` CORE override deleted both tables outright and left the floor asserting a table that was no longer in the prompt."
},
{
"id": "non-overridable-rules",
"title": "Non-Overridable Rules",
"customization_tier": "project",
"description": "Non-overridable rules, the customization contract, and the Trusty tool-priority mandate."
},
{
"id": "framework-guaranteed-conventions",
"title": "Framework-Guaranteed Conventions",
"customization_tier": "project",
"description": "Attribution footer, documentation proportionality, ticket attribution."
}
],
"blocks": [
{
"section": "identity",
"join_before": "rule",
"body": {
"kind": "file",
"path": "sections/identity.md"
}
},
{
"section": "core",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/core.md"
}
},
{
"section": "pm-allowlist",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/pm-allowlist.md"
}
},
{
"section": "delegation-mechanics",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/delegation-mechanics.md"
}
},
{
"section": "agent-routing",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/agent-routing.md"
}
},
{
"section": "subagent-re-engagement",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/subagent-re-engagement.md"
}
},
{
"section": "phases",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/phases.md"
}
},
{
"section": "qa-gate",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/qa-gate.md"
}
},
{
"section": "git-file-tracking",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/git-file-tracking.md"
}
},
{
"section": "tickets-prs-releases",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/tickets-prs-releases.md"
}
},
{
"section": "messages-reports-sessions",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/messages-reports-sessions.md"
}
},
{
"section": "messages-reports-sessions",
"join_before": "blank",
"body": {
"kind": "text",
"text": "### Clickable References\n\nEvery reference to an issue, PR, ticket, or commit renders as a clickable markdown link — never a bare number — in every artifact you author, not only formal reports. \"Fixed in #4318\" with no link is a defect. The link shapes for issues, PRs, commits and other trackers: `Skill(skill=\"tm-ticketing\")`."
}
},
{
"section": "autonomous-execution",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/autonomous-execution.md"
}
},
{
"section": "memory",
"join_before": "blank",
"body": {
"kind": "text",
"text": "## Memory Protocol (Context-First)\n\nCall `memory_recall` for targeted recall BEFORE any research or delegation, never after, and store durable findings with `memory_remember` / `memory_note` as you learn them. The trusty-memory palace is the memory; this protocol stays in force under any project override."
},
"pinned": true
},
{
"section": "memory",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/memory.md"
}
},
{
"section": "search",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/search.md"
},
"pinned": true
},
{
"section": "core",
"join_before": "rule",
"body": {
"kind": "generated",
"generator": "stack-profile"
},
"optional": true
},
{
"section": "workflow",
"join_before": "rule",
"body": {
"kind": "file",
"path": "sections/workflow.md"
}
},
{
"section": "workflow",
"join_before": "blank",
"body": {
"kind": "text",
"text": "## Opportunistic Fixes\n\nAn easy fix discovered while working on a file is noted on the CURRENT issue and made in the same work. Never file a new issue for it.\n\nNew issues are reserved for genuinely separable work someone would schedule on its own. Companion to the existing review-finding rule: fix it in the surfacing PR or drop it."
}
},
{
"section": "agent-delegation",
"join_before": "rule",
"body": {
"kind": "file",
"path": "sections/agent-delegation.md"
}
},
{
"section": "agent-delegation",
"join_before": "blank",
"body": {
"kind": "text",
"text": "> **Agent selection.** Dispatch a subagent only with the native Agent tool — `Agent(subagent_type=\"<name>\", ...)` — passing a name exactly as the harness's own `Available agent types for the Agent tool` listing or the roster below spells it. A prose title like \"Documentation Agent\" is not an agent and fails to dispatch (#4594). That listing is authoritative for WHICH agents exist; routing tables are doctrine only, and the roster below adds only the agents the listing does not carry (#4513).\n>\n> Depending on how this session was launched, a listed agent may not be loadable. If a dispatch fails with an unknown agent type, re-route to the closest listed alternative — do not retry the same agent."
},
"pinned": true
},
{
"section": "agent-delegation",
"join_before": "blank",
"body": {
"kind": "generated",
"generator": "agent-roster"
}
},
{
"section": "core",
"join_before": "rule",
"body": {
"kind": "generated",
"generator": "project-addendum"
},
"optional": true
},
{
"section": "enforcement",
"join_before": "rule",
"body": {
"kind": "file",
"path": "sections/enforcement.md"
}
},
{
"section": "non-overridable-rules",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/non-overridable-rules.md"
}
},
{
"section": "framework-guaranteed-conventions",
"join_before": "blank",
"body": {
"kind": "file",
"path": "sections/framework-guaranteed-conventions.md"
}
}
]
}