@synap-core/workspace-templates 0.24.0 → 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/templates.ts CHANGED
@@ -5157,6 +5157,61 @@ const DATA = {
5157
5157
  }
5158
5158
  ]
5159
5159
  },
5160
+ {
5161
+ "slug": "issue",
5162
+ "displayName": "Issue",
5163
+ "icon": "bug",
5164
+ "color": "#EF4444",
5165
+ "description": "An open bug or problem, titled as the problem itself. Moves open → investigating → fixed or won't fix.",
5166
+ "lifecycle": {
5167
+ "property": "issueStatus",
5168
+ "options": [
5169
+ {
5170
+ "key": "open",
5171
+ "category": "open"
5172
+ },
5173
+ {
5174
+ "key": "investigating",
5175
+ "category": "active"
5176
+ },
5177
+ {
5178
+ "key": "fixed",
5179
+ "category": "done"
5180
+ },
5181
+ {
5182
+ "key": "wont_fix",
5183
+ "category": "lost",
5184
+ "humanOnly": true
5185
+ }
5186
+ ]
5187
+ },
5188
+ "properties": [
5189
+ {
5190
+ "slug": "issueStatus",
5191
+ "label": "Status",
5192
+ "valueType": "string",
5193
+ "inputType": "select",
5194
+ "enumValues": [
5195
+ "open",
5196
+ "investigating",
5197
+ "fixed",
5198
+ "wont_fix"
5199
+ ],
5200
+ "constraints": {
5201
+ "defaultValue": "open"
5202
+ }
5203
+ },
5204
+ {
5205
+ "slug": "description",
5206
+ "label": "Description",
5207
+ "valueType": "string",
5208
+ "inputType": "textarea",
5209
+ "constraints": {
5210
+ "maxLength": 5000
5211
+ }
5212
+ }
5213
+ ]
5214
+ },
5160
5215
  {
5161
5216
  "slug": "skill",
5162
5217
  "displayName": "Skill",
@@ -6726,6 +6781,1115 @@ const DATA = {
6726
6781
  }
6727
6782
  }
6728
6783
  ]
