@frankzhang2026/opencode-android-orchestrator 0.10.0 → 1.0.1

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.
Files changed (109) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +48 -51
  3. package/dist/cli.js +14 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/android-sdk.d.ts +10 -0
  6. package/dist/config/android-sdk.d.ts.map +1 -0
  7. package/dist/config/android-sdk.js +50 -0
  8. package/dist/config/android-sdk.js.map +1 -0
  9. package/dist/config/queue-policy.d.ts +12 -0
  10. package/dist/config/queue-policy.d.ts.map +1 -0
  11. package/dist/config/queue-policy.js +18 -0
  12. package/dist/config/queue-policy.js.map +1 -0
  13. package/dist/config/verification-policy.d.ts +8 -3
  14. package/dist/config/verification-policy.d.ts.map +1 -1
  15. package/dist/config/verification-policy.js +48 -14
  16. package/dist/config/verification-policy.js.map +1 -1
  17. package/dist/doctor/index.d.ts.map +1 -1
  18. package/dist/doctor/index.js +3 -49
  19. package/dist/doctor/index.js.map +1 -1
  20. package/dist/doctor/installation.d.ts.map +1 -1
  21. package/dist/doctor/installation.js +3 -0
  22. package/dist/doctor/installation.js.map +1 -1
  23. package/dist/installer/adaptive-templates.d.ts +3 -1
  24. package/dist/installer/adaptive-templates.d.ts.map +1 -1
  25. package/dist/installer/adaptive-templates.js +2 -0
  26. package/dist/installer/adaptive-templates.js.map +1 -1
  27. package/dist/installer/install-manifest.d.ts +1 -0
  28. package/dist/installer/install-manifest.d.ts.map +1 -1
  29. package/dist/installer/install-manifest.js +6 -1
  30. package/dist/installer/install-manifest.js.map +1 -1
  31. package/dist/installer/opencode-config.d.ts +3 -3
  32. package/dist/installer/opencode-config.d.ts.map +1 -1
  33. package/dist/installer/opencode-config.js +1 -1
  34. package/dist/installer/opencode-config.js.map +1 -1
  35. package/dist/installer/uninstall.d.ts.map +1 -1
  36. package/dist/installer/uninstall.js +5 -0
  37. package/dist/installer/uninstall.js.map +1 -1
  38. package/dist/installer/upgrade.d.ts.map +1 -1
  39. package/dist/installer/upgrade.js +13 -1
  40. package/dist/installer/upgrade.js.map +1 -1
  41. package/dist/plugin/index.d.ts.map +1 -1
  42. package/dist/plugin/index.js +11 -5
  43. package/dist/plugin/index.js.map +1 -1
  44. package/dist/queue/approvals.d.ts +49 -0
  45. package/dist/queue/approvals.d.ts.map +1 -0
  46. package/dist/queue/approvals.js +68 -0
  47. package/dist/queue/approvals.js.map +1 -0
  48. package/dist/queue/cli.d.ts +3 -0
  49. package/dist/queue/cli.d.ts.map +1 -0
  50. package/dist/queue/cli.js +115 -0
  51. package/dist/queue/cli.js.map +1 -0
  52. package/dist/queue/executor.d.ts +24 -0
  53. package/dist/queue/executor.d.ts.map +1 -0
  54. package/dist/queue/executor.js +445 -0
  55. package/dist/queue/executor.js.map +1 -0
  56. package/dist/queue/lifecycle.d.ts +3 -0
  57. package/dist/queue/lifecycle.d.ts.map +1 -0
  58. package/dist/queue/lifecycle.js +24 -0
  59. package/dist/queue/lifecycle.js.map +1 -0
  60. package/dist/queue/queue.d.ts +171 -0
  61. package/dist/queue/queue.d.ts.map +1 -0
  62. package/dist/queue/queue.js +506 -0
  63. package/dist/queue/queue.js.map +1 -0
  64. package/dist/queue/service.d.ts +15 -0
  65. package/dist/queue/service.d.ts.map +1 -0
  66. package/dist/queue/service.js +152 -0
  67. package/dist/queue/service.js.map +1 -0
  68. package/dist/queue/storage.d.ts +32 -0
  69. package/dist/queue/storage.d.ts.map +1 -0
  70. package/dist/queue/storage.js +180 -0
  71. package/dist/queue/storage.js.map +1 -0
  72. package/dist/queue/tools.d.ts +12 -0
  73. package/dist/queue/tools.d.ts.map +1 -0
  74. package/dist/queue/tools.js +155 -0
  75. package/dist/queue/tools.js.map +1 -0
  76. package/docs/MIGRATION.md +32 -11
  77. package/docs/QUEUE.md +151 -0
  78. package/docs/SECURITY.md +38 -31
  79. package/docs/TROUBLESHOOTING.md +34 -11
  80. package/package.json +1 -1
  81. package/templates/.opencode/agents/scheduled-planner.md +64 -131
  82. package/templates/.opencode/commands/abort-task.md +6 -15
  83. package/templates/.opencode/commands/acceptance.md +6 -15
  84. package/templates/.opencode/commands/change.md +3 -1
  85. package/templates/.opencode/commands/resume-review.md +6 -14
  86. package/templates/.opencode/commands/resume-task.md +6 -23
  87. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +72 -248
  88. package/templates/AGENTS.md.fragment +8 -0
  89. package/templates/automation/config.json +8 -2
  90. package/templates/automation/config.schema.json +218 -46
  91. package/templates/scripts/automation/abort-task.sh +2 -1
  92. package/templates/scripts/automation/accept-and-integrate.sh +5 -0
  93. package/templates/scripts/automation/acceptance-report.sh +4 -2
  94. package/templates/scripts/automation/approve-and-run.sh +4 -0
  95. package/templates/scripts/automation/begin-review.sh +1 -0
  96. package/templates/scripts/automation/block-task.sh +1 -0
  97. package/templates/scripts/automation/claim-task.sh +1 -0
  98. package/templates/scripts/automation/lib.sh +94 -1
  99. package/templates/scripts/automation/orchestrate-task.sh +11 -0
  100. package/templates/scripts/automation/preflight.sh +14 -4
  101. package/templates/scripts/automation/prepare-contract-review.sh +4 -0
  102. package/templates/scripts/automation/quality-gate.sh +1 -0
  103. package/templates/scripts/automation/record-red.sh +1 -0
  104. package/templates/scripts/automation/resume-review-fix.sh +1 -0
  105. package/templates/scripts/automation/resume-review.sh +1 -0
  106. package/templates/scripts/automation/resume-task.sh +1 -0
  107. package/templates/scripts/automation/scope-gate.sh +10 -2
  108. package/templates/scripts/automation/submit-review.sh +8 -2
  109. package/templates/scripts/automation/verify-task.sh +13 -0
