okstra 0.123.0 โ†’ 0.125.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +1 -0
  2. package/docs/architecture/storage-model.md +3 -1
  3. package/docs/architecture.md +16 -2
  4. package/docs/cli.md +3 -1
  5. package/docs/for-ai/README.md +41 -35
  6. package/docs/for-ai/skills/okstra-brief-gen.md +105 -105
  7. package/docs/for-ai/skills/okstra-container-build.md +61 -61
  8. package/docs/for-ai/skills/okstra-graphify.md +64 -0
  9. package/docs/for-ai/skills/okstra-inspect.md +87 -86
  10. package/docs/for-ai/skills/okstra-manager.md +32 -32
  11. package/docs/for-ai/skills/okstra-memory.md +49 -50
  12. package/docs/for-ai/skills/okstra-pr-gen.md +48 -0
  13. package/docs/for-ai/skills/okstra-rollup.md +58 -58
  14. package/docs/for-ai/skills/okstra-run.md +95 -95
  15. package/docs/for-ai/skills/okstra-schedule-gen.md +106 -106
  16. package/docs/for-ai/skills/okstra-setup.md +63 -64
  17. package/docs/for-ai/skills/okstra-user-response.md +48 -0
  18. package/docs/performance-improvement-plan-v2.md +6 -6
  19. package/docs/pr-template-usage.md +34 -34
  20. package/docs/project-structure-overview.md +91 -70
  21. package/docs/task-process/README.md +33 -33
  22. package/docs/task-process/common-flow.md +26 -26
  23. package/docs/task-process/error-analysis.md +20 -21
  24. package/docs/task-process/final-verification.md +41 -41
  25. package/docs/task-process/implementation-planning.md +33 -33
  26. package/docs/task-process/implementation.md +38 -38
  27. package/docs/task-process/release-handoff.md +46 -46
  28. package/docs/task-process/requirements-discovery.md +22 -23
  29. package/package.json +1 -1
  30. package/runtime/BUILD.json +2 -2
  31. package/runtime/agents/workers/antigravity-worker.md +4 -4
  32. package/runtime/agents/workers/claude-worker.md +2 -2
  33. package/runtime/agents/workers/codex-worker.md +4 -4
  34. package/runtime/agents/workers/report-writer-worker.md +4 -4
  35. package/runtime/bin/lib/okstra/usage.sh +1 -1
  36. package/runtime/prompts/coding-preflight/frameworks/node-server.md +1 -1
  37. package/runtime/prompts/launch.template.md +1 -1
  38. package/runtime/prompts/lead/convergence.md +10 -20
  39. package/runtime/prompts/lead/okstra-lead-contract.md +15 -17
  40. package/runtime/prompts/lead/plan-body-verification.md +18 -18
  41. package/runtime/prompts/lead/report-writer.md +46 -44
  42. package/runtime/prompts/lead/team-contract.md +11 -122
  43. package/runtime/prompts/profiles/_common-contract.md +15 -22
  44. package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
  45. package/runtime/prompts/profiles/_implementation-executor.md +1 -1
  46. package/runtime/prompts/profiles/_implementation-verifier.md +28 -2
  47. package/runtime/prompts/profiles/error-analysis.md +2 -2
  48. package/runtime/prompts/profiles/final-verification.md +1 -1
  49. package/runtime/prompts/profiles/implementation-planning.md +13 -13
  50. package/runtime/prompts/profiles/implementation.md +2 -1
  51. package/runtime/prompts/profiles/improvement-discovery.md +1 -1
  52. package/runtime/prompts/profiles/release-handoff.md +3 -3
  53. package/runtime/prompts/profiles/requirements-discovery.md +17 -18
  54. package/runtime/python/okstra_ctl/models.py +4 -2
  55. package/runtime/python/okstra_ctl/run.py +8 -2
  56. package/runtime/python/okstra_ctl/stage_fix_carry.py +112 -0
  57. package/runtime/schemas/final-report-v1.0.schema.json +6 -6
  58. package/runtime/skills/_fragments/bash-invocation-rule.md +1 -0
  59. package/runtime/skills/_fragments/preflight-outdated-cli.md +1 -0
  60. package/runtime/skills/_fragments/python-bootstrap-note.md +1 -0
  61. package/runtime/skills/okstra-brief-gen/SKILL.md +117 -122
  62. package/runtime/skills/okstra-container-build/SKILL.md +24 -14
  63. package/runtime/skills/okstra-graphify/SKILL.md +12 -4
  64. package/runtime/skills/okstra-inspect/SKILL.md +39 -747
  65. package/runtime/skills/okstra-inspect/facets/cost.md +84 -0
  66. package/runtime/skills/okstra-inspect/facets/error-zip.md +41 -0
  67. package/runtime/skills/okstra-inspect/facets/errors.md +69 -0
  68. package/runtime/skills/okstra-inspect/facets/history.md +90 -0
  69. package/runtime/skills/okstra-inspect/facets/logs.md +89 -0
  70. package/runtime/skills/okstra-inspect/facets/recap.md +96 -0
  71. package/runtime/skills/okstra-inspect/facets/report.md +61 -0
  72. package/runtime/skills/okstra-inspect/facets/status.md +145 -0
  73. package/runtime/skills/okstra-inspect/facets/time.md +56 -0
  74. package/runtime/skills/okstra-manager/SKILL.md +1 -1
  75. package/runtime/skills/okstra-memory/SKILL.md +3 -3
  76. package/runtime/skills/okstra-pr-gen/SKILL.md +3 -3
  77. package/runtime/skills/okstra-rollup/SKILL.md +12 -6
  78. package/runtime/skills/okstra-run/SKILL.md +49 -88
  79. package/runtime/skills/okstra-schedule-gen/SKILL.md +36 -30
  80. package/runtime/skills/okstra-setup/SKILL.md +1 -1
  81. package/runtime/skills/okstra-setup/references/project-config.md +17 -16
  82. package/runtime/skills/okstra-usage/SKILL.md +5 -2
  83. package/runtime/skills/okstra-user-response/SKILL.md +15 -3
  84. package/runtime/templates/prd/brief.template.md +92 -92
  85. package/runtime/templates/project-docs/task-index.template.md +1 -1
  86. package/runtime/templates/reports/error-analysis-input.template.md +1 -1
  87. package/runtime/templates/reports/fan-out-unit.template.md +6 -6
  88. package/runtime/templates/reports/final-verification-input.template.md +6 -6
  89. package/runtime/templates/reports/implementation-input.template.md +1 -1
  90. package/runtime/templates/reports/implementation-planning-input.template.md +1 -1
  91. package/runtime/templates/reports/improvement-discovery-input.template.md +1 -1
  92. package/runtime/templates/reports/quick-input.template.md +1 -1
  93. package/runtime/templates/reports/release-handoff-input.template.md +1 -1
  94. package/runtime/templates/reports/schedule.template.md +22 -22
  95. package/runtime/templates/reports/task-brief.template.md +3 -3
  96. package/runtime/templates/reports/user-response.template.md +20 -20
  97. package/runtime/templates/worker-prompt-preamble.md +111 -13
  98. package/runtime/validators/validate-schedule.py +1 -1
