baxian 1.2.21 → 1.2.23

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 (46) hide show
  1. package/dist/agent/manager.d.ts +8 -0
  2. package/dist/agent/manager.d.ts.map +1 -1
  3. package/dist/agent/manager.js +311 -27
  4. package/dist/agent/manager.js.map +1 -1
  5. package/dist/agent/phase-signal-watcher.d.ts +6 -0
  6. package/dist/agent/phase-signal-watcher.d.ts.map +1 -1
  7. package/dist/agent/phase-signal-watcher.js +62 -0
  8. package/dist/agent/phase-signal-watcher.js.map +1 -1
  9. package/dist/agent/phase-signal.d.ts +4 -1
  10. package/dist/agent/phase-signal.d.ts.map +1 -1
  11. package/dist/agent/phase-signal.js +2 -1
  12. package/dist/agent/phase-signal.js.map +1 -1
  13. package/dist/agent/prompt.d.ts +2 -1
  14. package/dist/agent/prompt.d.ts.map +1 -1
  15. package/dist/agent/prompt.js +152 -278
  16. package/dist/agent/prompt.js.map +1 -1
  17. package/dist/agent/tmux.d.ts +1 -0
  18. package/dist/agent/tmux.d.ts.map +1 -1
  19. package/dist/agent/tmux.js +42 -10
  20. package/dist/agent/tmux.js.map +1 -1
  21. package/dist/api/projects.js +9 -2
  22. package/dist/api/projects.js.map +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/shared/constants.js +5 -5
  27. package/dist/shared/constants.js.map +1 -1
  28. package/dist/skill/registry.d.ts +2 -0
  29. package/dist/skill/registry.d.ts.map +1 -1
  30. package/dist/skill/registry.js +16 -0
  31. package/dist/skill/registry.js.map +1 -1
  32. package/dist/skills/baxian-greeting/SKILL.md +15 -0
  33. package/dist/skills/baxian-greeting/agents/openai.yaml +2 -0
  34. package/dist/skills/baxian-pr-feedback/SKILL.md +20 -3
  35. package/dist/skills/baxian-pr-recheck/SKILL.md +11 -11
  36. package/dist/skills/baxian-pr-review/SKILL.md +11 -11
  37. package/dist/skills/baxian-server-feedback/SKILL.md +38 -0
  38. package/dist/skills/baxian-server-feedback/agents/openai.yaml +2 -0
  39. package/dist/skills/baxian-server-review/SKILL.md +55 -0
  40. package/dist/skills/baxian-server-review/agents/openai.yaml +2 -0
  41. package/dist/skills/baxian-signals/SKILL.md +11 -5
  42. package/dist/skills/baxian-task-check/SKILL.md +35 -20
  43. package/dist/web/assets/index-B3nBJsTG.js +4 -0
  44. package/dist/web/index.html +1 -1
  45. package/package.json +1 -1
  46. package/dist/web/assets/index-C9dvXS8C.js +0 -4
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: baxian-greeting
3
+ description: One-time startup capability handshake. baxian force-loads this before assigning any task; emit the greeting signal per the baxian-signals skill to prove you can load skills and signal back through your pane.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ baxian force-loads this skill once, right after your REPL is ready and before any task is assigned. It verifies you can load a skill, reach the signal protocol, and signal baxian back through your pane.
8
+
9
+ Do exactly one thing: emit the `greeting` signal, following the **baxian-signals** skill for the wire format and emit rules.
10
+
11
+ ```
12
+ [bx:greeting:<token>]
13
+ ```
14
+
15
+ Substitute `<token>` with the value on the `token:` line of this message and emit the filled signal alone on its own line. Output nothing else.
@@ -0,0 +1,2 @@
1
+ policy:
2
+ allow_implicit_invocation: false
@@ -1,11 +1,15 @@
1
1
  ---
2
2
  name: baxian-pr-feedback