@@ -1,252 +1,76 @@
1
1
  ---
2
2
  name: scheduled-quality-orchestrator
3
- description: Use when the interactive planner must turn one approved request into a sealed contract, automatically guide contract and result review, notify the user at human acceptance, redisplay a sealed acceptance card, or integrate an exactly approved result locally
4
- compatibility: opencode
5
- metadata:
6
- audience: interactive-planner
7
- workflow: end-to-end-coding-orchestration
3
+ description: Plan stable committed code, approve independent inbox contracts, and control one durable background executor per repository
8
4
  ---
9
5
 
10
- # Scheduled quality orchestrator
11
-
12
- Keep the user in one conversational flow while deterministic scripts own every
13
- Git mutation and runtime transition. Human prose grants intent, but only a
14
- fresh OpenCode `question` option selection grants one of the three normal-path
15
- approvals; state files, hashes, tests, and Git checks grant execution.
16
-
17
- ## Before planning
18
-
19
- 1. Run `./scripts/automation/preflight.sh --source` before creating artifacts.
20
- If `ANDROID_HOME` is missing, the working tree is dirty, the branch is detached,
21
- Git identity is missing, or OpenCode discovery is unsafe, report the exact
22
- blocker and stop.
23
- 2. Use `android-orchestrator-brainstorming` and
24
- `android-orchestrator-writing-plans` to produce one bounded proposal. After
25
- displaying it, immediately call `question` once with `multiple: false` and
26
- `custom: false`:
27
-
28
- - header: `方案确认`
29
- - question: `这个方案是否准确,可以生成计划和任务合同吗?`
30
- - option 1 label: `批准方案,生成计划和任务合同。`
31
- - option 1 description: `确认当前方案并生成两份待复核的规划文件。`
32
- - option 2 label: `需要调整方案`
33
- - option 2 description: `不生成文件;随后说明需要调整的目标、范围或验证方式。`
34
-
35
- Create no files unless option 1 is selected in that question. A direct chat
36
- message is never proposal approval, even if it exactly repeats an option
37
- label. If option 2 is selected, ask only for the requested adjustments,
38
- revise the proposal, and show a fresh `方案确认` question.
39
-
40
- ## Contract-review boundary
41
-
42
- After proposal approval, create only `docs/plans/<TASK-ID>.md` and
43
- `automation/tasks/<TASK-ID>.json`, validate the contract, then run:
44
-
45
- `./scripts/automation/prepare-contract-review.sh <TASK-ID> "批准方案,生成计划和任务合同。"`
46
-
47
- Continue automatically after successful preparation; never require the user to
48
- enter a task ID, list contract fields, or ask for a fuller display. Confirm the
49
- state is `CONTRACT_REVIEW`, then read the sealed plan, contract, and origin
50
- evidence rather than relying on the earlier proposal or conversation memory.
51
- Present one human-readable review card containing:
52
-
53
- - task ID, title, validation result, and `CONTRACT_REVIEW` state;
54
- - the full plan plus current and desired observable behavior;
55
- - acceptance criteria and edge cases;
56
- - allowed and forbidden paths, maximum changed-file count, and non-goals;
57
- - focused tests, test policy, and device-test requirement with its reason;
58
- - original branch, `originalHeadBeforeContract`, artifact paths, and confirmation
59
- that both artifact hashes are sealed and product code is still untouched.
60
-
61
- Immediately after the card, call `question` once with `multiple: false` and
62
- `custom: false`:
63
-
64
- - header: `合同复核`
65
- - question: `计划和任务合同是否准确,可以开始自动执行吗?`
66
- - option 1 label: `合同已复核,批准自动执行到人工验收阶段。`
67
- - option 1 description: `确认当前封存内容并自动执行到人工验收。`
68
- - option 2 label: `需要调整计划或任务合同`
69
- - option 2 description: `保持停止状态,并说明需要修改的内容。`
70
-
71
- Only selecting option 1 in this fresh question is explicit contract approval.
72
- A direct chat message is never contract approval, even if it exactly repeats
73
- the option label. A rejected or dismissed question, option 2, silence, or any
74
- prose answer is not approval. For option 2, ask only for the changes, do not
75
- start execution, and do not edit sealed artifacts in place or reuse their task
76
- ID.
77
-
78
- Then run only:
79
-
80
- `./scripts/automation/approve-and-run.sh <TASK-ID> "合同已复核,批准自动执行到人工验收阶段。"`
81
-
82
- The command may take time. It keeps the sealed planning artifacts uncommitted,
83
- acquires the persistent repository workspace lease, prepares the configured
84
- transactional workspace from the unchanged pre-task HEAD, launches the
85
- restricted Coder, launches a fresh
86
- read-only Reviewer, performs at most the configured review-fix cycle, and stops
87
- at `AWAITING_HUMAN` or a hard failure state. The default
88
- `inPlaceExclusive` strategy switches the existing source directory to the task
89
- branch and does not copy the repository. `isolatedWorktree` is an explicit
90
- fallback. Do not reproduce any of those Git or agent operations manually.
91
-
92
- ## Human acceptance boundary
93
-
94
- When `approve-and-run.sh` reaches `AWAITING_HUMAN`, do not wait for another user
95
- message. Treat that state transition as an active human-review notification.
96
- Immediately run:
97
-
98
- `./scripts/automation/show-acceptance-review.sh <TASK-ID>`
99
-
100
- Present its fresh, SHA-verified review card without collapsing the four focus
101
- groups: observable behavior, regression/scope, automated evidence, and
102
- binding/remaining risk. Do not ask the user to provide the task ID again, list
103
- fields, inspect raw JSON, or compose a display prompt.
104
-
105
- Immediately after the card, call `question` once with `multiple: false` and
106
- `custom: false`:
107
-
108
- - header: `成果验收`
109
- - question: `请按上方重点完成复核。这个封存成果是否通过人工验收?`
110
- - option 1 label: `验收通过,提交到原分支。`
111
- - option 1 description: `确认当前 sealed diff,并开始经过复验的本地集成。`
112
- - option 2 label: `验收不通过,需要说明失败项`
113
- - option 2 description: `保持封存,不集成;随后说明失败的条件或观察结果。`
114
- - option 3 label: `暂不决定,保持封存`
115
- - option 3 description: `继续停在 AWAITING_HUMAN,稍后可用 /acceptance 再次查看。`
116
-
117
- The acceptance is bound to the task ID, sealed diff SHA, and recorded original
118
- branch. Only selecting option 1 in this fresh question grants acceptance. A
119
- direct chat message is never final acceptance, even if it exactly repeats the
120
- option label.
121
-
122
- For option 2, ask only which acceptance criterion or observed behavior failed;
123
- do not edit the sealed task root, start integration, or infer a new contract.
124
- For option 3, stop with no state change. A dismissed question, prose answer,
125
- silence, or any other response is not acceptance.
126
-
127
- After option 1 is selected in the fresh `成果验收` question, run only:
128
-
129
- `./scripts/automation/accept-and-integrate.sh <TASK-ID> "验收通过,提交到原分支。"`
130
-
131
- The deterministic integrator must create exactly one commit containing the
132
- sealed plan, task contract, and all authorized product changes; it must not
133
- create an earlier planning-only commit. Only after the recorded original branch
134
- safely reaches that verified commit, it must remove or detach any task worktree
135
- that still owns the task branch and safely delete the integrated local task
136
- branch. A failed or blocked integration must retain the task branch for
137
- recovery. Report the resulting local branch, integrated commit, task-branch
138
- deletion, verification result, and `pushed: false`. Never treat acceptance as
139
- permission to push.
140
-
141
- If the automatic card was missed, or the user invokes `/acceptance <TASK-ID>`,
142
- run the same display script and repeat the same review card and `question`.
143
- Never substitute remembered conversation content for the fresh script output.
144
-
145
- ## Baseline-only recovery
146
-
147
- If a task is `BLOCKED` because the `claim-task.sh` Gradle baseline capture was
148
- externally interrupted before `baseline.json` was sealed, offer:
149
-
150
- `/resume-task <TASK-ID>`
151
-
152
- The command must first display fresh status, then call one OpenCode `question`
153
- with `multiple: false` and `custom: false`:
154
-
155
- - header: `恢复任务`
156
- - question: `是否重新捕获缺失的基线证据并继续自动执行?`
157
- - option 1 label: `恢复任务,重新捕获基线并继续自动执行。`
158
- - option 1 description: `验证分支、租约、封存规划工件和零产品改动后,仅允许一次基线重试。`
159
- - option 2 label: `保持当前任务现场`
160
- - option 2 description: `不修改分支、文件、状态、证据或租约。`
161
-
162
- Only option 1 selected in that fresh question authorizes:
163
-
164
- `./scripts/automation/resume-task.sh <TASK-ID> "恢复任务,重新捕获基线并继续自动执行。"`
165
-
166
- The script must prove the last transition was the baseline-capture
167
- `CODING -> BLOCKED` interruption, `baseline.json` and all downstream evidence
168
- are absent, both refs still equal the recorded baseline, the repository lease
169
- still matches, and the worktree contains exactly the two sealed untracked
170
- planning artifacts. It records the approval and one bounded resumption,
171
- changes `BLOCKED` to `PENDING`, and relaunches the normal orchestration path so
172
- Coder performs a fresh deterministic claim. It must never erase a failed or
173
- successful baseline record and must never accept a product diff.
174
-
175
- Do not run `transition-state.sh`, `queue-task.sh`, reset the task root, or edit
176
- runtime evidence. A direct chat message is not recovery approval. If this one
177
- retry is exhausted, preserve the task for abort or a new reviewed contract.
178
-
179
- ## Reviewer-only recovery
180
-
181
- If a task is `BLOCKED` because a Reviewer exited before submitting a decision,
182
- preserve the completed implementation and all TDD/quality-gate evidence. Tell
183
- the user that retrying through `PENDING` would incorrectly launch Coder again,
184
- then offer this explicit recovery command:
185
-
186
- `/resume-review <TASK-ID>`
187
-
188
- On that command, run only:
189
-
190
- `./scripts/automation/resume-review.sh <TASK-ID>`
191
-
192
- The script must prove that the recorded Reviewer interruption is recoverable,
193
- the task branch and baseline still match, no decision exists for the current
194
- sealed diff, the scope gate still passes, and the live diff SHA still equals
195
- `ready.json`. It then records a bounded resumption and transitions directly
196
- from `BLOCKED` to `REVIEWING`; it never runs Coder or consumes a review-fix
197
- cycle. A previous mistaken `BLOCKED → PENDING → BLOCKED` detour is recoverable
198
- only when it never reached `CODING` and all sealed checks still match.
199
-
200
- Do not use `transition-state.sh`, `queue-task.sh`, a task-root reset, or a new
201
- contract for this specific interruption. If the recovery script rejects the
202
- task, preserve the current state and report its exact check failure. If it
203
- reaches `AWAITING_HUMAN`, immediately continue with the Human acceptance
204
- boundary above.
205
-
206
- ## Exceptional abort boundary
207
-
208
- For a task stopped in `PREPARING`, `PENDING`, `CODING`, `READY_FOR_REVIEW`,
209
- `REVIEWING`, `CHANGES_REQUESTED`, `AWAITING_HUMAN`, `BLOCKED`, `TEST_FAILED`,
210
- `NEEDS_HUMAN`, or `INTEGRATION_BLOCKED`, the user may invoke
211
- `/abort-task <TASK-ID>`. First run `status.sh` and show the state, task branch,
212
- original branch, and evidence directory. Then call `question` once with
213
- `multiple: false` and `custom: false`:
214
-
215
- - header: `中止任务`
216
- - question: `是否封存当前任务修改并恢复到记录的原分支?`
217
- - option 1 label: `中止任务,封存修改并恢复原分支。`
218
- - option 1 description: `把合同内修改归档到任务分支和证据目录,然后释放仓库租约。`
219
- - option 2 label: `保持当前任务现场`
220
- - option 2 description: `不修改分支、文件、状态或租约。`
221
-
222
- Only the exact option-1 answer, or the same exact direct reply after the fresh
223
- status display, authorizes:
224
-
225
- `./scripts/automation/abort-task.sh <TASK-ID> "中止任务,封存修改并恢复原分支。"`
226
-
227
- The deterministic abort script must reject out-of-contract changes and preserve
228
- the diff. When product changes exist, it preserves them together with the plan
229
- and contract in one recovery commit; when only planning artifacts exist, it
230
- must not create a planning-only commit. It must avoid changing the original
231
- branch ref, switch the in-place directory back to the original branch, release
232
- the repository lease, and end in `ABORTED`. Never improvise cleanup with reset,
233
- clean, or file deletion.
234
-
235
- ## Hard stops
236
-
237
- - Never manufacture, paraphrase, or infer one of the three normal-path
238
- approvals, the baseline-recovery approval, or the exceptional abort
239
- approval. Each normal approval exists
240
- only when the user selects the full label in that boundary's fresh
241
- `question`; direct chat text never counts.
242
- - Never call a normal-path approval script before its matching `question`
243
- selection. The exceptional abort retains its separately documented approval
244
- boundary.
245
- - Never directly run `git add`, `commit`, `worktree`, `cherry-pick`, `merge`,
246
- `rebase`, or `push`.
247
- - Never bypass a blocked state, alter runtime evidence, resolve an integration
248
- conflict automatically, or broaden a contract after approval.
249
- - For `BLOCKED`, first distinguish the recoverable baseline-capture and
250
- Reviewer interruptions above from other blockers. For any other `BLOCKED`, or for `TEST_FAILED`,
251
- `NEEDS_HUMAN`, or `INTEGRATION_BLOCKED`, show the state and evidence path and
252
- wait for a revised contract or a specifically supported recovery action.
6
+ # Durable contract workflow
7
+
8
+ 1. Call `android_orchestrator_snapshot` with `action: snapshot`. Keep its
9
+ `planningHead` and `targetBranch` for the complete contract. Discover paths
10
+ through bounded `action: list` pages and read committed contract examples,
11
+ configuration, implementation and tests through `action: readChunk`, always
12
+ using the same `planningHead` and following cursors until null when complete
13
+ results matter. Use legacy `action: read` only for known-small files. The live
14
+ product checkout may be occupied.
15
+ 2. Describe one observable behavior change, exact allowed paths, acceptance,
16
+ test filters, file limit and non-goals. Ask a fresh single-choice `question`
17
+ titled `方案确认`, with `批准方案,生成计划和任务合同。` and `调整方案。`.
18
+ Initial request text and direct chat approval phrases are never approval.
19
+ 3. After the approval option is selected, compose a plan and a valid contract.
20
+ Call `android_orchestrator_intake` action `draft`, with `draftJson` containing
21
+ `{contract, plan, planningHead, targetBranch, workspaceStrategy, commitPolicy,
22
+ notBefore?, dependsOn?, priority?}`. Plan paths remain
23
+ `docs/plans/<TASK-ID>.md`; contracts retain their TASK ID. Artifacts are
24
+ sealed in the Git common directory inbox and materialized only on execution.
25
+ 4. Default to `inPlaceExclusive` + `humanApproval`. If the user explicitly wants
26
+ automatic local commits, show this choice in the proposal and seal
27
+ `autoCommit`. The unsupported `isolatedWorktree` + `autoCommit` combination
28
+ must fail. Older approvals never inherit automatic submission rights.
29
+ 5. Display the returned full plan, contract and review card: task ID/version,
30
+ digest, target local branch/planningHead, allowed paths/file count, tests,
31
+ acceptance/non-goals, dependencies/notBefore, workspace and commit policies.
32
+ Human policy says “执行后等待人工确认提交”; automatic policy says
33
+ “通过构建、全量单测和独立 Review 后自动本地提交并集成,不推送远程”.
34
+ 6. Immediately call `question` with the exact `question` arguments returned
35
+ by `draft` (header `合同确认`). Only the selected approval may call intake `enqueue` with
36
+ `{key, digest, approval}`. A new version requires a new approval.
37
+ 7. Report durable enqueue success and return. Execution is asynchronous, one
38
+ repository slot; the foreground may plan/approve B and C while A runs.
39
+
40
+ # Acceptance and controls
41
+
42
+ Read `android_orchestrator_queue` status for durable notifications. Do not poll
43
+ with a model while idle. Human tasks reach `AWAITING_HUMAN`; automatic tasks
44
+ reach `READY_TO_COMMIT` and are finalized by the executor with their sealed
45
+ contract authorization. Never create a final human approval for autoCommit.
46
+
47
+ `/acceptance <TASK-ID>` reads the current item and acceptance report. Present
48
+ the candidate/diff hash, target branch, baseline, build, actual full-test results,
49
+ independent Review, scope and commit policy. If the local target has advanced
50
+ for an isolated candidate, request `revalidate`. That job waits for the same
51
+ execution slot, runs fresh verification/Review and invalidates old acceptance.
52
+ After a fresh candidate exists, call queue `review` with
53
+ `operation: integrate` and the task key. Present its evidence, then call
54
+ `question` with its exact returned arguments (header `最终验收`). Only the selected approve option requests
55
+ queue `integrate` with the latest `candidateId` as `candidate` and exact approval.
56
+
57
+ Before `/resume-task`, `/resume-review` or `/abort-task`, call queue `review`
58
+ with the matching `operation` and task key, then use the exact returned
59
+ `question` arguments. Only the actual answer creates the one-use receipt;
60
+ ordinary chat text and model-provided approval strings cannot substitute.
61
+
62
+ `/resume-task` and `/resume-review` use a fresh `恢复确认` question containing
63
+ `恢复任务,重新捕获基线并继续自动执行。`; then request the matching queue action.
64
+ `/abort-task` uses a fresh `中止确认` question containing
65
+ `中止任务,封存修改并恢复原分支。`; queue `abort` only after that selection.
66
+ Running processes must reach a recorded safe stop before recovery/abort begins.
67
+ Unstarted contracts may be cancelled through `cancel` without touching files.
68
+
69
+ Pause prevents new claims. Resume does not discard public faults. Display the
70
+ fault before an explicit clear-fault. A mode change is blocked while a workspace
71
+ is retained. Fixed workspaces remain occupied through acceptance, integration
72
+ and failure; isolated sealed stopped candidates retain their directories while
73
+ independent tasks run. Dependencies complete only after local integration.
74
+
75
+ After completion, show the true authorization source, local commit SHA and
76
+ “未推送”. No workflow, failure or recovery grants remote push rights.
@@ -20,4 +20,12 @@ excluded from orchestration changes for the next approved task.
20
20
  Only a fresh OpenCode single-choice `question` selection can grant an