6784
+ },
6785
+ {
6786
+ "name": "Build a change",
6787
+ "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.",
6788
+ "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.",
6789
+ "scope": "session",
6790
+ "subjectProfile": {
6791
+ "onEnd": {
6792
+ "failed": "spec",
6793
+ "cancelled": "spec"
6794
+ },
6795
+ "profileSlug": "devplane_feature",
6796
+ "statusProperty": "featureStatus"
6797
+ },
6798
+ "humanOnlyStatuses": [
6799
+ "backlog",
6800
+ "cancelled"
6801
+ ],
6802
+ "params": [
6803
+ {
6804
+ "name": "feature",
6805
+ "type": "entity",
6806
+ "label": "Feature",
6807
+ "required": true
6808
+ },
6809
+ {
6810
+ "name": "size",
6811
+ "type": "choice",
6812
+ "label": "How big is the change?",
6813
+ "default": "normal",
6814
+ "options": [
6815
+ "small",
6816
+ "normal"
6817
+ ]
6818
+ },
6819
+ {
6820
+ "name": "unattended",
6821
+ "type": "boolean",
6822
+ "label": "Run without a person (night shift)?",
6823
+ "default": false
6824
+ }
6825
+ ],
6826
+ "executor": "is-agent",
6827
+ "status": "draft",
6828
+ "stages": [
6829
+ {
6830
+ "key": "shape",
6831
+ "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.",
6832
+ "name": "Shaped",
6833
+ "category": "planned",
6834
+ "criteria": [
6835
+ {
6836
+ "key": "shape-criteria-written",
6837
+ "check": {
6838
+ "kind": "judge"
6839
+ },
6840
+ "statement": "The session states the end state and 2-5 binary criteria a check, a judge or a person can grade."
6841
+ },
6842
+ {
6843
+ "key": "shape-change-typed",
6844
+ "check": {
6845
+ "kind": "judge"
6846
+ },
6847
+ "statement": "The feature's change type is set (feature, refactor or chore) and the repos it touches are named."
6848
+ }
6849
+ ],
6850
+ "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).",
6851
+ "subjectStatus": "spec",
6852
+ "expectedOutputs": [
6853
+ {
6854
+ "kind": "document",
6855
+ "label": "Plan (skipped when size is small)",
6856
+ "optional": true,
6857
+ "relationToSubject": "relates_to"
6858
+ }
6859
+ ]
6860
+ },
6861
+ {
6862
+ "key": "build",
6863
+ "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.",
6864
+ "name": "Building",
6865
+ "category": "started",
6866
+ "criteria": [
6867
+ {
6868
+ "key": "build-gates-quoted",
6869
+ "check": {
6870
+ "kind": "judge"
6871
+ },
6872
+ "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."
6873
+ },
6874
+ {
6875
+ "key": "build-negative-control",
6876
+ "check": {
6877
+ "kind": "judge"
6878
+ },
6879
+ "statement": "Every new test was run with its fix reverted and failed."
6880
+ }
6881
+ ],
6882
+ "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).",
6883
+ "subjectStatus": "in_progress",
6884
+ "expectedOutputs": [
6885
+ {
6886
+ "kind": "commit",
6887
+ "label": "Gated commit sha"
6888
+ }
6889
+ ]
6890
+ },
6891
+ {
6892
+ "key": "pr-opened",
6893
+ "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.",
6894
+ "name": "Change proposed",
6895
+ "category": "started",
6896
+ "criteria": [
6897
+ {
6898
+ "key": "change-recorded",
6899
+ "check": {
6900
+ "kind": "judge"
6901
+ },
6902
+ "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."
6903
+ },
6904
+ {
6905
+ "key": "pr-names-session",
6906
+ "check": {
6907
+ "kind": "judge"
6908
+ },
6909
+ "statement": "A pull request body, when there is one, carries the line naming this Pod session."
6910
+ }
6911
+ ],
6912
+ "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).",
6913
+ "subjectStatus": "in_review",
6914
+ "expectedOutputs": [
6915
+ {
6916
+ "kind": "pull_request",
6917
+ "label": "Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only",
6918
+ "optional": true
6919
+ }
6920
+ ]
6921
+ },
6922
+ {
6923
+ "key": "checks",
6924
+ "gate": {
6925
+ "kind": "check"
6926
+ },
6927
+ "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.",
6928
+ "name": "Checks green",
6929
+ "onFail": {
6930
+ "toStage": "build"
6931
+ },
6932
+ "category": "started",
6933
+ "criteria": [
6934
+ {
6935
+ "key": "checks-green",
6936
+ "check": {
6937
+ "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.",
6938
+ "kind": "evidence",
6939
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
6940
+ },
6941
+ "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)."
6942
+ }
6943
+ ],
6944
+ "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)."
6945
+ },
6946
+ {
6947
+ "key": "merge",
6948
+ "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.",
6949
+ "name": "Landed on main",
6950
+ "category": "started",
6951
+ "criteria": [
6952
+ {
6953
+ "key": "merged",
6954
+ "check": {
6955
+ "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.",
6956
+ "kind": "evidence",
6957
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
6958
+ },
6959
+ "statement": "The change is on main and its outcome is marked complete."
6960
+ }
6961
+ ],
6962
+ "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)."
6963
+ },
6964
+ {
6965
+ "key": "deploy",
6966
+ "gate": {
6967
+ "kind": "human"
6968
+ },
6969
+ "goal": "A person approves the lab deploy of the merged build; record the deployed sha.",
6970
+ "name": "Deployed to lab",
6971
+ "onFail": {
6972
+ "toStage": "build"
6973
+ },
6974
+ "category": "started",
6975
+ "criteria": [
6976
+ {
6977
+ "key": "deployed",
6978
+ "check": {
6979
+ "hint": "The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).",
6980
+ "kind": "evidence",
6981
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
6982
+ },
6983
+ "statement": "The lab runs a build that contains the merge commit."
6984
+ }
6985
+ ],
6986
+ "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)."
6987
+ },
6988
+ {
6989
+ "key": "dogfood",
6990
+ "gate": {
6991
+ "kind": "check"
6992
+ },
6993
+ "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.",
6994
+ "name": "Dogfooded",
6995
+ "onFail": {
6996
+ "toStage": "build"
6997
+ },
6998
+ "category": "started",
6999
+ "criteria": [
7000
+ {
7001
+ "key": "dogfooded",
7002
+ "check": {
7003
+ "kind": "evidence",
7004
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7005
+ },
7006
+ "statement": "The dogfood walk reports WORKS on every path the change touches."
7007
+ }
7008
+ ],
7009
+ "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).",
7010
+ "expectedOutputs": [
7011
+ {
7012
+ "kind": "document",
7013
+ "label": "Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)",
7014
+ "optional": true,
7015
+ "relationToSubject": "relates_to"
7016
+ }
7017
+ ]
7018
+ },
7019
+ {
7020
+ "key": "verify",
7021
+ "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.",
7022
+ "name": "Criteria verified",
7023
+ "category": "completed",
7024
+ "criteria": [
7025
+ {
7026
+ "key": "criteria-verified",
7027
+ "check": {
7028
+ "kind": "judge"
7029
+ },
7030
+ "statement": "Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified."
7031
+ }
7032
+ ],
7033
+ "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).",
7034
+ "subjectStatus": "done"
7035
+ }
7036
+ ]
7037
+ },
7038
+ {
7039
+ "name": "Fix a bug",
7040
+ "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.",
7041
+ "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.",
7042
+ "scope": "session",
7043
+ "subjectProfile": {
7044
+ "onEnd": {
7045
+ "failed": "open",
7046
+ "cancelled": "open"
7047
+ },
7048
+ "profileSlug": "issue",
7049
+ "statusProperty": "issueStatus"
7050
+ },
7051
+ "humanOnlyStatuses": [
7052
+ "open",
7053
+ "wont_fix"
7054
+ ],
7055
+ "params": [
7056
+ {
7057
+ "name": "issue",
7058
+ "type": "entity",
7059
+ "label": "Issue",
7060
+ "required": true
7061
+ },
7062
+ {
7063
+ "name": "unattended",
7064
+ "type": "boolean",
7065
+ "label": "Run without a person (night shift)?",
7066
+ "default": false
7067
+ }
7068
+ ],
7069
+ "executor": "is-agent",
7070
+ "status": "draft",
7071
+ "stages": [
7072
+ {
7073
+ "key": "reproduce",
7074
+ "goal": "Show the bug happening with the smallest reproduction (a failing test or the exact steps) and name its root cause with file:line.",
7075
+ "name": "Reproduce",
7076
+ "category": "planned",
7077
+ "criteria": [
7078
+ {
7079
+ "key": "repro-shown",
7080
+ "check": {
7081
+ "kind": "judge"
7082
+ },
7083
+ "statement": "A test or exact reproduction shows the bug, and the root cause is named with file:line."
7084
+ }
7085
+ ],
7086
+ "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).",
7087
+ "subjectStatus": "investigating",
7088
+ "suggestedTasks": [
7089
+ "recall known gotchas for the area",
7090
+ "write the failing test or the exact repro steps",
7091
+ "name the root cause, not the symptom"
7092
+ ],
7093
+ "expectedOutputs": [
7094
+ {
7095
+ "kind": "note",
7096
+ "label": "Reproduction: failing test path or exact steps, and the root cause (file:line)"
7097
+ }
7098
+ ]
7099
+ },
7100
+ {
7101
+ "key": "fix",
7102
+ "gate": {
7103
+ "kind": "check"
7104
+ },
7105
+ "goal": "Fix the root cause on the canonical path; the reproduction test now passes and was seen failing with the fix reverted.",
7106
+ "name": "Fix",
7107
+ "onFail": {
7108
+ "toStage": "reproduce"
7109
+ },
7110
+ "category": "started",
7111
+ "criteria": [
7112
+ {
7113
+ "key": "fix-negative-control",
7114
+ "check": {
7115
+ "kind": "judge"
7116
+ },
7117
+ "statement": "The reproduction test passes with the fix and fails with the fix reverted; the gate output is quoted in the room."
7118
+ }
7119
+ ],
7120
+ "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).",
7121
+ "suggestedTasks": [
7122
+ "fix the root cause",
7123
+ "negative control: revert the fix, see the test fail",
7124
+ "run the smallest gate yourself and quote it"
7125
+ ],
7126
+ "expectedOutputs": [
7127
+ {
7128
+ "kind": "commit",
7129
+ "label": "Gated fix commit sha"
7130
+ }
7131
+ ]
7132
+ },
7133
+ {
7134
+ "key": "review",
7135
+ "gate": {
7136
+ "kind": "check"
7137
+ },
7138
+ "goal": "A separate session with a clean context reads the fix and lists must-fix findings apart from justified-keep ones.",
7139
+ "name": "Review",
7140
+ "onFail": {
7141
+ "toStage": "fix"
7142
+ },
7143
+ "category": "started",
7144
+ "criteria": [
7145
+ {
7146
+ "key": "review-clean",
7147
+ "check": {
7148
+ "kind": "judge"
7149
+ },
7150
+ "statement": "The review lists no open must-fix finding."
7151
+ }
7152
+ ],
7153
+ "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).",
7154
+ "suggestedTasks": [
7155
+ "start a review child session (not the author)",
7156
+ "author answers every finding"
7157
+ ],
7158
+ "expectedOutputs": [
7159
+ {
7160
+ "kind": "document",
7161
+ "label": "Review note (must-fix and justified-keep, with file:line)",
7162
+ "relationToSubject": "relates_to"
7163
+ }
7164
+ ]
7165
+ },
7166
+ {
7167
+ "key": "pr-opened",
7168
+ "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.",
7169
+ "name": "Change proposed",
7170
+ "category": "started",
7171
+ "criteria": [
7172
+ {
7173
+ "key": "change-recorded",
7174
+ "check": {
7175
+ "kind": "judge"
7176
+ },
7177
+ "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."
7178
+ },
7179
+ {
7180
+ "key": "pr-names-session",
7181
+ "check": {
7182
+ "kind": "judge"
7183
+ },
7184
+ "statement": "A pull request body, when there is one, carries the line naming this Pod session."
7185
+ }
7186
+ ],
7187
+ "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).",
7188
+ "expectedOutputs": [
7189
+ {
7190
+ "kind": "pull_request",
7191
+ "label": "Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only",
7192
+ "optional": true
7193
+ }
7194
+ ]
7195
+ },
7196
+ {
7197
+ "key": "checks",
7198
+ "gate": {
7199
+ "kind": "check"
7200
+ },
7201
+ "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.",
7202
+ "name": "Checks green",
7203
+ "onFail": {
7204
+ "toStage": "fix"
7205
+ },
7206
+ "category": "started",
7207
+ "criteria": [
7208
+ {
7209
+ "key": "checks-green",
7210
+ "check": {
7211
+ "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.",
7212
+ "kind": "evidence",
7213
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7214
+ },
7215
+ "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)."
7216
+ }
7217
+ ],
7218
+ "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)."
7219
+ },
7220
+ {
7221
+ "key": "merge",
7222
+ "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.",
7223
+ "name": "Landed on main",
7224
+ "category": "started",
7225
+ "criteria": [
7226
+ {
7227
+ "key": "merged",
7228
+ "check": {
7229
+ "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.",
7230
+ "kind": "evidence",
7231
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7232
+ },
7233
+ "statement": "The change is on main and its outcome is marked complete."
7234
+ }
7235
+ ],
7236
+ "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)."
7237
+ },
7238
+ {
7239
+ "key": "deploy",
7240
+ "gate": {
7241
+ "kind": "human"
7242
+ },
7243
+ "goal": "A person approves the lab deploy of the merged build; record the deployed sha.",
7244
+ "name": "Deployed to lab",
7245
+ "onFail": {
7246
+ "toStage": "fix"
7247
+ },
7248
+ "category": "started",
7249
+ "criteria": [
7250
+ {
7251
+ "key": "deployed",
7252
+ "check": {
7253
+ "hint": "The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).",
7254
+ "kind": "evidence",
7255
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7256
+ },
7257
+ "statement": "The lab runs a build that contains the merge commit."
7258
+ }
7259
+ ],
7260
+ "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)."
7261
+ },
7262
+ {
7263
+ "key": "dogfood",
7264
+ "gate": {
7265
+ "kind": "check"
7266
+ },
7267
+ "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.",
7268
+ "name": "Dogfooded",
7269
+ "onFail": {
7270
+ "toStage": "fix"
7271
+ },
7272
+ "category": "started",
7273
+ "criteria": [
7274
+ {
7275
+ "key": "dogfooded",
7276
+ "check": {
7277
+ "kind": "evidence",
7278
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7279
+ },
7280
+ "statement": "The dogfood walk reports WORKS on every path the change touches."
7281
+ }
7282
+ ],
7283
+ "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).",
7284
+ "expectedOutputs": [
7285
+ {
7286
+ "kind": "document",
7287
+ "label": "Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)",
7288
+ "optional": true,
7289
+ "relationToSubject": "relates_to"
7290
+ }
7291
+ ]
7292
+ },
7293
+ {
7294
+ "key": "verify",
7295
+ "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.",
7296
+ "name": "Criteria verified",
7297
+ "category": "completed",
7298
+ "criteria": [
7299
+ {
7300
+ "key": "criteria-verified",
7301
+ "check": {
7302
+ "kind": "judge"
7303
+ },
7304
+ "statement": "Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified."
7305
+ }
7306
+ ],
7307
+ "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).",
7308
+ "subjectStatus": "fixed"
7309
+ }
7310
+ ]
7311
+ },
7312
+ {
7313
+ "name": "Investigate",
7314
+ "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.",
7315
+ "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.",
7316
+ "scope": "session",
7317
+ "subjectProfile": {
7318
+ "profileSlug": "devplane_feature"
7319
+ },
7320
+ "params": [
7321
+ {
7322
+ "name": "question",
7323
+ "type": "text",
7324
+ "label": "What question should this answer?",
7325
+ "required": true
7326
+ },
7327
+ {
7328
+ "name": "feature",
7329
+ "type": "entity",
7330
+ "label": "Feature it is about"
7331
+ }
7332
+ ],
7333
+ "executor": "is-agent",
7334
+ "status": "draft",
7335
+ "stages": [
7336
+ {
7337
+ "key": "frame",
7338
+ "goal": "Restate the question so it can be answered and say what evidence would answer it.",
7339
+ "name": "Framed",
7340
+ "category": "planned",
7341
+ "criteria": [
7342
+ {
7343
+ "key": "question-answerable",
7344
+ "check": {
7345
+ "kind": "judge"
7346
+ },
7347
+ "statement": "The question is restated so it can be answered, and the evidence that would answer it is named."
7348
+ }
7349
+ ],
7350
+ "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)."
7351
+ },
7352
+ {
7353
+ "key": "measure",
7354
+ "goal": "Gather the evidence: read the code at the installed version, measure on real data, and keep rejected sources with their reason.",
7355
+ "name": "Measured",
7356
+ "category": "started",
7357
+ "criteria": [
7358
+ {
7359
+ "key": "sources-kept",
7360
+ "check": {
7361
+ "kind": "judge"
7362
+ },
7363
+ "statement": "Every source or measure used is cited, and rejected ones are kept with their reason."
7364
+ }
7365
+ ],
7366
+ "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)."
7367
+ },
7368
+ {
7369
+ "key": "conclude",
7370
+ "gate": {
7371
+ "kind": "check"
7372
+ },
7373
+ "goal": "Write the answer, its confidence and a recommendation as one pod document linked to the session.",
7374
+ "name": "Concluded",
7375
+ "onFail": {
7376
+ "toStage": "measure"
7377
+ },
7378
+ "category": "completed",
7379
+ "criteria": [
7380
+ {
7381
+ "key": "every-number-labeled",
7382
+ "check": {
7383
+ "kind": "judge"
7384
+ },
7385
+ "statement": "Every number in the document is labeled MEASURED, READ or ESTIMATED, and the recommendation follows from the evidence."
7386
+ }
7387
+ ],
7388
+ "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).",
7389
+ "expectedOutputs": [
7390
+ {
7391
+ "kind": "document",
7392
+ "label": "Investigation (question, measured evidence, recommendation)",
7393
+ "relationToSubject": "relates_to"
7394
+ }
7395
+ ]
7396
+ }
7397
+ ]
7398
+ },
7399
+ {
7400
+ "name": "Review a change",
7401
+ "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.",
7402
+ "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.",
7403
+ "scope": "session",
7404
+ "subjectProfile": {
7405
+ "profileSlug": "devplane_feature"
7406
+ },
7407
+ "params": [
7408
+ {
7409
+ "name": "target",
7410
+ "type": "text",
7411
+ "label": "What to review (a PR url, a branch, a sha or a document)",
7412
+ "required": true
7413
+ },
7414
+ {
7415
+ "name": "feature",
7416
+ "type": "entity",
7417
+ "label": "Feature under review"
7418
+ }
7419
+ ],
7420
+ "executor": "is-agent",
7421
+ "status": "draft",
7422
+ "stages": [
7423
+ {
7424
+ "key": "read",
7425
+ "goal": "Read the change with a clean context: the diff, the rules it touches, and what it can break.",
7426
+ "name": "Read",
7427
+ "category": "started",
7428
+ "criteria": [
7429
+ {
7430
+ "key": "read-whole-change",
7431
+ "check": {
7432
+ "kind": "judge"
7433
+ },
7434
+ "statement": "The whole change and the rules it touches were read; nothing was edited."
7435
+ }
7436
+ ],
7437
+ "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)."
7438
+ },
7439
+ {
7440
+ "key": "verdict",
7441
+ "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.",
7442
+ "name": "Verdict",
7443
+ "category": "completed",
7444
+ "criteria": [
7445
+ {
7446
+ "key": "findings-justified",
7447
+ "check": {
7448
+ "kind": "judge"
7449
+ },
7450
+ "statement": "Every finding is classed must-fix or justified-keep with its reason and file:line."
7451
+ }
7452
+ ],
7453
+ "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).",
7454
+ "expectedOutputs": [
7455
+ {
7456
+ "kind": "document",
7457
+ "label": "Review (must-fix and justified-keep, with file:line)",
7458
+ "relationToSubject": "relates_to"
7459
+ }
7460
+ ]
7461
+ }
7462
+ ]
7463
+ },
7464
+ {
7465
+ "name": "Maintain",
7466
+ "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.",
7467
+ "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.",
7468
+ "scope": "session",
7469
+ "subjectProfile": {
7470
+ "profileSlug": "task"
7471
+ },
7472
+ "params": [
7473
+ {
7474
+ "name": "chore",
7475
+ "type": "text",
7476
+ "label": "What chore (bump, clean, prune)?",
7477
+ "required": true
7478
+ },
7479
+ {
7480
+ "name": "repo",
7481
+ "type": "text",
7482
+ "label": "Which repo?",
7483
+ "default": "any"
7484
+ },
7485
+ {
7486
+ "name": "task",
7487
+ "type": "entity",
7488
+ "label": "Task it works, if any"
7489
+ }
7490
+ ],
7491
+ "executor": "is-agent",
7492
+ "status": "draft",
7493
+ "stages": [
7494
+ {
7495
+ "key": "do",
7496
+ "goal": "Do the bounded chore in your own worktree, or show there is nothing to do.",
7497
+ "name": "Done in a worktree",
7498
+ "category": "started",
7499
+ "criteria": [
7500
+ {
7501
+ "key": "chore-gated",
7502
+ "check": {
7503
+ "kind": "judge"
7504
+ },
7505
+ "statement": "The chore is done and its smallest gate is green and quoted, or the session says in one line why nothing changed."
7506
+ }
7507
+ ],
7508
+ "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).",
7509
+ "expectedOutputs": [
7510
+ {
7511
+ "kind": "commit",
7512
+ "label": "Gated commit sha (none when nothing changed)",
7513
+ "optional": true
7514
+ }
7515
+ ]
7516
+ },
7517
+ {
7518
+ "key": "pr-opened",
7519
+ "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.",
7520
+ "name": "Change proposed",
7521
+ "category": "started",
7522
+ "criteria": [
7523
+ {
7524
+ "key": "change-recorded",
7525
+ "check": {
7526
+ "kind": "judge"
7527
+ },
7528
+ "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."
7529
+ },
7530
+ {
7531
+ "key": "pr-names-session",
7532
+ "check": {
7533
+ "kind": "judge"
7534
+ },
7535
+ "statement": "A pull request body, when there is one, carries the line naming this Pod session."
7536
+ }
7537
+ ],
7538
+ "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).",
7539
+ "expectedOutputs": [
7540
+ {
7541
+ "kind": "pull_request",
7542
+ "label": "Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only",
7543
+ "optional": true
7544
+ }
7545
+ ]
7546
+ },
7547
+ {
7548
+ "key": "checks",
7549
+ "gate": {
7550
+ "kind": "check"
7551
+ },
7552
+ "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.",
7553
+ "name": "Checks green",
7554
+ "onFail": {
7555
+ "toStage": "do"
7556
+ },
7557
+ "category": "started",
7558
+ "criteria": [
7559
+ {
7560
+ "key": "checks-green",
7561
+ "check": {
7562
+ "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.",
7563
+ "kind": "evidence",
7564
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7565
+ },
7566
+ "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)."
7567
+ }
7568
+ ],
7569
+ "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)."
7570
+ },
7571
+ {
7572
+ "key": "merge",
7573
+ "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.",
7574
+ "name": "Landed on main",
7575
+ "category": "started",
7576
+ "criteria": [
7577
+ {
7578
+ "key": "merged",
7579
+ "check": {
7580
+ "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.",
7581
+ "kind": "evidence",
7582
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7583
+ },
7584
+ "statement": "The change is on main and its outcome is marked complete."
7585
+ }
7586
+ ],
7587
+ "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)."
7588
+ },
7589
+ {
7590
+ "key": "deploy",
7591
+ "gate": {
7592
+ "kind": "human"
7593
+ },
7594
+ "goal": "A person approves the lab deploy of the merged build; record the deployed sha.",
7595
+ "name": "Deployed to lab",
7596
+ "onFail": {
7597
+ "toStage": "do"
7598
+ },
7599
+ "category": "started",
7600
+ "criteria": [
7601
+ {
7602
+ "key": "deployed",
7603
+ "check": {
7604
+ "hint": "The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).",
7605
+ "kind": "evidence",
7606
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7607
+ },
7608
+ "statement": "The lab runs a build that contains the merge commit."
7609
+ }
7610
+ ],
7611
+ "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)."
7612
+ },
7613
+ {
7614
+ "key": "dogfood",
7615
+ "gate": {
7616
+ "kind": "check"
7617
+ },
7618
+ "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.",
7619
+ "name": "Dogfooded",
7620
+ "onFail": {
7621
+ "toStage": "do"
7622
+ },
7623
+ "category": "started",
7624
+ "criteria": [
7625
+ {
7626
+ "key": "dogfooded",
7627
+ "check": {
7628
+ "kind": "evidence",
7629
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7630
+ },
7631
+ "statement": "The dogfood walk reports WORKS on every path the change touches."
7632
+ }
7633
+ ],
7634
+ "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).",
7635
+ "expectedOutputs": [
7636
+ {
7637
+ "kind": "document",
7638
+ "label": "Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)",
7639
+ "optional": true,
7640
+ "relationToSubject": "relates_to"
7641
+ }
7642
+ ]
7643
+ },
7644
+ {
7645
+ "key": "verify",
7646
+ "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.",
7647
+ "name": "Criteria verified",
7648
+ "category": "completed",
7649
+ "criteria": [
7650
+ {
7651
+ "key": "criteria-verified",
7652
+ "check": {
7653
+ "kind": "judge"
7654
+ },
7655
+ "statement": "Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified."
7656
+ }
7657
+ ],
7658
+ "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)."
7659
+ }
7660
+ ]
7661
+ },
7662
+ {
7663
+ "name": "Fix main red",
7664
+ "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.",
7665
+ "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.",
7666
+ "scope": "session",
7667
+ "params": [
7668
+ {
7669
+ "name": "repo",
7670
+ "type": "text",
7671
+ "label": "Which repo is red?",
7672
+ "required": true
7673
+ },
7674
+ {
7675
+ "name": "check",
7676
+ "type": "text",
7677
+ "label": "Which check is red?",
7678
+ "required": true
7679
+ },
7680
+ {
7681
+ "name": "sha8",
7682
+ "type": "text",
7683
+ "label": "First 8 characters of the red main commit",
7684
+ "required": true
7685
+ }
7686
+ ],
7687
+ "executor": "is-agent",
7688
+ "status": "draft",
7689
+ "stages": [
7690
+ {
7691
+ "key": "claim",
7692
+ "goal": "Own the red once: look for an owner first, else claim it.",
7693
+ "name": "Claimed",
7694
+ "category": "planned",
7695
+ "criteria": [
7696
+ {
7697
+ "key": "one-owner",
7698
+ "check": {
7699
+ "kind": "judge"
7700
+ },
7701
+ "statement": "No older owner exists for this red, and the claim is posted in the wave's room."
7702
+ }
7703
+ ],
7704
+ "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)."
7705
+ },
7706
+ {
7707
+ "key": "read-step",
7708
+ "goal": "Read the failing step (gh run view <run> --log-failed) and recall what the pod knows (synap_ask \"<check name> red\").",
7709
+ "name": "Failing step read",
7710
+ "category": "started",
7711
+ "criteria": [
7712
+ {
7713
+ "key": "culprit-named",
7714
+ "check": {
7715
+ "kind": "judge"
7716
+ },
7717
+ "statement": "The failing step is quoted and the commit that caused it is named."
7718
+ }
7719
+ ],
7720
+ "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)."
7721
+ },
7722
+ {
7723
+ "key": "fix",
7724
+ "gate": {
7725
+ "kind": "check"
7726
+ },
7727
+ "goal": "Fix forward on branch fix/main-red-<sha8>, gated at the smallest rung; never revert-war.",
7728
+ "name": "Fixed forward",
7729
+ "onFail": {
7730
+ "toStage": "read-step"
7731
+ },
7732
+ "category": "started",
7733
+ "criteria": [
7734
+ {
7735
+ "key": "red-check-green",
7736
+ "check": {
7737
+ "kind": "judge"
7738
+ },
7739
+ "statement": "The red check passes on the fix branch, with the gate output quoted."
7740
+ }
7741
+ ],
7742
+ "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).",
7743
+ "expectedOutputs": [
7744
+ {
7745
+ "kind": "commit",
7746
+ "label": "Gated fix commit sha on fix/main-red-<sha8>"
7747
+ }
7748
+ ]
7749
+ },
7750
+ {
7751
+ "key": "pr-opened",
7752
+ "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.",
7753
+ "name": "Change proposed",
7754
+ "category": "started",
7755
+ "criteria": [
7756
+ {
7757
+ "key": "change-recorded",
7758
+ "check": {
7759
+ "kind": "judge"
7760
+ },
7761
+ "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."
7762
+ },
7763
+ {
7764
+ "key": "pr-names-session",
7765
+ "check": {
7766
+ "kind": "judge"
7767
+ },
7768
+ "statement": "A pull request body, when there is one, carries the line naming this Pod session."
7769
+ }
7770
+ ],
7771
+ "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).",
7772
+ "expectedOutputs": [
7773
+ {
7774
+ "kind": "pull_request",
7775
+ "label": "Draft pull request (outcome pr-<repo>-<number>, ref = its url); public repo only",
7776
+ "optional": true
7777
+ }
7778
+ ]
7779
+ },
7780
+ {
7781
+ "key": "checks",
7782
+ "gate": {
7783
+ "kind": "check"
7784
+ },
7785
+ "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.",
7786
+ "name": "Checks green",
7787
+ "onFail": {
7788
+ "toStage": "fix"
7789
+ },
7790
+ "category": "started",
7791
+ "criteria": [
7792
+ {
7793
+ "key": "checks-green",
7794
+ "check": {
7795
+ "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.",
7796
+ "kind": "evidence",
7797
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7798
+ },
7799
+ "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)."
7800
+ }
7801
+ ],
7802
+ "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)."
7803
+ },
7804
+ {
7805
+ "key": "merge",
7806
+ "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.",
7807
+ "name": "Landed on main",
7808
+ "category": "started",
7809
+ "criteria": [
7810
+ {
7811
+ "key": "merged",
7812
+ "check": {
7813
+ "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.",
7814
+ "kind": "evidence",
7815
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7816
+ },
7817
+ "statement": "The change is on main and its outcome is marked complete."
7818
+ }
7819
+ ],
7820
+ "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)."
7821
+ },
7822
+ {
7823
+ "key": "deploy",
7824
+ "gate": {
7825
+ "kind": "human"
7826
+ },
7827
+ "goal": "A person approves the lab deploy of the merged build; record the deployed sha.",
7828
+ "name": "Deployed to lab",
7829
+ "onFail": {
7830
+ "toStage": "fix"
7831
+ },
7832
+ "category": "started",
7833
+ "criteria": [
7834
+ {
7835
+ "key": "deployed",
7836
+ "check": {
7837
+ "hint": "The deployed sha contains the merge commit (github_compare base merge commit, head deployed sha, status identical or ahead).",
7838
+ "kind": "evidence",
7839
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7840
+ },
7841
+ "statement": "The lab runs a build that contains the merge commit."
7842
+ }
7843
+ ],
7844
+ "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)."
7845
+ },
7846
+ {
7847
+ "key": "dogfood",
7848
+ "gate": {
7849
+ "kind": "check"
7850
+ },
7851
+ "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.",
7852
+ "name": "Dogfooded",
7853
+ "onFail": {
7854
+ "toStage": "fix"
7855
+ },
7856
+ "category": "started",
7857
+ "criteria": [
7858
+ {
7859
+ "key": "dogfooded",
7860
+ "check": {
7861
+ "kind": "evidence",
7862
+ "evidenceKey": "[CREDENTIAL REDACTED: Secret assignment]"
7863
+ },
7864
+ "statement": "The dogfood walk reports WORKS on every path the change touches."
7865
+ }
7866
+ ],
7867
+ "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).",
7868
+ "expectedOutputs": [
7869
+ {
7870
+ "kind": "document",
7871
+ "label": "Dogfood report (each path WORKS, BROKEN or CANNOT-TELL, with what was seen)",
7872
+ "optional": true
7873
+ }
7874
+ ]
7875
+ },
7876
+ {
7877
+ "key": "verify",
7878
+ "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.",
7879
+ "name": "Criteria verified",
7880
+ "category": "completed",
7881
+ "criteria": [
7882
+ {
7883
+ "key": "criteria-verified",
7884
+ "check": {
7885
+ "kind": "judge"
7886
+ },
7887
+ "statement": "Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified."
7888
+ }
7889
+ ],
7890
+ "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)."
7891
+ }
7892
+ ]
6729
7893
  }
6730
7894
  ],
6731
7895
  "onboarding": {