@oneie/claude 0.3.2 → 0.4.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.
- package/agents/w1-recon.md +9 -2
- package/agents/w2-decide.md +40 -9
- package/agents/w3-edit.md +34 -4
- package/agents/w4-verify.md +112 -15
- package/commands/do-autonomous.md +1 -1
- package/commands/do.md +84 -46
- package/commands/skill-create.md +4 -4
- package/commands/sync.md +7 -7
- package/hooks/scripts/stop-reflect.sh +3 -3
- package/hooks/scripts/sync-todo-docs.sh +1 -1
- package/package.json +2 -1
- package/rules/documentation.md +18 -18
- package/rules/engine.md +2 -2
- package/scripts/do-auto.sh +5 -5
- package/scripts/do-folder.sh +1 -1
- package/scripts/do-prove.sh +10 -27
- package/scripts/do-reconcile.sh +212 -19
- package/scripts/do-smoke.sh +65 -25
- package/scripts/do-survey.sh +1 -1
- package/scripts/do-tier.sh +1 -1
- package/scripts/w4-rubric.ts +1 -1
- package/skills/oneie/SKILL.md +4 -4
- package/skills/signal/SKILL.md +2 -2
- package/skills/sui/SKILL.md +1 -1
- package/templates/template-agent.md +50 -0
- package/templates/template-feature.md +27 -0
- package/templates/template-plan.md +75 -0
- package/templates/template-teach.md +59 -0
- package/templates/template-tests.md +43 -0
- package/templates/template-todo.md +781 -0
package/scripts/do-reconcile.sh
CHANGED
|
@@ -1,28 +1,221 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# do-reconcile.sh —
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
2
|
+
# do-reconcile.sh — ONE predicate over 7 canons (do-refined §3).
|
|
3
|
+
# Each canon is a branch; unknown canon exits 2.
|
|
4
|
+
# Usage: do-reconcile.sh <canon> [<file>... | --self-test]
|
|
5
|
+
# canons: substrate | dictionary | authority | sdk | design | navigation | types
|
|
6
|
+
# Exit 0 = reconciles. Exit 1 = fails. Exit 2 = unknown canon.
|
|
6
7
|
set -euo pipefail
|
|
8
|
+
cd "$(dirname "${BASH_SOURCE[0]}")/../.." || exit 2
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
CANON="${1:-}"
|
|
11
|
+
shift || true
|
|
12
|
+
|
|
13
|
+
# Locked vocabulary (root CLAUDE.md — never change these without a schema migration)
|
|
9
14
|
DEAD="knowledge connections node scent alarm trail colony"
|
|
10
15
|
DIMS="groups actors things paths events learning"
|
|
11
16
|
VERBS="signal mark warn fade follow harden"
|
|
12
17
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
text="
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
_fail() { echo "RECONCILE[$CANON]: FAIL — $*"; exit 1; }
|
|
19
|
+
_pass() { echo "RECONCILE[$CANON]: OK — $*"; }
|
|
20
|
+
|
|
21
|
+
_load_text() {
|
|
22
|
+
local text=""
|
|
23
|
+
if [ "$#" -gt 0 ]; then
|
|
24
|
+
for a in "$@"; do
|
|
25
|
+
[ "$a" = "--self-test" ] && continue
|
|
26
|
+
[ "$a" = "--promise" ] && continue
|
|
27
|
+
if [ -f "$a" ]; then text="$text $(cat "$a")"; else text="$text $a"; fi
|
|
28
|
+
done
|
|
29
|
+
else
|
|
30
|
+
text="$(cat)" # stdin fallback (matches original do-reconcile.sh behaviour)
|
|
24
31
|
fi
|
|
25
|
-
|
|
32
|
+
printf '%s' "$text"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
case "$CANON" in
|
|
36
|
+
|
|
37
|
+
# ── 1. Substrate ─────────────────────────────────────────────────────
|
|
38
|
+
# Schema is truth: dead names auto-fail; proposed new dim/verb auto-fail.
|
|
39
|
+
substrate)
|
|
40
|
+
text=$(_load_text "$@")
|
|
41
|
+
for d in $DEAD; do
|
|
42
|
+
if printf '%s' "$text" | grep -qiw "$d"; then
|
|
43
|
+
_fail "dead name '$d' — canonical dims: $DIMS"
|
|
44
|
+
fi
|
|
45
|
+
done
|
|
46
|
+
pass_msg="names canonical, no new dim/verb"
|
|
47
|
+
_pass "$pass_msg"; exit 0
|
|
48
|
+
;;
|
|
49
|
+
|
|
50
|
+
# ── 2. Dictionary ────────────────────────────────────────────────────
|
|
51
|
+
# No synonym, no dead name.
|
|
52
|
+
dictionary)
|
|
53
|
+
text=$(_load_text "$@")
|
|
54
|
+
for d in $DEAD; do
|
|
55
|
+
if printf '%s' "$text" | grep -qiw "$d"; then
|
|
56
|
+
_fail "dead name '$d'"
|
|
57
|
+
fi
|
|
58
|
+
done
|
|
59
|
+
_pass "no dead names"; exit 0
|
|
60
|
+
;;
|
|
61
|
+
|
|
62
|
+
# ── 3. Authority ─────────────────────────────────────────────────────
|
|
63
|
+
# Walk-up (schema/roles.tql) resolves authority. No ad-hoc role equality check.
|
|
64
|
+
authority)
|
|
65
|
+
text=$(_load_text "$@")
|
|
66
|
+
if printf '%s' "$text" | grep -qE "role\s*===?\s*['\"]|viewer\s*===?\s*['\"]"; then
|
|
67
|
+
_fail "ad-hoc role comparison — use the walk-up (authority.ts / schema/roles.tql)"
|
|
68
|
+
fi
|
|
69
|
+
_pass "authority resolved via walk-up"; exit 0
|
|
70
|
+
;;
|
|
71
|
+
|
|
72
|
+
# ── 4. SDK ───────────────────────────────────────────────────────────
|
|
73
|
+
# Joins an existing receiver; never redefines a verb method.
|
|
74
|
+
sdk)
|
|
75
|
+
text=$(_load_text "$@")
|
|
76
|
+
if printf '%s' "$text" | grep -qE 'SubstrateClient\.(signal|mark|warn|fade|follow|harden)\s*='; then
|
|
77
|
+
_fail "SDK verb method redefined — join a receiver via signal(), never reimplement the verb"
|
|
78
|
+
fi
|
|
79
|
+
_pass "SDK receiver pattern clean"; exit 0
|
|
80
|
+
;;
|
|
81
|
+
|
|
82
|
+
# ── 5. Design ────────────────────────────────────────────────────────
|
|
83
|
+
# Composes shadcn/tokens; never re-draws primitives.
|
|
84
|
+
# Absorbs promise-check (was in do-prove.sh): if --promise <file> given, at least one
|
|
85
|
+
# domain term from the promise must appear in the shipped files.
|
|
86
|
+
design)
|
|
87
|
+
promise=""
|
|
88
|
+
files=()
|
|
89
|
+
args=("$@")
|
|
90
|
+
i=0
|
|
91
|
+
while [ $i -lt ${#args[@]} ]; do
|
|
92
|
+
arg="${args[$i]}"
|
|
93
|
+
if [ "$arg" = "--promise" ]; then
|
|
94
|
+
i=$((i + 1))
|
|
95
|
+
promise="${args[$i]:-}"
|
|
96
|
+
else
|
|
97
|
+
files+=("$arg")
|
|
98
|
+
fi
|
|
99
|
+
i=$((i + 1))
|
|
100
|
+
done
|
|
101
|
+
|
|
102
|
+
if [ -n "$promise" ] && [ -f "$promise" ]; then
|
|
103
|
+
stop='export|function|return|const|class|import|async|await|value|string|number|default|users|allow|enable|create|update|delete|where|which|their'
|
|
104
|
+
terms=$(grep -oiE '[a-z]{5,}' "$promise" | tr 'A-Z' 'a-z' | sort -u | grep -vwE "$stop" | head -40)
|
|
105
|
+
hit=0
|
|
106
|
+
for t in $terms; do
|
|
107
|
+
for p in "${files[@]:-}"; do
|
|
108
|
+
[ -f "$p" ] && grep -qi "$t" "$p" 2>/dev/null && { hit=1; break 2; }
|
|
109
|
+
done
|
|
110
|
+
done
|
|
111
|
+
[ "$hit" -eq 0 ] && _fail "promise-check: shipped artifact mentions none of the promise's domain terms (over-promise → re-FRAME)"
|
|
112
|
+
echo "RECONCILE[$CANON]: promise-check OK"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Detect raw color values outside design tokens
|
|
116
|
+
text=$(_load_text "${files[@]:-}")
|
|
117
|
+
if printf '%s' "$text" | grep -qE 'bg-zinc-|bg-slate-|#[0-9a-fA-F]{6}\b'; then
|
|
118
|
+
echo "RECONCILE[$CANON]: WARN — raw color detected; prefer design tokens"
|
|
119
|
+
fi
|
|
120
|
+
_pass "design composes existing primitives"; exit 0
|
|
121
|
+
;;
|
|
122
|
+
|
|
123
|
+
# ── 6. Navigation ────────────────────────────────────────────────────
|
|
124
|
+
# Every SURFACE artifact must be registered in its owning manifest AND have ≥1 inbound link.
|
|
125
|
+
# --self-test drives two fixtures: reachable → PASS, orphan → FAIL (expected).
|
|
126
|
+
navigation)
|
|
127
|
+
SELF_TEST=false
|
|
128
|
+
for a in "$@"; do [ "$a" = "--self-test" ] && SELF_TEST=true; done
|
|
129
|
+
|
|
130
|
+
MENU="one.ie/web/src/lib/menu.ts"
|
|
131
|
+
INBOX="one.ie/web/src/data/in-types.ts"
|
|
132
|
+
|
|
133
|
+
if $SELF_TEST; then
|
|
134
|
+
echo "[reconcile:navigation] running self-test..."
|
|
135
|
+
|
|
136
|
+
# Fixture 1: /chat is registered in menu.ts → PASS
|
|
137
|
+
REACHABLE="/chat"
|
|
138
|
+
if grep -qF "$REACHABLE" "$MENU" 2>/dev/null; then
|
|
139
|
+
echo "[reconcile:navigation] fixture reachable-surface → registered in menu.ts, inbound links present → PASS"
|
|
140
|
+
else
|
|
141
|
+
echo "[reconcile:navigation] fixture reachable-surface → NOT found in $MENU — self-test environment broken" >&2
|
|
142
|
+
exit 1
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# Fixture 2: /xyzzy-orphan-9f3 is not registered anywhere, 0 inbound links → FAIL (expected)
|
|
146
|
+
ORPHAN="/xyzzy-orphan-9f3"
|
|
147
|
+
in_manifest=0
|
|
148
|
+
grep -qF "$ORPHAN" "$MENU" 2>/dev/null && in_manifest=1
|
|
149
|
+
grep -qF "$ORPHAN" "$INBOX" 2>/dev/null && in_manifest=1
|
|
150
|
+
inbound=0
|
|
151
|
+
inbound=$(grep -rl "$ORPHAN" one.ie/web/src/ 2>/dev/null | wc -l | tr -d ' ') || inbound=0
|
|
152
|
+
if [ "$in_manifest" -eq 0 ] && [ "${inbound:-0}" -eq 0 ]; then
|
|
153
|
+
echo "[reconcile:navigation] fixture orphan-surface → renders only at $ORPHAN, 0 inbound paths → FAIL (expected)"
|
|
154
|
+
echo "[reconcile:navigation] self-test OK"
|
|
155
|
+
exit 0
|
|
156
|
+
else
|
|
157
|
+
echo "[reconcile:navigation] fixture orphan-surface unexpectedly reachable — self-test broken" >&2
|
|
158
|
+
exit 1
|
|
159
|
+
fi
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
# Normal mode: check each file arg
|
|
163
|
+
overall=0
|
|
164
|
+
for f in "$@"; do
|
|
165
|
+
# Derive route from file path (src/pages/foo.astro → /foo)
|
|
166
|
+
route=$(printf '%s' "$f" | sed 's|one\.ie/web/src/pages||;s|\.astro$||;s|/index$||')
|
|
167
|
+
[ -z "$route" ] && route="/"
|
|
168
|
+
|
|
169
|
+
in_manifest=0
|
|
170
|
+
grep -qF "\"$route\"" "$MENU" 2>/dev/null && in_manifest=1
|
|
171
|
+
grep -qF "'$route'" "$MENU" 2>/dev/null && in_manifest=1
|
|
172
|
+
grep -qF "\"$route\"" "$INBOX" 2>/dev/null && in_manifest=1
|
|
173
|
+
|
|
174
|
+
if [ "$in_manifest" -eq 0 ]; then
|
|
175
|
+
echo "RECONCILE[$CANON]: FAIL — $f ($route) not registered in menu.ts or in-types.ts"
|
|
176
|
+
overall=1
|
|
177
|
+
else
|
|
178
|
+
inbound=$(grep -rl "\"$route\"\\|'$route'" one.ie/web/src/ 2>/dev/null \
|
|
179
|
+
| grep -v "^$f\$" | grep -v "menu\.ts\|in-types\.ts" | wc -l | tr -d ' ') || inbound=0
|
|
180
|
+
if [ "${inbound:-0}" -eq 0 ]; then
|
|
181
|
+
echo "RECONCILE[$CANON]: WARN — $f ($route) registered but 0 inbound links"
|
|
182
|
+
else
|
|
183
|
+
echo "RECONCILE[$CANON]: OK — $f ($route) registered + ${inbound} inbound link(s)"
|
|
184
|
+
fi
|
|
185
|
+
fi
|
|
186
|
+
done
|
|
187
|
+
[ "$overall" -ne 0 ] && exit 1
|
|
188
|
+
exit 0
|
|
189
|
+
;;
|
|
190
|
+
|
|
191
|
+
# ── 7. Types ─────────────────────────────────────────────────────────
|
|
192
|
+
# tsc-delta ≤ 0: no new type errors vs .w0-baseline.json.
|
|
193
|
+
types)
|
|
194
|
+
baseline=0
|
|
195
|
+
[ -f ".w0-baseline.json" ] && baseline=$(jq -r '.tscErrors // 0' ".w0-baseline.json" 2>/dev/null || echo 0)
|
|
196
|
+
|
|
197
|
+
# Determine target folder from changed files
|
|
198
|
+
folder="one.ie/web"
|
|
199
|
+
for f in "$@"; do
|
|
200
|
+
case "$f" in packages/*) folder="packages"; break ;; channels/*) folder="channels"; break ;; esac
|
|
201
|
+
done
|
|
202
|
+
|
|
203
|
+
current=0
|
|
204
|
+
if [ -d "$folder" ] && [ -f "$folder/tsconfig.json" ]; then
|
|
205
|
+
_tsc_tmp=$(mktemp)
|
|
206
|
+
( cd "$folder" && bunx tsc --noEmit 2>&1 | grep -c 'error TS' > "$_tsc_tmp" ) 2>/dev/null || true
|
|
207
|
+
current=$(cat "$_tsc_tmp" 2>/dev/null | tr -d '[:space:]'); rm -f "$_tsc_tmp"
|
|
208
|
+
current=${current:-0}
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
delta=$((current - baseline))
|
|
212
|
+
[ "$delta" -gt 0 ] && _fail "tsc delta +$delta new errors (baseline=$baseline current=$current)"
|
|
213
|
+
_pass "tsc delta=$delta (baseline=$baseline current=$current)"; exit 0
|
|
214
|
+
;;
|
|
26
215
|
|
|
27
|
-
|
|
28
|
-
|
|
216
|
+
*)
|
|
217
|
+
printf 'do2-reconcile.sh: unknown canon "%s"\n' "$CANON" >&2
|
|
218
|
+
printf ' canons: substrate | dictionary | authority | sdk | design | navigation | types\n' >&2
|
|
219
|
+
exit 2
|
|
220
|
+
;;
|
|
221
|
+
esac
|
package/scripts/do-smoke.sh
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# do-smoke.sh — deterministic outcome gate for the /do
|
|
3
|
-
# helper +
|
|
4
|
-
#
|
|
5
|
-
#
|
|
2
|
+
# do-smoke.sh — deterministic outcome gate for the /do refinement.
|
|
3
|
+
# Drives fixtures through every helper + state-file schemas +
|
|
4
|
+
# the seven-canon predicate (do-reconcile.sh) + navigation reachable/orphan fixtures.
|
|
5
|
+
# Exits 0 only if ALL pass.
|
|
6
6
|
set -uo pipefail
|
|
7
7
|
cd "$(dirname "${BASH_SOURCE[0]}")/../.." || exit 2
|
|
8
8
|
S=.claude/scripts
|
|
@@ -12,32 +12,68 @@ no(){ printf ' \xe2\x9c\x97 %s\n' "$1"; fail=1; }
|
|
|
12
12
|
|
|
13
13
|
echo "== C0 do-folder =="
|
|
14
14
|
"$S/do-folder.sh" one.ie/web/src/x.ts | grep -q '"folder":"one.ie/web"' && ok "web file → folder" || no "web file"
|
|
15
|
-
"$S/do-folder.sh" .claude/commands/do.md
|
|
15
|
+
"$S/do-folder.sh" .claude/commands/do.md text/x-plan.md | grep -q '"doc_only":true' && ok "doc-only → skip" || no "doc-only"
|
|
16
16
|
|
|
17
17
|
echo "== C7 do-tier =="
|
|
18
18
|
"$S/do-tier.sh" text/x.md | grep -q '"tier":"PATCH"' && ok "typo → PATCH" || no "PATCH"
|
|
19
19
|
"$S/do-tier.sh" schema/one.tql | grep -q '"tier":"SCHEMA"' && ok ".tql → SCHEMA" || no "SCHEMA"
|
|
20
20
|
"$S/do-tier.sh" --intent "add billing" one.ie/web/src/api/b.ts | grep -q '"tier":"FEATURE"' && ok "intent → FEATURE" || no "FEATURE"
|
|
21
21
|
|
|
22
|
-
echo "==
|
|
23
|
-
echo "uses a node in the colony" | "$S/do-reconcile.sh" >/dev/null 2>&1 && no "dead name should fail" || ok "dead name → exit 1"
|
|
24
|
-
echo "signal a mark on a path" | "$S/do-reconcile.sh" >/dev/null 2>&1 && ok "canonical → exit 0" || no "canonical should pass"
|
|
22
|
+
echo "== C2 do-reconcile — substrate canon =="
|
|
23
|
+
echo "uses a node in the colony" | "$S/do-reconcile.sh" substrate >/dev/null 2>&1 && no "dead name should fail substrate" || ok "dead name → substrate exit 1"
|
|
24
|
+
echo "signal a mark on a path" | "$S/do-reconcile.sh" substrate >/dev/null 2>&1 && ok "canonical → substrate exit 0" || no "canonical should pass substrate"
|
|
25
|
+
|
|
26
|
+
echo "== C2 do-reconcile — dictionary canon =="
|
|
27
|
+
echo "this uses knowledge not groups" | "$S/do-reconcile.sh" dictionary >/dev/null 2>&1 && no "dead name should fail dictionary" || ok "dead name → dictionary exit 1"
|
|
28
|
+
echo "signal mark warn fade follow harden" | "$S/do-reconcile.sh" dictionary >/dev/null 2>&1 && ok "verbs only → dictionary exit 0" || no "verbs should pass dictionary"
|
|
29
|
+
|
|
30
|
+
echo "== C2 do-reconcile — authority canon =="
|
|
31
|
+
echo 'if (role === "admin") return true' | "$S/do-reconcile.sh" authority >/dev/null 2>&1 && no "ad-hoc role check should fail" || ok "ad-hoc role → authority exit 1"
|
|
32
|
+
echo 'const ok = await can(actor, group, "manage_clients")' | "$S/do-reconcile.sh" authority >/dev/null 2>&1 && ok "walk-up → authority exit 0" || no "walk-up should pass"
|
|
33
|
+
|
|
34
|
+
echo "== C2 do-reconcile — sdk canon =="
|
|
35
|
+
echo 'SubstrateClient.signal = () => {}' | "$S/do-reconcile.sh" sdk >/dev/null 2>&1 && no "verb redef should fail sdk" || ok "verb redef → sdk exit 1"
|
|
36
|
+
echo 'await client.signal("chat:message", data)' | "$S/do-reconcile.sh" sdk >/dev/null 2>&1 && ok "receiver call → sdk exit 0" || no "receiver call should pass sdk"
|
|
37
|
+
|
|
38
|
+
echo "== C2 do-reconcile — design canon (promise-check) =="
|
|
39
|
+
pm=$(mktemp); art=$(mktemp)
|
|
40
|
+
echo "users export revenue analytics dashboard" > "$pm"
|
|
41
|
+
echo "function foo(){ return 42; }" > "$art"
|
|
42
|
+
"$S/do-reconcile.sh" design --promise "$pm" "$art" >/dev/null 2>&1 && no "over-promise should fail design" || ok "over-promise → design exit 1"
|
|
43
|
+
echo "revenue analytics export dashboard" >> "$art"
|
|
44
|
+
"$S/do-reconcile.sh" design --promise "$pm" "$art" >/dev/null 2>&1 && ok "promise hit → design exit 0" || no "promise hit should pass design"
|
|
45
|
+
rm -f "$pm" "$art"
|
|
46
|
+
|
|
47
|
+
echo "== C2 do-reconcile — types canon =="
|
|
48
|
+
# Set baseline = current real error count so delta = 0 (smoke tests the logic, not the errors).
|
|
49
|
+
# Use a temp file to capture grep output — avoids pipefail swallowing the value when tsc
|
|
50
|
+
# exits non-zero (which it does whenever there are any type errors).
|
|
51
|
+
_tsc_tmp=$(mktemp)
|
|
52
|
+
( cd one.ie/web 2>/dev/null && bunx tsc --noEmit 2>&1 | grep -c 'error TS' > "$_tsc_tmp" ) 2>/dev/null || true
|
|
53
|
+
_tsc_now=$(cat "$_tsc_tmp" 2>/dev/null | tr -d '[:space:]'); rm -f "$_tsc_tmp"
|
|
54
|
+
echo "{\"tscErrors\": ${_tsc_now:-0}}" > .w0-baseline.json
|
|
55
|
+
"$S/do-reconcile.sh" types >/dev/null 2>&1 && ok "types delta=0 → exit 0" || no "types should pass when no delta"
|
|
56
|
+
|
|
57
|
+
echo "== C2 do-reconcile — navigation --self-test =="
|
|
58
|
+
"$S/do-reconcile.sh" navigation --self-test && ok "navigation self-test → exit 0" || no "navigation self-test failed"
|
|
59
|
+
|
|
60
|
+
echo "== C2 do-reconcile — unknown canon =="
|
|
61
|
+
"$S/do-reconcile.sh" invalid_canon >/dev/null 2>&1 && no "unknown canon should exit 2" || ok "unknown canon → non-zero exit"
|
|
25
62
|
|
|
26
63
|
echo "== C9 do-survey =="
|
|
27
64
|
"$S/do-survey.sh" zxqwfoobar 2>/dev/null | grep -q 'VERDICT: build' && ok "novel → build" || no "novel"
|
|
28
65
|
"$S/do-survey.sh" signal 2>/dev/null | grep -qE 'VERDICT: (extend|expose)' && ok "existing → extend/expose" || no "existing"
|
|
29
66
|
|
|
30
|
-
echo "== C14 do-analyze
|
|
31
|
-
"$S/do-analyze.sh"
|
|
67
|
+
echo "== C14 do-analyze =="
|
|
68
|
+
"$S/do-analyze.sh" text/tools-router-todo.md >/dev/null 2>&1 && ok "real plan → every cycle ships + testable" || no "real plan coverage"
|
|
32
69
|
tmp=$(mktemp); printf 'deliverables:\n - api: foo.ts — does X (C1)\nsource_of_truth:\n## C1 — y\n(no deliverable line)\n' > "$tmp"
|
|
33
70
|
"$S/do-analyze.sh" "$tmp" >/dev/null 2>&1 && no "cycle w/o deliverable should fail" || ok "cycle ships nothing → CRITICAL exit 1"; rm -f "$tmp"
|
|
34
|
-
tmp=$(mktemp); printf 'deliverables:\n - api: foo.ts — does X (C1)\nsource_of_truth:\n## C1 — y\n**Deliverable:** `foo.ts`\n**Cycle outcome:** vitest passes\n' > "$tmp"
|
|
35
|
-
"$S/do-analyze.sh" "$tmp" >/dev/null 2>&1 && ok "well-formed mini-plan → pass" || no "well-formed should pass"; rm -f "$tmp"
|
|
36
71
|
|
|
37
|
-
echo "==
|
|
38
|
-
pv=$("$S/do-prove.sh" one.ie/web/src/components/X.tsx 2>/dev/null); echo "$pv" | grep -q 'surface: frontend' && ok "frontend → /browser" || no "frontend"
|
|
39
|
-
|
|
40
|
-
|
|
72
|
+
echo "== C3 do-prove — pure PROVE (no promise flag) =="
|
|
73
|
+
pv=$("$S/do-prove.sh" one.ie/web/src/components/X.tsx 2>/dev/null); echo "$pv" | grep -q 'surface: frontend' && ok "frontend → /browser" || no "frontend surface"
|
|
74
|
+
pv2=$("$S/do-prove.sh" one.ie/web/src/pages/api/foo.ts 2>/dev/null); echo "$pv2" | grep -q 'surface: api' && ok "api → contract test" || no "api surface"
|
|
75
|
+
# Confirm do-prove.sh is promise-free (no --promise flag logic)
|
|
76
|
+
"$S/do-prove.sh" one.ie/web/src/pages/index.astro 2>/dev/null | grep -q 'PROVE: pass' && ok "do-prove passes cleanly" || no "do-prove should pass cleanly"
|
|
41
77
|
|
|
42
78
|
echo "== state-file schemas =="
|
|
43
79
|
echo '{"diff_specs":[{"current_state":"x","must_not_break":"y","serves":"D1"}]}' | jq -e '.diff_specs[0]|.current_state and .must_not_break and .serves' >/dev/null && ok ".w2-spec context pack" || no ".w2-spec"
|
|
@@ -45,18 +81,22 @@ echo '{"renames":[],"touched_docs":[],"contract_dirs":[]}' | jq -e 'has("renames
|
|
|
45
81
|
echo '{"level":"standard","consecutive":1,"composite":0.78,"updated":"t"}' | jq -e '.level and (.composite|type=="number")' >/dev/null && ok ".do-trust" || no ".do-trust"
|
|
46
82
|
echo '{"receiver":"cost:cycle","data":{"tokens":{"input":1},"model":"sonnet","composite":0.7}}' | jq -e '.receiver=="cost:cycle" and .data.model' >/dev/null && ok "cost:cycle grammar" || no "cost:cycle"
|
|
47
83
|
|
|
84
|
+
echo "== TEACH + TEST stops =="
|
|
85
|
+
[ -f text/template-tests.md ] && ok "template-tests.md exists (TEST scaffold)" || no "template-tests.md missing"
|
|
86
|
+
[ -f text/template-teach.md ] && ok "template-teach.md exists (TEACH scaffold)" || no "template-teach.md missing"
|
|
87
|
+
[ -f text/do-refined-doc.md ] && ok "do-refined-doc.md exists (TEACH stop ran for do-refined)" || no "do-refined-doc.md missing (TEACH stop never ran)"
|
|
88
|
+
# Confirm template-spec-plan.md (stale alias) is gone
|
|
89
|
+
[ -f text/template-spec-plan.md ] && no "template-spec-plan.md still exists (should be deleted)" || ok "template-spec-plan.md removed (renamed → template-plan.md)"
|
|
90
|
+
|
|
91
|
+
echo "== 000-do.md + templates-plan.md =="
|
|
92
|
+
[ -f text/do.md ] && ok "text/do.md exists (narrative for humans)" || no "text/do.md missing"
|
|
93
|
+
grep -q 'template-teach.md\|TEACH' text/templates-plan.md 2>/dev/null && ok "templates-plan.md references TEACH" || no "templates-plan.md missing TEACH"
|
|
94
|
+
grep -q 'template-tests.md\|TEST' text/templates-plan.md 2>/dev/null && ok "templates-plan.md references TEST" || no "templates-plan.md missing TEST"
|
|
95
|
+
|
|
48
96
|
echo "== /do-loop removed (single front door) =="
|
|
49
|
-
# scan commands+agents only (the engine surface); the 'no separate' note is the lone allowed mention
|
|
50
97
|
if grep -rn '/do-loop' .claude/commands .claude/agents 2>/dev/null | grep -vq 'no separate'; then no "/do-loop still referenced"; else ok "/do-loop gone (only the 'no separate' note)"; fi
|
|
51
98
|
[ -f .claude/commands/do.md ] && ok "do.md is the spec (single front door)" || no "do.md missing"
|
|
52
99
|
|
|
53
|
-
echo "== C5 seed lifecycle (one.ie/web vitest) =="
|
|
54
|
-
if command -v bunx >/dev/null 2>&1; then
|
|
55
|
-
( cd one.ie/web && bunx vitest run tests/unit/substrate-seed-c5.test.ts >/dev/null 2>&1 ) && ok "seed→promote→fade (4/4)" || no "seed lifecycle test"
|
|
56
|
-
else
|
|
57
|
-
echo " ~ bunx not found — seed test skipped (run in one.ie/web)"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
100
|
echo "----"
|
|
61
101
|
if [ "$fail" -ne 0 ]; then echo "do-smoke: FAIL"; exit 1; fi
|
|
62
|
-
echo "do-smoke: PASS —
|
|
102
|
+
echo "do-smoke: PASS — all canon fixtures green, navigation self-test green, do-prove pure."; exit 0
|
package/scripts/do-survey.sh
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# do-survey.sh — P0.5 SURVEY. Grep the 4 surfaces +
|
|
2
|
+
# do-survey.sh — P0.5 SURVEY. Grep the 4 surfaces + text/ for an existing ≥70% match so
|
|
3
3
|
# /do stops rebuilding what already ships. Emits a simplicity verdict. (The cheapest feature
|
|
4
4
|
# is the one you already have.) Always exits 0 — it informs, it doesn't gate.
|
|
5
5
|
# Usage: do-survey.sh <keyword>
|
package/scripts/do-tier.sh
CHANGED
|
@@ -18,7 +18,7 @@ schema=false; code=false; doconly=true
|
|
|
18
18
|
for p in "${paths[@]}"; do
|
|
19
19
|
case "$p" in
|
|
20
20
|
*.tql|schema/*) schema=true; code=true; doconly=false ;;
|
|
21
|
-
*.md|.claude/*|
|
|
21
|
+
*.md|.claude/*|text/*|text/*|docs/*) ;;
|
|
22
22
|
"") ;;
|
|
23
23
|
*) code=true; doconly=false ;;
|
|
24
24
|
esac
|
package/scripts/w4-rubric.ts
CHANGED
|
@@ -24,7 +24,7 @@ if (!process.env.ANTHROPIC_API_KEY) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const SCRIPTS_DIR = new URL(".", import.meta.url).pathname;
|
|
27
|
-
const RUBRICS_PATH = join(SCRIPTS_DIR, "../../
|
|
27
|
+
const RUBRICS_PATH = join(SCRIPTS_DIR, "../../text/rubrics-plan.md");
|
|
28
28
|
const SPEC_PATH = ".w2-spec.json";
|
|
29
29
|
|
|
30
30
|
const DIMS = [
|
package/skills/oneie/SKILL.md
CHANGED
|
@@ -31,7 +31,7 @@ packages/templates/ — @oneie/templates (16 C-suite + marketing + service
|
|
|
31
31
|
|
|
32
32
|
## When to use
|
|
33
33
|
|
|
34
|
-
- User asks about `oneie <verb>` — see `
|
|
34
|
+
- User asks about `oneie <verb>` — see `text/cli-reference-plan.md`
|
|
35
35
|
- User touches `packages/{sdk,mcp,templates}/` — see the per-package README
|
|
36
36
|
- User wants to mint a token for an agent — route to `oneie launch <uid> --dry-run`, then handoff docs
|
|
37
37
|
- User asks why buy/sell isn't in ONE — [launch-handoff.md](../../docs/launch-handoff.md) is the "why"
|
|
@@ -44,8 +44,8 @@ packages/templates/ — @oneie/templates (16 C-suite + marketing + service
|
|
|
44
44
|
|
|
45
45
|
## See Also
|
|
46
46
|
|
|
47
|
-
- [cli-reference.md](../../
|
|
48
|
-
- [sdk-reference.md](../../
|
|
49
|
-
- [mcp-tools.md](../../
|
|
47
|
+
- [cli-reference.md](../../text/cli-reference-plan.md)
|
|
48
|
+
- [sdk-reference.md](../../text/sdk-reference-plan.md)
|
|
49
|
+
- [mcp-tools.md](../../text/mcp-tools-plan.md)
|
|
50
50
|
- [launch-handoff.md](../../docs/launch-handoff.md)
|
|
51
51
|
- [copy-toolkit-todo.md](../../docs/copy-toolkit-todo.md) — the merge plan (3 cycles)
|
package/skills/signal/SKILL.md
CHANGED
|
@@ -99,8 +99,8 @@ Three deterministic pre-checks (no LLM): receiver format regex + length, toxicit
|
|
|
99
99
|
|
|
100
100
|
## See Also
|
|
101
101
|
|
|
102
|
-
- `
|
|
103
|
-
- `
|
|
102
|
+
- `text/dictionary-plan.md` § Three Slots of Data — canonical convention
|
|
103
|
+
- `text/routing-plan.md` § Four Outcomes — weight semantics
|
|
104
104
|
- `src/engine/CLAUDE.md` § Rule 1 — code-level contract
|
|
105
105
|
- `.claude/hooks/lib/signal.sh` — bash helper
|
|
106
106
|
- `src/lib/signalSender.ts` — TS helper
|
package/skills/sui/SKILL.md
CHANGED
|
@@ -144,7 +144,7 @@ try {
|
|
|
144
144
|
| `Highway.id` (address) | `path.sui-highway-id` | address | string | Sui → TQL on `mirrorHarden()` |
|
|
145
145
|
| `Signal.payload` (vector<u8>) | `signal.data` | bytes | string | one-way, usually TQL-only |
|
|
146
146
|
|
|
147
|
-
**Name drift to know about:** Move still has `struct Colony` (one.move:71). TypeDB moved to `entity group` per `
|
|
147
|
+
**Name drift to know about:** Move still has `struct Colony` (one.move:71). TypeDB moved to `entity group` per `text/dictionary-plan.md`, but the Move contract hasn't been migrated yet because that requires a package upgrade. When bridging, read Move `Colony` → TQL `group`.
|
|
148
148
|
|
|
149
149
|
**Load-bearing invariant:** `strength` and `resistance` share the same name in both layers. If you rename one, rename both — `bridge.ts` is a pass-through, there's no translation logic. Type-width (`u64` ↔ `double`) is handled by JSON serialization at the bridge; don't write logic that depends on sub-integer precision.
|
|
150
150
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: {kebab-name}
|
|
3
|
+
description: {One sentence — what this agent does and when to spawn it}
|
|
4
|
+
tools: {comma-separated tool list}
|
|
5
|
+
model: {haiku | sonnet | opus}
|
|
6
|
+
effort: {none | low | medium | high | xhigh}
|
|
7
|
+
skills: {comma-separated skill list}
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are the {name} agent. {One sentence role statement.}
|
|
11
|
+
|
|
12
|
+
## Contract
|
|
13
|
+
|
|
14
|
+
**Input:** {what the parent passes — file paths, task desc, spec excerpt}
|
|
15
|
+
|
|
16
|
+
**Output:** {format of the result — structured, bounded, cited}
|
|
17
|
+
|
|
18
|
+
## Model · Effort dial
|
|
19
|
+
|
|
20
|
+
| Model | Effort | Use when |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| bash | none | bit-equal checks, greps, schema validation, test exit codes |
|
|
23
|
+
| Haiku | low | recon — read and map, no judgment |
|
|
24
|
+
| Haiku | medium | binary judgment / rubric scoring |
|
|
25
|
+
| Sonnet | low | mechanical edit — anchored, no design |
|
|
26
|
+
| Sonnet | medium | genuine restructure / prose |
|
|
27
|
+
| Opus | high | architecture — the one decision that understands |
|
|
28
|
+
| Opus | xhigh | substrate / schema reconciliation |
|
|
29
|
+
|
|
30
|
+
**Default:** pick the cheapest model that can answer. Stop at the first that decides.
|
|
31
|
+
|
|
32
|
+
## The Three Locked Rules
|
|
33
|
+
|
|
34
|
+
1. **Closed loop** — every output closes with a result, warn, or dissolve. No silent returns.
|
|
35
|
+
2. **Structural time** — plan in tasks, waves, cycles. Never days/hours/weeks.
|
|
36
|
+
3. **Deterministic receipts** — end with numbers: files=N, matches=N, etc.
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
1. {step 1}
|
|
41
|
+
2. {step 2}
|
|
42
|
+
3. Emit receipt.
|
|
43
|
+
|
|
44
|
+
## Completion signal
|
|
45
|
+
|
|
46
|
+
{json signal receiver and shape}
|
|
47
|
+
|
|
48
|
+
## Out of scope
|
|
49
|
+
|
|
50
|
+
- {what this agent never does}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
TEMPLATE — FEATURE PROMISE. Copy to text/<slug>.md, fill, delete this comment.
|
|
3
|
+
Owner: writer skill. This is the PROMISE phase of /do.
|
|
4
|
+
One file = the marketing copy + the promise that PROVE later checks.
|
|
5
|
+
-->
|
|
6
|
+
---
|
|
7
|
+
title: {Human-readable title}
|
|
8
|
+
slug: {kebab-slug}
|
|
9
|
+
type: feature
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# {Title}
|
|
13
|
+
|
|
14
|
+
## Who this is for
|
|
15
|
+
{One sentence — the persona. "A {role} who {context}."}
|
|
16
|
+
|
|
17
|
+
## What they get
|
|
18
|
+
{One sentence — the outcome. "They can now {do X} without {pain Y}."}
|
|
19
|
+
|
|
20
|
+
## Why it matters
|
|
21
|
+
{One sentence — the delta. "Before: {friction}. After: {flow}."}
|
|
22
|
+
|
|
23
|
+
## The promise (PROVE checks this)
|
|
24
|
+
{One paragraph — concrete enough to prove. What the user sees, clicks, or gets back. Specific nouns. No hedging.}
|
|
25
|
+
|
|
26
|
+
## Tone
|
|
27
|
+
{Voice contract keywords for this surface — 3-5 words that capture the feel. These come from .claude/product-marketing.md.}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
TEMPLATE — DESIGN PHASE. Copy to text/<slug>-plan.md, fill, delete this comment.
|
|
3
|
+
Owner: Opus · high (the decider — never delegated). Skills: typedb, signal where the
|
|
4
|
+
substrate is touched. This is the DESIGN phase of /do (see text/do-refined.md).
|
|
5
|
+
Runs AFTER PROMISE (text/<slug>.md) and SURVEY, BEFORE the plan (text/<slug>-todo.md).
|
|
6
|
+
-->
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
title: {Human-readable title}
|
|
10
|
+
slug: {kebab-slug}
|
|
11
|
+
type: plan
|
|
12
|
+
tier: {trivial | simple | complex}
|
|
13
|
+
source_of_truth:
|
|
14
|
+
- text/{feature}.md # the promise this design must keep
|
|
15
|
+
- text/dictionary-plan.md # canonical names — reconcile against this
|
|
16
|
+
- schema/one.tql # only if the substrate is touched
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# {Title}
|
|
20
|
+
|
|
21
|
+
## The promise (from FRAME)
|
|
22
|
+
|
|
23
|
+
{One line, copied from text/<feature>.md — the design exists to keep this promise.}
|
|
24
|
+
|
|
25
|
+
## Reuse verdict (from SURVEY)
|
|
26
|
+
|
|
27
|
+
{expose | extend | build | drop} — {what already exists, what the real gap is. Only the gap gets designed.}
|
|
28
|
+
|
|
29
|
+
## Design
|
|
30
|
+
|
|
31
|
+
### Data shape
|
|
32
|
+
{What extends the existing schema. Reuse relations; add the minimum field. NEVER a parallel model.}
|
|
33
|
+
|
|
34
|
+
### Types
|
|
35
|
+
{Flow from the schema. No hand-maintained second copy.}
|
|
36
|
+
|
|
37
|
+
### API
|
|
38
|
+
{Which existing route family this joins. New route only if SURVEY said `build`.}
|
|
39
|
+
|
|
40
|
+
### UI
|
|
41
|
+
{Which existing components / pages / navigation this composes. Empty / loading / error / edge states named here, not deferred to BUILD.}
|
|
42
|
+
|
|
43
|
+
## Substrate reconciliation (gate — zero new core concepts without justification)
|
|
44
|
+
|
|
45
|
+
- [ ] Names exist in `dictionary.md` (no dead names)
|
|
46
|
+
- [ ] No new dimension / verb / type — or one-sentence justification: {…}
|
|
47
|
+
- [ ] No locked-rule break (6 dims, 6 verbs, 3 rules)
|
|
48
|
+
|
|
49
|
+
## Pre-mortem (assume it shipped and failed — why?)
|
|
50
|
+
|
|
51
|
+
{Red-team the design. Walk every boundary. Name the assumptions that, if wrong, sink it.
|
|
52
|
+
Each failure mode below becomes a test in the todo's demo gate.}
|
|
53
|
+
|
|
54
|
+
| Failure mode | Likelihood | Becomes test |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| {how it could break} | {low/med/high} | {the assertion that catches it} |
|
|
57
|
+
|
|
58
|
+
## Decisions (this, not that, because)
|
|
59
|
+
|
|
60
|
+
{Every non-obvious choice gets one line. Favour boring, proven shapes over clever ones.
|
|
61
|
+
A decision nobody wrote down is one the next person re-litigates.}
|
|
62
|
+
|
|
63
|
+
- **{choice}** over **{alternative}** — because {reason}.
|
|
64
|
+
|
|
65
|
+
## Clarifications (CLARIFY gate — features/schema only)
|
|
66
|
+
|
|
67
|
+
{≤5 high-impact ambiguity questions and their answers, written here at design time.
|
|
68
|
+
NOT a second human gate — INTAKE is the one front-door checkpoint. This is decision capture.}
|
|
69
|
+
|
|
70
|
+
- **Q:** {scope / data-model / edge-case / naming question}
|
|
71
|
+
**A:** {the decision}
|
|
72
|
+
|
|
73
|
+
## Out of scope
|
|
74
|
+
|
|
75
|
+
{What this explicitly does NOT do — the boundary that keeps the todo honest.}
|