@@ -1,82 +1,82 @@
1
1
  # okstra-memory AI Manual
2
2
 
3
- ## ์›์ฒœ
3
+ ## Source
4
4
 
5
- - ์Šคํ‚ฌ ์›๋ฌธ: [`skills/okstra-memory/SKILL.md`](../../../skills/okstra-memory/SKILL.md)
5
+ - Skill source: [`skills/okstra-memory/SKILL.md`](../../../skills/okstra-memory/SKILL.md)
6
6
  - CLI registry: [`src/cli-registry.mjs`](../../../src/cli-registry.mjs)
7
7
  - memory CLI: [`src/commands/memory/memory.mjs`](../../../src/commands/memory/memory.mjs)
8
8
 
9
- ## ๋ชฉ์ 
9
+ ## Purpose
10
10
 
11
- `okstra-memory`๋Š” ์‚ฌ์šฉ์ž ํ™ˆ์˜ Memory Book์„ ๊ด€๋ฆฌํ•œ๋‹ค.
11
+ `okstra-memory` manages the Memory Book in the user's home.
12
12
 
13
13
  ```text
14
14
  ~/.okstra/memory-book/
15
15
  ```
16
16
 
17
- ํ”„๋กœ์ ํŠธ local `.okstra/` artifact๊ฐ€ ์•„๋‹ˆ๋‹ค. `<PROJECT_ROOT>/.okstra/project.json`์ด ์—†์–ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
17
+ It is not a project-local `.okstra/` artifact. It can be used even without `<PROJECT_ROOT>/.okstra/project.json`.
18
18
 
19
- ## ์‚ฌ์šฉ ์กฐ๊ฑด
19
+ ## When to use
20
20
 
21
- ์‚ฌ์šฉํ•œ๋‹ค:
21
+ Use it when:
22
22
 
23
- - ์‚ฌ์šฉ์ž๊ฐ€ "๊ธฐ์–ตํ•ด๋‘ฌ", "๋Œ€ํ™” ์ €์žฅ", "okstra์— ์ •๋ฆฌํ•ด์„œ ๋ณด๊ด€", "remember this", "save this decision"์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ์ €์žฅ์„ ์š”์ฒญํ•œ๋‹ค.
24
- - ์ €์žฅ๋œ memory๋ฅผ ๊ฒ€์ƒ‰, ๋ชฉ๋กํ™”, ์ฝ๊ธฐ, archiveํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
23
+ - The user explicitly asks to save, e.g. "remember this", "save the conversation", "organize and store this in okstra", "remember this", "save this decision".
24
+ - The user wants to search, list, read, or archive stored memory.
25
25
 
26
- ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค:
26
+ Do not use it when:
27
27
 
28
- - ์‚ฌ์šฉ์ž๊ฐ€ ๋‹จ์ˆœ brainstorming ์ค‘์ด๊ณ  ์ €์žฅ ์š”์ฒญ์ด ์—†๋‹ค. ์ด๋•Œ๋Š” ํ™•์ธ ์งˆ๋ฌธ์„ ๋จผ์ € ํ•œ๋‹ค.
29
- - project task artifact๋กœ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š” ๋‚ด์šฉ. ์ด ๊ฒฝ์šฐ ํ•ด๋‹น okstra task์˜ brief/report/decision ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
28
+ - The user is only brainstorming with no save request. In that case, ask a confirmation question first.
29
+ - The content should be kept as a project task artifact. In that case, use the brief/report/decision path of the relevant okstra task.
30
30
 
31
31
  ## safety rule
32
32
 
33
- ๋ช…์‹œ์  ์ €์žฅ ์š”์ฒญ ์—†์ด ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. credentials, API keys, tokens, private personal data, secrets๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€ํ™”์— ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด summary์—์„œ ์ œ์™ธํ•˜๊ณ  omission์„ ๊ธฐ๋กํ•œ๋‹ค.
33
+ Do not save without an explicit save request. Do not store credentials, API keys, tokens, private personal data, or secrets. If the conversation includes sensitive material, exclude it from the summary and note the omission.
34
34
 
35
- CLI๋„ high-confidence secret shape๋ฅผ ๊ฐ์ง€ํ•ด `memory add`๋ฅผ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฑฐ๋ถ€๋˜๋ฉด ๋‚ด์šฉ์„ redactํ•˜๊ณ  ์žฌ์‹œ๋„ํ•œ๋‹ค.
35
+ The CLI can also detect high-confidence secret shapes and refuse `memory add`. If refused, redact the content and retry.
36
36
 
37
37
  ## CLI availability
38
38
 
39
- ๋จผ์ € help๋ฅผ ํ™•์ธํ•œ๋‹ค.
39
+ Check the help first.
40
40
 
41
41
  ```bash
42
42
  okstra memory --help
43
43
  ```
