What:新增 tools/stage-report.sh 與 references/stage-report.md,四支階段技能各加一步收尾回報:模型能力標籤判定、工作日誌連結、所有寫入的 wiki 連結;實作階段再加工作目錄與來源、工作、目標三條分支。 Why:階段跑完該交代什麼是固定的,寫在內文靠模型自己記,少一項看不出來。沒寫工作日誌更是如此——內容只留在對話裡,換一個工作階段就沒了。 How:彙整搬到程式層。頁名換絕對網址、commit 數與推送狀態由 git 現查、來源分支在不在遠端也由腳本判定;模型閘門那一列只轉述 sdlc-gate.sh report,不自評。沒有工作日誌就警告使用者檢查,並把內容交給 jsc-log 的暫存區,下次寫日誌一併寫入。結束碼 1 是警告不是阻擋,提前停下來也要回報。 Who:跑 SDLC 四階段的人,以及接手看紀錄的人。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
10 KiB
name, description
| name | description |
|---|---|
| analyze | SDLC analysis stage. Gate on capability tags enforced in code by sdlc-gate (analyze requires reasoning-max), confirm the source branch, then pick a plan from PLAN_CONTENTS and question until consensus per references/consensus.md. Analyze its user stories against the current state (working directory plus REPO_{HASH} inventory for reuse), then run WBS with a standalone delivery/handover WP-01, CPM estimates and TDD todos. Write wiki page ANALYZE_{HASH} with real sample data, then close with tools/stage-report.sh - model tag verdict, worklog link, every wiki link written; logic only - never write code or modify files. Use after planning and before implementation; not for writing code (that is implement), and not before a plan exists in PLAN_CONTENTS. |
analyze
Goal: create or extend the wiki analysis page ANALYZE_{HASH}.
This skill is a logic-only stage: never output code, and never modify any file.
{HASH} = the shared wiki hash for {owner}/{repo} used to build the ANALYZE_{HASH} page name, computed by jsc-gitea/tools/hash-id (see jsc-gitea:wiki).
All wiki reads and writes go through jsc-gitea:wiki.
Steps
-
Model gate and stage lock — run
jsc-cli/tools/model-tags.sh sync, thenjsc-hooks/hooks/sdlc-gate.sh lock analyze. This stage requires thereasoning-maxcapability tag. Rules:references/model-gate.md. Completion condition: the script exited 0, and you have reported the stage, the required tag, the actual model id it read from the transcript, and the verdict. -
Confirm the source branch — the branch whose code counts as the current state:
- Run
git fetch --prune originfirst — without it, everyorigin/...reference is stale cache. Then report the working directory's current branch, the remote branches available (git branch -r; nevergit branch) and whether the working tree is clean. - Ask per
jsc-ask:askrules which branch the analysis reads from; state the impact scope on every option (analysing the wrong branch produces work packages for code that does not exist). - The current state is always the remote branch
origin/{source-branch}, never the local one. The working directory's HEAD must point at the same commit asorigin/{source-branch}; behind, ahead or diverged all mean you would be analysing code that is not what the remote holds. Report the gap (git rev-list --left-right --count origin/{source-branch}...HEAD) and stop — this stage never switches branches, never stashes, never pulls and never touches the working tree. Rules inreferences/branch.md. - Record the confirmed branch and the head sha of
origin/{source-branch}on the analysis page. Completion condition: the user has confirmed the branch explicitly; never infer it from the current checkout alone.
- Run
-
Read
PLAN_CONTENTSviajsc-gitea:wikifor plans whose status is the literal 「未分析」 (name and HASH), and readANALYZE_CONTENTSfor existing analyses. Completion condition: you have listed every 未分析 plan with its name and HASH plus every existing analysis, or reported that a list is empty. -
Let the user choose per
jsc-ask:askrules: extend an existing analysis or analyze a new plan. State the impact scope on every option. Completion condition: the user has picked one option explicitly, and you have named the target — the existingANALYZE_{HASH}page, or the plan the new analysis covers. -
Analyze the plan page's user stories one by one against the current state, questioning until consensus per
references/consensus.md(the single authority for both planning and analysis): every answer produces the next question, and consensus needs both no output-changing unknown and the user's explicit confirmation. Never assume a missing detail, and never start the WBS while any item is still open. Current state means:- Every file in the working directory, at the commit
origin/{source-branch}points to (verified in step 2). - Reuse an existing method or endpoint unless its logic cannot satisfy the requirement:
- Check the
REPO_{HASH}inventory page first. Re-inventory when the feature or endpoint is missing, or when the recorded commit sha differs from the current one. - Re-inventory MUST run as a sub agent: analyze the repository's features and endpoints, attach the current commit sha, write back to
REPO_{HASH}withtemplates/repo-page.md, and updateREPO_CONTENTSpertemplates/repo-contents.md. - For each reuse candidate, confirm the file path and method name first, then analyze whether its logic fits the requirement. Reject a candidate only for a stated reason, and record both the candidate and that reason in the analysis page's 複用決策 field.
- Check the
Completion condition: every user story has reached consensus under both conditions of
references/consensus.md, and every reuse decision — reused, or rejected with its reason — is recorded in 複用決策. - Every file in the working directory, at the commit
-
Run a Work Breakdown Structure (WBS): split the user stories into work packages, number them sequentially (
WP-01,WP-02, ...) and mark dependencies. Completion condition: every user story on the plan page maps to at least one numbered work package, and every dependency edge is recorded in the WBS table's 相依 column. -
WP-01is always the delivery/handover work package — see "Delivery package is WP-01" below. It stands alone, never merged into an implementation package, and every implementation package that consumes its spec depends on it. Completion condition:WP-01is marked 交付是and holds only spec-shaped items, and every implementation package that consumes its spec namesWP-01in its 相依 column — or the no-handover case below is confirmed with the user and its reason is written on the page. -
Estimate every work package's effort in hours and days with the Critical Path Method (CPM), and mark the critical path. Completion condition: every work package carries an hours figure and a days figure, and the critical path plus its total days are written on the page.
-
Split every work package into todos with Test-Driven Development (TDD), formatted
[ ](open) /[x](done). Each todo is one vertical slice: one seam, one test, one minimal implementation. Seams and anti-patterns:references/tdd.md. Completion condition: every work package carries at least one[ ]todo, and every todo names its seam and the behaviour its test asserts. -
Apply
templates/analyze-page.mdto create or update the analysis page and write it back viajsc-gitea:wiki. The page content is Traditional Chinese, exactly as the template dictates. Completion condition: the page is saved on the wiki and carries every section the template dictates, including the source branch, the head sha and the 未決項 section (「無」 when there is none). -
If the analysis page is new: add it to
ANALYZE_CONTENTSpertemplates/analyze-contents.md, and flip the plan's status inPLAN_CONTENTSto the literal 「已分析」. Completion condition:ANALYZE_CONTENTSshows the new row andPLAN_CONTENTSshows the literal 「已分析」, both saved on the wiki. -
Stage report — the last thing this stage does, including every early stop (the model gate blocked, the working tree did not match
origin/{source-branch}, no plan was selectable). Runtools/stage-report.sh analyzewith one--page TYPE:{page}per wiki page this run wrote —ANALYZE_{HASH},ANALYZE_CONTENTS,PLAN_CONTENTS, andREPO_{HASH}plusREPO_CONTENTSwhen a re-inventory happened — plus--worklogand--worklog-headingwhen a work log entry exists. No work log yet: write this stage's log content to a file and pass--pending-file {file} --log-hash {HASH}so it is held for the nextjsc-log:worklogrun. Rules and exit codes:references/stage-report.md. Exit 1 is a warning, never a block. Completion condition: the script's output is reported to the user verbatim, and every wiki page this run wrote appears in it.
Delivery package is WP-01
A work package is a delivery/handover package when someone else — another person, another CLI, another team — has to act on its output. Interfaces, schemas, spec documents, acceptance criteria and sample payloads are delivery output; endpoint bodies and UI wiring are not.
WP-01is the delivery/handover package, always first, always standalone. Pull every spec-shaped item out of the implementation packages and put it here. Never merge a spec into the package that implements it — merging removes the ability to hand the spec over early, which is the whole point.- Implementation packages depend on
WP-01when they consume its spec, and they are the backup queue: still numbered, still estimated, still on the page, just ranked after it. - Mark every work package as 交付
是/否in the WBS table, and recordWP-01's intended content type in the 交付型別 column when the user has already decided it (options inreferences/deliver-formats.md; the type is confirmed for real whenimplementstarts that package). - Dependencies still win among the rest: never place a package before one it depends on. Within the same dependency level, delivery-shaped packages come first.
- When nothing is genuinely deliverable (say, an internal refactor with no interface change), do not invent an empty
WP-01: confirm with the user perjsc-ask:askthat this analysis has no handover output, then note the reason on the page and number the implementation packages fromWP-01.
Sample data
Every sample value on the analysis page — request and response payloads, field values, config snippets, test fixtures — follows references/deliver-formats.md, which owns the source order, the labelling and the API-document layout. Record each value's origin in the WBS table's 資料來源 column. Completion condition: every sample value on the page carries a 資料來源 label of either 「真實:{source}」 or 「推論:無來源」, and no sample value contains personal data.
Hard limits
- Never output a code snippet (file paths and method names are allowed).
- Never modify any file in the working directory.
- Never switch, create or clean branches in this stage; ask the user to do it.