3
- description: Process review feedback on a PR Fixed/Won't fix each finding, create issues for out-of-scope items
3
+ description: Dev processes PR review feedback (fix phase) and the pre-merge feedback pass (post-approve) — fetch, judge, act, signal back.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
7
+ baxian dispatches you with a block of `key: value` dispatch fields. Work in `worktree:`; the PR is in `pr:`. Communicate via the GitHub PR; stay in scope (out-of-scope → new Issue). Route on `phase:`: `fix` → §Fix, `post-approve` → §Post-Approve.
8
+
7
9
  ## Fetch Feedback
8
10
 
11
+ Substitute `N` with your `pr:` field:
12
+
9
13
  ```bash
10
14
  gh api --paginate repos/OWNER/REPO/pulls/N/reviews
11
15
  gh api --paginate repos/OWNER/REPO/pulls/N/comments
@@ -25,6 +29,19 @@ For each actionable item:
25
29
 
26
30
  Reply to every item, including duplicates (reference primary). Thread inline comments.
27
31
 
28
- ## Fix Completion
32
+ ## Fix
33
+
34
+ QA requested changes on the PR in `pr:` (review round `round:`). Read all feedback (§Fetch Feedback), then handle every finding (§Decide and Act). If you change code, commit then push to your `branch:`: `git push origin HEAD:<branch>`. Emit your `signal:` (`pr-fixed`) with `token:` when done — even without a code push; baxian verifies work exists before routing to QA.
35
+
36
+ ## Post-Approve
37
+
38
+ QA already approved. Before merge, re-process PR feedback idempotently — handle every item per §Fetch Feedback and §Decide and Act, plus:
39
+
40
+ - Idempotency: compute `T_self` = your latest reply timestamp per source. Respond to EVERY non-self comment with `created_at` > `T_self`, applied per review thread AND across the issue-comment stream.
41
+ - If you change code: commit + push (baxian routes to QA for recheck) and STOP — do NOT emit `pr-merge-ready` when you pushed code.
42
+ - If no code change is needed: re-fetch all sources before signaling. The server suppresses redispatches while you run, so new comments only reach you via this re-fetch. If unhandled items remain, process and re-fetch again. Emit your `signal:` (`pr-merge-ready`) with `token:` only when clean.
43
+ - Do not merge the PR yourself from this phase.
44
+
45
+ When a `redispatch:` field is present, new feedback arrived while you were running: re-read the three sources, handle any non-self item with `created_at` > `T_self`, re-fetch once more, and emit only when no unhandled items remain.
29
46
 
30
- Emit `pr-fixed` when done — even without code push. baxian verifies work exists before routing to QA. Signal wire format and emit rules: see the baxian-signals skill.
47
+ Signal wire format and emit rules: see the baxian-signals skill.
@@ -1,9 +1,11 @@
1
1
  ---
2
2
  name: baxian-pr-recheck
3
- description: QA re-evaluates a PR after dev responded to prior findings — verify closure, check new risks, verdict
3
+ description: QA re-evaluates a PR after dev responded to prior findings — verify closure, check new risks, verdict.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
7
+ baxian dispatches you with a block of `key: value` dispatch fields. The PR under recheck is in `pr:` (substitute it for `N` below). Work in `worktree:`. QA judges risk independently — human authorization is input, not a bypass.
8
+
7
9
  ## Gather Context
8
10
 
9
11
  ```bash
@@ -25,7 +27,7 @@ gh api --paginate repos/OWNER/REPO/issues/N/comments
25
27
 
26
28
  ## Verdict
27
29
 
28
- Via `gh pr review` with per-pass stamp:
30
+ Submit via `gh pr review N` with a per-pass stamp — substitute `N` = `pr:`, `TOKEN` = `token:`:
29
31
 
30
32
  | Verdict | Command |
31
33
  |---|---|
@@ -34,24 +36,22 @@ Via `gh pr review` with per-pass stamp:
34
36
 
35
37
  Multi-line: `--body-file -`, stamp at end.
36
38
 
