cc-devflow 4.5.6 → 4.5.7
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.
- package/.claude/skills/cc-act/PLAYBOOK.md +2 -2
- package/.claude/skills/cc-act/SKILL.md +2 -2
- package/.claude/skills/cc-act/scripts/{archive-requirement.sh → archive-change.sh} +7 -7
- package/.claude/skills/cc-investigate/CHANGELOG.md +5 -0
- package/.claude/skills/cc-investigate/SKILL.md +2 -2
- package/.claude/skills/cc-plan/CHANGELOG.md +22 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +20 -17
- package/.claude/skills/cc-plan/SKILL.md +91 -19
- package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +42 -0
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +2 -0
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +36 -2
- package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +30 -0
- package/.claude/skills/cc-plan/references/planning-contract.md +20 -15
- package/.claude/skills/cc-plan/scripts/next-change-key.sh +78 -0
- package/.claude/skills/cc-review/CHANGELOG.md +7 -0
- package/.claude/skills/cc-review/PLAYBOOK.md +54 -0
- package/.claude/skills/cc-review/SKILL.md +173 -0
- package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +81 -0
- package/.claude/skills/cc-review/references/implementation-review-branch.md +115 -0
- package/.claude/skills/cc-review/references/plan-review-branch.md +116 -0
- package/.claude/skills/cc-review/references/review-methods.md +126 -0
- package/.claude/skills/cc-roadmap/CHANGELOG.md +6 -0
- package/.claude/skills/cc-roadmap/SKILL.md +102 -8
- package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +3 -0
- package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +23 -0
- package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +20 -1
- package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +28 -13
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/markdown.js +18 -0
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/schema.js +8 -0
- package/CHANGELOG.md +9 -0
- package/README.md +9 -4
- package/README.zh-CN.md +9 -4
- package/bin/cc-devflow-cli.js +119 -0
- package/config/distributable-skills.json +2 -0
- package/docs/examples/example-bindings.json +5 -4
- package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
- package/docs/examples/full-design-blocked/README.md +1 -1
- package/docs/examples/full-design-blocked/ROADMAP.md +16 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +36 -3
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +295 -71
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +2 -1
- package/docs/examples/full-design-blocked/roadmap.json +18 -2
- package/docs/examples/local-handoff/BACKLOG.md +1 -1
- package/docs/examples/local-handoff/README.md +1 -1
- package/docs/examples/local-handoff/ROADMAP.md +16 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +27 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +170 -41
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +2 -1
- package/docs/examples/local-handoff/roadmap.json +16 -2
- package/docs/examples/pdca-loop/BACKLOG.md +1 -1
- package/docs/examples/pdca-loop/README.md +1 -1
- package/docs/examples/pdca-loop/ROADMAP.md +16 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +27 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +62 -10
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +2 -1
- package/docs/examples/pdca-loop/roadmap.json +16 -2
- package/docs/examples/scripts/check-example-bindings.sh +2 -0
- package/docs/guides/getting-started.md +12 -9
- package/docs/guides/getting-started.zh-CN.md +12 -9
- package/lib/skill-runtime/__tests__/archive-change.test.js +124 -0
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +1 -0
- package/lib/skill-runtime/__tests__/paths.test.js +81 -1
- package/lib/skill-runtime/archive-change.js +64 -0
- package/lib/skill-runtime/paths.js +32 -0
- package/package.json +2 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Plan Review Branch
|
|
2
|
+
|
|
3
|
+
Use this reference when the review target is a plan, investigation handoff, or mixed branch whose plan contract may be wrong.
|
|
4
|
+
|
|
5
|
+
## Intake
|
|
6
|
+
|
|
7
|
+
Read, in order:
|
|
8
|
+
|
|
9
|
+
1. `planning/design.md` or `planning/analysis.md`
|
|
10
|
+
2. `planning/tasks.md`
|
|
11
|
+
3. `planning/task-manifest.json`
|
|
12
|
+
4. `change-meta.json`
|
|
13
|
+
5. related roadmap/spec/docs/code referenced by the plan
|
|
14
|
+
|
|
15
|
+
If no change directory exists, review the user-provided plan text and clearly mark missing durable artifacts.
|
|
16
|
+
|
|
17
|
+
## Review Shape
|
|
18
|
+
|
|
19
|
+
Run only applicable facets. Do not load every facet when the plan is small.
|
|
20
|
+
|
|
21
|
+
### 1. Strategy Facet
|
|
22
|
+
|
|
23
|
+
Use a native strategy review question set:
|
|
24
|
+
|
|
25
|
+
- Is this the right problem?
|
|
26
|
+
- Is the stated user/business outcome direct or a proxy?
|
|
27
|
+
- What happens if we do nothing?
|
|
28
|
+
- What does the 12-month ideal look like?
|
|
29
|
+
- What existing code or workflow already solves part of this?
|
|
30
|
+
|
|
31
|
+
Output:
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
CURRENT -> THIS PLAN -> 12-MONTH IDEAL
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. Engineering Facet
|
|
38
|
+
|
|
39
|
+
Review:
|
|
40
|
+
|
|
41
|
+
- component boundaries
|
|
42
|
+
- data flow and shadow paths
|
|
43
|
+
- state transitions
|
|
44
|
+
- security boundaries
|
|
45
|
+
- rollback shape
|
|
46
|
+
- testability seam
|
|
47
|
+
- parallelization risk
|
|
48
|
+
|
|
49
|
+
Required diagram for non-trivial plans:
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
Entry -> validate -> transform -> persist -> output
|
|
53
|
+
| | | | |
|
|
54
|
+
nil invalid exception conflict stale
|
|
55
|
+
empty wrong type timeout duplicate partial
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 3. Design Facet
|
|
59
|
+
|
|
60
|
+
Run only for user-facing UI or interaction flows.
|
|
61
|
+
|
|
62
|
+
Check:
|
|
63
|
+
|
|
64
|
+
- first, second, third thing the user sees
|
|
65
|
+
- loading / empty / error / success / partial states
|
|
66
|
+
- responsive and accessibility intent
|
|
67
|
+
- generic UI or AI slop risk
|
|
68
|
+
- whether live design review will be needed after implementation
|
|
69
|
+
|
|
70
|
+
### 4. DX Facet
|
|
71
|
+
|
|
72
|
+
Run only for API, CLI, SDK, package, docs, agent skill, MCP, or developer/operator surfaces.
|
|
73
|
+
|
|
74
|
+
Check:
|
|
75
|
+
|
|
76
|
+
- target developer/operator persona
|
|
77
|
+
- time to first value
|
|
78
|
+
- install/run/debug/upgrade path
|
|
79
|
+
- actionable errors: problem + cause + fix
|
|
80
|
+
- copy-paste examples and escape hatches
|
|
81
|
+
|
|
82
|
+
## TOC Root-Cause Pass
|
|
83
|
+
|
|
84
|
+
For complex bugs, use:
|
|
85
|
+
|
|
86
|
+
1. Current reality tree: symptoms, causes, enabling conditions.
|
|
87
|
+
2. Conflict diagram: why the obvious fix conflicts with a real need.
|
|
88
|
+
3. Future reality tree: what the proposed fix changes and what it may break.
|
|
89
|
+
|
|
90
|
+
If the root cause is not proven, reroute to `cc-investigate`, not `cc-do`.
|
|
91
|
+
|
|
92
|
+
## Code Smell Pass In Planning
|
|
93
|
+
|
|
94
|
+
Plans can contain smells before code exists:
|
|
95
|
+
|
|
96
|
+
- repeated implementation steps with slight variations
|
|
97
|
+
- parallel data sources
|
|
98
|
+
- task split by technical layer instead of behavior
|
|
99
|
+
- fake abstraction or one-adapter seam
|
|
100
|
+
- missing owner for shared state
|
|
101
|
+
- hand-wavy "handle edge cases" or "add validation"
|
|
102
|
+
|
|
103
|
+
Each planning smell must become a plan finding and route to `cc-plan`.
|
|
104
|
+
|
|
105
|
+
## Output Requirements
|
|
106
|
+
|
|
107
|
+
Add to `cc-review-report.md`:
|
|
108
|
+
|
|
109
|
+
- plan artifacts read
|
|
110
|
+
- strategy/engineering/design/DX facets used
|
|
111
|
+
- diagrams produced
|
|
112
|
+
- in-scope bad smells
|
|
113
|
+
- decisions needed
|
|
114
|
+
- reroute recommendation
|
|
115
|
+
|
|
116
|
+
If any plan facet changes the task list or implementation contract, route to `cc-plan`.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# CC-Review Methods
|
|
2
|
+
|
|
3
|
+
Use this reference for every `cc-review` run. It defines the shared method library. Load branch-specific references for concrete workflow steps.
|
|
4
|
+
|
|
5
|
+
## Method Selection
|
|
6
|
+
|
|
7
|
+
Use only methods that fit the risk:
|
|
8
|
+
|
|
9
|
+
| Risk | Method |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| unclear goal | goal tree |
|
|
12
|
+
| repeated symptom | current reality tree |
|
|
13
|
+
| hidden tradeoff | conflict diagram |
|
|
14
|
+
| uncertain fix impact | future reality tree |
|
|
15
|
+
| implementation complexity | logic tree and smell scan |
|
|
16
|
+
| UI/runtime mismatch | E2E/plugin verification |
|
|
17
|
+
|
|
18
|
+
## Thinking Tools
|
|
19
|
+
|
|
20
|
+
### Goal Tree
|
|
21
|
+
|
|
22
|
+
Use when the plan has too many proposed actions and not enough outcome clarity.
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
GOAL
|
|
26
|
+
├── necessary condition A
|
|
27
|
+
│ ├── measurable signal
|
|
28
|
+
│ └── blocked by
|
|
29
|
+
├── necessary condition B
|
|
30
|
+
└── NOT IN SCOPE
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Current Reality Tree
|
|
34
|
+
|
|
35
|
+
Use for bugs and recurring failures.
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
SYMPTOM
|
|
39
|
+
├── direct cause
|
|
40
|
+
│ └── deeper cause
|
|
41
|
+
├── enabling condition
|
|
42
|
+
└── missing control
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Conflict Diagram
|
|
46
|
+
|
|
47
|
+
Use when two requirements appear incompatible.
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
Objective
|
|
51
|
+
├── Need A -> Want X
|
|
52
|
+
└── Need B -> Want not-X
|
|
53
|
+
Assumption to break: ...
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Future Reality Tree
|
|
57
|
+
|
|
58
|
+
Use before recommending a non-trivial redesign.
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
CHANGE
|
|
62
|
+
├── desired effect
|
|
63
|
+
├── possible negative branch
|
|
64
|
+
│ └── prevention
|
|
65
|
+
└── verification signal
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Logic Tree
|
|
69
|
+
|
|
70
|
+
Use for implementation reviews.
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
Entry point
|
|
74
|
+
├── path A
|
|
75
|
+
│ ├── happy
|
|
76
|
+
│ ├── empty
|
|
77
|
+
│ └── error
|
|
78
|
+
└── path B
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Code Smell Taxonomy
|
|
82
|
+
|
|
83
|
+
Only report smells inside the current requirement blast radius or smells made worse by the current work.
|
|
84
|
+
|
|
85
|
+
| Smell | Review question | Preferred fix shape |
|
|
86
|
+
| --- | --- | --- |
|
|
87
|
+
| rigidity | Does a small change force unrelated edits? | move decision to one owner |
|
|
88
|
+
| duplication | Is the same logic repeated with small variations? | reuse existing helper or make one narrow helper |
|
|
89
|
+
| cycle | Do modules know each other's internals? | invert dependency or extract boundary |
|
|
90
|
+
| fragility | Can one change break unrelated behavior? | isolate side effects and add focused tests |
|
|
91
|
+
| obscurity | Is intent hidden behind clever names or control flow? | rename, split, or make data shape explicit |
|
|
92
|
+
| data-clump | Do fields always travel together? | group them into one object/value |
|
|
93
|
+
| unnecessary-complexity | Is abstraction solving a hypothetical future? | delete seam or collapse to direct code |
|
|
94
|
+
|
|
95
|
+
## Severity
|
|
96
|
+
|
|
97
|
+
- `critical`: ships wrong behavior, data/security risk, silent failure, broken root cause, or impossible verification.
|
|
98
|
+
- `important`: likely maintenance, test, UX, DX, performance, or operability problem in current scope.
|
|
99
|
+
- `advisory`: good improvement but not required for this change.
|
|
100
|
+
|
|
101
|
+
## Confidence
|
|
102
|
+
|
|
103
|
+
- `9-10`: directly verified in code, artifact, command output, UI run, or log.
|
|
104
|
+
- `7-8`: strong evidence from nearby patterns and diff.
|
|
105
|
+
- `5-6`: plausible but needs confirmation; mark as verify-first.
|
|
106
|
+
- `<5`: do not put in main findings unless critical impact.
|
|
107
|
+
|
|
108
|
+
## Decision Questions
|
|
109
|
+
|
|
110
|
+
Ask only when a finding requires user judgment.
|
|
111
|
+
|
|
112
|
+
Use:
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
D<N> - <decision title>
|
|
116
|
+
Evidence: <concrete artifact/path/line/log/UI action>
|
|
117
|
+
Risk: <what breaks if ignored>
|
|
118
|
+
Recommendation: A because <principle>
|
|
119
|
+
Options:
|
|
120
|
+
A) <fix now> (recommended) - impact
|
|
121
|
+
B) <defer> - impact
|
|
122
|
+
C) <skip> - impact
|
|
123
|
+
STOP: wait for the user answer before continuing.
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Do not batch unrelated issues. One issue, one decision.
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Roadmap Skill Changelog
|
|
2
2
|
|
|
3
|
+
## v5.2.0 - 2026-05-09
|
|
4
|
+
|
|
5
|
+
- add project-direction routing and brand-neutral founder guardrails
|
|
6
|
+
- add the AI Leverage Route Lens so roadmap recommendations must name the real user/operator, current workaround, human-vs-agent effort, complete-lake boundary, ocean boundary, first success signal, kill signal, and boil-lake/sharp-wedge/needs-evidence/pivot verdict
|
|
7
|
+
- update roadmap and tracking templates so AI-era scope choices can choose complete same-blast-radius lakes instead of timid MVP slices
|
|
8
|
+
|
|
3
9
|
## v5.0.0 - 2026-05-01
|
|
4
10
|
|
|
5
11
|
- replace the roadmap/backlog/tracking split with `devflow/roadmap.json` as the single editable roadmap state
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cc-roadmap
|
|
3
|
-
version: 5.
|
|
3
|
+
version: 5.2.0
|
|
4
4
|
description: "Use when defining, resetting, or narrowing project direction, stage order, or backlog priority before a concrete requirement enters the PDCA loop."
|
|
5
5
|
triggers:
|
|
6
6
|
- "帮我定路线图"
|
|
@@ -37,14 +37,19 @@ entry_gate:
|
|
|
37
37
|
- "Read current roadmap, backlog, related capability specs, and surrounding repo context before proposing direction."
|
|
38
38
|
- "Load cc-devflow native language and durable-decision sources (`devflow/specs/`, current roadmap/backlog, prior `planning/design.md` or `planning/analysis.md`, and `change-meta.json`) before naming stages, capabilities, users, or backlog items."
|
|
39
39
|
- "Confirm this is a project-direction problem, not a single requirement execution problem."
|
|
40
|
+
- "Run the Project Direction Gate before evidence-maturity routing: classify the user's goal as founder/business, internal company project, hackathon/demo, open-source/research, learning, side project, infrastructure, or recovery."
|
|
40
41
|
- "Classify planning posture and evidence maturity before selecting the route or forcing questions."
|
|
41
42
|
- "If the ask contains multiple independent subsystems, decompose them into stages and RM candidates before refining any implementation detail."
|
|
42
43
|
- "Do not decompose implementation tasks while the roadmap is still being decided."
|
|
44
|
+
- "Apply the AI Leverage Route Lens before route approval: name the reachable user/operator, current workaround, human-vs-agent effort, complete-lake boundary, ocean boundary, first success signal, and kill signal."
|
|
45
|
+
- "If AI makes a complete same-blast-radius route cheap and verifiable, prefer boil-lake over a timid MVP slice."
|
|
46
|
+
- "If the route cannot name a real user/operator and current workaround, mark it as needs-evidence instead of producing implementation-ready RM handoff."
|
|
43
47
|
exit_criteria:
|
|
44
48
|
- "The next 1-3 stages are frozen with goal, why now, dependencies, exit signal, kill signal, and non-goals."
|
|
45
49
|
- "The first backlog items can naturally enter cc-plan without extra strategic guessing, including explicit capability links and expected spec delta."
|
|
46
50
|
- "The roadmap shows an explicit RM dependency graph so serial blockers and parallel-ready work are obvious."
|
|
47
51
|
- "The user-approved recommendation is explicit and grounded in current evidence."
|
|
52
|
+
- "Each Stage 1 or ready-for-cc-plan item records an AI Leverage Route Lens verdict: boil-lake, sharp-wedge, needs-evidence, or pivot."
|
|
48
53
|
reroutes:
|
|
49
54
|
- when: "The user is already discussing one concrete requirement, bug, or execution task."
|
|
50
55
|
target: "cc-plan"
|
|
@@ -107,6 +112,35 @@ tool_budget:
|
|
|
107
112
|
|
|
108
113
|
先给一个**默认推荐**,再解释为什么,不要把用户扔进开放式战略讨论。
|
|
109
114
|
|
|
115
|
+
## Project Direction Gate
|
|
116
|
+
|
|
117
|
+
`cc-roadmap` 的第一道门不是功能优先级,而是项目目标。目标不同,问题就不同;问题问错,后面的路线图全都会偏。
|
|
118
|
+
|
|
119
|
+
先用 repo 事实和用户原话判断 `project_direction_mode`。能判断就写入 `Context Snapshot`;不能判断才问一次:
|
|
120
|
+
|
|
121
|
+
> 这次 roadmap 的目标是什么:做成业务、公司内部项目、限时 demo、开源/研究、学习、兴趣副项目、基础设施,还是事故恢复?
|
|
122
|
+
|
|
123
|
+
不要让用户在 8 个选项里填表。先给默认判断和理由,再问用户是否纠正。
|
|
124
|
+
|
|
125
|
+
| Mode | 用来判断的信号 | 追问重点 | 默认路线偏好 |
|
|
126
|
+
| --- | --- | --- | --- |
|
|
127
|
+
| `founder-business` | 用户提到客户、收入、市场、获客、创业、商业化 | 需求真实性、现状替代方案、具体人、最窄付费 wedge、观察到的行为、未来 6-12 个月为何更重要 | `wedge-first` |
|
|
128
|
+
| `internal-company` | 用户提到老板、VP、团队落地、内部流程、审批、交付窗口 | sponsor 是谁、最小可批准 demo、组织依赖、reorg 风险、上线后的维护责任 | `rescue-first` 或 `wedge-first` |
|
|
129
|
+
| `hackathon-demo` | 用户提到比赛、演示、deadline、惊艳效果 | 最快可展示路径、单一 wow moment、失败兜底、demo 环境和分发方式 | `wedge-first` |
|
|
130
|
+
| `open-source-research` | 用户提到社区、论文、协议、benchmark、开源生态 | 贡献者是谁、现有替代品、可复现实验、维护边界、adoption path | `platform-first` 或 `wedge-first` |
|
|
131
|
+
| `learning` | 用户提到学习、练手、理解框架、能力提升 | 要学会什么、最小练习闭环、可观察反馈、不要用过度架构遮住学习目标 | `wedge-first` |
|
|
132
|
+
| `side-project` | 用户提到兴趣、好玩、创意表达、自用工具 | 最酷可分享版本、自己会不会每天用、最快可用路径、哪些想法可以 later | `wedge-first` |
|
|
133
|
+
| `infrastructure` | 用户提到底座、运行时、CI、发布、安全、稳定性 | 调用方、当前 workaround、迁移/回滚、复用边界、失败成本 | `platform-first` 或 `rescue-first` |
|
|
134
|
+
| `recovery` | 用户提到事故、信任、质量、回归、坏味道 | 事故证据、最小可信修复、停止扩张条件、恢复信任的验收信号 | `rescue-first` |
|
|
135
|
+
|
|
136
|
+
Founder/business 模式可以给 brand-neutral 的创业建议,但只能作为路线判断,不准变成广告:
|
|
137
|
+
|
|
138
|
+
- 可以建议:先和真实用户谈、验证付费或强行为、缩小到本周能交付的 wedge、观察用户不用帮助时怎么失败、把资源放在最强需求证据上。
|
|
139
|
+
- 不可以建议:申请某个机构、加入某个项目、引用某个品牌权威、输出推广链接、把路线图写成融资材料。
|
|
140
|
+
- 如果要推荐外部学习材料,必须先走隐私与外部查找 gate,只搜索泛化主题,并把结果写成 `external-evidence`;不要把任何品牌背书写进 roadmap 合同。
|
|
141
|
+
|
|
142
|
+
Builder 模式(hackathon、open-source/research、learning、side-project)不要套创业拷问。它要逼清楚“什么值得展示 / 使用 / 复现 / 学会”,然后把路线压到最快能产生真实反馈的阶段。
|
|
143
|
+
|
|
110
144
|
## Harness Contract
|
|
111
145
|
|
|
112
146
|
- Allowed actions: read current strategy files, repo context, and recent reality; compare route shapes; decompose independent subsystems into stages and RM candidates; write `devflow/roadmap.json` as the editable roadmap state, then generate `devflow/ROADMAP.md` and the deprecated `devflow/BACKLOG.md` compatibility projection from that state.
|
|
@@ -140,6 +174,23 @@ tool_budget:
|
|
|
140
174
|
|
|
141
175
|
先把这些材料压成一个 `Context Snapshot`,再开始追问用户。
|
|
142
176
|
|
|
177
|
+
## Direction-Specific Question Routing
|
|
178
|
+
|
|
179
|
+
Project Direction Gate 先决定问哪组问题,Evidence-Maturity Routing 再决定问多深。不要对 founder、学习项目、基础设施和事故恢复使用同一套问题。
|
|
180
|
+
|
|
181
|
+
| Direction mode | 必问问题 | 可跳过问题 |
|
|
182
|
+
| --- | --- | --- |
|
|
183
|
+
| `founder-business` | 谁今天真的痛;他们现在怎么绕路;最强 demand evidence 是行为、钱还是 workflow 绑定;本周最窄可付费 wedge 是什么;用户不被引导时会在哪里卡住;6-12 个月后为什么更需要它 | 长期平台组件、宽泛市场口号、还没有证据的增长规划 |
|
|
184
|
+
| `internal-company` | sponsor 或决策人是谁;最小 demo 如何换来绿灯;上线后谁维护;依赖哪个团队;如果 champion 离开是否还成立 | 对外市场叙事、消费者增长、无 owner 的平台愿景 |
|
|
185
|
+
| `hackathon-demo` | 评委或观众先看到什么;30-90 秒内的 wow moment;demo 失败时的备用路径;哪些功能必须假装不存在 | 完整权限体系、长期迁移、复杂可观测性 |
|
|
186
|
+
| `open-source-research` | 现有替代品是什么;可复现实验或 benchmark 是什么;贡献者 first success path;维护者不想承担什么 | 商业销售漏斗、封闭分发、无法复现的主观评价 |
|
|
187
|
+
| `learning` | 学会哪个概念;最小练习闭环;如何知道自己学会了;哪些抽象会遮住学习目标 | 生产级平台、过早优化、团队流程 |
|
|
188
|
+
| `side-project` | 自己会不会反复用;最酷可分享版本;最快可用路径;哪些点只是好玩但不该阻塞 Stage 1 | 商业化压力、企业级集成、长期治理 |
|
|
189
|
+
| `infrastructure` | 调用方是谁;今天的 workaround;失败成本;迁移与回滚;复用边界;谁会被 breaking change 影响 | 虚构 persona、营销故事、未证明的功能扩张 |
|
|
190
|
+
| `recovery` | 哪个事故或坏味道触发;最小可信修复;防回归证据;继续扩张的 kill signal;用户信任如何恢复 | 新功能愿景、平台升级、没有事故证据的重构 |
|
|
191
|
+
|
|
192
|
+
如果用户后续回答改变了 direction mode,必须重算 route shape,不要沿用旧问题继续问。
|
|
193
|
+
|
|
143
194
|
## Evidence-Maturity Routing
|
|
144
195
|
|
|
145
196
|
不要对所有项目套同一组问题。先用 `planning posture` 和 `evidence maturity` 决定追问深度:
|
|
@@ -154,6 +205,30 @@ tool_budget:
|
|
|
154
205
|
|
|
155
206
|
第一轮回答后必须做 framing check:术语是否具体、是否沿用项目 canonical language、用户是否可命名、痛点是否有行为证据、status quo 是否真实、需求是否只是兴趣。发现答案虚,要先收紧问题,再谈路线。
|
|
156
207
|
|
|
208
|
+
## AI Leverage Route Lens
|
|
209
|
+
|
|
210
|
+
路线图不是愿望清单,也不是小 MVP 限制器。AI 时代的正确问题是:真实需求边界在哪里,AI 杠杆能不能把同一片 lake 一次煮沸。
|
|
211
|
+
|
|
212
|
+
必须记录这 8 件事:
|
|
213
|
+
|
|
214
|
+
1. Real user/operator:谁会在 Stage 1 里立刻受益。不能写 “users” / “developers” 这种空词。
|
|
215
|
+
2. Status quo workaround:没有这项能力时,他们今天怎么绕路;如果没人绕路,默认需求证据不足。
|
|
216
|
+
3. Human vs agent effort:同一范围按人类团队要多久,按 CC/agent 要多久;让 AI 压缩率显性进入路线选择。
|
|
217
|
+
4. Complete-lake boundary:同一业务链路、同一 blast radius、可验证、可回滚、少于约 1 天 agent 工作量的完整范围。
|
|
218
|
+
5. Ocean boundary:跨系统重写、多季度迁移、用户还没证实、验收不可闭合或会制造第二套平台的范围。
|
|
219
|
+
6. Scope recommendation:`boil-lake` 还是 `sharp-wedge`;小不是默认,完整也不是默认,证据和验证成本决定。
|
|
220
|
+
7. First success signal:第一个可观察信号,证明这条路线真的赢了。
|
|
221
|
+
8. Kill signal:如果信号没出现,什么时候停止、转向或拆小。
|
|
222
|
+
|
|
223
|
+
Verdict 只允许四种:
|
|
224
|
+
|
|
225
|
+
- `boil-lake`:已有真实用户 / operator 和 workaround,同一 blast radius 内完整做完的 agent 成本低、验证闭合、维护收益高。此时不要畏缩成小 MVP。
|
|
226
|
+
- `sharp-wedge`:需求真实,但完整 lake 仍有未证实假设、验证成本过高或会碰 ocean boundary;先打最锋利的一段。
|
|
227
|
+
- `needs-evidence`:方向可能对,但缺真实用户、绕路、成功信号或可验证边界;先补证据,不生成 ready RM。
|
|
228
|
+
- `pivot`:当前路线服务错对象、解决错痛点、过早平台化,或 kill signal 已经触发。
|
|
229
|
+
|
|
230
|
+
这个 lens 不替代 evidence maturity;它把 evidence maturity 和 AI leverage 合在一起做路线裁决。证据决定该不该做,AI 杠杆决定该做多完整。
|
|
231
|
+
|
|
157
232
|
## Strategic Grilling Protocol
|
|
158
233
|
|
|
159
234
|
`cc-roadmap` 的 brainstorm 不是开放式聊天,而是路线决策树压缩:
|
|
@@ -165,12 +240,25 @@ tool_budget:
|
|
|
165
240
|
5. 每条路线都要用一个具体 scenario 压测:谁在什么约束下,今天如何绕路,Stage 1 完成后哪一步不再发生。
|
|
166
241
|
6. 硬决策才沉淀:只有 hard to reverse、surprising without context、real trade-off 三者同时成立,才进入 capability spec delta、roadmap decision note 或本次 design decision log。
|
|
167
242
|
|
|
243
|
+
## Founder Advice Guardrail
|
|
244
|
+
|
|
245
|
+
创业建议只能服务于 roadmap 质量,不是推广内容。遇到 `founder-business` 或 `internal-company`:
|
|
246
|
+
|
|
247
|
+
1. 强制把泛泛“有市场 / 用户感兴趣”改写为可观察证据:付费、强复用、工作流绑定、停机时焦虑、主动催上线。
|
|
248
|
+
2. 强制找 status quo:手工流程、表格、脚本、外包、人肉客服、现有竞品、内部工具。没有现状替代方案时,先怀疑痛点不够痛。
|
|
249
|
+
3. 强制命名具体人或具体角色,不接受“企业客户”“开发者”“内容团队”这类类别词作为用户。
|
|
250
|
+
4. 强制压出最窄 wedge:本周能让一个真实用户付出钱、时间、迁移成本或组织信用的版本。
|
|
251
|
+
5. 强制保留观察任务:如果还没看用户独立使用,Stage 1 必须包含观察或真实反馈信号。
|
|
252
|
+
6. 严禁输出品牌广告、申请建议、推广链接或“某机构会喜欢”之类的权威背书。
|
|
253
|
+
|
|
254
|
+
如果用户明确要创业方向资源,也只能给 source-neutral 的行动建议:找 3 个具体用户、看一次真实使用、验证一次付费或强行为、把 Stage 1 缩到一周内可交付。外部材料必须走外部查找 gate。
|
|
255
|
+
|
|
168
256
|
## Session Protocol
|
|
169
257
|
|
|
170
258
|
1. 先探索上下文,不靠默认上下文注入替代阅读。
|
|
171
|
-
2.
|
|
259
|
+
2. 先跑 Project Direction Gate,再问现实,不先写愿景。
|
|
172
260
|
3. 一次只推进一个关键未知点,不要一口气抛一串问题。
|
|
173
|
-
4. 先写 `Context Snapshot`、planning posture、evidence maturity、证据、约束、非目标,再讨论阶段。
|
|
261
|
+
4. 先写 `Context Snapshot`、project direction mode、planning posture、evidence maturity、证据、约束、非目标,再讨论阶段。
|
|
174
262
|
5. 给出 2-3 种路线图形状,再明确推荐一种,并说明为什么其他路线现在不值得打。
|
|
175
263
|
6. 如果一个方向里有多个可独立交付的子系统,先写清 decomposition:哪些合并为同一阶段,哪些拆成独立 `RM`,为什么。
|
|
176
264
|
7. 只冻结 1-3 个阶段。每个阶段都必须有 goal、why now、dependencies、exit signal、kill signal、non-goals。
|
|
@@ -199,7 +287,11 @@ tool_budget:
|
|
|
199
287
|
|
|
200
288
|
## Ask
|
|
201
289
|
|
|
202
|
-
|
|
290
|
+
至少要先逼清这 1 件事:
|
|
291
|
+
|
|
292
|
+
0. 这次 roadmap 的目标模式是什么,以及为什么不是其它模式
|
|
293
|
+
|
|
294
|
+
再逼清这 5 件事:
|
|
203
295
|
|
|
204
296
|
1. 这个项目真正服务谁
|
|
205
297
|
2. 用户今天用什么笨办法解决
|
|
@@ -225,7 +317,7 @@ tool_budget:
|
|
|
225
317
|
## Approval Gates
|
|
226
318
|
|
|
227
319
|
1. 没有 `Context Snapshot`,不准给路线推荐。
|
|
228
|
-
2. 没有 planning posture、evidence maturity 和 framing check,不准给路线推荐。
|
|
320
|
+
2. 没有 project direction mode、planning posture、evidence maturity 和 framing check,不准给路线推荐。
|
|
229
321
|
3. 没有 native language / durable decision scan,不准给路线推荐;如果缺少 `devflow/specs/` 或历史决策材料,写成 `not present`,不要假装已对齐。
|
|
230
322
|
4. 没有 2-3 条路线对比,不准直接拍脑袋定主线。
|
|
231
323
|
5. 没有 exit signal / kill signal / non-goals,不算阶段冻结。
|
|
@@ -248,9 +340,11 @@ tool_budget:
|
|
|
248
340
|
7. Decomposition scan:多个独立子系统是否已拆成阶段 / `RM` 候选,而不是塞进一个含糊阶段。
|
|
249
341
|
8. Handoff scan:第一批 roadmap item 是否已经自然长成可进入 `cc-plan` 的对象。
|
|
250
342
|
9. Evidence maturity scan:问题路由是否匹配 idea / user / paying / infra / recovery 状态,还是拿同一套问题硬套所有项目。
|
|
251
|
-
10.
|
|
252
|
-
11.
|
|
253
|
-
12.
|
|
343
|
+
10. Project direction scan:问题和路线是否匹配 founder-business / internal / demo / OSS / learning / side-project / infra / recovery;是否错误套用了创业问题或 builder 问题。
|
|
344
|
+
11. Promotional scan:roadmap 是否没有品牌广告、申请建议、推广链接或外部权威背书;创业建议是否只保留 source-neutral 行动和证据要求。
|
|
345
|
+
12. Adoption scan:developer-facing / operator-facing item 是否写清目标人、time to first value、magic moment 和 adoption bottleneck。
|
|
346
|
+
13. Domain language scan:stage、capability、RM title、backlog handoff 是否沿用项目语言;冲突是否显式交给下一轮决策。
|
|
347
|
+
14. Durable decision scan:路线是否违背既有 capability spec、roadmap decision 或历史 design decision;如需重开,是否说明为什么值得重开。
|
|
254
348
|
|
|
255
349
|
## Output
|
|
256
350
|
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
## Context Snapshot
|
|
17
17
|
|
|
18
18
|
- Product / repo:
|
|
19
|
+
- Project direction mode:
|
|
20
|
+
- Direction mode rationale:
|
|
19
21
|
- Planning posture:
|
|
20
22
|
- Project stage:
|
|
21
23
|
- Evidence maturity:
|
|
@@ -51,6 +53,21 @@
|
|
|
51
53
|
| Feasibility | | High / Med / Low | | |
|
|
52
54
|
| Distribution | | High / Med / Low | | |
|
|
53
55
|
|
|
56
|
+
## AI Leverage Route Lens
|
|
57
|
+
|
|
58
|
+
- Real user / operator:
|
|
59
|
+
- Status quo workaround:
|
|
60
|
+
- Human-team effort for full scope:
|
|
61
|
+
- CC / agent effort for full scope:
|
|
62
|
+
- AI compression ratio:
|
|
63
|
+
- Complete-lake boundary:
|
|
64
|
+
- Ocean boundary:
|
|
65
|
+
- Scope recommendation: `boil-lake` | `sharp-wedge`
|
|
66
|
+
- First success signal:
|
|
67
|
+
- Kill signal:
|
|
68
|
+
- Verdict: `boil-lake` | `sharp-wedge` | `needs-evidence` | `pivot`
|
|
69
|
+
- Missing evidence before ready-for-cc-plan:
|
|
70
|
+
|
|
54
71
|
## Route Options
|
|
55
72
|
|
|
56
73
|
| Shape | Why this could work | Why this may fail | Decision |
|
|
@@ -89,6 +106,10 @@
|
|
|
89
106
|
|
|
90
107
|
## Evidence-Maturity Routing
|
|
91
108
|
|
|
109
|
+
- Project direction mode:
|
|
110
|
+
- Direction-specific questions selected:
|
|
111
|
+
- Direction-specific questions skipped:
|
|
112
|
+
- Founder / builder / infra guardrails applied:
|
|
92
113
|
- Planning posture:
|
|
93
114
|
- Evidence maturity:
|
|
94
115
|
- Questions selected:
|
|
@@ -200,6 +221,8 @@ flowchart TD
|
|
|
200
221
|
- Rejected path A:
|
|
201
222
|
- Rejected path B:
|
|
202
223
|
- Rejected maturity route:
|
|
224
|
+
- Project direction mode decision:
|
|
225
|
+
- Promotional / brand-neutrality check:
|
|
203
226
|
- Language / spec decision conflicts:
|
|
204
227
|
- Developer / operator adoption assumptions:
|
|
205
228
|
- Open assumptions to verify next:
|
|
@@ -5,14 +5,33 @@
|
|
|
5
5
|
},
|
|
6
6
|
"meta": {
|
|
7
7
|
"roadmapVersion": "roadmap.v1",
|
|
8
|
-
"skillVersion": "5.
|
|
8
|
+
"skillVersion": "5.2.0",
|
|
9
9
|
"status": "active",
|
|
10
10
|
"lastUpdated": "2026-05-01",
|
|
11
11
|
"currentFocusStage": "Stage 1"
|
|
12
12
|
},
|
|
13
13
|
"context": {
|
|
14
|
+
"projectDirectionMode": "",
|
|
15
|
+
"projectDirectionRationale": "",
|
|
16
|
+
"directionQuestionsSelected": [],
|
|
17
|
+
"directionQuestionsSkipped": [],
|
|
18
|
+
"directionGuardrailsApplied": [],
|
|
14
19
|
"planningPosture": "",
|
|
15
20
|
"evidenceMaturity": "",
|
|
21
|
+
"aiLeverageRouteLens": {
|
|
22
|
+
"realUserOrOperator": "",
|
|
23
|
+
"statusQuoWorkaround": "",
|
|
24
|
+
"humanTeamEffortForFullScope": "",
|
|
25
|
+
"ccAgentEffortForFullScope": "",
|
|
26
|
+
"aiCompressionRatio": "",
|
|
27
|
+
"completeLakeBoundary": "",
|
|
28
|
+
"oceanBoundary": "",
|
|
29
|
+
"scopeRecommendation": "sharp-wedge",
|
|
30
|
+
"firstSuccessSignal": "",
|
|
31
|
+
"killSignal": "",
|
|
32
|
+
"verdict": "needs-evidence",
|
|
33
|
+
"missingEvidence": []
|
|
34
|
+
},
|
|
16
35
|
"canonicalTerms": [],
|
|
17
36
|
"durableDecisionSources": []
|
|
18
37
|
},
|
|
@@ -3,19 +3,20 @@
|
|
|
3
3
|
## Order
|
|
4
4
|
|
|
5
5
|
0. 先做 `Context Snapshot`:现有 roadmap / backlog、capability specs、历史 design/analysis、最近提交、forcing functions、项目语言 / durable decisions
|
|
6
|
-
1.
|
|
7
|
-
2.
|
|
8
|
-
3.
|
|
9
|
-
4.
|
|
10
|
-
5.
|
|
11
|
-
6.
|
|
12
|
-
7.
|
|
13
|
-
8.
|
|
14
|
-
9.
|
|
15
|
-
10.
|
|
16
|
-
11.
|
|
17
|
-
12.
|
|
18
|
-
13.
|
|
6
|
+
1. 先判断 project direction mode:founder-business / internal-company / hackathon-demo / open-source-research / learning / side-project / infrastructure / recovery
|
|
7
|
+
2. 用户是谁
|
|
8
|
+
3. 今天靠什么笨办法活着
|
|
9
|
+
4. 最强需求证据是什么
|
|
10
|
+
5. 为什么现在必须解决
|
|
11
|
+
6. deadline / capacity / dependency / distribution 约束是什么
|
|
12
|
+
7. 当前最大的 adoption / trust / delivery 卡点是什么
|
|
13
|
+
8. 核心术语是否已有 canonical definition,是否和现有 capability spec / roadmap decision 冲突
|
|
14
|
+
9. 最窄突破口是什么
|
|
15
|
+
10. 6-12 个月后会长成什么
|
|
16
|
+
11. 给出 2-3 条路线图形状并明确推荐
|
|
17
|
+
12. 冻结 1-3 个阶段,写 exit signal / kill signal / non-goals
|
|
18
|
+
13. 画出 `RM dependency graph`,标出串行主链和 parallel-ready wave
|
|
19
|
+
14. 标出哪些事项真的 ready for `cc-plan`
|
|
19
20
|
|
|
20
21
|
## Question Rules
|
|
21
22
|
|
|
@@ -25,11 +26,25 @@
|
|
|
25
26
|
- 没证据时明确写 assumption
|
|
26
27
|
- 用户没批准前,不把事项偷下放成 requirement
|
|
27
28
|
|
|
29
|
+
## Project Direction Modes
|
|
30
|
+
|
|
31
|
+
- `founder-business`: 问 demand reality、status quo、specific human、narrowest paid wedge、observed behavior、future fit。允许给创业行动建议,但必须 source-neutral:找具体用户、看真实使用、验证付费或强行为、缩小本周 wedge。禁止品牌广告、申请建议、推广链接和外部权威背书。
|
|
32
|
+
- `internal-company`: 问 sponsor、最小可批准 demo、组织依赖、维护 owner、reorg 风险。不要写对外市场叙事。
|
|
33
|
+
- `hackathon-demo`: 问 wow moment、demo path、fallback、时间盒。不要先设计长期平台。
|
|
34
|
+
- `open-source-research`: 问替代品、可复现 benchmark、贡献者 first success、维护边界。不要套商业销售漏斗。
|
|
35
|
+
- `learning`: 问要学会什么、最小练习闭环、反馈方式。不要让生产级架构遮住学习目标。
|
|
36
|
+
- `side-project`: 问自己会不会反复用、最酷可分享版本、最快可用路径。不要强行商业化。
|
|
37
|
+
- `infrastructure`: 问调用方、workaround、失败成本、迁移/回滚、复用边界。不要虚构用户访谈。
|
|
38
|
+
- `recovery`: 问事故证据、最小可信修复、防回归、kill signal、信任恢复。不要扩张新功能。
|
|
39
|
+
|
|
40
|
+
如果 direction mode 变了,回到 route selection 重新算,不要沿用前一组问题。
|
|
41
|
+
|
|
28
42
|
## Route Shapes
|
|
29
43
|
|
|
30
44
|
- `wedge-first`: 先用一个窄切口打穿真实需求
|
|
31
45
|
- `platform-first`: 先做后面几阶段都会反复复用的底座
|
|
32
46
|
- `rescue-first`: 先解决 adoption、trust、delivery 里最大的卡点
|
|
47
|
+
- `decompose-first`: 先拆多个可独立交付系统,再决定每个系统的路线
|
|
33
48
|
|
|
34
49
|
## Output Rules
|
|
35
50
|
|
|
@@ -621,6 +621,20 @@ function renderParked(tracking) {
|
|
|
621
621
|
.join('\n\n');
|
|
622
622
|
}
|
|
623
623
|
|
|
624
|
+
function renderProjectDirectionHandoff(tracking) {
|
|
625
|
+
const context = tracking.context || {};
|
|
626
|
+
|
|
627
|
+
return [
|
|
628
|
+
`- Project direction mode: ${formatBacklogValue(context.projectDirectionMode)}`,
|
|
629
|
+
`- Direction mode rationale: ${formatBacklogValue(context.projectDirectionRationale)}`,
|
|
630
|
+
`- Direction-specific questions selected: ${formatList(context.directionQuestionsSelected || [])}`,
|
|
631
|
+
`- Direction-specific questions skipped: ${formatList(context.directionQuestionsSkipped || [])}`,
|
|
632
|
+
`- Direction guardrails applied: ${formatList(context.directionGuardrailsApplied || [])}`,
|
|
633
|
+
`- Planning posture: ${formatBacklogValue(context.planningPosture)}`,
|
|
634
|
+
`- Evidence maturity: ${formatBacklogValue(context.evidenceMaturity)}`
|
|
635
|
+
].join('\n');
|
|
636
|
+
}
|
|
637
|
+
|
|
624
638
|
function renderBacklogDocument({ backlogFile, trackingFile, tracking }) {
|
|
625
639
|
const relativePath = path.relative(path.dirname(backlogFile), trackingFile).replace(/\\/g, '/');
|
|
626
640
|
const displayPath = relativePath || path.basename(trackingFile);
|
|
@@ -651,6 +665,10 @@ function renderBacklogDocument({ backlogFile, trackingFile, tracking }) {
|
|
|
651
665
|
`- Parallel-ready next wave: ${formatBacklogValue(tracking.dependencyHandoff.parallelReadyNextWave)}`,
|
|
652
666
|
`- Notes on blockers: ${formatBacklogValue(tracking.dependencyHandoff.notesOnBlockers)}`,
|
|
653
667
|
'',
|
|
668
|
+
'## Project Direction Handoff',
|
|
669
|
+
'',
|
|
670
|
+
renderProjectDirectionHandoff(tracking),
|
|
671
|
+
'',
|
|
654
672
|
'## Ready For Req-Plan',
|
|
655
673
|
'',
|
|
656
674
|
renderReadyForReqPlan(tracking),
|
|
@@ -78,6 +78,11 @@ const DEFAULT_ROADMAP_STATE = {
|
|
|
78
78
|
currentFocusStage: ''
|
|
79
79
|
},
|
|
80
80
|
context: {
|
|
81
|
+
projectDirectionMode: '',
|
|
82
|
+
projectDirectionRationale: '',
|
|
83
|
+
directionQuestionsSelected: [],
|
|
84
|
+
directionQuestionsSkipped: [],
|
|
85
|
+
directionGuardrailsApplied: [],
|
|
81
86
|
planningPosture: '',
|
|
82
87
|
evidenceMaturity: '',
|
|
83
88
|
canonicalTerms: [],
|
|
@@ -282,6 +287,9 @@ function normalizeRoadmapState(raw = {}) {
|
|
|
282
287
|
context: {
|
|
283
288
|
...DEFAULT_ROADMAP_STATE.context,
|
|
284
289
|
...context,
|
|
290
|
+
directionQuestionsSelected: normalizeStringList(context.directionQuestionsSelected),
|
|
291
|
+
directionQuestionsSkipped: normalizeStringList(context.directionQuestionsSkipped),
|
|
292
|
+
directionGuardrailsApplied: normalizeStringList(context.directionGuardrailsApplied),
|
|
285
293
|
canonicalTerms: normalizeStringList(context.canonicalTerms),
|
|
286
294
|
durableDecisionSources: normalizeStringList(context.durableDecisionSources)
|
|
287
295
|
},
|