1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# framework-manifest.toml — the FRAMEWORK TIER of the manifest.toml format.
#
# This is NOT a second file format. It is a `HarnessManifest` document, parsed by
# the same `HarnessManifest::from_toml` every other manifest layer uses
# (`<project>/.trusty-mpm/manifest.toml`, `~/.trusty-mpm/manifest.toml`, the
# catalog manifest). It differs only in tier: it is compiled into the binary and
# declares the FRAMEWORK'S OWN agent and skill catalogs, which no project authors.
#
# Owner ruling 2026-08-01: "extend manifest.toml, do NOT add a second file
# format." Owner ruling 2026-08-04a: the catalog declares FOUR deployment
# categories. Owner ruling 2026-08-04b: "authoritative agent/skill bundling
# should be in framework-manifest.toml or project manifest.toml. That's it."
#
# ---------------------------------------------------------------------------
# THIS FILE IS THE AUTHORITY
# ---------------------------------------------------------------------------
#
# It answers three questions, and it is the only place any of them is answered:
#
# 1. WHICH agents and skills are bundled.
# 2. WHETHER each one deploys to a given project (its category).
# 3. WHAT CONDITION gates it (its `markers`).
#
# No bundled document restates any of that. `assets/skills/tm.md` and
# `assets/instructions/sections/agent-delegation.md` POINT here; they used to
# enumerate the roster in prose, which drifted silently — #4760 found `ops`
# sitting "DEPRECATED" in prose while still reaching every roster.
# `tm generate capabilities` renders the human-readable view of this file into
# `assets/skills/tm-capabilities/references/agents.md`, mechanically.
#
# ---------------------------------------------------------------------------
# Agent deployment categories
# ---------------------------------------------------------------------------
#
# universal — deploy to every project, no detection.
# language — deploy only when the entry's own `markers` show a LANGUAGE.
# framework — deploy only when the entry's own `markers` show a FRAMEWORK.
# platform — deploy only when the entry's own `markers` show a PLATFORM.
# deprecated — never deploy. Declared so the agent stays accounted for.
#
# Composition (see `core::manifest::framework::agent_scope_from`):
#
# include = universal
# u ((language u framework) n detected stacks)
# u (platform n detected platforms)
#
# with ONE zero-regression fallback: when NO stack marker at all is recognized
# (unknown project type), every `language` and `framework` stem is included —
# exactly what `language_agent_scope` did before this file existed. There is no
# such fallback for `platform`: no platform marker means no platform agent.
#
# ---------------------------------------------------------------------------
# Marker forms (evaluated by `core::manifest::project_lang::marker_present`)
# ---------------------------------------------------------------------------
#
# "path/to/file" exact path — true when it exists.
# "*.ext" extension glob over the direct children of the root.
# "path::needle" CONTENT PROBE — true when `path` exists, is within the size
# cap, is affordable under the shared probe budget, and
# contains `needle` as a literal substring.
#
# Every marker is evaluated at the project root AND at every workspace member
# the root manifest declares (npm/yarn/pnpm workspaces, Elixir umbrella
# `apps_path`) — see `core::manifest::workspace`. All probing is bounded and
# fails closed: an unreadable, oversized, or unaffordable marker reads as ABSENT,
# never as an error.
#
# ---------------------------------------------------------------------------
# Editing rules — all mechanically enforced, all LOUD on violation
# ---------------------------------------------------------------------------
#
# * Every bundled agent (every `agents/*.md` in `core::bundle::ALL` that is not
# a `BASE-*` foundation template) MUST appear in EXACTLY ONE agent list
# below. Omitting one is an error; listing one twice is an error.
# * Every bundled skill (every top-level `skills/*.md` in `core::bundle::ALL`)
# MUST appear exactly once in `[skill_categories]`.
# * Every `language` / `framework` / `platform` entry MUST declare at least one
# marker — a gated entry with no condition could never deploy.
# * `universal` MUST be non-empty in both sections — an empty catalog would
# silently deploy nothing.
#
# Deprecating an agent is an edit to THIS FILE: move its stem into `deprecated`.
# The deploy filter then never selects it. (It does not retract an already-
# deployed copy — orphan retraction is issue #391 / ADR-0025 clause 9, unshipped.)
= 1
[]
# --- universal: always deployed, no detection --------------------------------
= [
"api-qa",
"code-analyzer",
"code-critic",
"data-engineer",
"documentation",
"engineer",
"local-ops",
"memory-manager",
"mpm-agent-manager",
"mpm-skills-manager",
"prompt-engineer",
"qa",
"refactoring-engineer",
"research",
"secrets-manager",
"security",
"ticketing",
"version-control",
"web-qa",
"web-ui-engineer",
]
# --- deprecated: never deployed ----------------------------------------------
#
# Currently EMPTY, and that is the correct state — not a leftover.
#
# `ops` was the category's first and only occupant: superseded by `local-ops`,
# marked DEPRECATED in `agent-delegation.md` prose with zero code-level effect,
# and still reaching every roster. The owner ruled on 2026-08-04 to delete the
# asset outright rather than keep-but-not-deploy, so it is gone from the bundle
# and needs no declaration.
#
# The category stays because it is the mechanism, not the instance: retiring a
# future agent that must remain bundled (a stable name other tooling references,
# or one kept for a deprecation window) is an edit to this list. The behavior is
# still proven — `deprecated_agent_never_deploys` exercises it against a
# synthetic catalog, which is a stronger test than one riding on whichever agent
# happens to be retired today.
= []
# --- language: gated on a detected LANGUAGE ----------------------------------
[[]]
= "dart-engineer"
= ["pubspec.yaml"]
[[]]
= "dotnet-engineer"
# C#/.NET and legacy VB.NET: project/solution files are extension globs;
# `global.json` and `Directory.Build.props` are exact filenames.
= ["*.sln", "*.csproj", "*.vbproj", "global.json", "Directory.Build.props"]
[[]]
= "elixir-engineer"
# `mix.exs` is the Elixir project manifest — every Mix project has one. Before
# #4760 this marker selected `phoenix-engineer`, which meant a plain Elixir
# project got a Phoenix specialist and nothing else.
= ["mix.exs"]
[[]]
= "golang-engineer"
= ["go.mod"]
[[]]
= "java-engineer"
= ["pom.xml", "build.gradle", "build.gradle.kts", "settings.gradle"]
[[]]
= "javascript-engineer"
= ["package.json"]
[[]]
= "php-engineer"
= ["composer.json"]
[[]]
= "python-engineer"
= ["pyproject.toml", "setup.py", "setup.cfg", "requirements.txt", "Pipfile"]
[[]]
= "ruby-engineer"
= ["Gemfile", "Gemfile.lock", ".ruby-version"]
[[]]
= "rust-engineer"
= ["Cargo.toml"]
[[]]
= "typescript-engineer"
= ["tsconfig.json", "package.json"]
# --- framework: gated on a detected FRAMEWORK --------------------------------
#
# These gate on FRAMEWORK evidence, not language evidence. React and Phoenix
# ship no config file that distinguishes them, so they gate on a bounded content
# probe of the project's own dependency declaration. Every needle carries its
# surrounding syntax, so a substring match is an exact declaration match.
[[]]
= "nextjs-engineer"
# `next.config.*` is OPTIONAL in Next.js, so the dependency declaration backstops
# it. `"next"` does not match `"next-auth"` or `"next-themes"`.
= [
"next.config.js",
"next.config.mjs",
"next.config.ts",
"package.json::\"next\"",
]
[[]]
= "phoenix-engineer"
# #4760: narrowed from the bare `mix.exs` Elixir marker. Phoenix has no config
# file of its own that plain Elixir lacks, so the only reliable signal is the
# dependency declaration itself. `{:phoenix,` is the canonical `mix format`
# spelling of the dep tuple and does not match `{:phoenix_live_view,`.
= ["mix.exs::{:phoenix,"]
[[]]
= "react-engineer"
# #4760: narrowed from a bare `package.json`, which selected React for every
# JavaScript project. React ships no config file of its own. The quotes make it
# an exact key match: `"react"` does not match `"react-dom"`, `"react-native"`,
# or `"@types/react"`.
= ["package.json::\"react\""]
[[]]
= "svelte-engineer"
# `svelte.config.*` is present in every SvelteKit app and most plain Svelte ones;
# the dep declaration backstops the rest. `"svelte"` does not match
# `"svelte-check"` or `"@sveltejs/kit"`.
= ["svelte.config.js", "svelte.config.ts", "package.json::\"svelte\""]
[[]]
= "tauri-engineer"
= ["src-tauri/tauri.conf.json", "tauri.conf.json"]
# --- platform: gated on a detected PLATFORM ----------------------------------
#
# These deployed to EVERY project before this file existed. They now deploy only
# where a platform marker is present. That is an intended behavior change. The
# marker sets are deliberately narrow — each entry is a file the platform's own
# tooling creates or requires, not an inferred heuristic — because a false
# positive puts an irrelevant agent in every roster, which is the exact noise
# #1941 built scoping to remove.
[[]]
= "gcp-ops"
# `app.yaml` (App Engine), `cloudbuild.yaml`/`.yml` (Cloud Build), and
# `.gcloudignore` (every `gcloud` deploy) are created by GCP tooling.
= ["app.yaml", "cloudbuild.yaml", "cloudbuild.yml", ".gcloudignore"]
[[]]
= "vercel-ops"
# `vercel.json` is the project config; `.vercel/project.json` is written by
# `vercel link`; `.vercelignore` by the deploy flow.
= ["vercel.json", ".vercelignore", ".vercel/project.json"]
# =============================================================================
# Skills
# =============================================================================
#
# Every bundled skill deploys to every project — skills have exactly ONE deploy
# rule today, so `universal` is the only list. That is a declaration, not an
# omission: when a skill first needs a marker gate, it gets gated entries of the
# same shape the agent categories use above.
#
# This list is the authority for WHICH skills are bundled. `tm.md` used to carry
# a hand-maintained `/tm-*` roll-call; it now points here.
[]
= [
"api-design-patterns",
"api-documentation",
"artifacts-builder",
"brainstorming",
"code-production-process",
"code-review-standards",
"condition-based-waiting",
"contract-driven-testing",
"database-migration",
"documentation-style",
"env-manager",
"git-workflow",
"internal-comms",
"json-data-handling",
"model-context-builder",
"requesting-code-review",
"root-cause-tracing",
"rust-build-performance",
"rust-delivery-workflow",
"security-scanning",
"self-improvement-loop",
"software-patterns",
"systematic-debugging",
"test-driven-development",
"test-quality-inspector",
"testing-anti-patterns",
"tm",
"tm-adr",
"tm-agent-architecture",
"tm-architect-setup",
"tm-bug-reporting",
"tm-capabilities",
"tm-circuit-breaker",
"tm-cli-operations",
"tm-delegation-patterns",
"tm-doctor",
"tm-epic",
"tm-git-file-tracking",
"tm-init",
"tm-issues-prune",
"tm-postmortem",
"tm-prose-style",
"tm-secrets",
"tm-session-management",
"tm-session-pause",
"tm-session-resume",
"tm-slack",
"tm-teaching-templates",
"tm-ticketing",
"tm-tool-usage-guide",
"tm-verification-protocols",
"tm-workflow",
"verification-before-completion",
"web-performance-optimization",
"webapp-testing",
"writing-plans",
"xlsx",
]