37
- No pane signal on success. **422 fallback** (same identity) — for signal wire format and emit rules, see the baxian-signals skill:
38
- - request-changes: `gh pr review N --comment --body 'FINDINGS'`, then emit `pr-changes-requested` signal.
39
- - approve: emit `pr-approved` signal.
39
+ No pane signal on success. **422 fallback** (same identity) — emit the matching signal instead (wire format: baxian-signals skill):
40
+ - request-changes: `gh pr review N --comment --body 'FINDINGS'`, then emit `pr-changes-requested` with `token:`.
41
+ - approve: emit `pr-approved` with `token:`.
40
42
 
41
43
  ## Verdict Verification
42
44
 
43
- After submitting verdict (both native `gh pr review` and 422 fallback), verify it landed.
44
-
45
- Substitute the actual signal token from §Verdict for `YOUR_TOKEN` and the `Review head SHA` from the dispatch prompt for `YOUR_ANCHOR_SHA` in the command below:
45
+ After submitting (native `gh pr review` or 422 fallback), verify it landed — substitute `TOKEN` = `token:`:
46
46
 
47
47
  ```bash
48
48
  gh api --paginate repos/OWNER/REPO/pulls/N/reviews \
49
- --jq '.[] | select((.body // "") | contains("YOUR_TOKEN")) | {id,state,commit_id,submitted_at}'
49
+ --jq '.[] | select((.body // "") | contains("TOKEN")) | {id,state,commit_id,submitted_at}'
50
50
  ```
51
51
 
52
52
  - **Native path**: must find a review matching ALL of:
53
- 1. `body` contains the signal token
53
+ 1. `body` contains the token
54
54
  2. `state` is `APPROVED` or `CHANGES_REQUESTED`
55
- 3. `commit_id` equals the Review head SHA (skip this check if the dispatch prompt says the SHA is unavailable)
55
+ 3. `commit_id` equals your `anchor-sha:` field (skip this check when `anchor-sha:` is absent)
56
56
  - **422 fallback path**: native review won't exist — verify the pane signal was emitted instead. Do NOT claim a GitHub native review was submitted.
57
57
  - If verification fails, report: "verdict 未落到 GitHub,需人工检查" and do NOT claim completion.
@@ -1,9 +1,11 @@
1
1
  ---
2
2
  name: baxian-pr-review
3
- description: QA performs a full independent pull request review — findings, verdict, approval
3
+ description: QA performs a full independent pull request review — gather context, findings, verdict, verification.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
7
+ baxian dispatches you with a block of `key: value` dispatch fields. The PR under review is in `pr:` (substitute it for `N` below). Work in `worktree:`. QA judges risk independently — human authorization is input, not a bypass.
8
+
7
9
  Source of truth: PR, commits, comments, checks, issues.
8
10
 
9
11
  ## Gather Context
@@ -30,7 +32,7 @@ Inline comments on smallest relevant range. Concrete evidence + expected fix. Do
30
32
 
31
33
  ## Verdict
32
34
 
33
- Via `gh pr review` with per-pass stamp:
35
+ Submit via `gh pr review N` with a per-pass stamp — substitute `N` = `pr:`, `TOKEN` = `token:`:
34
36
 
35
37
  | Verdict | Command |
36
38
  |---|---|
@@ -39,24 +41,22 @@ Via `gh pr review` with per-pass stamp:
39
41
 
40
42
  Multi-line: `--body-file -`, stamp at end.
41
43
 
42
- No pane signal on success. **422 fallback** (same identity) — for signal wire format and emit rules, see the baxian-signals skill:
43
- - request-changes: `gh pr review N --comment --body 'FINDINGS'`, then emit `pr-changes-requested` signal.
44
- - approve: emit `pr-approved` signal.
44
+ No pane signal on success. **422 fallback** (same identity) — emit the matching signal instead (wire format: baxian-signals skill):
45
+ - request-changes: `gh pr review N --comment --body 'FINDINGS'`, then emit `pr-changes-requested` with `token:`.
46
+ - approve: emit `pr-approved` with `token:`.
45
47
 
46
48
  ## Verdict Verification
47
49
 