44
44
 
45
- `okstra`๊ฐ€ PATH์— ์—†์œผ๋ฉด `npx okstra@latest install`์„ ์ง์ ‘ ์‹คํ–‰ํ•˜์ง€ ๋ง๊ณ , ํ•œ ๋ฒˆ ์„ค์น˜ ํ›„ ์žฌ์‹œ๋„ํ•˜๋ผ๊ณ  ์•ˆ๋‚ดํ•œ๋‹ค.
45
+ If `okstra` is not on PATH, do not run `npx okstra@latest install` directly; tell the user to install it once and then retry.
46
46
 
47
- ## project-group ์„ ํƒ
47
+ ## project-group selection
48
48
 
49
- ๋ชจ๋“  memory entry๋Š” project-group์— ์†ํ•œ๋‹ค. ์ €์žฅ/๊ฒ€์ƒ‰ ์ „์— group์„ ๋จผ์ € ๊ณ ๋ฅธ๋‹ค.
49
+ Every memory entry belongs to a project-group. Pick the group before storing or searching.
50
50
 
51
- ๊ธฐ์กด group ์กฐํšŒ:
51
+ Enumerate existing groups:
52
52
 
53
53
  ```bash
54
54
  okstra memory groups --json
55
55
  ```
56
56
 
57
- ์ถ”์ฒœ:
57
+ Recommendations:
58
58
 
59
- - ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ธ existing group
60
- - ๋‘ ๋ฒˆ์งธ existing group
61
- - ์ง์ ‘ ์ž…๋ ฅ
59
+ - the most-used existing group
60
+ - the second existing group
61
+ - Enter directly
62
62
 
63
- ๊ฐœ์ธ ๋ฉ”๋ชจ๋ฆฌ๋Š” `private`๋ฅผ ์šฐ์„  ์ถ”์ฒœํ•œ๋‹ค. group์ด ์—†๊ฑฐ๋‚˜ ์„ ํƒ์ด ์—†์œผ๋ฉด CLI default์ธ `global`์„ ์“ด๋‹ค.
63
+ For a personal note, recommend `private` first. If there is no group or no selection, use the CLI default `global`.
64
64
 
65
- ์„ ํƒ group์€ `add`, `search`, `list`์— `--project-group <group>`์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ cross-group search๋ฅผ ๋ช…์‹œํ•œ ๊ฒฝ์šฐ์—๋งŒ flag๋ฅผ ์ƒ๋žตํ•œ๋‹ค.
65
+ Pass the chosen group to `add`, `search`, and `list` as `--project-group <group>`. Omit the flag only when the user explicitly wants a cross-group search.
66
66
 
67
- ## ์ €์žฅ ์ ˆ์ฐจ
67
+ ## Store procedure
68
68
 
69
- ๋Œ€ํ™” ์ „์ฒด transcript๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ค๋ž˜ ๋‚จ๊ธธ durable memory๋งŒ ์ถ”์ถœํ•ด concise Markdown summary๋กœ ๋งŒ๋“ ๋‹ค.
69
+ Do not store the full conversation transcript. Extract only durable memory worth keeping long-term and turn it into a concise Markdown summary.
70
70
 
71
- ํฌํ•จํ•  ๊ฒƒ:
71
+ Include:
72
72
 
73
- - ์ €์žฅ ์ด์œ 
73
+ - the reason for storing
74
74
  - source: `conversation`
75
- - ๊ด€๋ จ project id๊ฐ€ ๋ช…ํ™•ํ•˜๋ฉด `--project`
76
- - ๊ฒ€์ƒ‰์šฉ tags
75
+ - `--project` when the related project id is clear
76
+ - tags for search
77
77
  - memory type
78
78
 
79
- type ๊ฐ’์€ `okstra memory --help` ์ถœ๋ ฅ์ด ๊ถŒ์œ„๋‹ค. ์›๋ฌธ ๊ธฐ์ค€ category:
79
+ The `okstra memory --help` output is authoritative for the type values. Categories per the source:
80
80
 
81
81
  - `decision`
82
82
  - `preference`
@@ -86,19 +86,19 @@ type ๊ฐ’์€ `okstra memory --help` ์ถœ๋ ฅ์ด ๊ถŒ์œ„๋‹ค. ์›๋ฌธ ๊ธฐ์ค€ category:
86
86
  - `follow-up`
87
87
  - `context`
88
88
 
89
- ์ €์žฅ ๋ช…๋ น ํ˜•ํƒœ:
89
+ Store command shape:
90
90
 
91
91
  ```bash
92
92
  okstra memory add --content "<summary markdown>" --title "<short title>" --type <type> --project-group <group> --tag <tag> --project <id> --source conversation --yes
93
93
  ```
94
94
 
95
- ํ•„์š”ํ•˜๋ฉด `--tag`, `--project`๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. ๊ด€๋ จ project๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด `--project`๋ฅผ ์ƒ๋žตํ•œ๋‹ค.
95
+ Repeat `--tag` and `--project` as needed. Omit `--project` when no related project is clear.
96
96
 
97
- `--yes`๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ์„ ๋ช…์‹œํ–ˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
97
+ Use `--yes` only when the user explicitly asked to save.
98
98
 
99
- ## ๊ฒ€์ƒ‰/์ฝ๊ธฐ/archive
99
+ ## search / read / archive
100
100
 
101
- ๊ธฐ๋ณธ์€ ์„ ํƒํ•œ project-group scope๋‹ค.
101
+ The default scope is the chosen project-group.
102
102
 
103
103
  ```bash
104
104
  okstra memory search "<query>" --project-group "<group>"
@@ -108,20 +108,19 @@ okstra memory show "<memory-id>"
108
108
  okstra memory archive "<memory-id>"
109
109
  ```
110
110
 
111
- ID parsing์ด ํ•„์š”ํ•˜๋ฉด `--json`์„ ์„ ํ˜ธํ•œ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์งง์€ ์š”์•ฝ๊ณผ entry id/path ์ •๋„๋งŒ ๋ณด์—ฌ์ค€๋‹ค.
111
+ Prefer `--json` when you need to parse IDs. Show the user only a short summary plus the entry id/path.
112
112
 
