@mstar-harness/dsh 3.8.1 → 3.8.3

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 (78) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +16 -6
  3. package/README.zh.md +16 -6
  4. package/dist/client/panel/engine-status-client.d.ts +84 -6
  5. package/dist/client/panel/graph/project-graph.d.ts +26 -13
  6. package/dist/client/panel/guards.d.ts +41 -1
  7. package/dist/client/panel/locale.d.ts +1 -1
  8. package/dist/client/panel/pages/AgentListPage.d.ts +1 -1
  9. package/dist/client/panel/sidebar.d.ts +3 -2
  10. package/dist/client/panel/state-section.d.ts +25 -3
  11. package/dist/client/panel/use-mstar-engine-status.d.ts +28 -4
  12. package/dist/client.js +346 -48
  13. package/dist/engine-status-endpoint.d.ts +85 -8
  14. package/dist/engine-status-store.d.ts +91 -1
  15. package/dist/engine-status-wire.d.ts +9 -0
  16. package/dist/gates/_shared.d.ts +61 -9
  17. package/dist/gates/adapter.d.ts +32 -2
  18. package/dist/gates/agent-flow.d.ts +312 -60
  19. package/dist/gates/catalog.d.ts +58 -37
  20. package/dist/gates/dispatch.d.ts +11 -2
  21. package/dist/gates/goal-bridge.d.ts +10 -130
  22. package/dist/gates/plan-mode-bridge.d.ts +20 -11
  23. package/dist/gates/role-persona.d.ts +16 -0
  24. package/dist/gates/steering.d.ts +41 -0
  25. package/dist/gates/workflow-ledger.d.ts +31 -4
  26. package/dist/gates/workflow-selection.d.ts +41 -20
  27. package/dist/index.js +1206 -392
  28. package/dist/types.d.ts +36 -11
  29. package/harness-commands/amazing-e2e-check.md +10 -0
  30. package/harness-commands/amazing-pr-review.md +2 -0
  31. package/harness-commands/codebase-audit.md +2 -0
  32. package/harness-commands/iteration-drive.md +1 -1
  33. package/harness-skills/mstar-artifacts/references/plan-files-and-reports.md +2 -2
  34. package/harness-skills/mstar-artifacts/references/plan-quality-bar.md +14 -12
  35. package/harness-skills/mstar-artifacts/templates/plan.main.md +19 -6
  36. package/harness-skills/mstar-audit/SKILL.md +5 -5
  37. package/harness-skills/mstar-coding-behavior/SKILL.md +8 -8
  38. package/harness-skills/mstar-dispatch-gates/SKILL.md +9 -7
  39. package/harness-skills/mstar-e2e/SKILL.md +40 -0
  40. package/harness-skills/mstar-e2e/references/report-template.md +32 -0
  41. package/harness-skills/mstar-engine-legacy/references/qc-seat-n-restatements.md +3 -3
  42. package/harness-skills/mstar-harness-core/SKILL.md +14 -1
  43. package/harness-skills/mstar-host/SKILL.md +3 -1
  44. package/harness-skills/mstar-host/references/_shared/host-role-binding-core.md +1 -1
  45. package/harness-skills/mstar-host/references/cursor.md +1 -1
  46. package/harness-skills/mstar-host/references/dsh-workflow-scripts.md +424 -0
  47. package/harness-skills/mstar-host/references/dsh.md +180 -51
  48. package/harness-skills/mstar-host/references/kimi.md +3 -3
  49. package/harness-skills/mstar-host/references/omp.md +3 -3
  50. package/harness-skills/mstar-host/references/parallel-dispatch.md +6 -6
  51. package/harness-skills/mstar-host/references/zcode.md +4 -4
  52. package/harness-skills/mstar-iteration/SKILL.md +1 -1
  53. package/harness-skills/mstar-iteration/references/phase-1-prepare.md +2 -2
  54. package/harness-skills/mstar-iteration/references/phase-2-worktree-lease.md +3 -3
  55. package/harness-skills/mstar-review-qc/SKILL.md +4 -4
  56. package/harness-skills/mstar-review-qc/references/review-responsibility-boundaries.md +9 -7
  57. package/harness-skills/mstar-roles/SKILL.md +2 -0
  58. package/harness-skills/mstar-roles/references/_shared/leaf-executor-core.md +9 -0
  59. package/harness-skills/mstar-roles/references/ops-engineer.md +3 -0
  60. package/harness-skills/mstar-roles/references/project-manager/dispatch-and-assignment.md +12 -9
  61. package/harness-skills/mstar-roles/references/project-manager/qa-trigger-matrix.md +7 -5
  62. package/harness-skills/mstar-roles/references/project-manager/qc-and-residuals.md +2 -2
  63. package/harness-skills/mstar-roles/references/project-manager/routing-and-dev-allocation.md +2 -2
  64. package/harness-skills/mstar-roles/references/project-manager.md +4 -2
  65. package/harness-skills/mstar-roles/references/qa-engineer/acceptance-gate.md +12 -13
  66. package/harness-skills/mstar-roles/references/qa-engineer.md +5 -4
  67. package/harness-skills/mstar-roles/references/qc-specialist/deep-review-lenses.md +5 -5
  68. package/harness-skills/mstar-roles/references/qc-specialist/report-template.md +2 -0
  69. package/harness-skills/mstar-roles/references/qc-specialist/reviewer-checklist.md +1 -1
  70. package/harness-skills/mstar-roles/references/qc-specialist/reviewer-workflow.md +5 -4
  71. package/harness-skills/mstar-roles/references/qc-specialist-shared.md +3 -1
  72. package/harness-skills/mstar-sdd/SKILL.md +17 -9
  73. package/harness-skills/mstar-sdd/references/file-handoffs.md +40 -20
  74. package/harness-skills/mstar-sdd/references/implementer-continuation-prompt.md +9 -4
  75. package/harness-skills/mstar-sdd/references/implementer-prompt.md +11 -6
  76. package/harness-skills/mstar-sdd/references/sticky-implementer-session.md +4 -2
  77. package/harness-skills/mstar-sdd/references/task-reviewer-prompt.md +8 -4
  78. package/package.json +2 -2
@@ -119,9 +119,9 @@ or a custom profile).
119
119
  doneAt — deterministic, documented heuristic, only provably
120
120
  cross-iteration events are dropped, no historical back-scan of resumed
121
121
  long logs; the sidebar chip title is captured at open time; a docked
122
- body renders nothing while `tab.visible === false`. Panel acceptance is
123
- dual-track: in-loop browser harness verification against the rebuilt
124
- bundle plus user-restart final GUI acceptance.
122
+ body renders nothing while `tab.visible === false`. Routine panel QA uses affected unit evidence only. Real-browser rebuilt-bundle
123
+ verification or user-restart GUI acceptance belongs to an explicitly requested
124
+ independent **`mstar-e2e`** workflow (`/amazing-e2e-check`), never an iteration QA gate.
125
125
 