48
- After submitting verdict (both native `gh pr review` and 422 fallback), verify it landed.
49
-
50
- Substitute the actual signal token from §Verdict for `YOUR_TOKEN` and the `Review head SHA` from the dispatch prompt for `YOUR_ANCHOR_SHA` in the command below:
50
+ After submitting (native `gh pr review` or 422 fallback), verify it landed — substitute `TOKEN` = `token:`:
51
51
 
52
52
  ```bash
53
53
  gh api --paginate repos/OWNER/REPO/pulls/N/reviews \
54
- --jq '.[] | select((.body // "") | contains("YOUR_TOKEN")) | {id,state,commit_id,submitted_at}'
54
+ --jq '.[] | select((.body // "") | contains("TOKEN")) | {id,state,commit_id,submitted_at}'
55
55
  ```
56
56
 
57
57
  - **Native path**: must find a review matching ALL of:
58
- 1. `body` contains the signal token
58
+ 1. `body` contains the token
59
59
  2. `state` is `APPROVED` or `CHANGES_REQUESTED`
60
- 3. `commit_id` equals the Review head SHA (skip this check if the dispatch prompt says the SHA is unavailable)
60
+ 3. `commit_id` equals your `anchor-sha:` field (skip this check when `anchor-sha:` is absent)
61
61
  - **422 fallback path**: native review won't exist — verify the pane signal was emitted instead. Do NOT claim a GitHub native review was submitted.