113
- ## ์ถœ๋ ฅ ๊ทœ์น™
113
+ ## Output rules
114
114
 
115
- - ์ €์žฅ ์‹œ title, type, project-group, tags, generated id๋ฅผ ์š”์•ฝํ•œ๋‹ค.
116
- - ๊ฒ€์ƒ‰ ์‹œ match count์™€ ๊ฐ€์žฅ ๊ด€๋ จ ๋†’์€ entry๋ฅผ ๋จผ์ € ๋ณด์—ฌ์ค€๋‹ค.
117
- - archive๋Š” ์‚ฌ์šฉ์ž ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•  ๋•Œ๋งŒ ์‹คํ–‰ํ•œ๋‹ค.
118
- - project `.okstra/`์— ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
115
+ - On store, summarize title, type, project-group, tags, and the generated id.
116
+ - On search, show the match count and the most relevant entry first.
117
+ - Run archive only when the user's intent is clear.
118
+ - Do not write into a project `.okstra/`.
119
119
 
120
- ## ๊ธˆ์ง€ ํŒจํ„ด
121
-
122
- - ๋ช…์‹œ ์š”์ฒญ ์—†์ด ์ž๋™ ์ €์žฅ.
123
- - secret/token/key๋ฅผ ์ €์žฅ.
124
- - full transcript๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅ.
125
- - project-local task memory์ฒ˜๋Ÿผ `.okstra/`์— ์“ฐ๊ธฐ.
126
- - cross-group search๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ๊ธฐ๋ณธ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ.
120
+ ## Forbidden patterns
127
121
 
122
+ - Auto-saving without an explicit request.
123
+ - Storing a secret/token/key.
124
+ - Storing the full transcript verbatim.
125
+ - Writing into `.okstra/` as if it were project-local task memory.
126
+ - Performing a cross-group search by default when the user did not ask for it.
@@ -0,0 +1,48 @@
1
+ # okstra-pr-gen AI Manual
2
+
3
+ ## Sources
4
+
5
+ - Skill source: [`skills/okstra-pr-gen/SKILL.md`](../../../skills/okstra-pr-gen/SKILL.md)
6
+ - Template core (CLI): [`scripts/okstra_ctl/pr_template.py`](../../../scripts/okstra_ctl/pr_template.py)
7
+ - Node wrapper: [`src/commands/pr/pr.mjs`](../../../src/commands/pr/pr.mjs)
8
+ - Bundled default template: [`src/commands/pr/default.md`](../../../src/commands/pr/default.md)
9
+
10
+ ## Purpose
11
+
12
+ `okstra-pr-gen` registers PR body templates and generates PR descriptions from a branch diff. Templates live in the user home at `~/.okstra/template/pr/`. This skill is **global** โ€” it does not require `<PROJECT_ROOT>/.okstra/project.json`. PR generation additionally requires the current directory to be a git repository.
13
+
14
+ ## Check CLI availability
15
+
16
+ A separate Bash call with a literal leading token:
17
+
18
+ ```bash
19
+ okstra pr --help
20
+ ```
21
+
22
+ If `okstra` is not on PATH: `okstra not installed โ€” run npx okstra@latest install once, then retry`. Every Bash command starts with the literal `okstra` token and passes literal arguments (do not wrap it in `$(...)`/leading `VAR=`/`if`/`eval`/`||`/`&&`).
23
+
24
+ ## Pick the mode (always first)
25
+
26
+ A 3-option picker via `AskUserQuestion`:
27
+
28
+ 1. `Generate PR` โ€” generate a PR body from a branch diff
29
+ 2. `Register template` โ€” save a new PR body template
30
+ 3. `Enter directly` โ€” always last (okstra picker convention)
31
+
32
+ ## Mode A โ€” Generate PR
33
+
34
+ 1. Pick a template: `okstra pr template list --json`. If empty, use the bundled default. Carry the chosen name as `<template>` (`default` for the bundled one).
35
+ 2. Pick the base branch: `okstra pr branches --json`. 3-option from the top `recommended` entries plus `Enter directly`. Carry the choice as `<base>`.
36
+ 3. Generation bundle: `okstra pr gen --base <base> --template <template> --json` โ†’ `{base, currentBranch, templateName, template, commits, diffStat}`. Then **read the real diff honestly** (SSOT): `git diff <base>...HEAD` (large diffs section by section). Fill the placeholders from the diff and commits, describing **only actual changes**. Mark a checklist box `[x]` only when the diff supports it (tests touched โ†’ tests box, docs touched โ†’ docs box). If `commits`/`diffStat` are empty, say there is nothing to describe and stop. **Never append AI trailers/footers.**
37
+ 4. Output and offer to create the PR: print the filled PR body as a single fenced markdown block. Ask whether to open a PR. **Only on an explicit yes**: write the body to a temp file and run `gh pr create --base <base> --title "<title>" --body-file <path>`. If `gh` is missing or unauthenticated (`gh auth status` fails), leave the text in chat and give manual-creation guidance. **No push/PR creation without the user's confirmation.**
38
+
39
+ ## Mode B โ€” Register template
40
+
41
+ 1. Template name (`AskUserQuestion`, free text) โ€” must match `^[A-Za-z0-9._-]+$`, otherwise re-ask.
42
+ 2. body โ€” pasted text or an absolute path.
43
+ 3. Save: `okstra pr template add --name <name> --file <abs-path>` (or, for pasted text, `--content "<body>"`). Add `--yes` only when the user confirmed overwriting a same-named template. Report the saved path (`saved: ...`).
44
+
45
+ ## Output Rules
46
+
47
+ - Not read-side โ€” write actions (PR creation, template saving) happen only after the user's explicit confirmation.
48
+ - Do not invent changes not in the diff. Stop if commit/diffStat is empty.
@@ -1,82 +1,82 @@
1
1
  # okstra-rollup AI Manual