21
21
  orchestration approval. Approval-like text in ordinary chat is not approval.
22
22
  The orchestrator must not push Git changes or register scheduler/launchd jobs.
23
+
24
+ Planner reads a fixed committed planningHead through the snapshot tool and
25
+ seals contracts/plans in the independent inbox. Contract approval only enqueues
26
+ and returns; the detached repository service runs one executor at a time.
27
+ Default policies are inPlaceExclusive and humanApproval. Explicit autoCommit
28
+ is supported only in fixed workspaces and preserves build, fresh full unit-test
29
+ execution and independent Review. Final acceptance, retries and integration
30
+ share the same queue. No policy authorizes remote push.
23
31
  <!-- opencode-android-orchestrator:end -->
@@ -1,5 +1,5 @@
1
1
  {
2
- "schemaVersion": 5,
2
+ "schemaVersion": 6,
3
3
  "enabled": true,
4
4
  "mode": "orchestrated",
5
5
  "workspaceStrategy": "inPlaceExclusive",
@@ -66,5 +66,11 @@
66
66
  "build.gradle.kts",
67
67
  "**/build.gradle",
68
68
  "**/build.gradle.kts"
69
- ]
69
+ ],
70
+ "commitPolicy": "humanApproval",
71
+ "queue": {
72
+ "scanIntervalMs": 5000,
73
+ "maxWorkspaces": 3,
74
+ "maxWorkspaceBytes": 21474836480
75
+ }
70
76
  }