@synap-core/workspace-templates 0.24.1 → 0.25.0

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/src/builder.yaml CHANGED
@@ -1030,6 +1030,38 @@ profiles:
1030
1030
  label: Session Key
1031
1031
  valueType: string
1032
1032
 
1033
+ # `issue` is a CORE kind: the pod seeds it on every pod (ensure-system-profiles.ts,
1034
+ # "an open bug or problem" → issue) with its ONE lifecycle `issueStatus`
1035
+ # (ensure-system-lifecycles.ts). Declared here to match the seed exactly, the way
1036
+ # research-base declares `research`, so the Fix a bug playbook can name its
1037
+ # statusProperty. Pod-local extras (severity, night-shift-run) are not core: not here.
1038
+ # ONE deviation from the seed: `wont_fix` is humanOnly (a person decides an issue
1039
+ # is not worth fixing), which the playbook's humanOnlyStatuses below requires.
1040
+ - slug: issue
1041
+ displayName: Issue
1042
+ icon: bug
1043
+ color: "#EF4444"
1044
+ description: An open bug or problem, titled as the problem itself. Moves open → investigating → fixed or won't fix.
1045
+ lifecycle:
1046
+ property: issueStatus
1047
+ options:
1048
+ - { key: open, category: open }
1049
+ - { key: investigating, category: active }
1050
+ - { key: fixed, category: done }
1051
+ - { key: wont_fix, category: lost, humanOnly: true }
1052
+ properties:
1053
+ - slug: issueStatus
1054
+ label: Status
1055
+ valueType: string
1056
+ inputType: select
1057
+ enumValues: [open, investigating, fixed, wont_fix]
1058
+ constraints: { defaultValue: open }
1059
+ - slug: description
1060
+ label: Description
1061
+ valueType: string
1062
+ inputType: textarea
1063
+ constraints: { maxLength: 5000 }
1064
+
1033
1065
  - slug: skill
1034
1066
  displayName: Skill
1035
1067
  icon: zap
@@ -2086,6 +2118,741 @@ playbooks:
2086
2118
  statement: Each Ship a change session covered got its dogfooded evidence, passed only when every path works.
2087
2119
  check: { kind: judge }
2088
2120
 
