oh-my-opencode 5.0.0-beta.87 → 5.0.0-beta.89
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/README.ja.md +1 -11
- package/README.ko.md +1 -11
- package/README.md +1 -1
- package/README.ru.md +1 -11
- package/README.zh-cn.md +1 -11
- package/dist/cli/index.js +90 -73
- package/dist/cli-node/index.js +90 -73
- package/dist/index.js +368 -347
- package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
- package/dist/skills/frontend/references/design/ambience-skill.md +2 -1
- package/dist/skills/frontend/references/design/design-system-architecture.md +30 -7
- package/dist/skills/frontend/references/design/interaction-skill.md +17 -5
- package/dist/skills/ulw-plan/SKILL.md +5 -5
- package/dist/skills/ulw-plan/references/full-workflow.md +13 -9
- package/dist/skills/ulw-plan/references/intent-clear.md +5 -6
- package/dist/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/dist/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
- package/package.json +14 -14
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +16 -3
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +13 -9
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +2 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +30 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +17 -5
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +13 -9
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +2 -1
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +30 -7
- package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +17 -5
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +13 -9
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/shared-skills/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
|
@@ -20,7 +20,7 @@ TOPOLOGY LOCK still applies: enumerate the 1-6 independently-succeed/fail compon
|
|
|
20
20
|
</research_protocol>
|
|
21
21
|
|
|
22
22
|
<default_selection>
|
|
23
|
-
For each open decision - including the extrinsic axes the sweep names (budget, mandated stack, expected scale, target audience / compliance) - adopt the
|
|
23
|
+
For each open decision - including the extrinsic axes the sweep names (budget, mandated stack, expected scale, target audience / compliance) - adopt the default the ideal state for the affected user demands (industry standard and repo convention are evidence for it, never the default itself), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical, or commits real spend the user never authorized, and research cannot settle.
|
|
24
24
|
|
|
25
25
|
Fold a contrarian self-grill into the Metis spawn: challenge the single highest-leverage adopted assumption - is this constraint real or habitual; does any adopted default add complexity the request never asked for? - and return concrete reframes. The grill targets incidental complexity (unneeded abstraction, speculative capacity), NEVER the feature set: reducing, phasing, or deferring part of the request is not a reframe. Fold a reframe into the plan only as a recommended default plus rationale, never as a forced change.
|
|
26
26
|
</default_selection>
|
|
@@ -38,7 +38,7 @@ Still present a brief and wait for the user's explicit okay - approval is not ex
|
|
|
38
38
|
<worked_example>
|
|
39
39
|
Request: "make auth better".
|
|
40
40
|
1. Research waves -> current auth at `src/auth/*` and evidence for the requested improvement; best-practice baselines via librarian.
|
|
41
|
-
2. Topology lock as an ANNOUNCEMENT, not a question: components refine the evidenced auth intent in full, such as session hardening, brute-force protection, and password policy when the repository supports them. MFA is an adjacent capability and stays in Scope OUT unless the user asks for it or evidence establishes it as part of the requested outcome.
|
|
41
|
+
2. Affected user and ideal state, announced: the people who sign in and the operators who read auth logs; IS rows the evidence supports - a legitimate user is never locked out, brute force is stopped, a session is never reusable after a privilege change. Topology lock as an ANNOUNCEMENT, not a question: components refine the evidenced auth intent in full, such as session hardening, brute-force protection, and password policy when the repository supports them. MFA is an adjacent capability and stays in Scope OUT unless the user asks for it or evidence establishes it as part of the requested outcome.
|
|
42
42
|
3. Adopted-defaults table (assumption | default | rationale | reversible?): bcrypt rounds 8 -> 12 (reversible), add 5/min-per-IP login limit (reversible), rotate session id on privilege change (reversible).
|
|
43
43
|
4. Metis folded -> auto dual review (fix eligible gaps under the bounded convergence contract) -> brief LEADING with the approach and the defaults, surfaced in the human TL;DR for veto.
|
|
44
44
|
</worked_example>
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// plan-templates.mjs - the draft and plan skeleton text that scaffold-plan.mjs emits.
|
|
2
|
+
//
|
|
3
|
+
// Text only: no filesystem access, no path policy (scaffold-plan.mjs owns the write
|
|
4
|
+
// boundary). Zero external dependencies so it runs byte-identically under `node` and `bun`.
|
|
5
|
+
|
|
6
|
+
// The canonical AI-plan section headers, in order. references/full-workflow.md
|
|
7
|
+
// documents this exact list; the two must never drift.
|
|
8
|
+
export const PLAN_SECTION_HEADERS = [
|
|
9
|
+
"## TL;DR (For humans)",
|
|
10
|
+
"## Scope",
|
|
11
|
+
"## Verification strategy",
|
|
12
|
+
"## Execution strategy",
|
|
13
|
+
"## Todos",
|
|
14
|
+
"## Final verification wave",
|
|
15
|
+
"## Commit strategy",
|
|
16
|
+
"## Success criteria",
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export const FINAL_VERIFICATION_ITEMS = [
|
|
20
|
+
"F1. Plan compliance audit",
|
|
21
|
+
"F2. Code quality review",
|
|
22
|
+
"F3. Real manual QA",
|
|
23
|
+
"F4. Ideal-state fidelity",
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export function buildDraft(slug, intent, { reviewRequired = false } = {}) {
|
|
27
|
+
const assumptionsNote =
|
|
28
|
+
intent === "unclear"
|
|
29
|
+
? "Intent is UNCLEAR: research resolves ambiguity, defaults are adopted (not asked), and each is surfaced in the plan's human TL;DR for veto."
|
|
30
|
+
: "Record any default you adopt instead of asking, so the user can veto it at the gate.";
|
|
31
|
+
const reviewState = reviewRequired
|
|
32
|
+
? `review_required: true
|
|
33
|
+
plan_path: .omo/plans/${slug}.md
|
|
34
|
+
plan_sha256: null
|
|
35
|
+
review_round_id: null
|
|
36
|
+
pending-action: write and review .omo/plans/${slug}.md
|
|
37
|
+
review:
|
|
38
|
+
momus:
|
|
39
|
+
status: pending
|
|
40
|
+
workspace_root: null
|
|
41
|
+
runtime_home: null
|
|
42
|
+
target: .omo/plans/${slug}.md
|
|
43
|
+
round_id: null
|
|
44
|
+
plan_sha256: null
|
|
45
|
+
launch_id: null
|
|
46
|
+
session: null
|
|
47
|
+
result: null
|
|
48
|
+
independent:
|
|
49
|
+
status: pending
|
|
50
|
+
workspace_root: null
|
|
51
|
+
runtime_home: null
|
|
52
|
+
target: .omo/plans/${slug}.md
|
|
53
|
+
round_id: null
|
|
54
|
+
plan_sha256: null
|
|
55
|
+
launch_id: null
|
|
56
|
+
session: null
|
|
57
|
+
result: null`
|
|
58
|
+
: `review_required: false
|
|
59
|
+
pending-action: write .omo/plans/${slug}.md`;
|
|
60
|
+
return `---
|
|
61
|
+
slug: ${slug}
|
|
62
|
+
status: drafting
|
|
63
|
+
intent: ${intent}
|
|
64
|
+
${reviewState}
|
|
65
|
+
approach: <fill: the approach you intend to plan>
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
# Draft: ${slug}
|
|
69
|
+
|
|
70
|
+
## Affected user and ideal state
|
|
71
|
+
<!-- Who this output touches (a customer, another programmer, a program or agent consuming it - often more than one) and how each uses it today and will use it after. -->
|
|
72
|
+
<!-- IS-n | property of the ideal state: nothing snags, feels odd, regresses, or degrades for them | reason -->
|
|
73
|
+
<!-- GAP-n | difference between IS-n and today | reason | closed by todo(s) -->
|
|
74
|
+
|
|
75
|
+
## Components (topology ledger)
|
|
76
|
+
<!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
|
|
77
|
+
<!-- id | outcome (one line) | status: active|deferred | evidence path -->
|
|
78
|
+
|
|
79
|
+
## Open assumptions (announced defaults)
|
|
80
|
+
<!-- ${assumptionsNote} -->
|
|
81
|
+
<!-- assumption | adopted default | rationale | reversible? -->
|
|
82
|
+
|
|
83
|
+
## Findings (cited - path:lines)
|
|
84
|
+
|
|
85
|
+
## Decisions (with rationale)
|
|
86
|
+
|
|
87
|
+
## Scope IN
|
|
88
|
+
|
|
89
|
+
## Scope OUT (Must NOT have)
|
|
90
|
+
|
|
91
|
+
## Open questions
|
|
92
|
+
|
|
93
|
+
## Approval gate
|
|
94
|
+
status: drafting
|
|
95
|
+
<!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
|
|
96
|
+
<!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function buildPlanSkeleton(slug, intent) {
|
|
101
|
+
const decisionsLine =
|
|
102
|
+
intent === "unclear"
|
|
103
|
+
? "**Decisions I made for you:** <fill last - the best-practice defaults you adopted; the user vetoes any here>"
|
|
104
|
+
: "**Decisions to sanity-check:** <fill last - the few choices worth a human glance>";
|
|
105
|
+
return `# ${slug} - Work Plan
|
|
106
|
+
|
|
107
|
+
## TL;DR (For humans)
|
|
108
|
+
<!-- Fill this LAST, after the detailed plan below is written, so it summarizes the REAL plan. -->
|
|
109
|
+
<!-- Plain English for a non-engineer: NO file paths, NO todo numbers, NO wave/agent/tool names. -->
|
|
110
|
+
|
|
111
|
+
**Who this is for and what changes for them:** <fill last - the affected user and their experience after, 1-2 sentences>
|
|
112
|
+
|
|
113
|
+
**What you'll get:** <fill last - deliverables in human terms, 1-2 sentences>
|
|
114
|
+
|
|
115
|
+
**Why this approach:** <fill last - the one or two load-bearing decisions and why>
|
|
116
|
+
|
|
117
|
+
**What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
|
|
118
|
+
|
|
119
|
+
**Effort:** <Quick | Short | Medium | Large | XL>
|
|
120
|
+
<!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
|
|
121
|
+
**Risk:** <Low | Medium | High> - <one-line driver>
|
|
122
|
+
${decisionsLine}
|
|
123
|
+
|
|
124
|
+
Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execution detail follows below.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
> TL;DR (machine): <1 line - effort, risk, deliverables>
|
|
129
|
+
|
|
130
|
+
## Scope
|
|
131
|
+
### Affected user and ideal state
|
|
132
|
+
<!-- From the draft ledger: who this touches and how they use the result, then one IS row per property with its reason, then one GAP row per difference with its reason. Every todo below closes a GAP row; ## Success criteria proves every IS row. -->
|
|
133
|
+
**Affected user:** <who, and how they use it today and after>
|
|
134
|
+
|
|
135
|
+
| Row | Statement | Reason |
|
|
136
|
+
| --- | --- | --- |
|
|
137
|
+
| IS-1 | <what the user does, sees, or never has break> | <why this is the ideal for them> |
|
|
138
|
+
| GAP-1 | <how today differs from IS-1> | <why it matters to them> |
|
|
139
|
+
|
|
140
|
+
### Must have
|
|
141
|
+
### Must NOT have (guardrails, anti-slop, scope boundaries)
|
|
142
|
+
|
|
143
|
+
## Verification strategy
|
|
144
|
+
> Zero human intervention - all verification is agent-executed.
|
|
145
|
+
- Test decision: <TDD | tests-after | none> + framework
|
|
146
|
+
- Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from 'omo-agent-toolkit ulw-loop status --json', .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
|
|
147
|
+
|
|
148
|
+
## Execution strategy
|
|
149
|
+
### Parallel execution waves
|
|
150
|
+
> Target 5-8 todos per wave. Fewer than 3 (except the final) means you under-split.
|
|
151
|
+
|
|
152
|
+
### Dependency matrix
|
|
153
|
+
| Todo | Depends on | Blocks | Can parallelize with |
|
|
154
|
+
| --- | --- | --- | --- |
|
|
155
|
+
|
|
156
|
+
## Todos
|
|
157
|
+
> Implementation + Test = ONE todo. Never separate.
|
|
158
|
+
<!-- APPEND TASK BATCHES BELOW THIS LINE WITH edit/apply_patch - never rewrite the headers above. -->
|
|
159
|
+
- [ ] 1. <title>
|
|
160
|
+
What to do / Must NOT do: <...>
|
|
161
|
+
Closes: GAP-<n>
|
|
162
|
+
Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
|
|
163
|
+
References (executor has NO interview context - be exhaustive): <src/path:lines>
|
|
164
|
+
Acceptance criteria (agent-executable): <exact command or assertion>
|
|
165
|
+
QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
|
|
166
|
+
Commit: <Y/N> | <type>(<scope>): <summary>
|
|
167
|
+
|
|
168
|
+
## Final verification wave
|
|
169
|
+
> Runs in parallel after ALL todos. ALL must APPROVE. Surface results and wait for the user's explicit okay before declaring complete.
|
|
170
|
+
${FINAL_VERIFICATION_ITEMS.map((item) => `- [ ] ${item}`).join("\n")}
|
|
171
|
+
|
|
172
|
+
## Commit strategy
|
|
173
|
+
|
|
174
|
+
## Success criteria
|
|
175
|
+
> One row per IS row. The plan is complete only when every IS row has a delivering todo and a proving QA scenario; F4 checks the delivered behavior against these rows 1:1, and a shortfall becomes new \`- [ ] N.\` rows, never a note.
|
|
176
|
+
| IS | Delivering todo(s) | Proving QA scenario | Evidence |
|
|
177
|
+
| --- | --- | --- | --- |
|
|
178
|
+
| IS-1 | <N> | <scenario name from todo N> | <attemptDir>/task-<N>-${slug}.<ext> |
|
|
179
|
+
`;
|
|
180
|
+
}
|
|
@@ -23,26 +23,10 @@
|
|
|
23
23
|
import { lstat, mkdir, writeFile, readFile, realpath } from "node:fs/promises";
|
|
24
24
|
import { dirname, join, relative, resolve, isAbsolute } from "node:path";
|
|
25
25
|
import { pathToFileURL } from "node:url";
|
|
26
|
+
import { FINAL_VERIFICATION_ITEMS, PLAN_SECTION_HEADERS, buildDraft, buildPlanSkeleton } from "./plan-templates.mjs";
|
|
26
27
|
|
|
27
|
-
// The
|
|
28
|
-
|
|
29
|
-
export const PLAN_SECTION_HEADERS = [
|
|
30
|
-
"## TL;DR (For humans)",
|
|
31
|
-
"## Scope",
|
|
32
|
-
"## Verification strategy",
|
|
33
|
-
"## Execution strategy",
|
|
34
|
-
"## Todos",
|
|
35
|
-
"## Final verification wave",
|
|
36
|
-
"## Commit strategy",
|
|
37
|
-
"## Success criteria",
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
export const FINAL_VERIFICATION_ITEMS = [
|
|
41
|
-
"F1. Plan compliance audit",
|
|
42
|
-
"F2. Code quality review",
|
|
43
|
-
"F3. Real manual QA",
|
|
44
|
-
"F4. Scope fidelity",
|
|
45
|
-
];
|
|
28
|
+
// The emitted text lives in plan-templates.mjs; re-exported so importers keep one entry point.
|
|
29
|
+
export { FINAL_VERIFICATION_ITEMS, PLAN_SECTION_HEADERS, buildDraft, buildPlanSkeleton };
|
|
46
30
|
|
|
47
31
|
const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,79}$/;
|
|
48
32
|
|
|
@@ -151,141 +135,6 @@ export function isUlwArtifact(content) {
|
|
|
151
135
|
return isPlan || isDraft;
|
|
152
136
|
}
|
|
153
137
|
|
|
154
|
-
export function buildDraft(slug, intent, { reviewRequired = false } = {}) {
|
|
155
|
-
const assumptionsNote =
|
|
156
|
-
intent === "unclear"
|
|
157
|
-
? "Intent is UNCLEAR: research resolves ambiguity, defaults are adopted (not asked), and each is surfaced in the plan's human TL;DR for veto."
|
|
158
|
-
: "Record any default you adopt instead of asking, so the user can veto it at the gate.";
|
|
159
|
-
const reviewState = reviewRequired
|
|
160
|
-
? `review_required: true
|
|
161
|
-
plan_path: .omo/plans/${slug}.md
|
|
162
|
-
plan_sha256: null
|
|
163
|
-
review_round_id: null
|
|
164
|
-
pending-action: write and review .omo/plans/${slug}.md
|
|
165
|
-
review:
|
|
166
|
-
momus:
|
|
167
|
-
status: pending
|
|
168
|
-
workspace_root: null
|
|
169
|
-
runtime_home: null
|
|
170
|
-
target: .omo/plans/${slug}.md
|
|
171
|
-
round_id: null
|
|
172
|
-
plan_sha256: null
|
|
173
|
-
launch_id: null
|
|
174
|
-
session: null
|
|
175
|
-
result: null
|
|
176
|
-
independent:
|
|
177
|
-
status: pending
|
|
178
|
-
workspace_root: null
|
|
179
|
-
runtime_home: null
|
|
180
|
-
target: .omo/plans/${slug}.md
|
|
181
|
-
round_id: null
|
|
182
|
-
plan_sha256: null
|
|
183
|
-
launch_id: null
|
|
184
|
-
session: null
|
|
185
|
-
result: null`
|
|
186
|
-
: `review_required: false
|
|
187
|
-
pending-action: write .omo/plans/${slug}.md`;
|
|
188
|
-
return `---
|
|
189
|
-
slug: ${slug}
|
|
190
|
-
status: drafting
|
|
191
|
-
intent: ${intent}
|
|
192
|
-
${reviewState}
|
|
193
|
-
approach: <fill: the approach you intend to plan>
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
# Draft: ${slug}
|
|
197
|
-
|
|
198
|
-
## Components (topology ledger)
|
|
199
|
-
<!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
|
|
200
|
-
<!-- id | outcome (one line) | status: active|deferred | evidence path -->
|
|
201
|
-
|
|
202
|
-
## Open assumptions (announced defaults)
|
|
203
|
-
<!-- ${assumptionsNote} -->
|
|
204
|
-
<!-- assumption | adopted default | rationale | reversible? -->
|
|
205
|
-
|
|
206
|
-
## Findings (cited - path:lines)
|
|
207
|
-
|
|
208
|
-
## Decisions (with rationale)
|
|
209
|
-
|
|
210
|
-
## Scope IN
|
|
211
|
-
|
|
212
|
-
## Scope OUT (Must NOT have)
|
|
213
|
-
|
|
214
|
-
## Open questions
|
|
215
|
-
|
|
216
|
-
## Approval gate
|
|
217
|
-
status: drafting
|
|
218
|
-
<!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
|
|
219
|
-
<!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
|
|
220
|
-
`;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export function buildPlanSkeleton(slug, intent) {
|
|
224
|
-
const decisionsLine =
|
|
225
|
-
intent === "unclear"
|
|
226
|
-
? "**Decisions I made for you:** <fill last - the best-practice defaults you adopted; the user vetoes any here>"
|
|
227
|
-
: "**Decisions to sanity-check:** <fill last - the few choices worth a human glance>";
|
|
228
|
-
return `# ${slug} - Work Plan
|
|
229
|
-
|
|
230
|
-
## TL;DR (For humans)
|
|
231
|
-
<!-- Fill this LAST, after the detailed plan below is written, so it summarizes the REAL plan. -->
|
|
232
|
-
<!-- Plain English for a non-engineer: NO file paths, NO todo numbers, NO wave/agent/tool names. -->
|
|
233
|
-
|
|
234
|
-
**What you'll get:** <fill last - deliverables in human terms, 1-2 sentences>
|
|
235
|
-
|
|
236
|
-
**Why this approach:** <fill last - the one or two load-bearing decisions and why>
|
|
237
|
-
|
|
238
|
-
**What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
|
|
239
|
-
|
|
240
|
-
**Effort:** <Quick | Short | Medium | Large | XL>
|
|
241
|
-
<!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
|
|
242
|
-
**Risk:** <Low | Medium | High> - <one-line driver>
|
|
243
|
-
${decisionsLine}
|
|
244
|
-
|
|
245
|
-
Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execution detail follows below.
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
> TL;DR (machine): <1 line - effort, risk, deliverables>
|
|
250
|
-
|
|
251
|
-
## Scope
|
|
252
|
-
### Must have
|
|
253
|
-
### Must NOT have (guardrails, anti-slop, scope boundaries)
|
|
254
|
-
|
|
255
|
-
## Verification strategy
|
|
256
|
-
> Zero human intervention - all verification is agent-executed.
|
|
257
|
-
- Test decision: <TDD | tests-after | none> + framework
|
|
258
|
-
- Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from 'omo-agent-toolkit ulw-loop status --json', .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
|
|
259
|
-
|
|
260
|
-
## Execution strategy
|
|
261
|
-
### Parallel execution waves
|
|
262
|
-
> Target 5-8 todos per wave. Fewer than 3 (except the final) means you under-split.
|
|
263
|
-
|
|
264
|
-
### Dependency matrix
|
|
265
|
-
| Todo | Depends on | Blocks | Can parallelize with |
|
|
266
|
-
| --- | --- | --- | --- |
|
|
267
|
-
|
|
268
|
-
## Todos
|
|
269
|
-
> Implementation + Test = ONE todo. Never separate.
|
|
270
|
-
<!-- APPEND TASK BATCHES BELOW THIS LINE WITH edit/apply_patch - never rewrite the headers above. -->
|
|
271
|
-
- [ ] 1. <title>
|
|
272
|
-
What to do / Must NOT do: <...>
|
|
273
|
-
Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
|
|
274
|
-
References (executor has NO interview context - be exhaustive): <src/path:lines>
|
|
275
|
-
Acceptance criteria (agent-executable): <exact command or assertion>
|
|
276
|
-
QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
|
|
277
|
-
Commit: <Y/N> | <type>(<scope>): <summary>
|
|
278
|
-
|
|
279
|
-
## Final verification wave
|
|
280
|
-
> Runs in parallel after ALL todos. ALL must APPROVE. Surface results and wait for the user's explicit okay before declaring complete.
|
|
281
|
-
${FINAL_VERIFICATION_ITEMS.map((item) => `- [ ] ${item}`).join("\n")}
|
|
282
|
-
|
|
283
|
-
## Commit strategy
|
|
284
|
-
|
|
285
|
-
## Success criteria
|
|
286
|
-
`;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
138
|
// Resume-safe write: plain re-run on an existing ulw-plan artifact is a no-op
|
|
290
139
|
// success; --reset overwrites but refuses to discard a hand-edited file unless
|
|
291
140
|
// --force is also passed.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// omo-codex-install:
|
|
2
|
+
// omo-codex-install:ed5913a0451b102580823bb453ab16a6b0fe5490e3c3cc96f21285ce1b271763:fef32404e9543827207e1db51df847e2c997e70ee31a7440d6a8cfb13c3450d0
|
|
3
3
|
var __esm = (fn, res, err) => () => {
|
|
4
4
|
if (fn)
|
|
5
5
|
try {
|
|
@@ -9984,7 +9984,7 @@ var package_default;
|
|
|
9984
9984
|
var init_package = __esm(() => {
|
|
9985
9985
|
package_default = {
|
|
9986
9986
|
name: "@oh-my-opencode/omo-codex",
|
|
9987
|
-
version: "5.0.0-beta.
|
|
9987
|
+
version: "5.0.0-beta.89",
|
|
9988
9988
|
type: "module",
|
|
9989
9989
|
private: true,
|
|
9990
9990
|
description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
|
|
@@ -113,7 +113,8 @@ react-bits optimizes for the demo page. The project optimizes for `perfection/RE
|
|
|
113
113
|
- **Accessibility contract.** Decorative canvases and effect layers get `aria-hidden="true"`. Split or scrambled text keeps the full string readable: one `aria-label` on the wrapper, or a visually hidden copy, so screen readers never hear one glyph at a time.
|
|
114
114
|
- **Tokens, not demo colors.** Every color, gradient stop, and intensity traces to a `DESIGN.md` token. The catalog's violet, pink, and cyan defaults are placeholders.
|
|
115
115
|
- **Budget and load order.** WebGL and GSAP-heavy components load lazily (`React.lazy` / `next/dynamic`) after the LCP element; the hero's LCP is the headline or the poster image, never the canvas. Ship a static poster fallback behind a WebGL capability check. Record the chunk size in `DESIGN.md` accepted debt.
|
|
116
|
-
- **
|
|
116
|
+
- **Comfort for large-area motion.** A moving layer that fills the viewport is read by peripheral vision as the world moving: keep the surrounding chrome still as a fixed reference frame, keep the moving layer low-contrast and translucent, concentrate motion toward the center rather than the viewport edges, and never run a slow oscillation near 0.2 Hz (one cycle every ~5 s).
|
|
117
|
+
- **One atmosphere per page.** A background is the hero's one signature moment; a text reveal marks arrival; a card effect signals affordance. Two atmospheres on one page, or a reveal on every paragraph, is slop even when each piece is well built.
|
|
117
118
|
|
|
118
119
|
## 5. Dependency rules
|
|
119
120
|
|
package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md
CHANGED
|
@@ -60,8 +60,7 @@ rather than borders, creating layers you feel more than see."
|
|
|
60
60
|
| Status/info | --status-info | #2563EB | #3B82F6 | Informational |
|
|
61
61
|
|
|
62
62
|
### Rules
|
|
63
|
-
-
|
|
64
|
-
- Accent is used ONLY for interactive elements. Never decorative.
|
|
63
|
+
- Accent marks the one or two most likely actions on a screen, on the control's background rather than its glyph or label. Peer choices differ by style, never by size. Nothing decorative carries accent.
|
|
65
64
|
- Never introduce a color not in this table. Extend the table first.
|
|
66
65
|
|
|
67
66
|
## 3. Typography
|
|
@@ -148,12 +147,22 @@ code; do not invent future components just to fill the section.
|
|
|
148
147
|
| Emphasis | 400-600ms | cubic-bezier(0.16, 1, 0.3, 1) | Page transition, hero entry |
|
|
149
148
|
| Scroll-driven | tied to scroll | linear | Parallax, progress, reveal |
|
|
150
149
|
|
|
150
|
+
### Feedback thresholds
|
|
151
|
+
|
|
152
|
+
| Event | Feedback | Timing |
|
|
153
|
+
|-------|----------|--------|
|
|
154
|
+
| Press, tap, drag start | State change on the element itself | Same frame; a drag image once the pointer has moved a few px |
|
|
155
|
+
| Hover-revealed controls | Controls appear, then leave with the pointer | After hover intent, not on pointer entry |
|
|
156
|
+
| Async action started | Placeholder or disabled control at once; spinner or skeleton only past ~1 s | An indicator never flashes for sub-second work |
|
|
157
|
+
| Long wait | Determinate progress at an even pace; indeterminate only when the total is unknown | Never swap indicator shape mid-task or front-load to 90% |
|
|
158
|
+
| Outcome | Failure reported next to the object; success shown by the changed state itself | Toast only for outcomes not visible in place |
|
|
159
|
+
|
|
151
160
|
### Rules
|
|
152
|
-
- Only animate `transform` and `
|
|
153
|
-
- Every interactive element has hover
|
|
154
|
-
-
|
|
161
|
+
- Only animate `transform`, `opacity`, and `filter`. Never animate layout properties.
|
|
162
|
+
- Every interactive element has hover, active, and focus states. Selected/focused/active is encoded with ink-alpha washes and a glyph (check) — never a coloured accent border or outline. `focus-visible` rings are the only coloured edge.
|
|
163
|
+
- A surface that changes size, position, or content animates from its old geometry to the new one; never unmount and remount it. Nothing reflows under the pointer while the user is typing or dragging.
|
|
155
164
|
- Scroll-triggered animations use `IntersectionObserver`, not scroll listeners.
|
|
156
|
-
- Reduced motion:
|
|
165
|
+
- Reduced motion means reduce, not remove: under `prefers-reduced-motion`, positional, scale, and depth motion becomes a cross-fade; fades, gesture-tracked motion, and progress indicators stay.
|
|
157
166
|
|
|
158
167
|
## 7. Depth & Surface
|
|
159
168
|
|
|
@@ -176,6 +185,19 @@ If borders:
|
|
|
176
185
|
If tonal-shift:
|
|
177
186
|
Surfaces use progressively lighter/darker shades. No borders, no shadows.
|
|
178
187
|
|
|
188
|
+
### Radius
|
|
189
|
+
|
|
190
|
+
| Token | Value | Usage |
|
|
191
|
+
|-------|-------|-------|
|
|
192
|
+
| --radius-sm | [e.g. 6px] | Inputs, chips, small controls |
|
|
193
|
+
| --radius-md | [e.g. 12px] | Cards, panels, popovers |
|
|
194
|
+
| --radius-lg | [e.g. 20px] | Sheets, modals, hero containers |
|
|
195
|
+
| --radius-full | 9999px | Pills, avatars |
|
|
196
|
+
|
|
197
|
+
### Rules
|
|
198
|
+
- Nested corners are concentric: inner radius = outer radius minus the padding between them, never the same value at both depths.
|
|
199
|
+
- Elevation reads only when scale, shadow, and highlight change together; a shadow change alone does not lift a surface.
|
|
200
|
+
|
|
179
201
|
## 8. Accessibility Constraints & Accepted Debt
|
|
180
202
|
|
|
181
203
|
### Constraints
|
|
@@ -220,7 +242,8 @@ After every component implementation, check:
|
|
|
220
242
|
- [ ] Interactive elements have all required states from Section 5 and Section 6.
|
|
221
243
|
- [ ] Depth treatment matches the chosen strategy from Section 7.
|
|
222
244
|
- [ ] Component reused 2+ times? Documented in Section 5.
|
|
223
|
-
- [ ] Motion follows the timing
|
|
245
|
+
- [ ] Motion follows the timing and feedback-threshold tables, and every animation has its reduced-motion path.
|
|
246
|
+
- [ ] Radii come from the Section 7 scale; nested corners are concentric.
|
|
224
247
|
- [ ] Component visual QA passed for each primitive and required state before product screens were composed.
|
|
225
248
|
- [ ] Section 8 accessibility constraints hold for the new component; any new debt is recorded in Section 8, not silently accepted.
|
|
226
249
|
- [ ] Survives content stress: empty, long label, unbroken string. Reflows to one readable column at 375px with no horizontal scroll of primary content.
|
|
@@ -125,11 +125,23 @@ This table is the edge of this catalog. Hero atmospheres, animated or shader bac
|
|
|
125
125
|
|
|
126
126
|
These sharpen the shared axioms for interaction work; none of them replace the style skill.
|
|
127
127
|
|
|
128
|
-
- **Motion serves meaning.** Every animation maps to a real interaction, state change, or affordance
|
|
129
|
-
|
|
128
|
+
- **Motion serves meaning, and each meaning has its motion.** Every animation maps to a real interaction, state change, or affordance; a hover that changes nothing is slop. Pick the motion from the meaning, not from the catalog's most striking demo:
|
|
129
|
+
|
|
130
|
+
| Meaning | Motion | Not |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| Press acknowledged | Scale or wash on the element, same frame | A ripple that arrives after the action fires |
|
|
133
|
+
| Something is in progress | A moving indicator | A static one, which reads as frozen |
|
|
134
|
+
| Something is live or new | A brief highlight or subtle pulse, once | A permanent loop |
|
|
135
|
+
| Something arrived from elsewhere | Enter from the direction of its origin | A fade-in from nowhere |
|
|
136
|
+
| Something moved | It travels there | Disappear here, appear there |
|
|
137
|
+
| An unfamiliar control exists | A one-time introduction on first appearance | Continuous decoration |
|
|
138
|
+
|
|
139
|
+
- **Transitions keep identity.** A surface that resizes, repositions, or swaps content animates from its old geometry to the new one (`layoutId` shared layout or a measured-height morph); the user must never suspect a replacement. When items move and others appear, move first, then add. Keep one element still as the anchor while the rest animates. Nothing reflows under the pointer while the user is typing or dragging. A panel leaves the way it came: a sheet that rose from the bottom dismisses downward, and the reverse gesture undoes the forward one.
|
|
140
|
+
- **Reduced motion is part of the component, not an afterthought.** Every beui.dev component ships a reduced-motion path; match that bar, and reduce rather than remove: under `prefers-reduced-motion: reduce`, positional, scale, and depth motion becomes a cross-fade (the `loader` pattern's opacity-pulse swap is the model); fades, gesture-tracked motion, and progress indicators stay; blur never animates its start or end. Any state that motion conveys is also announced (`aria-live`, a label change). React Native: respect the system reduce-motion setting.
|
|
130
141
|
- **GPU-composited properties only** — `transform`, `opacity`, `filter`. Never animate layout properties; morph layout through shared-layout (`layoutId`) or measured height primitives instead.
|
|
131
|
-
- **Springs move things; easings tint things.** Spatial movement (position, scale, layout morphs) wants spring physics so it stays interruptible and retargetable. Color, opacity, and blur want short duration + easing. Do not put a fixed-duration tween on a gesture-driven surface.
|
|
132
|
-
- **Interruptibility is non-negotiable.** A press, hover-out, or route change mid-animation must retarget smoothly, never queue or block input. This is the practical reason beui.dev uses springs — copy that property, not just the bounce.
|
|
142
|
+
- **Springs move things; easings tint things; continuous input tracks.** Spatial movement (position, scale, layout morphs) wants spring physics so it stays interruptible and retargetable. Color, opacity, and blur want short duration + easing. Discrete input (a tap, a keypress) animates; continuous input (a drag, a wheel, a slider) follows the pointer 1:1 with no interpolation, then settles with a spring on release. Do not put a fixed-duration tween on a gesture-driven surface.
|
|
143
|
+
- **Interruptibility is non-negotiable.** A press, hover-out, or route change mid-animation must retarget smoothly, never queue or block input, and never snap to the end state. This is the practical reason beui.dev uses springs — copy that property, not just the bounce.
|
|
144
|
+
- **One event, one feedback.** Feedback lives on the object that changed. Do not stack a spinner over a control that already shows progress, re-animate a native control, or confirm routine success with a toast: success is assumed and shown by the changed state; failure is always reported, next to the object, with the cause. Prefer undo to a confirmation dialog; a dialog is for uncommon and irreversible loss only, its buttons name the outcome ("Delete", "Keep editing"), and neither Cancel nor the destructive action takes the default (Enter) role. Send the request when the input lands, not when the acknowledging animation ends.
|
|
133
145
|
- **Motion never regresses input latency or stream rendering.** Measure with the `perfection` ruleset when in doubt; a virtualized list's measurement contract beats a pretty reveal.
|
|
134
146
|
- **Library choice is a project decision, not a default.** beui.dev assumes Motion (motion.dev) + Tailwind. If the project already has a motion stack, adapt the mechanism to it. If it has none: CSS transitions/WAAPI cover micro-interactions; adding a library is justified by shared-layout or spring-physics needs and gets recorded (with bundle cost) in `DESIGN.md`. Check `package.json` before importing anything.
|
|
135
147
|
|
|
@@ -143,4 +155,4 @@ These sharpen the shared axioms for interaction work; none of them replace the s
|
|
|
143
155
|
|
|
144
156
|
## 6. Verification
|
|
145
157
|
|
|
146
|
-
Interaction work is verified through `/visual-qa` with motion actually driven and inspected — hover, press, open/close, swipe, and theme transitions exercised on the rendered surface,
|
|
158
|
+
Interaction work is verified through `/visual-qa` with motion actually driven and inspected — hover, press, open/close, swipe, and theme transitions exercised on the rendered surface, an interruption pass (retarget mid-animation, dismiss mid-open) proving nothing snaps or blocks, and a reduced-motion pass (emulate `prefers-reduced-motion: reduce`) proving the fallback exists. Timing-sensitive changes record a short screen capture, not just stills.
|
|
@@ -24,13 +24,13 @@ If another active mode mandates its own first line (ultrawork does), print that
|
|
|
24
24
|
Directly under the marker, before any exploration, state the working contract once, in your own words, carrying ALL of these commitments:
|
|
25
25
|
|
|
26
26
|
1. **Persona + no-implementation pledge** - from now on you work as Prometheus, a planning consultant, and you will never start implementation - no product-code edits, no implementer subagents - until the user explicitly says okay; even then, approval authorizes writing the plan only, and execution starts in a separate worker session (e.g. `$ulw-execute`).
|
|
27
|
-
2. **Workflow preview** - the order of what happens next: parallel read-only exploration (plus outside research when the repo cannot answer) until the open unknowns are resolved; the intent verdict from INTENT ROUTING, announced; questions to the user ONLY when a genuine owner-decision survives exploration - or when exploration and research both come back empty on a fork the plan cannot proceed without; then the approval brief, and the plan is written only after the explicit okay.
|
|
27
|
+
2. **Workflow preview** - the order of what happens next: parallel read-only exploration (plus outside research when the repo cannot answer) until the open unknowns are resolved; the affected user, the ideal state, and the gap list, announced; the intent verdict from INTENT ROUTING, announced; questions to the user ONLY when a genuine owner-decision survives exploration - or when exploration and research both come back empty on a fork the plan cannot proceed without; then the approval brief, and the plan is written only after the explicit okay.
|
|
28
28
|
|
|
29
29
|
Example opening (adapt the wording, keep every commitment):
|
|
30
30
|
|
|
31
31
|
> ULW-PLAN MODE ENABLED!
|
|
32
32
|
> From now on I am working as Prometheus, a planning consultant. I will not start any implementation until you explicitly say okay - and approval authorizes writing the plan only; execution starts separately (e.g. `$ulw-execute`).
|
|
33
|
-
> Next, in order: (1) parallel read-only exploration and research, (2) intent verdict announced (CLEAR or UNCLEAR, plus whether high-accuracy review is required), (
|
|
33
|
+
> Next, in order: (1) parallel read-only exploration and research, (2) the affected user, the ideal state for them, and every gap from today, announced, (3) intent verdict announced (CLEAR or UNCLEAR, plus whether high-accuracy review is required), (4) questions only for the forks the ideal state and exploration cannot settle - or where research finds nothing on a blocking decision, (5) approval brief, then (6) the plan is written after your okay.
|
|
34
34
|
|
|
35
35
|
## INTENT ROUTING - pick ONE intent reference
|
|
36
36
|
|
|
@@ -68,10 +68,10 @@ When producing the plan, encode every executable item as a column-zero Markdown
|
|
|
68
68
|
|
|
69
69
|
## Universal invariants (hold on every path)
|
|
70
70
|
|
|
71
|
-
- **
|
|
72
|
-
- **
|
|
71
|
+
- **The ideal state for the affected user is the north star.** Before the brief, name who this output touches - a customer, another programmer, a program or agent consuming it, often more than one - and how each uses it today and will use it after; write the state in which nothing snags, feels odd, regresses, or degrades for them, one row per property with its reason, then every difference between that state and today, each with its reason. Record both in the draft; the plan exists to close every gap row. "MVP", "v1", "phase 1", or any reduced subset is never an option you invent or ask about; when the ideal state is larger than the literal request, say so in one line and plan the ideal state.
|
|
72
|
+
- **Decision-complete is how the plan gets there.** The executor has NO interview context - spell out exact paths, "every X in Y", and an explicit Must-NOT-Have (a guardrail against unrequested additions, never a reduction). Leave the implementer ZERO judgment calls.
|
|
73
73
|
- **Explore before asking.** Discoverable facts (repo/system/docs truth) -> research and cite, never ask. Preferences/tradeoffs -> the only things you bring to the user. When unsure which, treat it as a user-decision.
|
|
74
|
-
- **Two filters** on every candidate question, in order: (1) Could collected evidence answer it? -> explore instead. (2)
|
|
74
|
+
- **Two filters** on every candidate question, in order: (1) Could collected evidence answer it? -> explore instead. (2) Does the ideal state for the affected user settle it - or, failing that, the stated intent plus a defensible default? -> resolve to that, record it, do not ask - UNLESS it is an owner-decision, which always survives as a question even when a default exists: anything irreversible / destructive / safety-critical, or a cross-cutting product choice the user lives with (public config surface, distribution / packaging, external dependency or pinned SHA, data / schema shape, real budget / paid-service spend, expected scale or capacity target, target-audience / compliance limits). Extrinsic constraints (budget, mandated stack, scale, audience) leave no repo evidence, so exploration can never surface them - sweep those axes explicitly once per plan and classify each as explored, defaulted (ledger), or asked. Default the reversible internals; surface the owner-decisions.
|
|
75
75
|
- **Explore to sufficiency, then STOP.** One research wave per open question; stop when the clearance check is answerable; never re-explore to double-check.
|
|
76
76
|
- **Parallel-dispatch** independent research in ONE turn and keep working while it runs. Subagent outputs are CLAIMS until you independently verify them.
|
|
77
77
|
- **Approval is not execution.** Approval authorizes writing the plan ONLY, never implementation. ONE request -> ONE plan, however large.
|