126
126
  ## Skill loading
127
127
 
@@ -138,6 +138,7 @@ or a custom profile).
138
138
  | dsh tool | Harness use |
139
139
  |----------|-------------|
140
140
  | **`subagent`** | Primary dispatch — the model-facing delegation tool the dispatch gate matches (default `toolName`; a renamed instance must be declared via Config `dispatchTools`) |
141
+ | **`workflow`** | Read-only N≥3 fan-out — one run, one conversation `workflow-run` node (§ Read-only fan-out via the `workflow` tool; scripts → `references/dsh-workflow-scripts.md`) |
141
142
  | **`mstar_iteration_gate`** | Evaluate the iteration phase gate in-app (`evaluatePhaseGate` — `mstar iteration gate` parity) |
142
143
  | **`mstar_sdd_workspace`** / **`mstar_sdd_task_brief`** | SDD workspace resolve + task brief extraction (`mstar sdd …` parity) |
143
144
  | **`mstar_*_validate`** | On-demand seam validators (design-md / audit / compound / roles) |
@@ -208,59 +209,107 @@ tab's `EventLogPage` log page are pure consumers of this evidence.
208
209
  `beforeDispatch` followed by the identical text as an in-loop subagent tool
209
210
  call) records two dispatch events — the surfaces are mutually exclusive by
210
211
  design; the double record is documented, not deduplicated.
211
- - **File / bounds**: events append to `{HARNESS_DIR}/agent-flow.jsonl` (JSON
212
- Lines, one event per line; harness dirs are gitignored by convention). The
213
- ledger assumes ONE dsh process writes each harness dir (single-writer):
214
- concurrent dsh sessions on the same repo can lose events (the append itself
215
- is near-atomic O_APPEND, but truncation is a read-modify-write) — the loss
216
- only under-reports actual flow in the panel, never a gate impact. After each
217
- append the file truncates to the most recent **500** events; truncation is
218
- size-gated (≈500 lines' typical size — small files stay append-only) and
219
- performed as an atomic temp-file rename. The catalog read returns the
220
- latest-first view with a default window of **50** and a role × outcome
221
- summary. A MISSING file reads as the empty view ("no actual dispatches yet"
222
- — recording starts at plan merge); an unreadable file is absent evidence;
223
- malformed lines are skipped, never fatal.
212
+ - **File / bounds**: events append to the ACTIVE workflow dir —
213
+ `{HARNESS_DIR}/workflows/<id>/agent-flow.jsonl` (JSON Lines, one event per
214
+ line; harness dirs are gitignored by convention) — never the harness root:
215
+ with no active lifecycle the record is SKIPPED with a one-time warn. The
216
+ append and the size-gated truncating read-modify-write form ONE critical
217
+ section behind a per-workflow lockdir, so a second dsh session sharing the
218
+ active lifecycle cannot silently drop the other writer's lines (steady state
219
+ stays one writer per workflow dir); any loss only under-reports actual flow
220
+ in the panel, never a gate impact. After each append the file truncates to
221
+ the most recent **500** events; truncation is size-gated (≈500 lines'
222
+ typical size — small files stay append-only) and performed as an atomic
223
+ temp-file rename. The catalog read returns the latest-first view with a
224
+ default window of **50** and a role × outcome summary. A MISSING file reads
225
+ as the empty view ("no actual dispatches yet" — recording starts at plan
226
+ merge); an unreadable file is absent evidence; malformed lines are skipped,
227
+ never fatal.
224
228
  - **Settle = real completion pairing, never faked**: `tools/post-execute`
225
229
  IS part of the
226
230
  verified dsh-tools registry surface (`runPostExecute` dispatches the
227
231
  waterfall for every tool call — verified against the upstream source and
228
232
  pinned by a real-call probe). The pairing listener matches dispatch TOOLS
229
- (Config `dispatchTools`, default `['subagent']`), looks up the exec's
230
- `callId` in the apply-scoped pairing store, and branches on the verified
231
- result shapes:
232
- - `{ kind: 'background', taskId }` → store `taskId → dispatchRef`; the REAL
233
- settle arrives via `ctx.tasks.onTaskDone` (terminal mapping
234
- completed → ok / killed → denied / failed → error, `durationMs` when
235
- available), wired through `ctx.inject(['tasks'])`.
233
+ (Config `dispatchTools`, default `['subagent', 'subagent_fork']`), looks up
234
+ the exec's agent-namespaced call key in the apply-scoped pairing store, and
235
+ branches on the verified result shapes:
236
+ - `{ kind: 'background', jobId }` (the registry job id, `<kind>-N`) → store
237
+ `jobId → dispatchRef` and the bounded job id as the ref's `taskRef`; the
238
+ REAL settle arrives via `ctx.inject(['jobs'])` → `jobs.onJobDone`
239
+ (terminal mapping completed → ok / killed → denied / failed → error,
240
+ `durationMs` when available). A background value without a valid `jobId` →
241
+ nothing mappable (no settle).
236
242
  - `{ kind: 'continuable', subagentId }` → no terminal signal this round →
237
- no settle (documented limit — the child owns its turns).
243
+ no settle (documented limit — the child owns its turns); the value
244
+ authorizes the child-identity join below and nothing is copied onto a
245
+ settle.
238
246
  - any other successful value (foreground included) → settle `ok`; a failed
239
- result (`isError`) → settle `error`.
247
+ result (`isError` or an `error` payload) → settle `error`. A returned
248
+ foreground `runId` is the settle's `childId`, extracted independently of
249
+ the outcome (an error settle keeps its identity without becoming `ok`).
240
250
  Pairing is apply-scoped (in-memory `callId → dispatchRef` /
241
- `taskId → dispatchRef` maps created in the entry `apply`; an HMR restart
251
+ `jobId → dispatchRef` maps created in the entry `apply`; an HMR restart
242
252
  resets them, and completions outside the window stay unpaired). Every
243
253
  PAIRED settle carries the paired dispatch's identity (`role`/`planId`/
244
254
  `taskId` — same field names + semantics as the dispatch event; the registry
