@oneie/claude 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/agents/abm-strategist.md +89 -0
  2. package/agents/ads-meta.md +97 -0
  3. package/agents/analyst.md +173 -0
  4. package/agents/architect.md +280 -0
  5. package/agents/brand-guardian.md +88 -0
  6. package/agents/brand-strategist.md +92 -0
  7. package/agents/campaign-content.md +90 -0
  8. package/agents/campaign-email.md +88 -0
  9. package/agents/campaign-sms.md +87 -0
  10. package/agents/campaign-social.md +87 -0
  11. package/agents/cco.md +99 -0
  12. package/agents/ceo.md +106 -0
  13. package/agents/chairman.md +120 -0
  14. package/agents/cmo.md +101 -0
  15. package/agents/community-greeter.md +89 -0
  16. package/agents/community-moderator.md +92 -0
  17. package/agents/compliance.md +92 -0
  18. package/agents/copywriter.md +100 -0
  19. package/agents/creative-strategist.md +95 -0
  20. package/agents/cro.md +98 -0
  21. package/agents/cto.md +267 -0
  22. package/agents/customer-interviewer.md +93 -0
  23. package/agents/customer-researcher.md +89 -0
  24. package/agents/customer-success-manager.md +90 -0
  25. package/agents/customer-trainer.md +90 -0
  26. package/agents/cxo.md +100 -0
  27. package/agents/demand-creator.md +89 -0
  28. package/agents/demo-mover.md +83 -0
  29. package/agents/demo-specialist.md +89 -0
  30. package/agents/demo-thai-family-law.md +87 -0
  31. package/agents/designer.md +112 -0
  32. package/agents/discovery-caller.md +98 -0
  33. package/agents/doctor.md +139 -0
  34. package/agents/educate-coach.md +100 -0
  35. package/agents/elevate-tutor.md +83 -0
  36. package/agents/email-lifecycle-marketer.md +91 -0
  37. package/agents/engage-specialist.md +99 -0
  38. package/agents/events-coordinator.md +90 -0
  39. package/agents/foundation-builder.md +94 -0
  40. package/agents/funnel-architect.md +89 -0
  41. package/agents/gift-creator.md +100 -0
  42. package/agents/google-ads.md +103 -0
  43. package/agents/guide.md +292 -0
  44. package/agents/helpdesk-dispatcher.md +88 -0
  45. package/agents/hook-specialist.md +91 -0
  46. package/agents/identify-optimizer.md +101 -0
  47. package/agents/implementer.md +305 -0
  48. package/agents/incident-commander.md +120 -0
  49. package/agents/insights-lead.md +93 -0
  50. package/agents/journey-runner.md +113 -0
  51. package/agents/linkedin-ads.md +123 -0
  52. package/agents/live-sales-chat.md +90 -0
  53. package/agents/market-researcher.md +88 -0
  54. package/agents/media-buyer.md +96 -0
  55. package/agents/movers-customer-researcher.md +95 -0
  56. package/agents/movers-foundation-builder.md +96 -0
  57. package/agents/movers-market-researcher.md +97 -0
  58. package/agents/movers-pricing-strategist.md +171 -0
  59. package/agents/nurture-architect.md +99 -0
  60. package/agents/offer-architect.md +92 -0
  61. package/agents/onboarder.md +222 -0
  62. package/agents/onboarding-specialist.md +92 -0
  63. package/agents/operations-dashboard.md +98 -0
  64. package/agents/perf-engineer.md +348 -0
  65. package/agents/playbook-writer.md +71 -0
  66. package/agents/plg-strategist.md +91 -0
  67. package/agents/positioning-architect.md +88 -0
  68. package/agents/press-officer.md +89 -0
  69. package/agents/pricing-strategist.md +94 -0
  70. package/agents/privacy-officer.md +92 -0
  71. package/agents/referral-manager.md +91 -0
  72. package/agents/refine-analyst.md +102 -0
  73. package/agents/release-manager.md +261 -0
  74. package/agents/renewals-upsell-rep.md +90 -0
  75. package/agents/review-engineer.md +327 -0
  76. package/agents/rewards-steward.md +82 -0
  77. package/agents/sales-call-coach.md +94 -0
  78. package/agents/sales-closer.md +98 -0
  79. package/agents/security-auditor.md +313 -0
  80. package/agents/sell-closer.md +101 -0
  81. package/agents/share-amplifier.md +99 -0
  82. package/agents/social-media-manager.md +92 -0
  83. package/agents/storyteller.md +250 -0
  84. package/agents/strategist.md +83 -0
  85. package/agents/strategy-aligner.md +94 -0
  86. package/agents/support-agent.md +90 -0
  87. package/agents/tagger.md +245 -0
  88. package/agents/tech-writer.md +216 -0
  89. package/agents/test-engineer.md +243 -0
  90. package/agents/tiktok-ads.md +105 -0
  91. package/agents/tracking-engineer.md +92 -0
  92. package/agents/upsell-strategist.md +101 -0
  93. package/agents/voice.md +85 -0
  94. package/agents/w4-tools.md +153 -0
  95. package/agents/w4-verify.md +20 -138
  96. package/agents/workflow-optimiser.md +84 -0
  97. package/commands/close.md +814 -160
  98. package/commands/create.md +2 -2
  99. package/commands/deploy.md +554 -175
  100. package/commands/do.md +119 -109
  101. package/commands/fast.md +67 -0
  102. package/commands/improve.md +2 -2
  103. package/commands/one.md +418 -0
  104. package/commands/see.md +1 -1
  105. package/commands/sync.md +1 -1
  106. package/commands/tasks.md +222 -0
  107. package/commands/vespio.md +110 -0
  108. package/commands/vespio.remote.md +227 -0
  109. package/hooks/hooks.json +25 -79
  110. package/hooks/lib/governor-escape-match.sh +88 -0
  111. package/hooks/lib/hook.sh +4 -13
  112. package/hooks/lib/signal.sh +9 -2
  113. package/hooks/scripts/branch-pin.sh +6 -0
  114. package/hooks/scripts/config-protect.sh +6 -0
  115. package/hooks/scripts/do-outcome-gate.sh +19 -2
  116. package/hooks/scripts/git-add-guard.sh +43 -2
  117. package/hooks/scripts/governor-escape.sh +96 -0
  118. package/hooks/scripts/load-guard.sh +127 -0
  119. package/hooks/scripts/post-edit-check.sh +36 -29
  120. package/hooks/scripts/session-start.sh +34 -80
  121. package/hooks/scripts/task-complete-verify.sh +46 -40
  122. package/package.json +1 -1
  123. package/rules/documentation.md +9 -0
  124. package/scripts/ad-copy-lint.sh +656 -0
  125. package/scripts/agentverse-audit.sh +256 -0
  126. package/scripts/asi-walk.sh +435 -0
  127. package/scripts/astro-build-cached.sh +143 -0
  128. package/scripts/blocks-manifest-cached.sh +100 -0
  129. package/scripts/blocks-manifest.mjs +497 -0
  130. package/scripts/blocks-ratchet.sh +116 -0
  131. package/scripts/blocks-render-probe.mjs +529 -0
  132. package/scripts/blocks-usage.mjs +334 -0
  133. package/scripts/chat-context-check.sh +89 -0
  134. package/scripts/close-metrics.sh +558 -0
  135. package/scripts/close-owner.sh +268 -0
  136. package/scripts/db-sync-lock-check.sh +116 -0
  137. package/scripts/deploy-dev.sh +35 -0
  138. package/scripts/deploy-emit.sh +298 -0
  139. package/scripts/deploy-gate-check.sh +128 -0
  140. package/scripts/deploy-ready.sh +78 -0
  141. package/scripts/deploy-record.sh +605 -0
  142. package/scripts/deploy.sh +1273 -0
  143. package/scripts/do-auto.sh +598 -48
  144. package/scripts/do-brief.sh +113 -0
  145. package/scripts/do-close.sh +1137 -0
  146. package/scripts/do-commit.sh +75 -0
  147. package/scripts/do-consumer-sweep.sh +18 -1
  148. package/scripts/do-cycle-shape-check.sh +160 -0
  149. package/scripts/do-decide.sh +476 -0
  150. package/scripts/do-derive-check.sh +436 -0
  151. package/scripts/do-fleet.sh +106 -28
  152. package/scripts/do-folder.sh +10 -1
  153. package/scripts/do-next.sh +106 -0
  154. package/scripts/do-orchestrate.sh +17 -5
  155. package/scripts/do-plan-json.mjs +201 -0
  156. package/scripts/do-plan-json.sh +8 -0
  157. package/scripts/do-preflight.sh +117 -0
  158. package/scripts/do-project.sh +157 -0
  159. package/scripts/do-prove-selftest.sh +108 -0
  160. package/scripts/do-prove.sh +295 -23
  161. package/scripts/do-rank.py +31 -1
  162. package/scripts/do-recon-cache.sh +7 -1
  163. package/scripts/do-recon-pack.sh +196 -0
  164. package/scripts/do-reconcile.sh +121 -4
  165. package/scripts/do-signal.sh +280 -23
  166. package/scripts/do-smoke.sh +18 -1
  167. package/scripts/do-test-gate.sh +80 -0
  168. package/scripts/do-tick.sh +102 -0
  169. package/scripts/do-tier.sh +6 -0
  170. package/scripts/do-triage.sh +182 -0
  171. package/scripts/do-ui-gate.sh +1 -1
  172. package/scripts/do-w4-gates.sh +451 -0
  173. package/scripts/do-walk.sh +12 -1
  174. package/scripts/env-sync.sh +173 -0
  175. package/scripts/factory-brief-check.sh +330 -0
  176. package/scripts/factory-check.sh +68 -14
  177. package/scripts/factory-close-check.sh +257 -0
  178. package/scripts/factory-emit.sh +211 -0
  179. package/scripts/factory-executor-check.mjs +353 -0
  180. package/scripts/factory-peak.sh +301 -0
  181. package/scripts/factory-repo.sh +118 -3
  182. package/scripts/factory-review-check.mjs +61 -0
  183. package/scripts/factory-ship.sh +61 -0
  184. package/scripts/factory-tasks-check.sh +18 -1
  185. package/scripts/factory-turn.sh +326 -0
  186. package/scripts/factory-walk.sh +396 -0
  187. package/scripts/factory-width.sh +57 -0
  188. package/scripts/fade-toxic.sh +4 -3
  189. package/scripts/fixtures/factory-brief-real.md +44 -0
  190. package/scripts/fixtures/triage-dupe.md +5 -0
  191. package/scripts/fleet-manifest.mjs +108 -0
  192. package/scripts/fleet-status.sh +110 -0
  193. package/scripts/full-suite-paths-check.sh +144 -0
  194. package/scripts/gate-reaper-check.sh +98 -0
  195. package/scripts/gate-reaper.sh +125 -0
  196. package/scripts/gate-run.sh +73 -0
  197. package/scripts/gc-content-check.sh +140 -0
  198. package/scripts/gen-dev-config.py +20 -0
  199. package/scripts/govern-bound-check.sh +60 -0
  200. package/scripts/govern-claims-check.sh +233 -0
  201. package/scripts/govern-mem-check.sh +290 -0
  202. package/scripts/governor-doors-check.sh +362 -0
  203. package/scripts/governor-escape-check.sh +171 -0
  204. package/scripts/health.sh +413 -0
  205. package/scripts/id-inventory.mjs +418 -0
  206. package/scripts/land.sh +551 -0
  207. package/scripts/lib/gc-finished.sh +77 -0
  208. package/scripts/lib/govern.sh +361 -0
  209. package/scripts/lib/govern.ts +756 -0
  210. package/scripts/lighthouse-run.sh +187 -0
  211. package/scripts/livekit-live-check.sh +61 -0
  212. package/scripts/livekit-ratchet.sh +46 -0
  213. package/scripts/load-guard-check.sh +49 -0
  214. package/scripts/machine-check.sh +102 -0
  215. package/scripts/machine-watch.sh +177 -0
  216. package/scripts/one-agents.mjs +415 -0
  217. package/scripts/one-resume.sh +78 -0
  218. package/scripts/orphan-baseline.json +182 -0
  219. package/scripts/orphan-modules.mjs +179 -0
  220. package/scripts/pr-body.sh +335 -0
  221. package/scripts/preview-fd-check.sh +289 -0
  222. package/scripts/promise-manifest.mjs +24 -1
  223. package/scripts/release.sh +322 -0
  224. package/scripts/roles-check.sh +946 -0
  225. package/scripts/sdk-build-cached.sh +64 -0
  226. package/scripts/signal-watch.sh +241 -0
  227. package/scripts/skills-publish.sh +94 -0
  228. package/scripts/speed-cache-check.sh +173 -0
  229. package/scripts/speed-check.mjs +907 -0
  230. package/scripts/speed-parity-check.sh +648 -0
  231. package/scripts/speed-waterfall-check.sh +355 -0
  232. package/scripts/substrate-env-parity.mjs +156 -0
  233. package/scripts/tasks-claim-race.mjs +108 -0
  234. package/scripts/tasks-loop.sh +185 -0
  235. package/scripts/test-cached.sh +255 -0
  236. package/scripts/test-full.sh +87 -0
  237. package/scripts/test-honesty.mjs +137 -0
  238. package/scripts/test-lanes.sh +166 -0
  239. package/scripts/test-speed.sh +94 -0
  240. package/scripts/triage-shape-check.sh +149 -0
  241. package/scripts/tsc-cached.sh +179 -0
  242. package/scripts/typedb-flake-check.sh +197 -0
  243. package/scripts/urls-lint.sh +15 -0
  244. package/scripts/verify-fast.sh +445 -0
  245. package/scripts/vespio-sync.sh +149 -0
  246. package/scripts/wf-check.mjs +104 -1
  247. package/scripts/worktree-preview.sh +879 -0
  248. package/scripts/worktree-up.sh +208 -0
  249. package/skills/livekit-agents/SKILL.md +285 -0
  250. package/skills/livekit-agents/references/freshness-rules.md +168 -0
  251. package/skills/shadcn/SKILL.md +1 -1
  252. package/skills/signal/SKILL.md +0 -1
  253. package/skills/voice/SKILL.md +94 -6
  254. package/skills/voice/corpus-check.sh +87 -0
  255. package/hooks/scripts/compact-hint.sh +0 -35
  256. package/hooks/scripts/gate-guard.sh +0 -83
  257. package/hooks/scripts/read-tracker.sh +0 -26
  258. package/hooks/scripts/session-end-verify.sh +0 -51
  259. package/hooks/scripts/stop-reflect.sh +0 -140
  260. package/hooks/scripts/sync-priority-todo.sh +0 -57
  261. package/hooks/scripts/sync-todo-docs.sh +0 -46
  262. package/hooks/scripts/tool-signal.sh +0 -48
  263. package/scripts/do-tasks-bridge.py +0 -366
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env bash
2
+ # typedb-flake-check.sh — decide whether a RED vitest log is ONLY the shared
3
+ # TypeDB Cloud cluster being unavailable, and therefore safe to ship past.
4
+ #
5
+ # manifest: portable
6
+ #
7
+ # WHY THIS EXISTS. `one.ie/web`'s suite talks to a REAL shared TypeDB Cloud
8
+ # cluster (CLAUDE.md: "Don't mock TypeDB in integration tests"). When that
9
+ # cluster blips or a query exceeds its timeout, a handful of task/substrate
10
+ # suites go red without anything in the diff being wrong. Before this script the
11
+ # operator read the log by eye and decided — which is exactly the judgement call
12
+ # that gets rubber-stamped at 2am on the fifth deploy attempt.
13
+ #
14
+ # WHAT IT IS NOT. It is not a failure allowlist by FILE. A file-based allowlist
15
+ # waves through every future failure in that file, including real ones. This
16
+ # keys on the failure SIGNATURE — the substrate was unreachable — so a genuine
17
+ # assertion break in the very same test still blocks.
18
+ #
19
+ # THE HARD LINE. `not_found` from `tasks:claim` is the privilege boundary. Four
20
+ # separate defects presented as exactly that string and were fixed 2026-08-02
21
+ # (see deploy.md's Known-Flaky section). It is NEVER a flake, it is never
22
+ # waived, and it is checked BEFORE the flake signatures so no combination of
23
+ # other output can pass it.
24
+ #
25
+ # CONTRACT
26
+ # exit 0 — every failure carries a substrate-unavailable signature. Waivable.
27
+ # exit 1 — at least one failure is real, or the log could not be classified.
28
+ # Silence is never a pass: a log with no parseable "Tests N failed" line exits 1.
29
+ #
30
+ # bash .claude/scripts/typedb-flake-check.sh <vitest-log>
31
+ # bash .claude/scripts/typedb-flake-check.sh --self-test
32
+ set -uo pipefail
33
+
34
+ # ── signatures ───────────────────────────────────────────────────────────────
35
+ # The substrate refused to answer. Nothing downstream of these proved anything.
36
+ FLAKE_RE='upstream_50[234]|status=50[234]|fixture write failed|Test timed out in [0-9]+ ?ms|ETIMEDOUT|ECONNRESET|ECONNREFUSED|EAI_AGAIN|socket hang up|fetch failed|TypeDB.*(unavailable|timed out|connection)|Failed to connect'
37
+
38
+ # Never waivable, whatever else the log says: the privilege boundary. Matched
39
+ # against failure BODIES only, in the awk below -- see the comment there.
40
+ NEVER_RE='not_found'
41
+
42
+ classify() {
43
+ local log="$1" fails blocks matched
44
+ [ -f "$log" ] || { echo "typedb-flake: no such log: $log"; return 1; }
45
+
46
+ # A COLLECT CRASH — vitest's bracketed form, `FAIL path/x.test.ts [ path/x.test.ts ]`
47
+ # followed by a parse/import error — ran ZERO tests. It is never a cluster blip
48
+ # and never waivable: on 2026-09-05 a truncated gitignored JSON crashed the
49
+ # collect of deploy-board.test.tsx and the waiver called it a TypeDB outage
50
+ # (vitest-collect-crash-reads-as-pass, through the waiver door).
51
+ if grep -qE '^ *FAIL +[^ ]+\.test\.[a-z]+ +\[ +[^ ]+\.test\.[a-z]+ +\]' "$log"; then
52
+ echo "typedb-flake: BLOCKED -- a test file failed to COLLECT ($(grep -oE '^ *FAIL +[^ ]+\.test\.[a-z]+ +\[' "$log" | head -1 | awk '{print $2}')). Zero tests ran there. Not a flake."
53
+ return 1
54
+ fi
55
+ # Unhandled errors ("Errors 45 errors") fail the run with ZERO failed tests.
56
+ # They are never a cluster blip and never waivable — refuse before anything
57
+ # else, or a red run reads GREEN here (measured 2026-09-05).
58
+ if grep -qE 'Errors +[1-9][0-9]* errors?' "$log"; then
59
+ echo "typedb-flake: BLOCKED -- the log carries unhandled errors ($(grep -Eo 'Errors +[0-9]+ errors?' "$log" | tail -1)). Not a flake."
60
+ return 1
61
+ fi
62
+ # How many tests vitest itself says failed. No line ⇒ we cannot classify ⇒ RED.
63
+ # Strip ANSI escape codes first — vitest 4.x wraps its summary in colour codes
64
+ # that break the regex ("Tests \x1b[1m\x1b[31m12 failed\x1b[39m" → no match).
65
+ fails=$(sed 's/\x1b\[[0-9;]*m//g' "$log" | grep -Eo 'Tests +[0-9]+ failed' | tail -1 | grep -Eo '[0-9]+' || true)
66
+ if [ -z "$fails" ]; then
67
+ # A green log has "Tests N passed" and no "failed" — that is not our business.
68
+ if grep -qE 'Tests +[0-9]+ passed' "$log" && ! grep -qE '[0-9]+ failed' "$log"; then
69
+ echo "typedb-flake: log is GREEN — nothing to classify"; return 1
70
+ fi
71
+ echo "typedb-flake: cannot find a 'Tests N failed' line — refusing to classify"; return 1
72
+ fi
73
+
74
+ # The hard line, checked first and independently of everything else.
75
+ #
76
+ # Scoped to failure BODIES, with the FAIL header line dropped. Two reasons,
77
+ # both real: (a) a whole-log grep sees `not_found` in the NAME of a perfectly
78
+ # healthy test -- tasks-do-roundtrip.test.ts really does contain
79
+ # `claim by an unknown slug is not_found, never a silent success`, so a
80
+ # log-wide grep let one passing test veto every deploy; (b) `not_found` is
81
+ # legitimate ASSERTED output in the tests that check the boundary holds. What
82
+ # is never acceptable is `not_found` as the RECEIVED value of a failure.
83
+ # `seen` bounds the FIRST block: before any FAIL header the accumulator holds
84
+ # the log PREAMBLE — gate banners plus the stderr of every PASSING test that
85
+ # ran first — and a passing test's NAME ("…is not_found") or asserted output
86
+ # ("workspace_not_found") tripped this on two deploys (2026-09-05), once with a
87
+ # confident wrong diagnosis pointing at tasks:claim for an un-regenerated
88
+ # roster. A body is only a failure body once a header has opened it.
89
+ if awk -v re="$NEVER_RE" '
90
+ /^ *(FAIL|Unhandled)/ { if (seen && body ~ re) { print "HIT"; exit } ; seen = 1; body = ""; next }
91
+ { body = body "\n" $0 }
92
+ END { if (seen && body ~ re) print "HIT" }
93
+ ' "$log" | grep -q HIT; then
94
+ echo "typedb-flake: BLOCKED -- a failure BODY contains 'not_found'."
95
+ echo " That is the tasks:claim privilege boundary, not a cluster blip."
96
+ echo " It is never waived. See deploy.md section Known-Flaky Test Allowlist."
97
+ return 1
98
+ fi
99
+
100
+ # Split the log into vitest's per-failure blocks (the ⎯[n/m]⎯ separators) and
101
+ # require EVERY one of them to carry a substrate signature. Counting matched
102
+ # blocks rather than grepping the whole file is the point: one flake signature
103
+ # anywhere must not vouch for an unrelated assertion failure beside it.
104
+ blocks=$(awk '/^ *(FAIL|Unhandled)/{n++} END{print n+0}' "$log")
105
+ matched=$(awk -v re="$FLAKE_RE" '
106
+ /^ *(FAIL|Unhandled)/ { if (cur != "" && cur ~ re) m++; cur = $0; next }
107
+ { cur = cur "\n" $0 }
108
+ END { if (cur != "" && cur ~ re) m++; print m+0 }
109
+ ' "$log")
110
+
111
+ if [ "$blocks" -eq 0 ]; then
112
+ echo "typedb-flake: $fails failed test(s) but no FAIL blocks parsed — refusing to classify"; return 1
113
+ fi
114
+ if [ "$matched" -lt "$blocks" ]; then
115
+ echo "typedb-flake: BLOCKED — $matched/$blocks failure blocks look like substrate outage."
116
+ echo " $(( blocks - matched )) failure(s) are REAL. Diagnose them."
117
+ return 1
118
+ fi
119
+ echo "typedb-flake: WAIVABLE — all $blocks failure block(s) ($fails test(s)) are substrate-unavailable."
120
+ echo " Signature matched: shared TypeDB Cloud did not answer. Nothing was disproven."
121
+ return 0
122
+ }
123
+
124
+ # ── --self-test: prove the checker can go RED ────────────────────────────────
125
+ # A classifier that only ever says "waivable" is worse than no classifier. This
126
+ # drives both halves, including the two ways it must refuse.
127
+ if [ "${1:-}" = "--self-test" ]; then
128
+ d=$(mktemp -d); fails=0
129
+ t() { # name expected_rc file
130
+ local name="$1" want="$2" f="$3" got
131
+ classify "$f" >/dev/null 2>&1; got=$?
132
+ if [ "$got" -eq "$want" ]; then echo " ok $name (rc=$got)"
133
+ else echo " FAIL $name — wanted rc=$want got rc=$got"; fails=$((fails+1)); fi
134
+ }
135
+
136
+ cat >"$d/flake.log" <<'EOF'
137
+ FAIL tests/unit/tasks-humans.test.ts > seeds a task
138
+ Error: fixture write failed (status=503 error=upstream_503)
139
+ ⎯⎯⎯[1/1]⎯
140
+ Test Files 1 failed | 900 passed (901)
141
+ Tests 1 failed | 9000 passed (9001)
142
+ EOF
143
+ t "pure 503 outage is waivable" 0 "$d/flake.log"
144
+
145
+ cat >"$d/real.log" <<'EOF'
146
+ FAIL tests/unit/billing.test.ts > charges the card once
147
+ AssertionError: expected 2 to be 1
148
+ ⎯⎯⎯[1/1]⎯
149
+ Test Files 1 failed | 900 passed (901)
150
+ Tests 1 failed | 9000 passed (9001)
151
+ EOF
152
+ t "a real assertion failure BLOCKS" 1 "$d/real.log"
153
+
154
+ cat >"$d/mixed.log" <<'EOF'
155
+ FAIL tests/unit/tasks-humans.test.ts > seeds a task
156
+ Error: fixture write failed (status=503 error=upstream_503)
157
+ FAIL tests/unit/billing.test.ts > charges the card once
158
+ AssertionError: expected 2 to be 1
159
+ ⎯⎯⎯[2/2]⎯
160
+ Test Files 2 failed | 900 passed (902)
161
+ Tests 2 failed | 9000 passed (9002)
162
+ EOF
163
+ t "one flake must not vouch for its neighbour" 1 "$d/mixed.log"
164
+
165
+ cat >"$d/notfound.log" <<'EOF'
166
+ FAIL tests/unit/tasks-containment.test.ts > a task is claimable
167
+ AssertionError: expected 'not_found' to be undefined
168
+ Error: fixture write failed (status=503 error=upstream_503)
169
+ ⎯⎯⎯[1/1]⎯
170
+ Test Files 1 failed | 900 passed (901)
171
+ Tests 1 failed | 9000 passed (9001)
172
+ EOF
173
+ t "not_found BLOCKS even wrapped in a 503" 1 "$d/notfound.log"
174
+
175
+ cat >"$d/nameonly.log" <<'EOF'
176
+ FAIL tests/tasks-do-roundtrip.test.ts > claim by an unknown slug is not_found, never a silent success
177
+ Error: fixture write failed (status=503 error=upstream_503)
178
+ Test Files 1 failed | 900 passed (901)
179
+ Tests 1 failed | 9000 passed (9001)
180
+ EOF
181
+ t "not_found in a test NAME does not block a real 503" 0 "$d/nameonly.log"
182
+
183
+ cat >"$d/green.log" <<'EOF'
184
+ Test Files 901 passed (901)
185
+ Tests 9001 passed (9001)
186
+ EOF
187
+ t "a green log is not classifiable" 1 "$d/green.log"
188
+
189
+ : >"$d/empty.log"
190
+ t "an empty log is not a pass" 1 "$d/empty.log"
191
+
192
+ rm -rf "$d"
193
+ [ "$fails" -eq 0 ] && { echo "typedb-flake: self-test PASS"; exit 0; }
194
+ echo "typedb-flake: self-test FAILED ($fails)"; exit 1
195
+ fi
196
+
197
+ classify "${1:?usage: typedb-flake-check.sh <vitest-log> | --self-test}"
@@ -23,6 +23,12 @@ FROZEN_ROOT_PAGES=(
23
23
  dashboard settings analytics chat skills build create editor in memory
24
24
  profile credits payments rewards tracking watch stream meet classroom
25
25
  learning activity do cc device motion "self-improving"
26
+ # console-slugless — AMENDMENT 2026-08-26 (slugless-doors). Two deliberate
27
+ # additions, each a session-resolved door that rewrites/redirects into
28
+ # /u/<workspace>/<room> and renders nothing of its own. Both words are
29
+ # declared in RESERVED_PREFIXES (src/lib/urls/law.ts) and added to
30
+ # RESERVED_SLUGS so no future workspace can claim them.
31
+ tasks w
26
32
  # identity
27
33
  signin signup recover "recovery-codes" "auth-security" unsubscribe
28
34
  # system
@@ -32,6 +38,15 @@ FROZEN_ROOT_PAGES=(
32
38
  "index-new" "index-open" home
33
39
  # dead — unreferenced, flagged for a future lever-4 cycle, not this promise
34
40
  dotsdemo
41
+ # NOT GRANDFATHERED, on purpose (noted 2026-08-26 by slugless-doors): nine root
42
+ # pages are committed to main with no allowlist amendment, so this lint — and
43
+ # therefore text/urls.md's proof: — is RED for reasons that predate and are
44
+ # unrelated to the slugless doors:
45
+ # asi1 · chat-block · factory · loading · media · pay-blocks · sell ·
46
+ # speed-metrics · x402
47
+ # They are deliberately left OFF this list. Absorbing them would turn nine live
48
+ # violations into permanent grandfathering and make a green lint mean less than
49
+ # it does. Whoever added them owns the amendment or the deletion.
35
50
  )
36
51
 
37
52
  is_allowed() {