2121
+ # THE SIX DEV PLAYBOOKS (decision d05, founder instruction 2026-11-05): Build a
2122
+ # change, Fix a bug, Investigate, Review a change, Maintain, Fix main red.
2123
+ # Mirrored field by field from the six draft playbook proposals filed on the Builder
2124
+ # pod (stored shape; humanOnlyStatuses lifted to the top-level wire spelling).
2125
+ # ALL `status: draft` and NO activators: a pod keeps its own draft/active
2126
+ # choice on later template updates, and a person turns each on.
2127
+
2128
+ # --- Build a change ---
2129
+ - name: Build a change
2130
+ description: 'Dev set (decision d05), key: build. Works one feature (devplane_feature) from shaped criteria to a verified change on main; its stages follow the feature''s lifecycle (spec, in_progress, in_review, done), and a cancelled or failed session puts the feature back to spec so nothing is left half-claimed. One feature per session, never two subjects (founder default, 2026-11-05). A quick change is this playbook with size small (no plan); a night shift run is this playbook with unattended true. No activators until binding is turned on; the shape would be {on: enters_status, status: spec, size: per_thing, mode: propose}, the trigger Ship a change uses today. Reuses Ship a change (2c5aa553) stage text and evidence keys; absorbs AI Dev Session and Quick change once they are re-pointed. Draft until the founder activates it.'
2131
+ goalTemplate: 'Build {feature} through one session and one PR per repo (or gated commits on main in a private repo), size {size}. SHAPE: write the end state and 2-5 binary criteria on this session (plan skill, skipped when size is small). BUILD: branch <type>/<slug> from origin/main in your own worktree, commit in verified slices, run the smallest gate that answers with its negative control, quote the output. LAND: follow the land stages (Change proposed, Checks green, Landed on main, Deployed to lab, Dogfooded, Criteria verified). Unattended: {unattended}. When unattended is true, ask no person, stop at a draft PR or a gated branch, never merge, push main or deploy, and post one "Look at first:" paragraph in the room.'
2132
+ scope: session
2133
+ subjectProfile:
2134
+ onEnd:
2135
+ failed: spec
2136
+ cancelled: spec
2137
+ profileSlug: devplane_feature
2138
+ statusProperty: featureStatus
2139
+ humanOnlyStatuses:
2140
+ - backlog
2141
+ - cancelled
2142
+ params:
2143
+ - name: feature
2144
+ type: entity
2145
+ label: Feature
2146
+ required: true
2147
+ - name: size
2148
+ type: choice
2149
+ label: How big is the change?
2150
+ default: normal
2151
+ options:
2152
+ - small
2153
+ - normal
2154
+ - name: unattended
2155
+ type: boolean
2156
+ label: Run without a person (night shift)?
2157
+ default: false
2158
+ executor: is-agent
2159
+ status: draft
2160
+ stages:
2161
+ - key: shape
2162
+ goal: Write the end state and 2-5 binary criteria on the session, set the feature's change type, and name the repos the change touches.
2163
+ name: Shaped
2164
+ category: planned
2165
+ criteria:
2166
+ - key: shape-criteria-written
2167
+ check:
2168
+ kind: judge
2169
+ statement: The session states the end state and 2-5 binary criteria a check, a judge or a person can grade.
2170
+ - key: shape-change-typed
2171
+ check:
2172
+ kind: judge
2173
+ statement: The feature's change type is set (feature, refactor or chore) and the repos it touches are named.
2174
+ description: 'Load the plan skill; skip it when size is small (criteria alone are enough). Recall first: synap_ask "<area> gotchas". Tools: read only (code, pod). Gate: none. Model tier: deep (advisory until a tier field exists).'
2175
+ subjectStatus: spec
2176
+ expectedOutputs:
2177
+ - kind: document
2178
+ label: Plan (skipped when size is small)
2179
+ optional: true
2180
+ relationToSubject: relates_to
2181
+ - key: build
2182
+ goal: Build on a branch named after the work, from origin/main in your own worktree; commit in verified slices and run the smallest gate that answers for each finished slice, with its negative control.
2183
+ name: Building
2184
+ category: started
2185
+ criteria:
2186
+ - key: build-gates-quoted
2187
+ check:
2188
+ kind: judge
2189
+ statement: Each finished slice was gated once (the smallest gate that answers) and its output is quoted in the room, red lines attributed against main.
2190
+ - key: build-negative-control
2191
+ check:
2192
+ kind: judge
2193
+ statement: Every new test was run with its fix reverted and failed.
2194
+ description: 'Load the verified-wave skill. Commit a checkpoint about every 30 minutes and post it in the room. Never run git checkout --, restore, stash or a working-tree reset in a shared tree (rule shared-tree). Tools: edit, git in your own worktree, devbox gates (rule devbox-gates). Gate: none here; the Checks green stage sends a red back to this stage. Model tier: standard (advisory until a tier field exists).'
2195
+ subjectStatus: in_progress
2196
+ expectedOutputs:
2197
+ - kind: commit
2198
+ label: Gated commit sha
2199
+ - key: pr-opened
2200
+ goal: 'Record the change as one outcome with its url: a draft PR in a public repo, or a pushed branch gated at its exact sha in a private repo.'
2201
+ name: Change proposed
2202
+ category: started
2203
+ criteria:
2204
+ - key: change-recorded
2205
+ check:
2206
+ kind: judge
2207
+ statement: 'The change is recorded on the session as an outcome with its url: pr-<repo>-<number> for a public repo, commit-<repo>-<sha8> for a private repo.'
2208
+ - key: pr-names-session
2209
+ check:
2210
+ kind: judge
2211
+ statement: A pull request body, when there is one, carries the line naming this Pod session.
2212
+ description: 'Shared land stage. Public repo (backend, synap-cli): open a DRAFT pull request whose body carries the line "Pod session: <session id>", then record the outcome pr-<repo>-<number> (kind pull_request, ref url). Private repo (app-bases, browser, relay-app, control-plane-api, control-plane-dashboard, synap-bridge): no PR; rebase on origin/main, push the branch and queue the smallest devbox gate on its full sha with GATE_POD_SESSION set. One session, one PR per repo. Done by the ship flow and the outcome verbs, not by free reasoning. Rules: work-units, github-ci, devbox-gates. Tools: git, gh, devbox queue, synap_update_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2213
+ subjectStatus: in_review
2214
+ expectedOutputs:
2215
+ - kind: pull_request
2216
+ label: Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only
2217
+ optional: true
2218
+ - key: checks
2219
+ gate:
2220
+ kind: check
2221
+ goal: 'Every required check on the exact head is green: the 4 required backend checks, or the devbox gate on the private repo''s sha.'
2222
+ name: Checks green
2223
+ onFail:
2224
+ toStage: build
2225
+ category: started
2226
+ criteria:
2227
+ - key: checks-green
2228
+ check:
2229
+ hint: Posted by the ci.finished automation, by the worker after github_pr_checks on the head sha, or with the devbox summary of the exact sha for a private repo.
2230
+ kind: evidence
2231
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2232
+ statement: Every required check on the head finished green (the 4 required backend checks, or the devbox gate on the exact sha in a private repo).
2233
+ description: 'Shared land stage. Backend: mark the draft ready once, when the slice is done and gated; it is done when Release gate, Full suite, API e2e and Reference docs are current are green on its head (github_pr_checks or the ci.finished event). Private repo: the devbox gate on that full sha is green with no INFRA result. A red you did not cause is not yours: read main''s latest run or the [vs main] mark first. A red that is yours goes back to the work stage; push the fix once. Done by CI, the devbox and the ci.finished automation, not by free reasoning. Tools: gh read, devbox status. Model tier: quick (advisory until a tier field exists).'
2234
+ - key: merge
2235
+ goal: 'The change reaches main through its door: the merge bot for backend, a fast-forward push of the gated sha for a private repo.'
2236
+ name: Landed on main
2237
+ category: started
2238
+ criteria:
2239
+ - key: merged
2240
+ check:
2241
+ hint: Posted by the dev.pr_merged automation, by the worker after github_pr_get (merged true), or with the commit url on main for a private repo.
2242
+ kind: evidence
2243
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2244
+ statement: The change is on main and its outcome is marked complete.
2245
+ description: 'Shared land stage. Backend: never run gh pr merge (with or without --auto, never --admin) and never enqueue the PR yourself; the merge bot enqueues a ready, green PR whose body names the session. A PR touching CI or test infrastructure waits 2 h after green unless the founder runs prcheck --merge backend <n>: say so. Private repo: git push origin <sha>:main of the exact gated sha, fast-forward only, never --force; if main moved, only a clean rebase touching none of your files may go, otherwise gate again. Then completeOutput on the outcome. An unattended run stops before this stage. Done by the merge bot, the bridge and the outcome verbs. Tools: git push (private repo only), synap_update_session. Gate: none (the bridge and the merge bot hold the evidence). Model tier: quick (advisory until a tier field exists).'
2246
+ - key: deploy
2247
+ gate:
2248
+ kind: human
2249
+ goal: A person approves the lab deploy of the merged build; record the deployed sha.
2250
+ name: Deployed to lab
2251
+ onFail:
2252
+ toStage: build
2253
+ category: started
2254
+ criteria:
2255
+ - key: deployed
2256
+ check:
2257
+ hint: The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).
2258
+ kind: evidence
2259
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2260
+ statement: The lab runs a build that contains the merge commit.
2261
+ description: 'Shared land stage. Ask with synap_request_deploy_approval; the deploy is the person''s call and releases stay the founder''s. Skip with a one-line reason in the room when the change never reaches a running pod (CI, tests, docs, tooling). Never in an unattended run. Tools: synap_request_deploy_approval, github_compare. Model tier: quick (advisory until a tier field exists).'
2262
+ - key: dogfood
2263
+ gate:
2264
+ kind: check
2265
+ goal: Walk the change in the running lab as a person would, entering through the doors a person enters through, and report WORKS, BROKEN or CANNOT-TELL with what was seen.
2266
+ name: Dogfooded
2267
+ onFail:
2268
+ toStage: build
2269
+ category: started
2270
+ criteria:
2271
+ - key: dogfooded
2272
+ check:
2273
+ kind: evidence
2274
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2275
+ statement: The dogfood walk reports WORKS on every path the change touches.
2276
+ description: 'Shared land stage. Load the dogfood skill, or start Dogfood a change (08a4929c) as a child session for a deployed change. A BROKEN path becomes a finding and the run goes back to the work stage. Skip with a one-line reason when nothing a person sees changed. Tools: browser automation, screenshots, read. Model tier: standard (advisory until a tier field exists).'
2277
+ expectedOutputs:
2278
+ - kind: document
2279
+ label: Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)
2280
+ optional: true
2281
+ relationToSubject: relates_to
2282
+ - key: verify
2283
+ goal: Grade every criterion of the session with its evidence, separating VERIFIED (gate or check output quoted) from NEEDS-DOGFOOD, capture what was learned, and close the session.
2284
+ name: Criteria verified
2285
+ category: completed
2286
+ criteria:
2287
+ - key: criteria-verified
2288
+ check:
2289
+ kind: judge
2290
+ statement: Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified.
2291
+ description: 'Shared land stage. Never report unverified work as verified. File the lesson, decision or finding the work produced (engineering-memory skill, rule dogfood-journal). Close what you opened: asks answered or withdrawn, worktree removed once merged, then synap_complete_session. Moving the feature to done is a proposal the person approves. Tools: synap_update_session, synap_capture, synap_complete_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2292
+ subjectStatus: done
2293
+
2294
+ # --- Fix a bug ---
2295
+ - name: Fix a bug
2296
+ description: 'Dev set (decision d05), key: fix. Works an issue at its root: reproduce it with a failing test, fix the canonical path, a clean-context review, then the shared land stages. Its stages follow the issue''s lifecycle (open, investigating, fixed); a cancelled or failed session puts the issue back to open, as Fix a finding does. Small fixes may be batched (founder default, 2026-11-05): several issues in one session, one as the subject and the rest as session targets; today a stage moves only the subject, and the session end moves the subject and every target still open. No activators until binding is turned on; a batch would be {on: count, status: open, min: 3} or {on: schedule, cron, status: open} (both one session per moment). A night shift run is this playbook with unattended true. Reuses Bugfix (8c335e2e), Night shift: build an issue (c101dd75) and Ship a change (2c5aa553). Draft until the founder activates it.'
2297
+ goalTemplate: 'Fix the issue {issue} at its root and prove it with a test that fails before the fix and passes after. REPRODUCE (recall first, smallest reproduction, root cause file:line), FIX on the canonical path in your own worktree, a clean-context REVIEW, then LAND through the shared land stages (Change proposed, Checks green, Landed on main, Deployed to lab, Dogfooded, Criteria verified). Unattended: {unattended}. When unattended is true, ask no person, stop at a draft PR or a gated branch, never merge, push main or deploy; if no code fix is right, write the root cause as a pod document; post one "Look at first:" paragraph in the room.'
2298
+ scope: session
2299
+ subjectProfile:
2300
+ onEnd:
2301
+ failed: open
2302
+ cancelled: open
2303
+ profileSlug: issue
2304
+ statusProperty: issueStatus
2305
+ # Added to the pod draft (it has none; the catalog's lifecycle-coverage check
2306
+ # needs every option owned): `open` is where an issue starts and a failed or
2307
+ # cancelled session returns it (onEnd), `wont_fix` is a person's call.
2308
+ humanOnlyStatuses:
2309
+ - open
2310
+ - wont_fix
2311
+ params:
2312
+ - name: issue
2313
+ type: entity
2314
+ label: Issue
2315
+ required: true
2316
+ - name: unattended
2317
+ type: boolean
2318
+ label: Run without a person (night shift)?
2319
+ default: false
2320
+ executor: is-agent
2321
+ status: draft
2322
+ stages:
2323
+ - key: reproduce
2324
+ goal: Show the bug happening with the smallest reproduction (a failing test or the exact steps) and name its root cause with file:line.
2325
+ name: Reproduce
2326
+ category: planned
2327
+ criteria:
2328
+ - key: repro-shown
2329
+ check:
2330
+ kind: judge
2331
+ statement: A test or exact reproduction shows the bug, and the root cause is named with file:line.
2332
+ description: 'Load the engineering-memory skill and recall first: synap_ask "<area> gotchas". Name the root cause, not the symptom. Tools: read, devbox (one test file at the smallest rung). Gate: none. Model tier: standard (advisory until a tier field exists).'
2333
+ subjectStatus: investigating
2334
+ suggestedTasks:
2335
+ - recall known gotchas for the area
2336
+ - write the failing test or the exact repro steps
2337
+ - name the root cause, not the symptom
2338
+ expectedOutputs:
2339
+ - kind: note
2340
+ label: 'Reproduction: failing test path or exact steps, and the root cause (file:line)'
2341
+ - key: fix
2342
+ gate:
2343
+ kind: check
2344
+ goal: Fix the root cause on the canonical path; the reproduction test now passes and was seen failing with the fix reverted.
2345
+ name: Fix
2346
+ onFail:
2347
+ toStage: reproduce
2348
+ category: started
2349
+ criteria:
2350
+ - key: fix-negative-control
2351
+ check:
2352
+ kind: judge
2353
+ statement: The reproduction test passes with the fix and fails with the fix reverted; the gate output is quoted in the room.
2354
+ description: 'Load the verified-wave skill. Branch fix/<slug> from origin/main in your own worktree. The entry check judges Reproduce: no reproduction sends the run back. Tools: edit, git in your own worktree, devbox (be-file or *-touched). Model tier: standard (advisory until a tier field exists).'
2355
+ suggestedTasks:
2356
+ - fix the root cause
2357
+ - 'negative control: revert the fix, see the test fail'
2358
+ - run the smallest gate yourself and quote it
2359
+ expectedOutputs:
2360
+ - kind: commit
2361
+ label: Gated fix commit sha
2362
+ - key: review
2363
+ gate:
2364
+ kind: check
2365
+ goal: A separate session with a clean context reads the fix and lists must-fix findings apart from justified-keep ones.
2366
+ name: Review
2367
+ onFail:
2368
+ toStage: fix
2369
+ category: started
2370
+ criteria:
2371
+ - key: review-clean
2372
+ check:
2373
+ kind: judge
2374
+ statement: The review lists no open must-fix finding.
2375
+ description: 'Load the pr-review skill in a review child session, never the author. The author answers every finding; a must-fix finding sends the run back to Fix before landing. The entry check judges Fix (test green, negative control seen red). Tools: read only. Model tier: deep (advisory until a tier field exists).'
2376
+ suggestedTasks:
2377
+ - start a review child session (not the author)
2378
+ - author answers every finding
2379
+ expectedOutputs:
2380
+ - kind: document
2381
+ label: Review note (must-fix and justified-keep, with file:line)
2382
+ relationToSubject: relates_to
2383
+ - key: pr-opened
2384
+ goal: 'Record the change as one outcome with its url: a draft PR in a public repo, or a pushed branch gated at its exact sha in a private repo.'
2385
+ name: Change proposed
2386
+ category: started
2387
+ criteria:
2388
+ - key: change-recorded
2389
+ check:
2390
+ kind: judge
2391
+ statement: 'The change is recorded on the session as an outcome with its url: pr-<repo>-<number> for a public repo, commit-<repo>-<sha8> for a private repo.'
2392
+ - key: pr-names-session
2393
+ check:
2394
+ kind: judge
2395
+ statement: A pull request body, when there is one, carries the line naming this Pod session.
2396
+ description: 'Shared land stage. Public repo (backend, synap-cli): open a DRAFT pull request whose body carries the line "Pod session: <session id>", then record the outcome pr-<repo>-<number> (kind pull_request, ref url). Private repo (app-bases, browser, relay-app, control-plane-api, control-plane-dashboard, synap-bridge): no PR; rebase on origin/main, push the branch and queue the smallest devbox gate on its full sha with GATE_POD_SESSION set. One session, one PR per repo. Done by the ship flow and the outcome verbs, not by free reasoning. Rules: work-units, github-ci, devbox-gates. Tools: git, gh, devbox queue, synap_update_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2397
+ expectedOutputs:
2398
+ - kind: pull_request
2399
+ label: Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only
2400
+ optional: true
2401
+ - key: checks
2402
+ gate:
2403
+ kind: check
2404
+ goal: 'Every required check on the exact head is green: the 4 required backend checks, or the devbox gate on the private repo''s sha.'
2405
+ name: Checks green
2406
+ onFail:
2407
+ toStage: fix
2408
+ category: started
2409
+ criteria:
2410
+ - key: checks-green
2411
+ check:
2412
+ hint: Posted by the ci.finished automation, by the worker after github_pr_checks on the head sha, or with the devbox summary of the exact sha for a private repo.
2413
+ kind: evidence
2414
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2415
+ statement: Every required check on the head finished green (the 4 required backend checks, or the devbox gate on the exact sha in a private repo).
2416
+ description: 'Shared land stage. Backend: mark the draft ready once, when the slice is done and gated; it is done when Release gate, Full suite, API e2e and Reference docs are current are green on its head (github_pr_checks or the ci.finished event). Private repo: the devbox gate on that full sha is green with no INFRA result. A red you did not cause is not yours: read main''s latest run or the [vs main] mark first. A red that is yours goes back to the work stage; push the fix once. Done by CI, the devbox and the ci.finished automation, not by free reasoning. Tools: gh read, devbox status. Model tier: quick (advisory until a tier field exists).'
2417
+ - key: merge
2418
+ goal: 'The change reaches main through its door: the merge bot for backend, a fast-forward push of the gated sha for a private repo.'
2419
+ name: Landed on main
2420
+ category: started
2421
+ criteria:
2422
+ - key: merged
2423
+ check:
2424
+ hint: Posted by the dev.pr_merged automation, by the worker after github_pr_get (merged true), or with the commit url on main for a private repo.
2425
+ kind: evidence
2426
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2427
+ statement: The change is on main and its outcome is marked complete.
2428
+ description: 'Shared land stage. Backend: never run gh pr merge (with or without --auto, never --admin) and never enqueue the PR yourself; the merge bot enqueues a ready, green PR whose body names the session. A PR touching CI or test infrastructure waits 2 h after green unless the founder runs prcheck --merge backend <n>: say so. Private repo: git push origin <sha>:main of the exact gated sha, fast-forward only, never --force; if main moved, only a clean rebase touching none of your files may go, otherwise gate again. Then completeOutput on the outcome. An unattended run stops before this stage. Done by the merge bot, the bridge and the outcome verbs. Tools: git push (private repo only), synap_update_session. Gate: none (the bridge and the merge bot hold the evidence). Model tier: quick (advisory until a tier field exists).'
2429
+ - key: deploy
2430
+ gate:
2431
+ kind: human
2432
+ goal: A person approves the lab deploy of the merged build; record the deployed sha.
2433
+ name: Deployed to lab
2434
+ onFail:
2435
+ toStage: fix
2436
+ category: started
2437
+ criteria:
2438
+ - key: deployed
2439
+ check:
2440
+ hint: The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).
2441
+ kind: evidence
2442
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2443
+ statement: The lab runs a build that contains the merge commit.
2444
+ description: 'Shared land stage. Ask with synap_request_deploy_approval; the deploy is the person''s call and releases stay the founder''s. Skip with a one-line reason in the room when the change never reaches a running pod (CI, tests, docs, tooling). Never in an unattended run. Tools: synap_request_deploy_approval, github_compare. Model tier: quick (advisory until a tier field exists).'
2445
+ - key: dogfood
2446
+ gate:
2447
+ kind: check
2448
+ goal: Walk the change in the running lab as a person would, entering through the doors a person enters through, and report WORKS, BROKEN or CANNOT-TELL with what was seen.
2449
+ name: Dogfooded
2450
+ onFail:
2451
+ toStage: fix
2452
+ category: started
2453
+ criteria:
2454
+ - key: dogfooded
2455
+ check:
2456
+ kind: evidence
2457
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2458
+ statement: The dogfood walk reports WORKS on every path the change touches.
2459
+ description: 'Shared land stage. Load the dogfood skill, or start Dogfood a change (08a4929c) as a child session for a deployed change. Re-run the original reproduction where the issue was reported. A BROKEN path becomes a finding and the run goes back to the work stage. Skip with a one-line reason when nothing a person sees changed. Tools: browser automation, screenshots, read. Model tier: standard (advisory until a tier field exists).'
2460
+ expectedOutputs:
2461
+ - kind: document
2462
+ label: Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)
2463
+ optional: true
2464
+ relationToSubject: relates_to
2465
+ - key: verify
2466
+ goal: Grade every criterion of the session with its evidence, separating VERIFIED (gate or check output quoted) from NEEDS-DOGFOOD, capture what was learned, and close the session.
2467
+ name: Criteria verified
2468
+ category: completed
2469
+ criteria:
2470
+ - key: criteria-verified
2471
+ check:
2472
+ kind: judge
2473
+ statement: Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified.
2474
+ description: 'Shared land stage. Never report unverified work as verified. File the lesson, decision or finding the work produced (engineering-memory skill, rule dogfood-journal). Close what you opened: asks answered or withdrawn, worktree removed once merged, then synap_complete_session. Moving the issue to fixed is a proposal the person approves. Tools: synap_update_session, synap_capture, synap_complete_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2475
+ subjectStatus: fixed
2476
+
2477
+ # --- Investigate ---
2478
+ - name: Investigate
2479
+ description: 'Dev set (decision d05), key: investigate. Works a feature (devplane_feature) before anyone builds it, usually while it is an idea (backlog): frame the question, measure, and conclude with a recommendation (continue, cut or reshape) in one pod document. It moves no status itself: taking the feature to spec or dropping it stays the person''s call. Changes no code. One feature per session. No activators until binding is turned on. Absorbs Evaluate Feature (11b3acd8) once it is re-pointed; reuses the stage shape of Research a Question (418e862a). Draft until the founder activates it.'
2480
+ goalTemplate: 'Investigate {question} and answer it with evidence. FRAME: restate the question so it can be answered and say what evidence would answer it. MEASURE: read the code at the installed version, measure on real data, keep rejected sources with their reason, and label every number MEASURED, READ or ESTIMATED. CONCLUDE: write the answer, its confidence and a recommendation (for a feature: continue, cut or reshape, with the reasoning) as one pod document; a choice only the founder can make goes into a decision brief. Change no code.'
2481
+ scope: session
2482
+ subjectProfile:
2483
+ profileSlug: devplane_feature
2484
+ params:
2485
+ - name: question
2486
+ type: text
2487
+ label: What question should this answer?
2488
+ required: true
2489
+ - name: feature
2490
+ type: entity
2491
+ label: Feature it is about
2492
+ executor: is-agent
2493
+ status: draft
2494
+ stages:
2495
+ - key: frame
2496
+ goal: Restate the question so it can be answered and say what evidence would answer it.
2497
+ name: Framed
2498
+ category: planned
2499
+ criteria:
2500
+ - key: question-answerable
2501
+ check:
2502
+ kind: judge
2503
+ statement: The question is restated so it can be answered, and the evidence that would answer it is named.
2504
+ description: 'Recall first: synap_ask on the area, and read what the pod already settled. Load research-decision-room when options must be compared, decision-brief when the answer is a founder decision. Tools: read only (code, pod, web). Gate: none. Model tier: deep (advisory until a tier field exists).'
2505
+ - key: measure
2506
+ goal: 'Gather the evidence: read the code at the installed version, measure on real data, and keep rejected sources with their reason.'
2507
+ name: Measured
2508
+ category: started
2509
+ criteria:
2510
+ - key: sources-kept
2511
+ check:
2512
+ kind: judge
2513
+ statement: Every source or measure used is cited, and rejected ones are kept with their reason.
2514
+ description: 'Label every number MEASURED, READ or ESTIMATED. No code change and no write except pod captures. Tools: read only; a devbox read gate only when a measure needs one (smallest rung). Gate: none. Model tier: deep (advisory until a tier field exists).'
2515
+ - key: conclude
2516
+ gate:
2517
+ kind: check
2518
+ goal: Write the answer, its confidence and a recommendation as one pod document linked to the session.
2519
+ name: Concluded
2520
+ onFail:
2521
+ toStage: measure
2522
+ category: completed
2523
+ criteria:
2524
+ - key: every-number-labeled
2525
+ check:
2526
+ kind: judge
2527
+ statement: Every number in the document is labeled MEASURED, READ or ESTIMATED, and the recommendation follows from the evidence.
2528
+ description: 'The entry check judges Measure: an unlabeled number or an uncited claim sends the run back. Open choices only a person can settle go into a decision brief (decision-brief skill), each with a recommendation. Capture what stays true as knowledge. Tools: synap_create_document, synap_capture. Model tier: deep (advisory until a tier field exists).'
2529
+ expectedOutputs:
2530
+ - kind: document
2531
+ label: Investigation (question, measured evidence, recommendation)
2532
+ relationToSubject: relates_to
2533
+
2534
+ # --- Review a change ---
2535
+ - name: Review a change
2536
+ description: 'Dev set (decision d05), key: review. Works a feature in review (devplane_feature at in_review): a read-only, clean-context review of its change; every finding is must-fix or justified-keep, with its reason and file:line, and goes to the author''s session. Moves no status. Never the author; the author applies the fixes. Reviewing a fix runs as the review child of a Fix a bug session. There is no pull request kind: a PR is an outcome url, not an object. No activators until binding is turned on. Reuses the review stage of Bugfix (8c335e2e) and Quick change (63552bed). Draft until the founder activates it.'
2537
+ goalTemplate: 'Review {target} with a clean context and give a verdict. READ the change, the rules it touches and what it can break. VERDICT: list every finding as must-fix (why it is real) or justified-keep (why it stays), each with file:line, in one review document, and post it to the author''s session. Read only: apply nothing.'
2538
+ scope: session
2539
+ subjectProfile:
2540
+ profileSlug: devplane_feature
2541
+ params:
2542
+ - name: target
2543
+ type: text
2544
+ label: What to review (a PR url, a branch, a sha or a document)
2545
+ required: true
2546
+ - name: feature
2547
+ type: entity
2548
+ label: Feature under review
2549
+ executor: is-agent
2550
+ status: draft
2551
+ stages:
2552
+ - key: read
2553
+ goal: 'Read the change with a clean context: the diff, the rules it touches, and what it can break.'
2554
+ name: Read
2555
+ category: started
2556
+ criteria:
2557
+ - key: read-whole-change
2558
+ check:
2559
+ kind: judge
2560
+ statement: The whole change and the rules it touches were read; nothing was edited.
2561
+ description: 'Load pr-review for one pull request, parallel-review for a substantial build (independent read-only lenses). Never review your own work. Tools: read only (gh read, code, pod). Gate: none. Model tier: deep (advisory until a tier field exists).'
2562
+ - key: verdict
2563
+ goal: List findings as must-fix (why it is real) or justified-keep (why it stays), each with file:line, and post the verdict to the author's session.
2564
+ name: Verdict
2565
+ category: completed
2566
+ criteria:
2567
+ - key: findings-justified
2568
+ check:
2569
+ kind: judge
2570
+ statement: Every finding is classed must-fix or justified-keep with its reason and file:line.
2571
+ description: 'Send the document to the author''s session (synap_post_message with toSessionId, intent handoff); the author answers every finding and applies the fixes. Gate: none (the author''s own playbook gates on an empty must-fix list). Tools: synap_create_document, synap_post_message. Model tier: deep (advisory until a tier field exists).'
2572
+ expectedOutputs:
2573
+ - kind: document
2574
+ label: Review (must-fix and justified-keep, with file:line)
2575
+ relationToSubject: relates_to
2576
+
2577
+ # --- Maintain ---
2578
+ - name: Maintain
2579
+ description: 'Dev set (decision d05), key: maintain. Works a task (one bounded chore: a dependency bump, a cleanup, a prune) in your own worktree, gated at the smallest rung, then the shared land stages when something changed. Nothing to change ends the session with a one-line reason. Small chores may be batched: several tasks in one session, one as the subject and the rest as targets. It writes no task status yet: the task lifecycle property is not confirmed (Builder''s task-status is a plain select with no declared lifecycle). No activators until binding is turned on. Draft until the founder activates it.'
2580
+ goalTemplate: 'Do this chore: {chore} (repo: {repo}). DO it in your own worktree and run the smallest gate that answers; if there is nothing to change, say why in one line and close. LAND it through the shared land stages only when something changed.'
2581
+ scope: session
2582
+ subjectProfile:
2583
+ profileSlug: task
2584
+ params:
2585
+ - name: chore
2586
+ type: text
2587
+ label: What chore (bump, clean, prune)?
2588
+ required: true
2589
+ - name: repo
2590
+ type: text
2591
+ label: Which repo?
2592
+ default: any
2593
+ - name: task
2594
+ type: entity
2595
+ label: Task it works, if any
2596
+ executor: is-agent
2597
+ status: draft
2598
+ stages:
2599
+ - key: do
2600
+ goal: Do the bounded chore in your own worktree, or show there is nothing to do.
2601
+ name: Done in a worktree
2602
+ category: started
2603
+ criteria:
2604
+ - key: chore-gated
2605
+ check:
2606
+ kind: judge
2607
+ statement: The chore is done and its smallest gate is green and quoted, or the session says in one line why nothing changed.
2608
+ description: 'Rules: devbox-gates (smallest gate that answers) and shared-tree (never checkout --, restore, stash or a working-tree reset). Remove only what the chore names or what your change made unused. Tools: edit, git in your own worktree, devbox. Gate: none; nothing to change ends the session with a one-line reason and skips the land stages. Model tier: quick (advisory until a tier field exists).'
2609
+ expectedOutputs:
2610
+ - kind: commit
2611
+ label: Gated commit sha (none when nothing changed)
2612
+ optional: true
2613
+ - key: pr-opened
2614
+ goal: 'Record the change as one outcome with its url: a draft PR in a public repo, or a pushed branch gated at its exact sha in a private repo.'
2615
+ name: Change proposed
2616
+ category: started
2617
+ criteria:
2618
+ - key: change-recorded
2619
+ check:
2620
+ kind: judge
2621
+ statement: 'The change is recorded on the session as an outcome with its url: pr-<repo>-<number> for a public repo, commit-<repo>-<sha8> for a private repo.'
2622
+ - key: pr-names-session
2623
+ check:
2624
+ kind: judge
2625
+ statement: A pull request body, when there is one, carries the line naming this Pod session.
2626
+ description: 'Shared land stage. Public repo (backend, synap-cli): open a DRAFT pull request whose body carries the line "Pod session: <session id>", then record the outcome pr-<repo>-<number> (kind pull_request, ref url). Private repo (app-bases, browser, relay-app, control-plane-api, control-plane-dashboard, synap-bridge): no PR; rebase on origin/main, push the branch and queue the smallest devbox gate on its full sha with GATE_POD_SESSION set. One session, one PR per repo. Done by the ship flow and the outcome verbs, not by free reasoning. Rules: work-units, github-ci, devbox-gates. Tools: git, gh, devbox queue, synap_update_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2627
+ expectedOutputs:
2628
+ - kind: pull_request
2629
+ label: Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only
2630
+ optional: true
2631
+ - key: checks
2632
+ gate:
2633
+ kind: check
2634
+ goal: 'Every required check on the exact head is green: the 4 required backend checks, or the devbox gate on the private repo''s sha.'
2635
+ name: Checks green
2636
+ onFail:
2637
+ toStage: do
2638
+ category: started
2639
+ criteria:
2640
+ - key: checks-green
2641
+ check:
2642
+ hint: Posted by the ci.finished automation, by the worker after github_pr_checks on the head sha, or with the devbox summary of the exact sha for a private repo.
2643
+ kind: evidence
2644
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2645
+ statement: Every required check on the head finished green (the 4 required backend checks, or the devbox gate on the exact sha in a private repo).
2646
+ description: 'Shared land stage. Backend: mark the draft ready once, when the slice is done and gated; it is done when Release gate, Full suite, API e2e and Reference docs are current are green on its head (github_pr_checks or the ci.finished event). Private repo: the devbox gate on that full sha is green with no INFRA result. A red you did not cause is not yours: read main''s latest run or the [vs main] mark first. A red that is yours goes back to the work stage; push the fix once. Done by CI, the devbox and the ci.finished automation, not by free reasoning. Tools: gh read, devbox status. Model tier: quick (advisory until a tier field exists).'
2647
+ - key: merge
2648
+ goal: 'The change reaches main through its door: the merge bot for backend, a fast-forward push of the gated sha for a private repo.'
2649
+ name: Landed on main
2650
+ category: started
2651
+ criteria:
2652
+ - key: merged
2653
+ check:
2654
+ hint: Posted by the dev.pr_merged automation, by the worker after github_pr_get (merged true), or with the commit url on main for a private repo.
2655
+ kind: evidence
2656
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2657
+ statement: The change is on main and its outcome is marked complete.
2658
+ description: 'Shared land stage. Backend: never run gh pr merge (with or without --auto, never --admin) and never enqueue the PR yourself; the merge bot enqueues a ready, green PR whose body names the session. A PR touching CI or test infrastructure waits 2 h after green unless the founder runs prcheck --merge backend <n>: say so. Private repo: git push origin <sha>:main of the exact gated sha, fast-forward only, never --force; if main moved, only a clean rebase touching none of your files may go, otherwise gate again. Then completeOutput on the outcome. An unattended run stops before this stage. Done by the merge bot, the bridge and the outcome verbs. Tools: git push (private repo only), synap_update_session. Gate: none (the bridge and the merge bot hold the evidence). Model tier: quick (advisory until a tier field exists).'
2659
+ - key: deploy
2660
+ gate:
2661
+ kind: human
2662
+ goal: A person approves the lab deploy of the merged build; record the deployed sha.
2663
+ name: Deployed to lab
2664
+ onFail:
2665
+ toStage: do
2666
+ category: started
2667
+ criteria:
2668
+ - key: deployed
2669
+ check:
2670
+ hint: The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).
2671
+ kind: evidence
2672
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2673
+ statement: The lab runs a build that contains the merge commit.
2674
+ description: 'Shared land stage. Ask with synap_request_deploy_approval; the deploy is the person''s call and releases stay the founder''s. Skip with a one-line reason in the room when the change never reaches a running pod (CI, tests, docs, tooling). Never in an unattended run. Tools: synap_request_deploy_approval, github_compare. Model tier: quick (advisory until a tier field exists).'
2675
+ - key: dogfood
2676
+ gate:
2677
+ kind: check
2678
+ goal: Walk the change in the running lab as a person would, entering through the doors a person enters through, and report WORKS, BROKEN or CANNOT-TELL with what was seen.
2679
+ name: Dogfooded
2680
+ onFail:
2681
+ toStage: do
2682
+ category: started
2683
+ criteria:
2684
+ - key: dogfooded
2685
+ check:
2686
+ kind: evidence
2687
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2688
+ statement: The dogfood walk reports WORKS on every path the change touches.
2689
+ description: 'Shared land stage. Load the dogfood skill, or start Dogfood a change (08a4929c) as a child session for a deployed change. A BROKEN path becomes a finding and the run goes back to the work stage. Skip with a one-line reason when nothing a person sees changed. Tools: browser automation, screenshots, read. Model tier: standard (advisory until a tier field exists).'
2690
+ expectedOutputs:
2691
+ - kind: document
2692
+ label: Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)
2693
+ optional: true
2694
+ relationToSubject: relates_to
2695
+ - key: verify
2696
+ goal: Grade every criterion of the session with its evidence, separating VERIFIED (gate or check output quoted) from NEEDS-DOGFOOD, capture what was learned, and close the session.
2697
+ name: Criteria verified
2698
+ category: completed
2699
+ criteria:
2700
+ - key: criteria-verified
2701
+ check:
2702
+ kind: judge
2703
+ statement: Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified.
2704
+ description: 'Shared land stage. Never report unverified work as verified. File the lesson, decision or finding the work produced (engineering-memory skill, rule dogfood-journal). Close what you opened: asks answered or withdrawn, worktree removed once merged, then synap_complete_session. Tools: synap_update_session, synap_capture, synap_complete_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2705
+
2706
+ # --- Fix main red ---
2707
+ - name: Fix main red
2708
+ description: 'Dev set (decision d05), key: main-red. Own one red on main, once: claim it or join its owner, read the failing step, fix forward on fix/main-red-<sha8>, then the shared land stages. No subject kind: a session titled "main red: <repo> <check> @<sha8>" (the title the github-ci rule mandates) is how it is started. Stage text comes from the github-ci rule section "Never". Draft until the founder activates it.'
2709
+ goalTemplate: 'Fix main red on {repo}: check {check} at {sha8}. CLAIM it once or join its owner. READ the failing step and recall what the pod knows. FIX forward on branch fix/main-red-{sha8} with a PR titled "fix: main red", gated at the smallest rung; never revert-war. LAND it through the shared land stages and close this session once the fix is on main.'
2710
+ scope: session
2711
+ params:
2712
+ - name: repo
2713
+ type: text
2714
+ label: Which repo is red?
2715
+ required: true
2716
+ - name: check
2717
+ type: text
2718
+ label: Which check is red?
2719
+ required: true
2720
+ - name: sha8
2721
+ type: text
2722
+ label: First 8 characters of the red main commit
2723
+ required: true
2724
+ executor: is-agent
2725
+ status: draft
2726
+ stages:
2727
+ - key: claim
2728
+ goal: 'Own the red once: look for an owner first, else claim it.'
2729
+ name: Claimed
2730
+ category: planned
2731
+ criteria:
2732
+ - key: one-owner
2733
+ check:
2734
+ kind: judge
2735
+ statement: No older owner exists for this red, and the claim is posted in the wave's room.
2736
+ description: 'Look for an owner: an open session titled "main red: <repo> ..." (synap_list_sessions), an open PR from fix/main-red-* or titled "fix: main red", or a pushed fix/main-red-* branch. An owner exists: send it what you know (synap_post_message, intent fyi) and stop. No owner: this session is titled "main red: <repo> <check> @<sha8>"; post "fixing main red <sha8>: <session id>" in the wave''s room, list sessions again, and cancel yours if an older one shows. Rule: github-ci. Tools: synap_list_sessions, synap_post_message, gh read. Gate: none. Model tier: quick (advisory until a tier field exists).'
2737
+ - key: read-step
2738
+ goal: Read the failing step (gh run view <run> --log-failed) and recall what the pod knows (synap_ask "<check name> red").
2739
+ name: Failing step read
2740
+ category: started
2741
+ criteria:
2742
+ - key: culprit-named
2743
+ check:
2744
+ kind: judge
2745
+ statement: The failing step is quoted and the commit that caused it is named.
2746
+ description: 'Attribute before acting: name the commit that turned main red. A red you did not cause in a lane is not this session''s work. Tools: gh read, synap_ask. Gate: none. Model tier: standard (advisory until a tier field exists).'
2747
+ - key: fix
2748
+ gate:
2749
+ kind: check
2750
+ goal: Fix forward on branch fix/main-red-<sha8>, gated at the smallest rung; never revert-war.
2751
+ name: Fixed forward
2752
+ onFail:
2753
+ toStage: read-step
2754
+ category: started
2755
+ criteria:
2756
+ - key: red-check-green
2757
+ check:
2758
+ kind: judge
2759
+ statement: The red check passes on the fix branch, with the gate output quoted.
2760
+ description: 'Load the verified-wave skill. If CI''s revert PR fix/main-red-revert-<pr>-<sha8> lands first, let it land and redo the change in a new PR. The entry check judges Read: no quoted failing step sends the run back. Tools: edit, git in your own worktree, devbox. Model tier: standard (advisory until a tier field exists).'
2761
+ expectedOutputs:
2762
+ - kind: commit
2763
+ label: Gated fix commit sha on fix/main-red-<sha8>
2764
+ - key: pr-opened
2765
+ goal: 'Record the change as one outcome with its url: a draft PR in a public repo, or a pushed branch gated at its exact sha in a private repo.'
2766
+ name: Change proposed
2767
+ category: started
2768
+ criteria:
2769
+ - key: change-recorded
2770
+ check:
2771
+ kind: judge
2772
+ statement: 'The change is recorded on the session as an outcome with its url: pr-<repo>-<number> for a public repo, commit-<repo>-<sha8> for a private repo.'
2773
+ - key: pr-names-session
2774
+ check:
2775
+ kind: judge
2776
+ statement: A pull request body, when there is one, carries the line naming this Pod session.
2777
+ description: 'Shared land stage. Public repo (backend, synap-cli): open a DRAFT pull request whose body carries the line "Pod session: <session id>", then record the outcome pr-<repo>-<number> (kind pull_request, ref url). Private repo (app-bases, browser, relay-app, control-plane-api, control-plane-dashboard, synap-bridge): no PR; rebase on origin/main, push the branch and queue the smallest devbox gate on its full sha with GATE_POD_SESSION set. One session, one PR per repo. Done by the ship flow and the outcome verbs, not by free reasoning. Rules: work-units, github-ci, devbox-gates. Tools: git, gh, devbox queue, synap_update_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2778
+ expectedOutputs:
2779
+ - kind: pull_request
2780
+ label: Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only
2781
+ optional: true
2782
+ - key: checks
2783
+ gate:
2784
+ kind: check
2785
+ goal: 'Every required check on the exact head is green: the 4 required backend checks, or the devbox gate on the private repo''s sha.'
2786
+ name: Checks green
2787
+ onFail:
2788
+ toStage: fix
2789
+ category: started
2790
+ criteria:
2791
+ - key: checks-green
2792
+ check:
2793
+ hint: Posted by the ci.finished automation, by the worker after github_pr_checks on the head sha, or with the devbox summary of the exact sha for a private repo.
2794
+ kind: evidence
2795
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2796
+ statement: Every required check on the head finished green (the 4 required backend checks, or the devbox gate on the exact sha in a private repo).
2797
+ description: 'Shared land stage. Backend: mark the draft ready once, when the slice is done and gated; it is done when Release gate, Full suite, API e2e and Reference docs are current are green on its head (github_pr_checks or the ci.finished event). Private repo: the devbox gate on that full sha is green with no INFRA result. A red you did not cause is not yours: read main''s latest run or the [vs main] mark first. A red that is yours goes back to the work stage; push the fix once. Done by CI, the devbox and the ci.finished automation, not by free reasoning. Tools: gh read, devbox status. Model tier: quick (advisory until a tier field exists).'
2798
+ - key: merge
2799
+ goal: 'The change reaches main through its door: the merge bot for backend, a fast-forward push of the gated sha for a private repo.'
2800
+ name: Landed on main
2801
+ category: started
2802
+ criteria:
2803
+ - key: merged
2804
+ check:
2805
+ hint: Posted by the dev.pr_merged automation, by the worker after github_pr_get (merged true), or with the commit url on main for a private repo.
2806
+ kind: evidence
2807
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2808
+ statement: The change is on main and its outcome is marked complete.
2809
+ description: 'Shared land stage. Backend: never run gh pr merge (with or without --auto, never --admin) and never enqueue the PR yourself; the merge bot enqueues a ready, green PR whose body names the session (while main is red it enqueues only a main-red fix). A PR touching CI or test infrastructure waits 2 h after green unless the founder runs prcheck --merge backend <n>: say so. Private repo: git push origin <sha>:main of the exact gated sha, fast-forward only, never --force; if main moved, only a clean rebase touching none of your files may go, otherwise gate again. Then completeOutput on the outcome. An unattended run stops before this stage. Done by the merge bot, the bridge and the outcome verbs. Tools: git push (private repo only), synap_update_session. Gate: none (the bridge and the merge bot hold the evidence). Model tier: quick (advisory until a tier field exists).'
2810
+ - key: deploy
2811
+ gate:
2812
+ kind: human
2813
+ goal: A person approves the lab deploy of the merged build; record the deployed sha.
2814
+ name: Deployed to lab
2815
+ onFail:
2816
+ toStage: fix
2817
+ category: started
2818
+ criteria:
2819
+ - key: deployed
2820
+ check:
2821
+ hint: The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).
2822
+ kind: evidence
2823
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2824
+ statement: The lab runs a build that contains the merge commit.
2825
+ description: 'Shared land stage. Ask with synap_request_deploy_approval; the deploy is the person''s call and releases stay the founder''s. Skip with a one-line reason in the room when the change never reaches a running pod (CI, tests, docs, tooling). Never in an unattended run. Tools: synap_request_deploy_approval, github_compare. Model tier: quick (advisory until a tier field exists).'
2826
+ - key: dogfood
2827
+ gate:
2828
+ kind: check
2829
+ goal: Walk the change in the running lab as a person would, entering through the doors a person enters through, and report WORKS, BROKEN or CANNOT-TELL with what was seen.
2830
+ name: Dogfooded
2831
+ onFail:
2832
+ toStage: fix
2833
+ category: started
2834
+ criteria:
2835
+ - key: dogfooded
2836
+ check:
2837
+ kind: evidence
2838
+ evidenceKey: '[CREDENTIAL REDACTED: Secret assignment]'
2839
+ statement: The dogfood walk reports WORKS on every path the change touches.
2840
+ description: 'Shared land stage. Load the dogfood skill, or start Dogfood a change (08a4929c) as a child session for a deployed change. A BROKEN path becomes a finding and the run goes back to the work stage. Skip with a one-line reason when nothing a person sees changed. Tools: browser automation, screenshots, read. Model tier: standard (advisory until a tier field exists).'
2841
+ expectedOutputs:
2842
+ - kind: document
2843
+ label: Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)
2844
+ optional: true
2845
+ - key: verify
2846
+ goal: Grade every criterion of the session with its evidence, separating VERIFIED (gate or check output quoted) from NEEDS-DOGFOOD, capture what was learned, and close the session.
2847
+ name: Criteria verified
2848
+ category: completed
2849
+ criteria:
2850
+ - key: criteria-verified
2851
+ check:
2852
+ kind: judge
2853
+ statement: Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified.
2854
+ description: 'Shared land stage. Never report unverified work as verified. File the lesson, decision or finding the work produced (engineering-memory skill, rule dogfood-journal). Close what you opened: asks answered or withdrawn, worktree removed once merged, then synap_complete_session. Tools: synap_update_session, synap_capture, synap_complete_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2855
+
2089
2856
  onboarding:
2090
2857
  goal: Capture the real engineering surface — the apps that are shipped, where their code lives, what runs behind them, where they deploy, and what's in flight — so the workspace mirrors what the team actually builds and runs, not a generic template.
2091
2858
  framing: >