2
2
 
3
- ## ์›์ฒœ
3
+ ## Source
4
4
 
5
- - ์Šคํ‚ฌ ์›๋ฌธ: [`skills/okstra-rollup/SKILL.md`](../../../skills/okstra-rollup/SKILL.md)
6
- - ์ง‘๊ณ„ ์ฝ”์–ด(CLI): [`scripts/okstra_ctl/rollup.py`](../../../scripts/okstra_ctl/rollup.py)
7
- - Node ๋ž˜ํผ: [`src/commands/inspect/rollup.mjs`](../../../src/commands/inspect/rollup.mjs)
8
- - ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ-task ์ง‘๊ณ„๊ธฐ: [`scripts/okstra_ctl/time_report.py`](../../../scripts/okstra_ctl/time_report.py), [`scripts/okstra_ctl/error_log_core.py`](../../../scripts/okstra_ctl/error_log_core.py)
9
- - catalog ์—ด๊ฑฐ ํ—ฌํผ: [`scripts/okstra_project/state.py`](../../../scripts/okstra_project/state.py) (`list_project_tasks`)
10
- - ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: [`tests/inspect/test_okstra_rollup.py`](../../../tests/inspect/test_okstra_rollup.py)
5
+ - Skill source: [`skills/okstra-rollup/SKILL.md`](../../../skills/okstra-rollup/SKILL.md)
6
+ - aggregation core (CLI): [`scripts/okstra_ctl/rollup.py`](../../../scripts/okstra_ctl/rollup.py)
7
+ - Node wrapper: [`src/commands/inspect/rollup.mjs`](../../../src/commands/inspect/rollup.mjs)
8
+ - reused single-task aggregators: [`scripts/okstra_ctl/time_report.py`](../../../scripts/okstra_ctl/time_report.py), [`scripts/okstra_ctl/error_log_core.py`](../../../scripts/okstra_ctl/error_log_core.py)
9
+ - catalog enumeration helper: [`scripts/okstra_project/state.py`](../../../scripts/okstra_project/state.py) (`list_project_tasks`)
10
+ - unit tests: [`tests/inspect/test_okstra_rollup.py`](../../../tests/inspect/test_okstra_rollup.py)
11
11
 
12
- ## ๋ชฉ์ 
12
+ ## Purpose
13
13
 
14
- `okstra-rollup`์€ **์—ฌ๋Ÿฌ task์˜ run ๊ฒฐ๊ณผ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ชจ์•„ ์š”์•ฝ**ํ•œ๋‹ค. ๋‹จ์ผ task๋ฅผ ๋ณด๋Š” `okstra-inspect`์™€ ๋Œ€๋น„๋˜๋Š” task ํšก๋‹จ(cross-task) read-side ๋ ˆ์ด์–ด๋‹ค.
14
+ `okstra-rollup` **collects and summarizes the run results of multiple tasks at once**. It is a cross-task read-side layer, in contrast to `okstra-inspect` which looks at a single task.
15
15
 
16
- - ์ž…๋ ฅ ๋ฒ”์œ„: ํ•œ task-group, ๋˜๋Š” `--task-group`์„ ์ƒ๋žตํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์ „์ฒด catalog.
17
- - deterministic ์ง‘๊ณ„(๊ฐœ์ˆ˜ยท์‹œ๊ฐ„ ํ•ฉยท์—๋Ÿฌ ํ•ฉยท์ƒํƒœ/์นดํ…Œ๊ณ ๋ฆฌ/phase ๋ถ„ํฌ)๋Š” `okstra rollup` CLI๊ฐ€ ์ „๋‹ดํ•œ๋‹ค. ์Šคํ‚ฌ์€ ๊ทธ ํ‘œ๋ฅผ ๋ Œ๋”ํ•˜๊ณ , ๊ฐ task์˜ report ๋ณธ๋ฌธ์„ ์ฝ์–ด **task ํšก๋‹จ ์ข…ํ•ฉ ์š”์•ฝ(digest)**์„ ์ž‘์„ฑํ•œ๋‹ค.
18
- - ์„ค๊ณ„ ์›์น™: ์ง‘๊ณ„ ์†๊ณ„์‚ฐ์€ LLM์ด ํ‹€๋ฆฌ๊ธฐ ์‰ฌ์šฐ๋ฏ€๋กœ CLI(SSOT)๋กœ ๋‚ด๋ฆฌ๊ณ , ์ž์—ฐ์–ด ์ข…ํ•ฉ๋งŒ LLM์ด ๋งก๋Š”๋‹ค. `okstra-inspect time`์ด "์ ˆ๋Œ€ ์†์œผ๋กœ ์‹œ๊ฐ„์„ ์žฌํ•ฉ์‚ฐํ•˜์ง€ ๋ง ๊ฒƒ"์ด๋ผ ๋ชป ๋ฐ•๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ถ„์—…์ด๋‹ค.
16
+ - Input scope: one task-group, or the whole-project catalog when `--task-group` is omitted.
17
+ - Deterministic aggregation (counts, time sums, error sums, status/category/phase distributions) is handled entirely by the `okstra rollup` CLI. The skill renders that table and reads each task's report body to write a **cross-task synthesis (digest)**.
18
+ - Design principle: hand-computed aggregation is error-prone for an LLM, so it is pushed to the CLI (SSOT), and only the natural-language synthesis is left to the LLM. This is the same division of labor as `okstra-inspect time`, which insists on "never re-sum the time by hand".
19
19
 
20
- ์ด ์Šคํ‚ฌ์€ read-only๋‹ค. task ์‚ฐ์ถœ๋ฌผ์„ mutate ํ•˜์ง€ ์•Š๋Š”๋‹ค.
20
+ This skill is read-only. It does not mutate task artifacts.
21
21
 
22
- ## ์‚ฌ์šฉ ์กฐ๊ฑด
22
+ ## When to use
23
23
 
24
- ์‚ฌ์šฉํ•œ๋‹ค:
24
+ Use it when:
25
25
 