245
- background-task id is never written as `taskId`, `taskRef` is reserved for
246
- it). Unpaired payloads (non-dispatch tools, calls outside the pairing
247
- window) record NOTHING — the ledger stays dispatch-only, never a
248
- fabricated settle.
255
+ job id is never written as `taskId` — `taskId` stays the Assignment `Task N`
256
+ tag, `taskRef` is reserved for the registry id). Unpaired payloads
257
+ (non-dispatch tools, calls outside the pairing window) record NOTHING — the
258
+ ledger stays dispatch-only, never a fabricated settle.
259
+ - **Child identity (`subagent-link`, nonterminal)**: the child session id is
260
+ published upstream as a PARENT-OWNED `subagent/catalog` session event
261
+ (`{ version: 0, childId, childCreatedAt, mode, label }`; `label` = the
262
+ delegation `description`), appended by the tool body — for the continuable
263
+ path BEFORE the tool returns. The join spans a per-dispatch CALL WINDOW: the
264
+ pre-execute reserves the first raw-label slot under the live parent Session
265
+ object and captures its `seq` as the window start; a valid `background` /
266
+ `continuable` result at `tools/post-execute` makes that exact candidate
267
+ eligible (every other outcome retires it to a tombstone; a duplicate label
268
+ was already refused a candidate at reservation). Eligibility walks
269
+ `eventAt(seq)` over `[fromSeq, end)`, where `end` is the session's `seq`
270
+ CAPTURED when the candidate became eligible — recovering a catalog appended
271
+ before the tool returned — while ONE root-context `session/event` observer
272
+ feeds the same matcher for later arrivals against the session's CURRENT
273
+ `seq`: only that live observer follows the session forward, so a catalog
274
+ appended after eligibility still joins through it (the catch-up scan stays
275
+ frozen at its captured endpoint). A matched
276
+ candidate is consumed once and appends `{ v: 1, ts, kind: 'subagent-link',
277
+ agent?, childId, label, role, planId?, taskId?, taskRef? }` to the
278
+ DISPATCH's own workflow dir (`ts` = observation time), correlating the
279
+ catalog child back to the dispatch identity mstar recorded. It is an
280
+ IDENTITY record, NOT a completion: no `outcome`, no `verdict`, no `paired`
281
+ marker. A background one-shot link also carries its registry `taskRef`; a
282
+ continuable link omits it. Settle rows carry an optional `childId` — a
283
+ foreground `runId`, or for background only when the join has already
284
+ supplied one.
285
+ - **Join bounds (honest degrade)**: NO row when the label is missing/empty,
286
+ the dispatch unpaired, a background result carries no valid `jobId` (the
287
+ reserved candidate is retired — nothing mappable: no settle, no link),
288
+ the catalog version unknown, the mode not matching the result kind,
289
+ a continuable catalog naming a different child than the tool returned,
290
+ the slot map at capacity (500 labels per parent Session), or the slot
291
+ already consumed. The join is apply-scoped: no whole-history cold
292
+ scan and no `session/created` backfill — a catalog written before apply
293
+ (constructor seeds) can never label a new dispatch. Duplicate labels are
294
+ deterministic best-effort (first reservation + first matching catalog wins),
295
+ NOT proof of unique ownership. Not every provider emits a catalog — a remote
296
+ run without a `localAgent` produces none, so a dispatch may legitimately
297
+ have no link row.
249
298
  - **Catalog**: `state.agentFlow` carries the ledger view (`events` ≤ 50,
250
299
  latest-first, + `summary`); the model-facing `<mstar_engine_status>` text
251
300
  renders ONE compact `agent flow: …` line only when events > 0 (role totals
252
301
  top-5 + latest dispatch with HH:MM — the event detail lives in the
253
- structured source, never the model text). A ledger record (dispatch/settle)
254
- invalidates the affected workspace's TTL cache entry IMMEDIATELY
255
- (apply-scoped `harnessDir → cache key` reverse map + invalidation closure)
256
- → the next pre-step rebuilds and (digest
257
- text change) re-injects the row — the 60 s TTL no longer bounds
258
- ledger-change latency; it still bounds non-ledger staleness.
302
+ structured source, never the model text). A ledger record
303
+ (dispatch/settle/link) invalidates the affected workspace's TTL cache entry
304
+ IMMEDIATELY (apply-scoped `harnessDir → cache key` reverse map +
305
+ invalidation closure) → the next pre-step rebuilds and (digest text change)
306
+ re-injects the row — the 60 s TTL no longer bounds ledger-change latency; it
307
+ still bounds non-ledger staleness.
259
308
  - **Maintainer view**: change the ledger shape (event schema, bounds, settle
260
309
  seam) and update the projections together — `gates/agent-flow.ts` (record /
261
- read / settle listener), `gates/catalog.ts` (agent-flow line + `source`
262
- view) and `client/panel/graph/project-graph.ts` (the ZoneView flow/agents
263
- projection) — the panel renders ONLY what the evidence shows.
310
+ read / settle / catalog-join listeners), `gates/catalog.ts` (agent-flow line
311
+ + `source` view) and `client/panel/graph/project-graph.ts` (the ZoneView
312
+ flow/agents projection) — the panel renders ONLY what the evidence shows.
264
313
 
265
314
  ## PM dispatch
266
315
 
@@ -299,22 +348,102 @@ the "queued messages" dock instead of reaching the parent (observed on dsh).
299
348
  The closing message is the guaranteed delivery channel; reserve `report` for
300
349
  MID-turn findings that change what the parent should do next.
301
350
 
351
+ ### Progress discipline — native workflow, never `/goal`
352
+
353
+ dsh progress is driven by the **native workflow**: the workflow snapshot phases
354
+ + the dispatch gates + **subagent settle notifications**. mstar **stops arming**
355
+ a goal on dsh — the surviving bridge is advisory-only (no `create` / `edit` /
356
+ `complete` / `pause` / `resume`, no goal read) — so no goal round loop drives
357
+ mstar work here. Never drive a dsh session with a `/goal` objective or a goal
358
+ round loop: `goal-round-driver` opens a round whenever the goal is active +
359
+ armed and the agent is idle, and it knows nothing about running subagents, so
360
+ an operator who arms `/goal` manually can still get rounds firing while a
361
+ dispatched child owns the critical path.
362
+
363
+ **Phase 2 continuous execution is a PM-local loop**: dispatch → **wait for the
364
+ child's settle notification** → next dispatch. When a dispatched child owns the
365
+ critical path, the correct action is to **wait** — not to open another unit of
366
+ work against the same worktree.
367
+
302
368
  ### QC default
303
369
 
304
- - **`Execution mode: sdd`**: **N=3** `subagent` dispatches — one per QC seat
305
- (`qc-specialist`, `qc-specialist-2`, `qc-specialist-3`), each body **Act as**
306
- the respective QC role + QC skill load. **MUST dispatch all three with
307
- `run_in_background: true` in one message** → the seats run CONCURRENTLY
308
- (background children; wall ≈ single seat); foreground (no
309
- `run_in_background`) runs serially (wall ≈ 3× single seat) and does NOT
310
- count as parallel tri. Cannot emit required **N** → **`Blocked`**.
370
+ - **`Execution mode: sdd`**: **N=3** seats — one per QC seat (`qc-specialist`,
371
+ `qc-specialist-2`, `qc-specialist-3`), each body **Act as** the respective QC
372
+ role + QC skill load. Read-only fan-out of N≥3 on dsh uses the native
373
+ **`workflow`** tool (the `mstar-qc-tri` script — § Read-only fan-out via the
374
+ `workflow` tool): one run, three concurrent children, one conversation
375
+ `workflow-run` node. When the tool is not mounted (the `ptc` preset hides it),
376
+ fall back to the `subagent` path below. **The `subagent` path MUST dispatch all
377
+ three with `run_in_background: true` in one message** → the seats run
378
+ CONCURRENTLY (background children; wall ≈ single seat); foreground (no
379
+ `run_in_background`) runs serially (wall ≈ 3× single seat) and does NOT count
380
+ as parallel tri. Cannot emit required **N** → **`Blocked`**.
311
381
  - **`inline`**: **N=1**.