62
62
  - If verification fails, report: "verdict 未落到 GitHub,需人工检查" and do NOT claim completion.
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: baxian-server-feedback
3
+ description: Dev responds to QA's server-review findings (response.json) and publishes the reviewed branch (server-after-done). Covers code findings, spec findings, and publish.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ baxian dispatches you with a block of `key: value` dispatch fields. Work in `worktree:`. Route on `phase:`: `server-feedback` → §Feedback, `server-after-done` → §Publish.
8
+
9
+ ## Feedback
10
+
11
+ QA's findings ride in the `findings:` block. Judge each finding independently — QA can be wrong; fix only what is actually correct, otherwise reject. Handle EVERY finding by id. The `feedback:` field is `code` or `spec`.
12
+
13
+ Do NOT push to any remote and do NOT open a PR in this phase — baxian reads your worktree directly; publishing is deferred to the `server-after-done` phase.
14
+
15
+ For each finding:
16
+ - `fix` — `feedback: code` → change the code (or spec), commit, include the `commitSha` in your response item. `feedback: spec` → revise `.baxian/spec.md` in place. Do NOT commit or push it — baxian reads the file directly.
17
+ - `reject` — concrete rationale why the finding is wrong or not applicable. Never reject just to save effort.
18
+ - `out-of-scope` — rationale plus where it is tracked (issue link or task note).
19
+
20
+ Write your response to `.baxian/review/response.json` in YOUR worktree (`mkdir -p .baxian/review` first). Atomic write: write `response.json.tmp` first, then `mv response.json.tmp response.json`.
21
+
22
+ Schema — substitute `<round>` with your `round:` field:
23
+
24
+ ```json
25
+ {"round":<round>,"responses":[{"findingId":"f-1","action":"fix"|"reject"|"out-of-scope","rationale":"..."}]}
26
+ ```
27
+
28
+ Code-finding responses also carry `"commitSha":"..."` on every `fix`. Spec-finding responses omit `commitSha`. Every finding id MUST have exactly one response item (ids may look like `b0-f-1` when the review was batched).
29
+
30
+ Then emit your `signal:` (`code-fixed` or `spec-fixed`) with `token:`.
31
+
32
+ ## Publish
33
+
34
+ Publish the reviewed `branch:`:
35
+ - `publish: pr` — `git push -u origin <branch>`, open a managed PR (`gh pr create`; the body MUST end with the `<!-- baxian:managed -->` marker or baxian ignores the PR's merge/comment events; ready for review, not Draft). Emit `code-ready` carrying the new PR number: `[bx:code-ready:<pr_number>:<token>]`.
36
+ - `publish: branch` — `git push -u origin <branch>`, then emit `code-ready` with `token:`.
37
+
38
+ Signal wire format and emit rules: see the **baxian-signals** skill.
@@ -0,0 +1,2 @@
1
+ policy:
2
+ allow_implicit_invocation: false
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: baxian-server-review
3
+ description: QA reviews injected server-review content (a code diff or a spec doc) — judge against the task spec, write findings.json with a verdict. Covers code review, recheck closure, and spec review.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ baxian dispatches you with a block of `key: value` dispatch fields; the review input rides in trailing blocks — `diff:` (code) or `spec:` (spec review), plus `prior-findings:` / `prior-response:` on a recheck. Do NOT fetch branches or use `gh` — those blocks ARE the review input. Work in `worktree:`. QA judges risk independently — human authorization is input, not a bypass. If a `content: truncated` field is present, request the missing context via the read-file side-channel.
8
+
9
+ Route on `phase:`: `server-review` → §Code Review; `server-recheck` → §Code Review + §Recheck Closure; `server-spec-review` → §Spec Review.
10
+
11
+ ## Code Review
12
+
13
+ Judge the `diff:` block against the task spec: correctness, tests, edge cases, security, regressions.
14
+
15
+ - Severity: `critical` = broken/unsafe, `major` = must fix before merge, `minor` = improvement.
16
+ - Reference file + line for every code finding.
17
+ - For unchanged files, read them directly from your own base-branch worktree; use the read-file side-channel only for content not present locally.
18
+
19
+ ## Recheck Closure
20
+
21
+ The `prior-findings:` and `prior-response:` blocks carry the earlier findings and the dev response. Close them out before judging anything new.
22
+
23
+ - Resolve the status of EVERY prior finding first.
24
+ - A finding the dev claims fixed → verify it in the new diff. No "fixed" without evidence.
25
+ - A finding the dev rejected / called out-of-scope → judge the rationale on merit; re-raise it with concrete counter-evidence if it is wrong.
26
+ - Any prior finding NOT closed reappears in `findings.json` with its ORIGINAL id and the evidence restated — do not renumber or drop it.
27
+ - Verdict `approve` ONLY when every prior finding is closed AND the new diff is clean. An unresolved finding may not be downgraded to a minor suggestion to justify approve — otherwise `request-changes`.
28
+ - After closure, scan the new diff for regressions AND for behavior the fixes introduced that lacks test coverage.
29
+
30
+ ## Spec Review
31
+
32
+ Judge the `spec:` block:
33
+
34
+ - completeness — every requirement covered, interfaces and data flows defined, error paths specified.
35
+ - correctness — internally consistent, no contradicting sections, feasible against the existing codebase.
36
+ - ambiguity — any requirement readable two ways is a finding.
37
+
38
+ Need a referenced file or codebase section to judge feasibility? Use the read-file side-channel. When `prior-findings:` / `prior-response:` blocks are present, verify every finding is closed before judging the rest of the spec.
39
+
40
+ ## Findings Output
41
+
42
+ Write findings to `.baxian/review/findings.json` in YOUR worktree (`mkdir -p .baxian/review` first). Atomic write: write `findings.json.tmp` first, then `mv findings.json.tmp findings.json`.
43
+
44
+ Schema — substitute `<round>` with your `round:` field:
45
+
46
+ ```json
47
+ {"round":<round>,"verdict":"approve"|"request-changes","findings":[{"id":"f-1","severity":"critical"|"major"|"minor","message":"...","file":"path","line":N}]}
48
+ ```
49
+
50
+ Spec-review findings use `"location":"Section ..."` in place of `"file"`/`"line"`.
51
+
52
+ - Finding ids are `f-1`, `f-2`, … sequential and unique within `findings.json` — the dev coverage check and QA closure verification key off them.
53
+ - `approve` MAY carry minor findings as suggestions; the `verdict` field is authoritative.
54
+
55
+ Then emit your `signal:` (`code-reviewed` or `spec-reviewed`) with `token:`. Signal wire format and the read-file side-channel: see the **baxian-signals** skill.
@@ -0,0 +1,2 @@
1
+ policy:
2
+ allow_implicit_invocation: false
@@ -18,22 +18,28 @@ baxian scans the pane fuzzily (strips ANSI escapes and whitespace), so a TUI sof
18
18
 
19
19
  ## How to emit
20
20
 
21
- The dispatch prompt hands you a template with placeholders plus the literal values on companion lines:
21
+ The dispatch descriptor names the signal kind in a signal field and the token in `token:`. The default completion is `signal:`; some phases also expose an alternate field for an optional branch (e.g. `spec-signal:` on develop's SDD route). Your phase skill's flow tells you which field applies — emit the one for the route you took, never both:
22
22
 
23
23
  ```
24
- [bx:pr-fixed:<token>]
24
+ signal: pr-fixed
25
25
  token: a1b2c3d4e5f6
26
26
  ```
27
27
 
28
- 1. Substitute `<token>` with the value on the `token:` line. `<pr_number>` (only `pr-created`, and `code-ready` when publishing as a PR) is the number of the PR you just created/opened with `gh pr create` — the dispatch prompt carries no PR-number line.
28
+ 1. Build the wire form `[bx:KIND:TOKEN]` from the field your skill's flow selects — KIND = that field's value (the `signal:` value by default, or an alternate like `spec-signal:`), TOKEN = the `token:` value — and emit it filled. `<pr_number>` (only `pr-created`, and `code-ready` when publishing as a PR) is the number of the PR you just created/opened with `gh pr create` — the descriptor carries no PR-number field.
29
29
  2. Emit the filled signal **alone on its own line**.
30
- 3. **Never echo the `<…>` placeholder verbatim** — the scanner's strict regex cannot match angle-bracket placeholders, so a verbatim template echo fires nothing and the task hangs forever waiting on a signal.
31
- 4. Emit the kind the prompt asks for, **exactly once**, only when its precondition holds. baxian consumes the first matching signal whose token matches the active dispatch; the token rotates every dispatch, so a stale or guessed token never fires.
30
+ 3. **Never emit an angle-bracket placeholder** like `[bx:pr-fixed:<token>]` verbatim — the scanner's strict regex cannot match placeholders, so it fires nothing and the task hangs forever waiting on a signal.
31
+ 4. Emit the single kind your phase skill's flow selects, **exactly once**, only when its precondition holds. baxian consumes the first matching signal whose token matches the active dispatch; the token rotates every dispatch, so a stale or guessed token never fires.
32
32
 
33
33
  ## Signal catalog
34
34
 
35
35
  Phase signals — the per-dispatch transition signals baxian consumes to advance a task. The dispatch prompt always names which one to emit and when.
36
36
 
37
+ Bootstrap handshake (before any task):
38
+
39
+ | Signal | Meaning |
40
+ |---|---|
41
+ | `greeting` | one-time capability check at agent startup; prove you can load this skill and signal back. baxian holds the agent until it sees a valid `greeting` echo |
42
+
37
43
  GitHub PR flow:
38
44
 
39
45
  | Signal | Meaning |
@@ -1,35 +1,50 @@
1
1
  ---
2
2
  name: baxian-task-check
3
- description: How to analyze a baxian-managed task before starting development
3
+ description: How a dev analyzes and executes a baxian-managed develop/code task read the structured prompt, plan, run the develop or code flow, signal back.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
7
- Before writing any code, read the task in your prompt the `Phase:` / `Role:` header followed by the `Title:` line and its description.
7
+ baxian dispatches you with a block of `key: value` dispatch fields followed by the task `title:` and its description. Work in the directory named by `worktree:` cd there before any file operation. Route on `phase:`: `develop` → §Develop, `code` → §Code.
8
8
 
9
- ## Steps
10
- 1. Read the prompt's `Title:` line and description — the authoritative task source (no `.baxian/task.md` file).
11
- 2. Identify acceptance criteria.
12
- 3. Plan: files to modify, tests to write.
9
+ If an `images:` list is present, read each path (baxian downloaded the user's uploads to the agent host) and factor them into the task.
13
10
 
14
- ## What to look for
15
- - Explicit vs implied requirements
16
- - Edge cases
17
- - File/function references
18
- - Linked docs, screenshots, specs
11
+ ## Analyze
19
12
 
20
- ## When to ask vs. proceed
13
+ 1. Read `title:` and the description — the authoritative task source (no `.baxian/task.md` file).
14
+ 2. Identify acceptance criteria, explicit vs implied requirements, edge cases, file/function references, linked docs/specs.
15
+ 3. Plan the files to modify and the tests to write.
16
+
17
+ When to ask vs proceed:
21
18
  - Clear → start.
22
- - Missing info + PR exists record in PR description.
23
- - Missing info + no PR → pick reasonable interpretation, write assumption after `<!-- baxian:managed -->` marker (marker MUST be line 1), or create task if blocked.
24
- - Minor ambiguity → proceed, note in PR.
25
- - Always record assumptions (PR, task, or commit message).
19
+ - Minor ambiguity proceed, record the assumption (PR description, task note, or commit message).
20
+ - Blocked → pick a reasonable interpretation and record it after the `<!-- baxian:managed -->` marker (marker MUST be line 1), or create a task if truly blocked.
21
+
22
+ ## Conventions
23
+
24
+ Your `exchange:` field selects the cross-agent medium:
25
+ - `github-pr` — communicate via the GitHub PR (description, commits, reviews, comments). A managed PR's description first line MUST be `<!-- baxian:managed -->`. Stay in scope — out-of-scope work goes to a new GitHub Issue.
26
+ - `server-files` — baxian reads your worktree directly; do NOT push or open a PR (the publish phase does that). Stay in scope.
27
+
28
+ A PR you open MUST be ready for review (not Draft): do NOT use `--draft`; if it is draft after creation, run `gh pr ready` before signaling.
29
+
30
+ ## Develop
31
+
32
+ Two mutually-exclusive routes — pick ONE and emit only its signal:
33
+
34
+ - **SDD** (only when a `spec-signal:` field is present, i.e. a QA partner exists) — get your design reviewed first: follow §Specification-Driven Development, then emit `spec-signal:` (`spec-done`) with `token:`. Do NOT emit the default `signal:` on this route — that would skip spec review and push an unimplemented task forward. After QA approves the spec, baxian dispatches the code phase. Use SDD when the design is non-trivial; skip it when the change is small or unambiguous.
35
+ - **Direct** — implement the change, then emit `signal:` with `token:`: `exchange: github-pr` → after `gh pr create` (ready for review), emit `pr-created`; `exchange: server-files` → after a local commit (do NOT push), emit `code-done`.
36
+
37
+ ## Code
38
+
39
+ The spec is approved at `.baxian/spec.md`. Implement it, then emit your `signal:` with `token:`:
40
+ - `exchange: github-pr` → commit + push, `gh pr create` (ready for review), emit `pr-created`.
41
+ - `exchange: server-files` → local commit only (do NOT push, no PR), emit `code-done`.
26
42
 
27
43
  ## Specification-Driven Development (SDD)
28
44
 
29
- Optional, and offered only when the dispatch prompt gives you a `spec-done` signal (a QA partner exists). Use it to have QA review your design before you write code.
45
+ Use it to have QA review your design before you write code.
30
46
 
31
47
  - Write the spec to `.baxian/spec.md` in your worktree. Do NOT commit or push it — baxian reads the file directly for QA review.
32
- - Then emit the `spec-done` signal the prompt gives you (with its token). Signal wire format and emit rules: see the baxian-signals skill.
33
- - Skip it and implement directly when the change is small or the design is unambiguous.
48
+ - Then emit the `spec-signal:` (`spec-done`) with `token:`.
34
49
 
35
- After QA approves the spec, baxian dispatches the code phase to implement it.
50
+ Signal wire format and emit rules: see the baxian-signals skill.