26
- - ์‚ฌ์šฉ์ž๊ฐ€ "๋กค์—…", "task-group ์š”์•ฝ", "๊ทธ๋ฃน ๋‹จ์œ„ ๋ฆฌํฌํŠธ", "์—ฌ๋Ÿฌ task ๊ฒฐ๊ณผ ๋ชจ์•„", "์ „์ฒด task ํ˜„ํ™ฉ ์š”์•ฝ", "run ๊ฒฐ๊ณผ ํ•œ๊บผ๋ฒˆ์— ์ •๋ฆฌ"๋ฅผ ์š”์ฒญํ•œ๋‹ค.
27
- - ํ•œ task๊ฐ€ ์•„๋‹ˆ๋ผ **์—ฌ๋Ÿฌ task**๋ฅผ ๊ฐ€๋กœ์งˆ๋Ÿฌ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ.
26
+ - The user asks for "rollup", "task-group summary", "group-level report", "collect multiple task results", "whole-project task status summary", "run results all at once".
27
+ - You want to look across **multiple tasks** rather than a single one.
28
28
 
29
- ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค:
29
+ Do not use it when:
30
30
 
31
- - ๋‹จ์ผ task์˜ report/์‹œ๊ฐ„/์—๋Ÿฌ/recap โ†’ `okstra-inspect` (report / time / errors / recap facet).
32
- - ๋ฏธ๋ž˜ ์ž‘์—… ๊ณ„ํšํ‘œ(non-done task์˜ ํด๋ผ์ด์–ธํŠธ์šฉ ์ผ์ •) โ†’ `okstra-schedule-gen`. rollup์€ ๊ณผ๊ฑฐ run ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์œผ๋Š” **ํšŒ๊ณ ํ˜•**์ด๊ณ , schedule์€ ์•ž์œผ๋กœ์˜ ๊ณ„ํš์„ ์งœ๋Š” **์ „๋งํ˜•**์ด๋‹ค.
33
- - ์‹ค์ œ phase ์‹คํ–‰ โ†’ `okstra-run`.
31
+ - A single task's report/time/errors/recap โ†’ `okstra-inspect` (report / time / errors / recap facet).
32
+ - A forward-looking work plan (a client-facing schedule of non-done tasks) โ†’ `okstra-schedule-gen`. rollup is **retrospective**, collecting past run results; schedule is **forward-looking**, planning future work.
33
+ - Actual phase execution โ†’ `okstra-run`.
34
34
 
35
35
  ## Preflight
36
36
 
37
- ๋ฆฌํ„ฐ๋Ÿด `okstra` ํ† ํฐ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์ผ Bash ํ˜ธ์ถœ(`if`/`eval`/`$(...)`/`VAR=`/`||`/`&&`/`npx` fallback์œผ๋กœ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค):
37
+ A single Bash call starting with the literal `okstra` token (not wrapped in `if`/`eval`/`$(...)`/`VAR=`/`||`/`&&`/`npx` fallback):
38
38
 
39
39
  ```bash
40
40
  okstra preflight --runtime claude-code --json
41
41
  ```
42
42
 
43
- `ok:false` โ†’ `/okstra-setup` ์•ˆ๋‚ด ํ›„ ๋ฉˆ์ถ˜๋‹ค. `ok:true`๋ฉด `projectRoot`๋ฅผ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด๋กœ ๋“ค๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ฐ„๋‹ค.
43
+ `ok:false` โ†’ point to `/okstra-setup` and stop. If `ok:true`, carry `projectRoot` as a literal string and proceed.
44
44
 
45
- ## scope ํ•ด์„
45
+ ## scope resolution
46
46
 
47
- - ์‚ฌ์šฉ์ž๊ฐ€ task-group์„ ์ง€๋ชฉ("alpha ๊ทธ๋ฃน ์š”์•ฝ") โ†’ `--task-group <group>`.
48
- - "์ „์ฒด task"/"ํ”„๋กœ์ ํŠธ ์ „์ฒด"/๋ฒ”์œ„ ๋ฏธ์ง€์ • โ†’ `--task-group` ์ƒ๋žต(์ „์ฒด catalog).
49
- - ์ง„์งœ ๋ชจํ˜ธํ•˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ฌป๋Š”๋‹ค: ํ•œ task-group์ธ์ง€ ํ”„๋กœ์ ํŠธ ์ „์ฒด์ธ์ง€. ํŠน์ • ๊ทธ๋ฃน์„ ์ž„์˜๋กœ ์ถ”์ธกํ•˜์ง€ ์•Š๋Š”๋‹ค.
47
+ - The user named a task-group ("summarize the alpha group") โ†’ `--task-group <group>`.
48
+ - "all tasks" / "the whole project" / no scope named โ†’ omit `--task-group` (whole catalog).
49
+ - If genuinely ambiguous, ask once: one task-group or the whole project? Do not silently guess a specific group.
50
50
 
51
- ## CLI ํ˜ธ์ถœ
51
+ ## CLI call
52
52
 
53
53
  ```bash
54
54
  okstra rollup --task-group <group> --project-root <projectRoot> --json
55
55
  ```
56
56
 
57
- ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฉด `--task-group`์„ ๋บ€๋‹ค. ์ถœ๋ ฅ์€ ํ•ญ์ƒ JSON์ด๋ฉฐ **๋ชจ๋“  ์‹œ๊ฐ„์€ raw ๋ฐ€๋ฆฌ์ดˆ**๋‹ค.
57
+ For the whole project, drop `--task-group`. The output is always JSON, and **all times are raw milliseconds**.
58
58
 
59
- ## ์ถœ๋ ฅ ํ•ด์„
59
+ ## Interpreting the output
60
60
 
61
- ์ตœ์ƒ์œ„:
61
+ Top level:
62
62
 