312
382
 
313
- ### SDD implement (serial)
314
-
315
- - **`Execution mode: sdd`**: one implementer `subagent` dispatch per task id;
316
- task reviewer = a separate dispatch (SDD review role) — no sticky resume
317
- unless the host's continuable-subagent id is available and recorded.
383
+ ### SDD implement
384
+
385
+ - **`Execution mode: sdd`**: one implementer `subagent` dispatch per ready task id;
386
+ independent tasks use isolated tracks and `run_in_background: true` before
387
+ waiting, per **`mstar-sdd`** § Ready-task scheduling. Task reviewer is a fresh
388
+ separate dispatch; sticky resume is limited to one sequential owner track
389
+ with a recorded continuable-subagent id.
390
+
391
+ ## Read-only fan-out via the `workflow` tool
392
+
393
+ dsh also exposes the upstream **`workflow`** tool
394
+ (`@deepseek-ai/dsh-tool-workflow`, mounted by the shipped agent presets; the
395
+ `ptc` preset disables it in favour of its own orchestration surface). It runs a
396
+ model-written plain-JavaScript script that fans children out inside ONE run; the
397
+ run is recorded as durable `tool-workflow/*` session events and the stock dsh UI
398
+ (`dsh-client-ui-workflow-run`) folds them into one conversation **`workflow-run`**
399
+ node the operator expands by phase and member. Use it for **read-only fan-out of
400
+ N ≥ 3 seats** — plan QC tri, large-repo audit categories, `/amazing-pr-review
401
+ deep` seats — and copy the `script` + `meta` + `args` from this skill →
402
+ `references/dsh-workflow-scripts.md`. For **1–2** delegations keep **`subagent`**
403
+ (the tool's own guidance): the two-seat default tier of `/amazing-pr-review`
404
+ shows two subagent cards and no `workflow-run` node, and that is expected.
405
+
406
+ **Read-only only.** A workflow child is a delegated child (the shipped `spawn`
407
+ provider pins `approval: never` for the whole delegation), and the run has **no
408
+ per-child pre-start veto seam** — so a script is never the channel for writable
409
+ work; writable fan-out stays on `subagent` behind the dispatch and lease gates.
410
+ Seats return findings in their result payload and must never depend on writing
411
+ files — the caller persists the seat reports.
412
+
413
+ **Every `agent()` prompt starts with the Assignment header** — `## Assignment`
414
+ plus `Execute as` / `Delegation` / `Task category` as the first lines:
415
+
416
+ ```markdown
417
+ ## Assignment
418
+
419
+ Execute as: qc-specialist
420
+ Delegation: forbidden
421
+ Task category: audit
422
+ ```
423
+
424
+ Role binding on dsh is prompt-only (there is no `agent` field), and the same
425
+ engine grammar is what the role-persona channel parses
426
+ (`packages/dsh/src/gates/role-persona.ts` reads only the header region) — so
427
+ `Execute as: qc-specialist` resolves the QC role persona for that child. Keep
428
+ body-quoted field examples out of the header region, and never pass the deferred
429
+ `agentType` option: the engine rejects it loudly.
430
+
431
+ | Operator types | N | Tool | `meta.name` | Operator sees |
432
+ |---|---|---|---|---|
433
+ | `/codebase-audit` (large repo) | ≥3 | native `workflow` | `mstar-audit-fanout` | conversation `workflow-run` node |
434
+ | `/amazing-pr-review deep` | ≥3 | native `workflow` | `mstar-pr-seats` | same |
435
+ | `/amazing-pr-review` default tier | 2 | `subagent` | — | two subagent cards, no node (expected) |
436
+ | Plan QC tri (PM already in session, no extra slash) | 3 | native `workflow` | `mstar-qc-tri` | conversation `workflow-run` node |
437
+ | Any 1–2 read-only delegation | 1–2 | `subagent` | — | expected |
438
+
439
+ `meta.name` is the gate identity — keep it kebab-case and on the recommended
440
+ list. With the default Config (`workflowNames` unset) every name is *unknown*,
441
+ which under the default `workflowGate: warn` is one `workflow.name.unknown`
442
+ **advisory that the run survives** — acceptable on a first run, not a failure. A
443
+ production overlay may set `workflowNames: ['mstar-qc-tri', 'mstar-audit-fanout',
444
+ 'mstar-pr-seats']` (and, separately, `workflowGate: hard`); both are operator
445
+ choices, never mstar defaults. The same run also reaches the panel's 事件记录 tab
446
+ through the agent-flow ledger (§ Agent-flow ledger).
318
447
 
319
448
  ## Commands and skills paths
320
449
 
@@ -97,10 +97,10 @@ Harness **dispatch** on Kimi = **one or more `Agent` tool calls** with correct *
97
97
 
98
98
  Cannot emit required **N** → **`Blocked`**.
99
99
 
100
- ### SDD implement (serial)
100
+ ### SDD implement
101
101
 
102
- - **`Execution mode: sdd`**: one implementer **`Agent`** per task id; task reviewer = new **`Agent`** with **Act as `code-reviewer`** (Kimi L2 review; not qc-specialist*), always via generic fallback `subagent_type: "coder"` per C5 — no sticky resume unless host adds it later. Serial rule → **`parallel-dispatch.md`** § SDD implement.
103
- - **Never** multiple implementer Agents in one message for the same plan.
102
+ - **`Execution mode: sdd`**: one implementer **`Agent`** per task id; task reviewer = new **`Agent`** with **Act as `code-reviewer`** (Kimi L2 review; not qc-specialist*), always via generic fallback `subagent_type: "coder"` per C5 — no sticky resume unless host adds it later. Ready-task scheduling → **`parallel-dispatch.md`** § SDD implement.
103
+ - Independent ready implementers use isolated parallel tracks; never share a writable worktree or session.
104
104
 
105
105
  ## Clarify
106
106
 
@@ -188,10 +188,10 @@ Harness **dispatch** on omp = **one or more `task` tool calls** with correct **`
188
188
 
189
189
  Cannot emit required **N** → **`Blocked`**.
190
190
 
191
- ### SDD implement (serial)
191
+ ### SDD implement
192
192
 
193
- - **`Execution mode: sdd`**: one implementer `task` entry per task id with `agent` matching the implementer role when listed; task reviewer = new entry with `agent: "code-reviewer"` (omp L2 review; not qc-specialist*) or `agent: "reviewer"`/`"task"` as fallback + C5b — no sticky resume unless host resume/id is available and recorded. Serial rule → **`parallel-dispatch.md`** § SDD implement.
194
- - **Never** multiple implementer entries in one message for the same plan.
193
+ - **`Execution mode: sdd`**: one implementer `task` entry per task id with `agent` matching the implementer role when listed; task reviewer = new entry with `agent: "code-reviewer"` (omp L2 review; not qc-specialist*) or `agent: "reviewer"`/`"task"` as fallback + C5b — no sticky resume unless host resume/id is available and recorded. Ready-task scheduling → **`parallel-dispatch.md`** § SDD implement.
194
+ - Independent ready implementers use isolated parallel tracks; never share a writable worktree or session.
195
195
 
196
196
  ## Clarify
197
197
 
@@ -46,16 +46,16 @@ Formal iteration Phase 2 uses the same SDD + tri rule — not a separate carve-o
46
46
 
47
47
  (**SDD 默认**已在上一节;本节仅覆盖显式 tri 的非 SDD 场景。)
48
48
 
49
- ## SDD implement (serial — not parallel)
49
+ ## SDD implement
50
50
 
51
- - **`Execution mode: sdd`**: implementer and task reviewer dispatches are **one at a time** per task.
52
- - **Never** multiple implementer Tasks in one message for the same plan.
53
- - See **`mstar-sdd`**.
51
+ - Follow **`mstar-sdd`** § Ready-task scheduling: independent ready tasks run concurrently after per-track worktree and artifact isolation; fresh implementers, one fresh reviewer per task.
52
+ - Serialize only actual dependencies, overlapping writers, one sticky session, and integration merges. PM alone updates shared progress.
53
+ - When the host only exposes separate asynchronous starts, issue every ready call before waiting for any result; same-message packaging is required only when supported.
54
54
 
55
55
  ## QC targeted re-review (after fixes)
56
56
 
57
57
  - Assignment: **`QC re-review: targeted — reviewers: <role-ids>`** → **N** = listed seats only (1–3), **one** dispatch turn with **N** invocations.
58
- - Do **not** default to three invocations after a routine fix round.
58
+ - Do **not** default to three invocations after a routine fix round. Each listed seat receives only its findings and fix delta; tri seat count never expands review scope.
59
59
  - Post-dispatch: verify only **dispatched** seats returned; PM updates same bundle `qc-consolidated.md` and durable plan summary (see `mstar-artifacts/references/plan-files-and-reports.md`).
60
60
 
61
61
  ## Self-check before send
@@ -65,4 +65,4 @@ Formal iteration Phase 2 uses the same SDD + tri rule — not a separate carve-o
65
65
  3. Dispatch message contains **exactly `N`** invocation calls?
66
66
  4. **Each** invocation carries its role-binding field set to **`Execute as`** (omp `agent` / Cursor `subagent_type` / OpenCode `subagent` / Kimi·ZCode `subagent_type`)? A bare `task`/prompt item with no role field = **incomplete**, even at **N=1**.
67
67
  5. QC initial: **`Execution mode: sdd`** → **N=3**? **`inline`** → **N=1**? Targeted re-review → **N** = Assignment reviewer count?
68
- 6. SDD implement → **serial** (never batch implementers); sticky = **resume** same implementer, not parallel
68
+ 6. SDD implement → independent ready tasks isolated and concurrent? Sticky resume limited to one sequential owner track?
@@ -67,7 +67,7 @@ ZCode C5/C5b SSOT is **this file** — do **not** load `_shared/host-role-bindin
67
67
  3. **Skill load list** — instruct the subagent to read `mstar-roles` → `references/<role-id>.md` (or shared reference + parameters) and topic skills per that reference.
68
68
  4. **`subagent_type`** — bare Morning Star role id per C5; `general-purpose` fallback.
69
69
 
70
- Paste-only Assignment **without** an invoke call is **not** dispatch. Anti-recursion NEVER: leaf executors are already `Execute as` — no recursive invoke of the same role; Assignment wins (`Delegation: forbidden` unless stated). **Never** multiple implementer invokes in one message for the same plan (SDD serial → **`parallel-dispatch.md`** § SDD implement).
70
+ Paste-only Assignment **without** an invoke call is **not** dispatch. Anti-recursion NEVER: leaf executors are already `Execute as` — no recursive invoke of the same role; Assignment wins (`Delegation: forbidden` unless stated). Independent ready implementers may run concurrently after isolation; scheduling → **`parallel-dispatch.md`** § SDD implement.
71
71
 
72
72
  ZCode invoke shape (same turn):
73
73
 
@@ -119,10 +119,10 @@ Harness **dispatch** on ZCode = **one or more `Agent` tool calls** with correct
119
119
 
120
120
  Cannot emit required **N** → **`Blocked`**.
121
121
 
122
- ### SDD implement (serial)
122
+ ### SDD implement
123
123
 
124
- - **`Execution mode: sdd`**: one implementer **`Agent`** per task id (bare role id per C5, `general-purpose` fallback); task reviewer = new **`Agent`** with **Act as `code-reviewer`** (`subagent_type: "code-reviewer"`, `general-purpose` fallback; ZCode L2 review; not qc-specialist*), always with C5b prompt binding — no sticky resume unless host adds it later. Serial rule → **`parallel-dispatch.md`** § SDD implement.
125
- - **Never** multiple implementer Agents in one message for the same plan.
124
+ - **`Execution mode: sdd`**: one implementer **`Agent`** per task id (bare role id per C5, `general-purpose` fallback); task reviewer = new **`Agent`** with **Act as `code-reviewer`** (`subagent_type: "code-reviewer"`, `general-purpose` fallback; ZCode L2 review; not qc-specialist*), always with C5b prompt binding — no sticky resume unless host adds it later. Ready-task scheduling → **`parallel-dispatch.md`** § SDD implement.
125
+ - Independent ready implementers use isolated parallel tracks; never share a writable worktree or session.
126
126
 
127
127
  ## Clarify
128
128
 
@@ -81,7 +81,7 @@ Phase 5: PR merge-ready loop —— 至 mergeable + CI 全绿 + reviews resolved
81
81
  - 未知 → 读 `mstar-*`;仅 **`Blocked`**、secrets、不可逆范围缺口、branch metadata 缺失、或 Phase 5 多轮仍 blocked 时升级用户
82
82
  - 实际 Git ≠ `working_branch` → **同轮**更新 plan + snapshot + `execution_lease.working_branch`(如适用)
83
83
  - **跨 plan implement 并行安全闸**与 **integration merge 串行** → `references/phase-2-worktree-lease.md` §2.0 #5 /「Multi-plan parallelism」(**无论** `Worktree mode: waived`)
84
- - plan 内 SDD task **串行** — phase-2 reference §2.4、§2.5、`mstar-sdd` Continuous execution
84
+ - plan 内 SDD 独立 ready tasks **并行**,真实依赖与共享写目标串行 — phase-2 reference §2.4、§2.5、`mstar-sdd` Ready-task scheduling
85
85
  - **zero-residual(默认)**:单 plan QC findings 尽量当轮清干净;仅真 blocker 才 defer(须 Durable Roadmap)— 见 **`mstar-artifacts`** Findings cleanup modes
86
86
  - iteration 命令共享的 PM invariants / preflight / todos / STOP → **`references/command-shared-invariants.md`**
87
87
 
@@ -145,10 +145,10 @@ Phase 1 与 §1.6 须遵守 **`references/iteration-artifact-boundaries.md`**(
145
145
  派发机制 → **`mstar-dispatch-gates`**(specialist review-and-edit dispatch,**顺序链**)。PM **不得**将迭代 harness 文档 commit 到 `spec_integration_branch`,直到:
146
146
 
147
147
  1. **product-manager** → **architect** → **writing-specialist** 已按序 invoke 编辑 compass、plans、`{SPECS_DIR}/` 与 **`{ITERATION_DIR}/<iteration-id>/`** package(guides/specs,按需);**不得**在 start 链向 `{KNOWLEDGE_DIR}/` 新增
148
- 2. **writing-specialist** 完成 **corpus hygiene**:全库 `{SPECS_DIR}/` + 既有 `{KNOWLEDGE_DIR}/` 卫生;错放迁回 **`<iteration-id>/`** package;细则 → **`iteration-corpus-hygiene.md`**、**`iteration-artifact-boundaries.md`**
148
+ 2. **writing-specialist** 完成 **corpus hygiene**:仅本轮修改的 `{SPECS_DIR}/` / iteration package 与直接相关 knowledge 引用;错放迁回 **`<iteration-id>/`** package;细则 → **`iteration-corpus-hygiene.md`**、**`iteration-artifact-boundaries.md`**
149
149
  3. PM 将 compass `status` 设为 `locked`,并确认各 plan 的 Prepare gate(specify / clarify / plan)
150
150
 
151
- **顺序理由**:产品范围与优先级 → 架构与长期契约(specs)→ 行文、规格库卫生与错放纠正(须在 PM/architect 定稿后扫全库 specs)。并行会导致后手重复劳动或覆盖前手未定稿内容。OpenCode:plain role id — **`mstar-host/references/opencode.md`** § Role-mention hygiene。
151
+ **顺序理由**:产品范围与优先级 → 架构与长期契约(specs)→ 行文、规格库卫生与错放纠正(在 PM/architect 定稿后核对受影响文档)。本共享产物链存在真实依赖;独立文档可按 ownership 隔离并行。早期全局探索的既有结果复用,不因每次编辑重新扫全库。OpenCode:plain role id — **`mstar-host/references/opencode.md`** § Role-mention hygiene。
152
152
 
153
153
  **完成证据** = 磁盘上的 compass / plans / specs / iteration 文档修订 + specs(与既有 knowledge)卫生/归档(如有)+ 索引与 metadata 更新 + compass `status: locked`。**不**要求单独的迭代审查报告——迭代审查的 SSOT 是被编辑的文档本身,无 per-plan QC 式审计链。
154
154
 
@@ -149,14 +149,14 @@ mismatch → **STOP**.
149
149
  2. **Plan start — feature worktree + branch**:创建/校验 dedicated feature worktree(默认 `<repoRoot>/.worktrees/<plan-id>-<slug>`);Assignment 须含绝对 `Worktree path` + `Working branch`(与 lease 一致)。plan 内多可写并行轨 → **`mstar-branch-worktree`** **`references/parallel-writable-pre-dispatch.md`**
150
150
  3. **Implement → InReview**(产品编辑在 feature worktree;plans / snapshot / iterations / SDD 经 control 绝对路径):
151
151
  - **默认 `Execution mode: sdd`**(多 task plan;hotfix 可 `inline`)。
152
- - PM 载入 **`mstar-sdd`** 后,按 plan task 顺序 **串行** per-task 循环(**不是**一次派发 dev 做全部 tasks):
152
+ - PM 载入 **`mstar-sdd`** 后,按依赖与 ownership 派发 **独立 ready tasks 并行** 的 per-task 循环(**不是**一次派发 dev 做全部 tasks):
153
153
  1. `mstar sdd workspace <plan-id>` → `{SDD_DIR}`
154
154
  2. `mstar sdd task-brief <plan-file> N` → `{SDD_DIR}/task-N-brief.md`;记录 `BASE_SHA`
155
155
  3. Dispatch **one** implementer subagent(`references/implementer-prompt.md`:brief 路径 + report 路径 + `Model tier`;**禁止**贴整份 plan)
156
156
  4. Implementer `DONE` → `mstar sdd review-package BASE HEAD` → task diff 文件
157
157
  5. Dispatch **one** task reviewer subagent(brief + report + diff + Global Constraints)
158
158
  6. Fix loop 直至 review clean;append `{SDD_DIR}/progress.md`;更新 snapshot plan 行 / plan checkbox
159
- 7. Next task
159
+ 7. 放行已满足依赖的 next task;不等待无依赖任务,PM 独占共享 progress / snapshot 写入
160
160
  - 每次 Completion Report 后更新 snapshot(`workflows/<id>/snapshot.json`)+ 主 plan
161
161
  4. **QC → QA gate**(plan 保持 **`InReview`**;**保留** `execution_lease`):per-plan 审查链 → **`mstar-sdd`**(L1–L2)+ **`mstar-review-qc/references/review-responsibility-boundaries.md`**(L3 tri / inline 单席;raw reports in `{SDD_DIR}/review/`,durable summary in main plan/snapshot)+ **`QA gate`**(`mandatory` → `qa-engineer`;`pm-acceptance` → PM checklist)。**禁止**在 integration merge 成功前设 `Done` 或删除 `execution_lease`。
162
162
  5. **Plan complete — serial merge back**(§2.0 #5 未 waive):自 **control worktree** claim/resume snapshot 顶层 `integration_merge_lease` → 将 plan feature branch 合并入 `spec_integration_branch`(仅 merge-lease holder;细则 → 下方「Integration merge lease」)→ 记录 merge commit 证据 → 释放 merge lease;**同轮**设 `Done` 并删除 `execution_lease`。merge 失败:保持 `InReview` + 保留 lease,不得标 `Done`。
@@ -177,7 +177,7 @@ mismatch → **STOP**.
177
177
 
178
178
  | 规则 | 说明 |
179
179
  |------|------|
180
- | 串行 | 同一 plan 内 **one implementer at a time**;每 task 后 **one fresh task reviewer** |
180
+ | 并行 | 独立 ready tasks 各自 fresh implementer + 隔离 worktree;单一 canonical per-plan SDD root 内分离 task artifact 路径,context/progress 仅 PM 串行写;leaf 直接消费不可变绝对路径,不调用共享 context helper;每 task 后一位 fresh reviewer;真实依赖与 merge 串行(`mstar-sdd`) |
181
181
  | Sticky(可选) | Assignment **`SDD implementer session: sticky`** + `implementer-session.json`;implementer **resume**,reviewer **fresh** — `mstar-sdd/references/sticky-implementer-session.md` |
182
182
  | 文件交接 | brief / report / diff / `progress.md` 在 `{SDD_DIR}`;dispatch prompt **只给路径**,不贴 plan 全文或 task 历史 |
183
183
  | Assignment 字段 | 每个 implement dispatch 须含 `Execution mode: sdd`、`SDD dir`、`Model tier`;§2.0 #5 未 waive 时还须含绝对 `Worktree path` + verified `execution_lease`;**禁止**省略 `Model tier` |
@@ -13,16 +13,16 @@ description: "Morning Star QC orchestration — **SDD mandatory plan QC tri-revi
13
13
 
14
14
  ## L3 是什么(派发前对齐)
15
15
 
16
- - Plan QC seats are **reviewers**: whole-branch **diff / logic / risk** lenses — same family as PR review, not a parallel QA test lane.
16
+ - Plan QC seats are **reviewers**: assigned changed **diff / logic / risk** lenses and directly affected interfaces — same family as PR review, not a parallel QA test lane.
17
17
  - **Do not** instruct QC in Assignment to “run the suite / build / lint to confirm” on shared tri cwd; that causes peer `Blocked` and collapses L3 into L4.
18
- - Runtime proof stays with **implementer evidence** and **`QA gate`** (`qa-engineer` or PM acceptance).
18
+ - Runtime proof stays with scoped **implementer evidence** and **`QA gate`** (targeted unit evidence only). `full tri-review` describes seats, not full-repository review. Scope SSOT → **`mstar-harness-core`** § 定向执行与验证边界; QC never broadens exploration or repeats unchanged L2 evidence.
19
19
 
20
20
  ## 分派时机(与 plan / batch 对齐)
21
21
 
22
22
  - **`Execution mode: sdd`**:全部 task + L2 task reviewers 完成后 → **强制 tri-review**(`QC mode: full tri-review`,**N=3**)。Assignment 须含 **branch review-package** 路径与 `{SDD_DIR}/review/qcN.md` report paths。PM 汇总 `{SDD_DIR}/review/qc-consolidated.md` 并回写主 plan durable summary。
23
23
  - **`Execution mode: inline`**:单席 `qc-specialist` → `{SDD_DIR}/review/qc.md`(**N=1**),或按 hotfix 路由跳过。
24
24
  - **After `Request Changes` (default)**:**Targeted re-review** — PM dispatches only seats that **raised** blocking findings; each updates **the same** `{SDD_DIR}/review/qcN.md` (`## Revalidation`, update verdict). **Do not** spawn `qcN-rev2.md` for targeted re-review. Naming → **`mstar-artifacts/references/plan-files-and-reports.md`** § QC 三审触发时机.
25
- - **Full tri re-review (exception)**:Assignment **`QC re-review: full tri-review`** → new basenames (`qc1-rev2.md` …); PM marks **active wave** in consolidated decision.
25
+ - **Three-seat re-review**:only when all three seats have affected findings. `QC re-review: full tri-review` denotes seat count, never broader scope; each seat still checks its findings and fix delta. New wave basenames may distinguish reports, but do not reopen unchanged review coverage.
26
26
 
27
27
  > **Engine check (when available):** run `mstar review seats <assignment-file> [--mode sdd|inline|targeted] [--reviewers <role1,role2,...>]` (or `import { executionModeToN, assertTriIdentity } from "@mstar-harness/engine"` in a host hook) to map `Execution mode` to its QC seat count N above and assert tri identity. On `fail` -> do not proceed; fix and re-run. Skill text below remains authoritative when the runtime is absent.
28
28
 
@@ -55,7 +55,7 @@ Leaf reviewers apply verdict per **`mstar-roles/references/qc-specialist/report-
55
55
 
56
56
  ### 覆盖语义(未提及 = 未审查)
57
57
 
58
- - **未提及 = 未审查**:某 finding / severity 项 / 声明未被任何席位报告提及 → 不得在汇总中标记为已解决或通过;如实标注 `unreviewed`,按需转 targeted re-review 或补充席位。
58
+ - **未提及 = 未审查**:某 finding / severity 项 / 声明未被任何席位报告提及 → 不得在汇总中标记为已解决或通过;如实标注 `unreviewed`,仅对受影响项按需转 targeted re-review 或补充席位;不据此重审无关内容。
59
59
  - **汇总层零注入**:consolidated 中每条发现可溯源到某 `qcN.md`;PM 不得在汇总层引入席位报告之外的新声明(PM 自身观察走独立 Status Update,不混入 gate 决策输入)。
60
60
  - **Unconfirmed 传导**:任一席位 verdict = `Unconfirmed`(`report-template.md` 定义的证据通道失败态)→ gate 决策不得为 `Approve`——先补证据(重发 review-package / 修 diff 基线)再收敛;受影响席位走既有 targeted re-review 机制(同 `qcN.md` `## Revalidation` 原位更新 verdict),不新增 re-review 形态、不改 N 规则。
61
61
 
@@ -4,10 +4,10 @@
4
4
 
5
5
  | Layer | Who | When | Scope | Input |
6
6
  |-------|-----|------|-------|--------|
7
- | **L1** Implementer | dev subagent | Per task | Write code + **run** TDD / verification evidence | `task-N-brief.md` |
7
+ | **L1** Implementer | dev subagent | Per task | Write code + affected unit evidence; non-executable docs/policy may use `scoped-check` | `task-N-brief.md` |
8
8
  | **L2** Task reviewer | `code-reviewer` (default; generic fallback when the host agent list lacks it) — PM-dispatched subagent (SDD) | Per task, after implementer | Spec + quality for **one task** (diff-first; no full suite) | brief, report, **task-level** diff |
9
- | **L3** Plan QC tri (cross-review) | `qc-specialist` + `qc-specialist-2` + `qc-specialist-3` | After **all** tasks on branch | **Code-review seat** — diff, language/logic, security & contract lenses on **whole branch**; **not** the test-execution path | Branch `review-package` MERGE_BASE..HEAD |
10
- | **L4** QA | `qa-engineer` when **`QA gate: mandatory`**; else PM acceptance | After QC gate | DoD acceptance, residual verify, targeted/full **command** verification, Done recommendation | Review bundle + plan + **L1 evidence** + `status.json` |
9
+ | **L3** Plan QC tri (cross-review) | `qc-specialist` + `qc-specialist-2` + `qc-specialist-3` | After **all** tasks on branch | **Code-review seat** — diff, language/logic, security & contract lenses on **the assigned change and directly affected interfaces**; **not** the test-execution path | Branch `review-package` MERGE_BASE..HEAD |
10
+ | **L4** QA | `qa-engineer` when **`QA gate: mandatory`**; else PM acceptance | After QC gate | DoD acceptance, residual verify, named affected **unit-test** verification only, Done recommendation | Review bundle + plan + **L1 evidence** + `status.json` |
11
11
 
12
12
  PM sets **`QA gate`** per `mstar-roles/references/project-manager/qa-trigger-matrix.md`. L4 execution when dispatched → `mstar-roles/references/qa-engineer/acceptance-gate.md`.
13
13
 
@@ -18,15 +18,17 @@ PM sets **`QA gate`** per `mstar-roles/references/project-manager/qa-trigger-mat
18
18
  | Produce runnable test/build evidence | **L1** implementer | **Does not** own |
19
19
  | Diff / logic / vulnerability / contract review | **L3** QC (and L2 task reviewer) | **Primary job** |
20
20
  | Map DoD → evidence; re-run gaps; close residuals | **L4** QA (or PM acceptance) | **Does not** own |
21
- | Full / targeted test suites, builds, installs | **L1** and/or **L4** | **NEVER** — leave to QA/dev |
21
+ | Affected unit tests / evidence gaps | **L1** and/or **L4** | **NEVER** — consume evidence |
22
+ | Explicitly user-authorized full local suite | Separate bounded action by implementer/ops; core authorization contract | **NEVER** |
23
+ | Real browser / device / E2E | Explicit independent **`mstar-e2e`** workflow; ops executor | **NEVER**; not an L4 gate |
22
24
 
23
25
  **Why:** SDD plan QC is **N=3 parallel** on a **shared** `Review cwd`. Build/test/lint toolchains contend for caches and locks and falsely `Blocked` peer reviewers. QC is a **reviewer**, not a second QA lane.
24
26
 
25
- **SDD rule:** Layers L1–L2 run **per task** (serial). Layer L3 is **mandatory full tri-review** (`N=3`) whenever **`Execution mode: sdd`** — single-plan **and** iteration **and** multi-plan iteration. Layer L3 is **not** optional “final single review”.
27
+ **SDD rule:** Layers L1–L2 run **per task**; independent ready tasks use isolated parallel tracks (`mstar-sdd` § Ready-task scheduling). Layer L3 is **mandatory full tri-review** (`N=3`) whenever **`Execution mode: sdd`** — single-plan **and** iteration **and** multi-plan iteration. Layer L3 is **not** optional “final single review”.
26
28
 
27
29
  **Non-SDD (`Execution mode: inline`):** hotfix / single-stream — plan QC may be **single-seat** (`qc.md`) or skipped per PM routing.
28
30
 
29
- Per-task spec/quality is **done** in L2 before L3. QC seats do not re-derive each task from scratch; they cross-review the **whole branch** for gaps L2 could not see.
31
+ Per-task spec/quality is **done** in L2 before L3. QC seats do not re-derive each task from scratch; they review changed cross-task interfaces for gaps L2 could not see. Full tri denotes three seats, not full scope; do not repeat unchanged L2 work or survey the repository.
30
32
 
31
33
  ## Plan QC tri (SDD mandatory)
32
34
 
@@ -47,7 +49,7 @@ Per-task spec/quality is **done** in L2 before L3. QC seats do not re-derive eac
47
49
  | After | Fix dispatch |
48
50
  |-------|----------------|
49
51
  | Task review Critical/Important | Task fix subagent → task re-review (L2) |
50
- | Plan QC Critical/Important | **One** fix subagent with **complete** finding list → **targeted** QC re-review (listed seats) |
52
+ | Plan QC Critical/Important | Owned fix assignments, independent ones in parallel; PM retains complete ledger → **targeted** QC re-review (listed seats) |
51
53
 
52
54
  ## Minor findings
53
55
 
@@ -103,3 +103,5 @@ PM consolidated (tri mode): `{SDD_DIR}/review/qc-consolidated.md` (same folder;
103
103
 
104
104
  - 角色正文 → `references/<role>.md`(本 skill 内;leaf QC / QA 等子目录见 `references/qc-specialist/`、`references/qa-engineer/`)
105
105
  - 全局角色 → `mstar-harness-core` 加载矩阵与专题 skill 索引
106
+
107
+ - Explicit independent E2E/browser/device requests → `mstar-e2e` (PM orchestrates; `ops-engineer` executes; routine QA does not trigger it).
@@ -2,6 +2,15 @@
2
2
 
3
3
  > Shared by all leaf-executor role references in `mstar-roles/references/`. Each role file references this for the identical Completion Report template, repo-write Git discipline, the shared anti-recursion NEVER section, and plan/documentation rules. **Load selection follows the `mstar-roles` hub § Load Order** (Assignment `Skill presets:` decision): under explicit `none` this boundary plus the role identity carry the load-bearing semantics — no optional topic skill (including `mstar-harness-core`) is required, and `none` never grants delegation or waives gates. Whenever `mstar-harness-core` IS loaded (standard routes, PM rounds, direct topic invocation) it remains the global lifecycle/authority entry. Role-specific NEVER rules, mission, and responsibilities stay in each role file — this file holds only the uniform blocks.
4
4
 
5
+ ## Assignment scope boundary
6
+
7
+ Applies under every preset, including explicit `none`. Canonical policy when loaded: `mstar-harness-core` § 定向执行与验证边界.
8
+
9
+ - Execute only the assigned task, owned files, named checks and acceptance criteria. Read the supplied inputs and relevant knowledge; during implement/fix/QC/QA do not restart whole-repository exploration, review, or scans.
10
+ - Never run local full suites without explicit user authorization identifying the permitted scope; PM wording, risk, missing evidence, and fixes cannot supply it. Full suites belong to CI by default. Do not disguise a full suite as unrelated small checks.
11
+ - Reuse unaffected evidence; verify only changed behavior or the assigned finding/fix delta. QA executes targeted unit tests only; QC runs no test/build/install. Browser/device/E2E belongs to an explicitly requested independent workflow, never routine QA.
12
+ - Stop when the assigned result is evidenced. Do not over-analyze settled questions, invent extra checks, expand into downstream tasks, or repair unrelated findings. Report the concrete missing input/permission to PM if scope is insufficient; preserve completed work.
13
+
5
14
  ## Completion Report
6
15
 
7
16
  Every leaf executor returns this template (only `**Agent**` and content fields change per role):
@@ -23,6 +23,7 @@ If any item below matches, **stop** and return `Blocked` to `project-manager` in
23
23
  2. Deploy/runbook execution
24
24
  3. Monitoring/alerting integration
25
25
  4. Rollback and recovery readiness
26
+ 5. Separately requested E2E/browser/device verification — `mstar-e2e` (PM dispatch only; never inferred from routine QA).
26
27
 
27
28
  ## High-Risk Gate
28
29
 
@@ -44,6 +45,8 @@ When assignment is marked `high-risk`:
44
45
 
45
46
  ## Deliverable Template
46
47
 
48
+ For verification-only assignments, use `mstar-e2e` → `references/report-template.md` instead of the Deploy Plan below. The role does not require deployment, production changes, or rollback work when those actions are outside the assignment.
49
+
47
50
  ```markdown
48
51
  # Deploy Plan: <release/feature>
49
52