63
- - `taskGroup` โ€” ๋ฒ”์œ„(`null`์ด๋ฉด ํ”„๋กœ์ ํŠธ ์ „์ฒด), `taskCount` โ€” task ์ˆ˜.
64
- - `tasks[]` โ€” task 1๊ฐœ๋‹น: `taskKey, taskGroup, taskId, taskType, workCategory, workStatus, currentPhase, currentPhaseState, nextRecommendedPhase, latestRunStatus, updatedAt, reportPath, runCount, cpuSumMs, wallClockMs, errorCount`.
65
- - `totals` โ€” `runs, cpuSumMs, wallClockMs, errors`, ๊ทธ๋ฆฌ๊ณ  `byWorkStatus` / `byWorkCategory` / `byCurrentPhase` / `byTaskType` (๊ฐ๊ฐ `{๊ฐ’: ๊ฐœ์ˆ˜}` ๋งต).
63
+ - `taskGroup` โ€” the scope (`null` = whole project), `taskCount` โ€” number of tasks.
64
+ - `tasks[]` โ€” per task: `taskKey, taskGroup, taskId, taskType, workCategory, workStatus, currentPhase, currentPhaseState, nextRecommendedPhase, latestRunStatus, updatedAt, reportPath, runCount, cpuSumMs, wallClockMs, errorCount`.
65
+ - `totals` โ€” `runs, cpuSumMs, wallClockMs, errors`, plus `byWorkStatus` / `byWorkCategory` / `byCurrentPhase` / `byTaskType` (each a `{value: count}` map).
66
66
 
67
- ์ˆ˜์น˜ ์˜๋ฏธ(๋ฐ˜๋“œ์‹œ ์ง€ํ‚ฌ ๊ฒƒ):
67
+ Numeric meanings (must observe):
68
68
 
69
- - `runCount`๋Š” timeline์˜ **์ „์ฒด run ์ˆ˜**๋‹ค. `cpuSumMs`/`wallClockMs`๋Š” Phase 7 usage์— ๋„๋‹ฌํ•œ run๋งŒ ๋ฐ˜์˜ํ•˜๋ฏ€๋กœ `runCount > 0`์ด์–ด๋„ `0`์ผ ์ˆ˜ ์žˆ๋‹ค.
70
- - `cpuSumMs`๋Š” lead + worker๊ฐ€ ๊ฒน์ณ ๋„๋Š” **CPU ํ•ฉ**์ด์ง€ wall-clock์ด ์•„๋‹ˆ๋‹ค. ๋ผ๋ฒจ์„ "CPU"๋กœ ์“ฐ๊ณ , wall-clock์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌผ์„ ๋•Œ๋งŒ `wallClockMs`๋กœ ๋ณด์—ฌ์ค€๋‹ค.
71
- - `reportPath`๋Š” ํ”„๋กœ์ ํŠธ ์ƒ๋Œ€๊ฒฝ๋กœ์ด๋ฉฐ ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค(์•„์ง report๊ฐ€ ์—†๋Š” task).
72
- - `taskCount`๊ฐ€ `0`์ด๋ฉด ํ•ด๋‹น ๋ฒ”์œ„์— okstra task๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค.
69
+ - `runCount` is the **total number of runs** in the timeline. `cpuSumMs`/`wallClockMs` reflect only runs that reached Phase 7 usage, so they can be `0` even when `runCount > 0`.
70
+ - `cpuSumMs` is the **CPU sum** of the overlapping lead + workers, not wall-clock. Label it "CPU", and show wall-clock as `wallClockMs` only when the user explicitly asks.
71
+ - `reportPath` is project-relative and may be empty (a task with no report yet).
72
+ - If `taskCount` is `0`, say there are no okstra tasks in that scope and stop.
73
73
 
74
- ## ๋ Œ๋”
74
+ ## Render
75
75
 
76
- ๋ชจ๋“  `*Ms`๋Š” `HH:MM:SS`๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค(zero-pad, raw ms ์ ˆ๋Œ€ ๋…ธ์ถœ ๊ธˆ์ง€ โ€” `okstra-inspect time`๊ณผ ๊ฐ™์€ ๊ทœ์น™). task๋Š” `updatedAt` ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ.
76
+ Convert every `*Ms` to `HH:MM:SS` (zero-pad; never expose raw ms โ€” the same rule as `okstra-inspect time`). Sort tasks by `updatedAt` descending.
77
77
 
78
78
  ```markdown
79
- ## okstra Rollup โ€” <task-group ๋˜๋Š” "whole project"> (<taskCount> tasks)
79
+ ## okstra Rollup โ€” <task-group or "whole project"> (<taskCount> tasks)
80
80
 
81
81
  | Task | Category | workStatus | Phase | Runs | CPU | Errors | Report |
82
82
  |------|----------|------------|-------|------|-----|--------|--------|
@@ -87,26 +87,26 @@ okstra rollup --task-group <group> --project-root <projectRoot> --json
87
87
  **workStatus:** done 1 ยท in-progress 1 **category:** bugfix 1 ยท feature 1
88
88
  ```
89
89
 
90
- - `Report` ์—ด: `reportPath`๊ฐ€ ์žˆ์œผ๋ฉด `โœ“`, ์—†์œผ๋ฉด `โ€”`.
91
- - ์ƒํƒœ/์นดํ…Œ๊ณ ๋ฆฌ/phase ์ค„์€ `totals`์˜ tally ๋งต์„ **๊ทธ๋Œ€๋กœ** ์˜ฎ๊ธด๋‹ค. `tasks[]` ๋ฐฐ์—ด์„ ์ง์ ‘ ์„ธ์ง€ ์•Š๋Š”๋‹ค(์ง‘๊ณ„๋Š” CLI๊ฐ€ SSOT).
90
+ - `Report` column: `โœ“` when `reportPath` is present, `โ€”` when not.
91
+ - Build the status/category/phase lines from the `totals` tally maps **verbatim**. Do not count the `tasks[]` array yourself (the CLI is the SSOT for aggregation).
92
92
 
93
- ## digest ์ž‘์„ฑ (์š”์•ฝ โ€” ์Šคํ‚ฌ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜)
93
+ ## Writing the digest (the summary โ€” the skill's core value)
94
94
 
95
- ์‚ฌ์šฉ์ž๊ฐ€ "์š”์•ฝ"/"์ •๋ฆฌ"/"summarize"/"digest"๋ฅผ ์š”์ฒญํ•œ ๊ฒฝ์šฐ(์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ):
95
+ When the user asks to "summarize"/"organize"/"summarize"/"digest" (the common case):
96
96
 
97
- 1. `reportPath`๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š๊ณ  `<projectRoot>/<reportPath>` ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” task๋งˆ๋‹ค report๋ฅผ ์ฝ๊ณ , **๋ฌด์—‡์„ ๋‹ฌ์„ฑํ–ˆ๊ณ  ๊ถŒ์žฅ ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ๋ฌด์—‡์ธ์ง€** 1~2์ค„๋กœ ์š”์•ฝํ•œ๋‹ค.
98
- 2. per-task ์ค„ ์œ„์—, ๊ทธ๋ฃน ์ฐจ์› ์ข…ํ•ฉ 2~4๋ฌธ์žฅ์„ ์“ด๋‹ค: ๊ทธ๋ฃน ์ „๋ฐ˜์—์„œ ๋ฌด์—‡์ด ์‚ฐ์ถœ๋๋Š”์ง€, ๋ฏธ๊ฒฐ ์ž‘์—…์ด ์–ด๋”” ์žˆ๋Š”์ง€(`byWorkStatus`/`byCurrentPhase` ํ™œ์šฉ), ์—๋Ÿฌ ํ•ซ์ŠคํŒŸ(๋†’์€ `errorCount` task)์ด ์žˆ๋Š”์ง€.
99
- 3. ๊ฐ per-task ์ฃผ์žฅ์€ report ๊ฒฝ๋กœ(`<reportPath>`)๋กœ ์ธ์šฉํ•ด ๋…์ž๊ฐ€ ๋ฐ”๋กœ ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
97
+ 1. For each task with a non-empty `reportPath` whose `<projectRoot>/<reportPath>` file actually exists, read the report and summarize in 1โ€“2 lines **what it accomplished and its recommended next step**.
98
+ 2. Above the per-task lines, write a 2โ€“4 sentence group-level synthesis: what was delivered across the group, where the open work sits (using `byWorkStatus`/`byCurrentPhase`), and whether there are error hot-spots (tasks with high `errorCount`).
99
+ 3. Cite each per-task claim with the report path (`<reportPath>`) so the reader can open it directly.
100
100
 
101
- report๊ฐ€ ์—†๋Š” task๋Š” ์š”์•ฝ์„ ์ง€์–ด๋‚ด์ง€ ๋ง๊ณ  ํ˜„์žฌ phase/workStatus๋ฅผ ๋Œ€์‹  ๋งํ•œ๋‹ค. report ์•„๋‹Œ ์‚ฐ์ถœ๋ฌผ์„ ์ฝ์–ด ๋นˆ์นธ์„ ๋ฉ”์šฐ์ง€ ์•Š๋Š”๋‹ค(artifact-home ๊ทœ์น™). report๊ฐ€ ๋น„์—ˆ๊ฑฐ๋‚˜ ์—†์œผ๋ฉด ๊ทธ๋ ‡๋‹ค๊ณ  ๋งํ•œ๋‹ค.
101
+ For a task with no report, do not invent a summary; state the current phase/workStatus instead. Do not read non-report artifacts to fill the gap (artifact-home rule). If a report is empty or missing, say so.
102
102
 
103
- ๋‹จ์ผ task์˜ ๊นŠ์€ drill-down(์ „์ฒด report, worker๋ณ„ ์‹œ๊ฐ„, ์—๋Ÿฌ ๋ถ„ํ•ด, run ๊ฐ„ recap)์ด ํ•„์š”ํ•˜๋ฉด `/okstra-inspect`๋กœ ์•ˆ๋‚ดํ•œ๋‹ค.
103
+ If a deep single-task drill-down (full report, per-worker time, error breakdown, run-to-run recap) is needed, point the user to `/okstra-inspect`.
104
104
 
105
- ## ๊ธˆ์ง€ ํŒจํ„ด
105
+ ## Forbidden patterns
106
106
 
107
- - ์ง‘๊ณ„ ์ˆ˜์น˜(ํ•ฉ๊ณ„, ๋ถ„ํฌ)๋ฅผ `tasks[]`์—์„œ ์†์œผ๋กœ ๋‹ค์‹œ ์„ธ๊ธฐ. `totals`๊ฐ€ SSOT๋‹ค.
108
- - raw ms ๋…ธ์ถœ. ํ•ญ์ƒ `HH:MM:SS`.
109
- - `cpuSumMs`๋ฅผ wall-clock์ธ ์–‘ ํ‘œ๊ธฐ.
110
- - report๊ฐ€ ์—†๋Š” task์— ๋Œ€ํ•ด ์š”์•ฝ์„ ์ง€์–ด๋‚ด๊ธฐ. ํ˜„์žฌ phase/workStatus๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
111
- - okstra ์‚ฐ์ถœ๋ฌผ ๋ฐ–(non-`.okstra`) ํŒŒ์ผ์„ ์ฝ์–ด ์š”์•ฝ์„ ์ฑ„์šฐ๊ธฐ.
112
- - ๋‹จ์ผ task ์ƒ์„ธ๋ฅผ rollup์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ. `okstra-inspect`๋กœ ๋ณด๋‚ธ๋‹ค.
107
+ - Re-counting aggregate numbers (totals, distributions) by hand from `tasks[]`. `totals` is the SSOT.
108
+ - Exposing raw ms. Always `HH:MM:SS`.
109
+ - Labeling `cpuSumMs` as if it were wall-clock.
110
+ - Inventing a summary for a task with no report. Substitute the current phase/workStatus.
111
+ - Reading files outside okstra artifacts (non-`.okstra`) to fill the summary.
112
+ - Handling single-task detail in rollup. Send it to `okstra-inspect`.