its-magic 0.1.2-43 → 0.1.2-49
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.md +119 -0
- package/package.json +1 -1
- package/scripts/check_intake_template_parity.py +90 -2
- package/scripts/guard_installer_publish.py +19 -1
- package/template/.cursor/commands/architecture.md +16 -6
- package/template/.cursor/commands/auto.md +42 -0
- package/template/.cursor/commands/execute.md +49 -0
- package/template/.cursor/commands/qa.md +37 -0
- package/template/.cursor/commands/release.md +11 -0
- package/template/.cursor/commands/verify-work.md +43 -1
- package/template/.cursor/rules/caveman.mdc +43 -0
- package/template/.cursor/scratchpad.local.example.md +39 -4
- package/template/.cursor/scratchpad.md +34 -4
- package/template/.github/workflows/ci.yml +4 -114
- package/template/README.md +113 -0
- package/template/docs/engineering/auto-orchestration-reference.md +62 -1
- package/template/docs/engineering/context/installer-owned-paths.manifest +12 -0
- package/template/docs/engineering/context/readme-section-affinity.json +30 -0
- package/template/docs/engineering/runbook.md +151 -5
- package/template/scripts/auto_outer_driver.py +521 -0
- package/template/scripts/check_downstream_ci_guard.py +67 -0
- package/template/scripts/check_intake_template_parity.py +90 -2
- package/template/scripts/downstream_ci_guard_lib.py +222 -0
- package/template/scripts/enforce-triad-hot-surface.py +135 -8
- package/template/scripts/readme_feature_coverage_lib.py +608 -0
- package/template/scripts/uat_probe_lib.py +868 -0
- package/template/scripts/validate_readme_feature_coverage.py +140 -0
package/README.md
CHANGED
|
@@ -24,6 +24,28 @@ with pause/resume, decision gates, and persistent artifacts.
|
|
|
24
24
|
- Built-in benchmarks (live, prompted, headless).
|
|
25
25
|
- Multiplatform distribution (npm, Chocolatey, Homebrew).
|
|
26
26
|
|
|
27
|
+
<!-- readme-feature-coverage-catalog -->
|
|
28
|
+
|
|
29
|
+
### Feature coverage catalog (US-0091)
|
|
30
|
+
|
|
31
|
+
- `/bin` — POSIX npm installer + Linux remote test targets (WSL / SSH / Docker) (`US-0084`).
|
|
32
|
+
- `/choco` — Configurable Multi-Target Release Publish with Confirmation Gate (`US-0054`).
|
|
33
|
+
- `/devops` — First-Class Bug Issue Workflow (Open/Closed) (`US-0079`).
|
|
34
|
+
- `/engineering` — Agent-Driven Codebase Map Bootstrap (`US-0082`).
|
|
35
|
+
- `/engineering` — Remote Runtime Connectivity Contract for QA/Release/Publish (`US-0064`).
|
|
36
|
+
- `/install` — Template/install payload omits intake gate scripts (`BUG-0001`).
|
|
37
|
+
- `/intake` — Optional Caveman-style input compression (safe file scope) (`US-0090`).
|
|
38
|
+
- `/lint` — CI/CD Workflows (`US-0007`).
|
|
39
|
+
- `/or` — Cursor Caveman mode (scratchpad-configurable terse responses) (`US-0089`).
|
|
40
|
+
- `/push` — Multiplatform Distribution (`US-0009`).
|
|
41
|
+
- `/run-tests` — Baseline Regression Cleanup for Installer and Version Sync Checks (`US-0074`).
|
|
42
|
+
- `/template` — End-to-End Lifecycle QA for `its-magic` Install/Upgrade/Clean (`US-0041`).
|
|
43
|
+
- `/upgrade` — Missing scripts still occur on install modes missing/upgrade (`BUG-0003`).
|
|
44
|
+
- `/usr` — Global Linux install fails: empty `install_include_paths` when manifest is CRLF (`BUG-0008`).
|
|
45
|
+
- `/workdir` — installer.sh fails in shell path with `set: Illegal option -` (`BUG-0004`).
|
|
46
|
+
- `MIGRATION` scratchpad flag — Smart Upgrade Mode (`US-0018`).
|
|
47
|
+
- `US-0016` scratchpad flag — Homebrew Version Sync (`US-0016`).
|
|
48
|
+
|
|
27
49
|
## Setup
|
|
28
50
|
|
|
29
51
|
its-magic is an installer you run once per repo. It copies the AI dev team
|
|
@@ -947,6 +969,12 @@ Troubleshooting quick guide:
|
|
|
947
969
|
- Fix JSON syntax and retry.
|
|
948
970
|
- Secret-like inline value detected:
|
|
949
971
|
- Replace literal secret with an env-var reference field.
|
|
972
|
+
- **CI still runs its-magic packaging jobs?** Your project received a pre-fix workflow.
|
|
973
|
+
Run **`its-magic --target <repo> --mode upgrade`** (or **`--mode clean`** then reinstall)
|
|
974
|
+
to refresh `.github/workflows/ci.yml` from the corrected template. After upgrade, GitHub
|
|
975
|
+
Actions should show only **`checks`** and **`auto-fix`** jobs — not `npm-test`,
|
|
976
|
+
`brew-test`, or `choco-test`. Fix applies to new installs/upgrades; stale repos heal on
|
|
977
|
+
next upgrade (**US-0018**).
|
|
950
978
|
|
|
951
979
|
Team/local (recommended in `.cursor/scratchpad.local.md`):
|
|
952
980
|
|
|
@@ -1105,6 +1133,68 @@ push / PR ──> checks ──> PASS ──> done
|
|
|
1105
1133
|
Auto-fix commits appear as `ci: auto-fix attempt N/3`. After 3 retries the
|
|
1106
1134
|
workflow stops and points you to `scripts/validate-and-push` for local fixing.
|
|
1107
1135
|
|
|
1136
|
+
<!-- readme-feature-coverage-catalog -->
|
|
1137
|
+
|
|
1138
|
+
### Feature coverage catalog (US-0091)
|
|
1139
|
+
|
|
1140
|
+
- `/acceptance` — Mandatory Intake Question Packs for First and Small Intakes (`US-0068`).
|
|
1141
|
+
- `/ask` — /ask Command: Context-Aware Questions Without Workflow (`US-0020`).
|
|
1142
|
+
- `/ask` — Context Compaction and Tiered Token-Cost Optimization Mode (`US-0053`).
|
|
1143
|
+
- `/auto` — Configurable Auto Phase Selection Policy (`US-0070`).
|
|
1144
|
+
- `/auto` — Continuous `/auto` Backlog-Drain Mode with Fine-Tune Switches (`US-0044`).
|
|
1145
|
+
- `/auto` — Fresh Subagent Context Per Phase and /auto Orchestration (`US-0023`).
|
|
1146
|
+
- `/auto` — Mid-Process `/auto` Continuation with Deterministic Resume Point (`US-0037`).
|
|
1147
|
+
- `/auto` — Strict Phase Role Enforcement in /auto Orchestration (`US-0069`).
|
|
1148
|
+
- `/auto` — Strict Runtime Proof for Per-Phase Subagent Isolation (`US-0056`).
|
|
1149
|
+
- `/auto` — Token-Cost Hardening for Orchestrated Runs (`US-0080`).
|
|
1150
|
+
- `/auto` — `/auto` continuous multi-phase loop + quiet drain (close one-phase-stop gap) (`US-0088`).
|
|
1151
|
+
- `/auto` — `/auto` executes phases without spawning required subagents (`BUG-0006`).
|
|
1152
|
+
- `/auto` — `/auto` explicit bug targeting (fix all OPEN bugs / fix `BUG-####`) (`US-0087`).
|
|
1153
|
+
- `/auto` — `/auto` fails with stale resume target after bug intake (`BUG-0005`).
|
|
1154
|
+
- `/check` — Optional Documentation Pack (Design Concept, CRS, Technical Spec) (`US-0031`).
|
|
1155
|
+
- `/confirmation` — Enforced Interactive Intake Question Evidence (`US-0078`).
|
|
1156
|
+
- `/connectivity` — Release Operator Run/Connect/Verify Hints Contract (`US-0067`).
|
|
1157
|
+
- `/decision` — Optional Fresh-Project ID Namespace Bootstrap (`US-0052`).
|
|
1158
|
+
- `/derived` — Deterministic Status Reconciliation Command (`US-0055`).
|
|
1159
|
+
- `/developer-dense` — Documentation Audience Profiles and Dual README Strategy (`US-0077`).
|
|
1160
|
+
- `/docs` — Installer-Owned `its_magic/` Folder for Framework Metadata (`US-0062`).
|
|
1161
|
+
- `/engineering` — Deterministic Context Slimming and Archive Enforcement Across Core Artifacts (`US-0072`).
|
|
1162
|
+
- `/engineering` — Deterministic State Hot-Surface Rollover and Archive Enforcement (`US-0060`).
|
|
1163
|
+
- `/engineering` — OS-Aware Runbook Command Auto-Bootstrap with Verified Quality Gates (`US-0063`).
|
|
1164
|
+
- `/flag` — Release Gate for Command/Flag Documentation Delta (`US-0030`).
|
|
1165
|
+
- `/intake` — Critical Evaluation in Intake and Architecture (`US-0021`).
|
|
1166
|
+
- `/intake` — Deterministic Intake Runtime Capability Guard and Single-Writer Drift Safety (`US-0059`).
|
|
1167
|
+
- `/intake` — Multi-Repo and Contract Compatibility Observability (`US-0034`).
|
|
1168
|
+
- `/intake` — intake evidence records asked questions that were never asked (`BUG-0007`).
|
|
1169
|
+
- `/integration` — Generated Test Scaffolding and Auto-Run Contract (`US-0066`).
|
|
1170
|
+
- `/managed` — Runtime QA Autopilot for Generated Projects (`US-0065`).
|
|
1171
|
+
- `/new` — First-Intake Full-Plan Coverage and Story-Map Gate (`US-0081`).
|
|
1172
|
+
- `/order` — Deterministic Artifact Ordering and Write Discipline (`US-0058`).
|
|
1173
|
+
- `/phases` — Cross-Phase Artifact Ownership Guard and Deterministic Archive Control (`US-0061`).
|
|
1174
|
+
- `/planning` — User-Visible Internal Metadata Sanitization Guard (`US-0071`).
|
|
1175
|
+
- `/product` — Backlog Reconciliation Gate for Released Sprints (`US-0043`).
|
|
1176
|
+
- `/push` — Phase-Triggered Sync Policy with Guarded Auto-Push (`US-0038`).
|
|
1177
|
+
- `/release` — Enforced Per-Phase Subagent Isolation with Audit Gate (`US-0048`).
|
|
1178
|
+
- `/release` — Legacy DONE-Story Acceptance/Traceability Backfill Guard (`US-0049`).
|
|
1179
|
+
- `/release` — Per-Sprint Release Notes and Release Queue Tracker (`US-0040`).
|
|
1180
|
+
- `/release` — Release Findings Artifact and Post-QA Issue Workflow (`US-0042`).
|
|
1181
|
+
- `/release` — Release Gate Tightening for Check-In Tests and QA/UAT Completion (`US-0039`).
|
|
1182
|
+
- `/remote` — Automation-driven remote execution selection (Docker / SSH / NL container intent) (`US-0086`).
|
|
1183
|
+
- `/remote` — Gitignored `.env` for remote and release connectivity (no AI read) (`US-0085`).
|
|
1184
|
+
- `/repetitive` — Delegable Intake Clarification Without Hard Blocks (`US-0083`).
|
|
1185
|
+
- `/research` — Knowledge Curation & Early Research (`US-0029`).
|
|
1186
|
+
- `/risk` — Intelligent Intake Decomposition and Risk-Aware PO Questioning (`US-0051`).
|
|
1187
|
+
- `/scratchpad` — Executable Scratchpad-Driven Sync and Auto-Push Wiring (`US-0076`).
|
|
1188
|
+
- `/scratchpad` — Scratchpad Delivery Simplification (Example-Only Install Policy) (`US-0073`).
|
|
1189
|
+
- `/scratchpad` — Upgrade Scratchpad Example–First Refresh (Fix Example Drift vs Materialized Baseline) (`US-0075`).
|
|
1190
|
+
- `/scratchpad` — Upgrade-Safe Scratchpad Example Refresh and Parity (`US-0057`).
|
|
1191
|
+
- `/sprint-plan` — Explicit `/sprint-plan --bulk` Mode (`US-0046`).
|
|
1192
|
+
- `/sprint-plan` — Sprint Sizing Rules and Configurable Sprint Planning (`US-0022`).
|
|
1193
|
+
- `/story` — Optional Feature User Guide Generation (`US-0032`).
|
|
1194
|
+
- `/uat` — UAT Artifact Lifecycle and Ownership (`US-0027`).
|
|
1195
|
+
- `SKILL` scratchpad flag — Skill and Templates (`US-0004`).
|
|
1196
|
+
- `US-0001` scratchpad flag — Core Workflow Commands (`US-0001`).
|
|
1197
|
+
|
|
1108
1198
|
## Walkthrough examples
|
|
1109
1199
|
|
|
1110
1200
|
### Example 1: New feature from idea
|
|
@@ -1240,6 +1330,35 @@ Reliable pattern:
|
|
|
1240
1330
|
- `decisions/`: decision records.
|
|
1241
1331
|
- `.github/workflows/`: CI/CD templates.
|
|
1242
1332
|
|
|
1333
|
+
<!-- readme-feature-coverage-catalog -->
|
|
1334
|
+
|
|
1335
|
+
### Feature coverage catalog (US-0091)
|
|
1336
|
+
|
|
1337
|
+
- `/evidence` — Backlog-to-Sprint Traceability Contract (`US-0025`).
|
|
1338
|
+
- `/exit` — Milestone Lifecycle Definition and Exit Criteria (`US-0026`).
|
|
1339
|
+
- `/field` — Official Remote Config Template, Docs, and Fail-Fast Validation (`US-0036`).
|
|
1340
|
+
- `/installer` — Runbook Completion (`US-0015`).
|
|
1341
|
+
- `/intake` — Component-Scoped Execution Mode with Protection Guards (`US-0035`).
|
|
1342
|
+
- `/intake` — Configurable Guided Intake Behavior (`US-0033`).
|
|
1343
|
+
- `/map-codebase` — map-codebase does not write codebase-map in fresh repos (`BUG-0002`).
|
|
1344
|
+
- `/memory-audit` — Memory Drift Audit Command (`US-0024`).
|
|
1345
|
+
- `/product` — Canonical Story Status Source + Global Drift Guard (`US-0045`).
|
|
1346
|
+
- `/product` — Clean Install Hygiene and Complete Clean-Repo Coverage (`US-0050`).
|
|
1347
|
+
- `/security-review` — Security & Compliance Review Agent (`US-0028`).
|
|
1348
|
+
- `/skip` — Explicit Bulk Execute Orchestration Mode (`US-0047`).
|
|
1349
|
+
- `/strings` — Clean Placeholder Content from Templates and Active Files (`US-0019`).
|
|
1350
|
+
- `/write` — Artifact Templates and Starter Docs (`US-0006`).
|
|
1351
|
+
- `AUTO_FLOW_MODE` scratchpad flag — Automation Modes (`US-0011`).
|
|
1352
|
+
- `README` scratchpad flag — Voice Input Documentation (`US-0010`).
|
|
1353
|
+
- `TEAM_MODE` scratchpad flag — Team Mode (`US-0013`).
|
|
1354
|
+
- `US-0002` scratchpad flag — AI Behavior Rules (`US-0002`).
|
|
1355
|
+
- `US-0003` scratchpad flag — Subagent Definitions (`US-0003`).
|
|
1356
|
+
- `US-0005` scratchpad flag — Hook System (`US-0005`).
|
|
1357
|
+
- `US-0008` scratchpad flag — CLI Installer (`US-0008`).
|
|
1358
|
+
- `US-0012` scratchpad flag — Benchmark Suite (`US-0012`).
|
|
1359
|
+
- `US-0014` scratchpad flag — Quality Chain (3-Layer) (`US-0014`).
|
|
1360
|
+
- `US-0017` scratchpad flag — Template Drift Guard (`US-0017`).
|
|
1361
|
+
|
|
1243
1362
|
## Developer and release deep-dive
|
|
1244
1363
|
|
|
1245
1364
|
### CI/CD via runbook
|
package/package.json
CHANGED
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
Scoped modes (DEC-0073 §10 / US-0090):
|
|
5
5
|
--scope=intake (default) DEC-0063 intake pair table.
|
|
6
6
|
--scope=caveman-compress DEC-0073 caveman input-compression pair table.
|
|
7
|
-
--scope=
|
|
7
|
+
--scope=readme-feature-coverage DEC-0074 README feature-coverage pair table.
|
|
8
|
+
--scope=downstream-ci-guard DEC-0075 downstream CI guard script pair table.
|
|
9
|
+
--scope=us-0092 DEC-0078 full-autonomy outer driver + probe surfaces.
|
|
10
|
+
--scope=us-0093 DEC-0079 browser UAT probe surfaces.
|
|
11
|
+
--scope=all union of all tables.
|
|
8
12
|
"""
|
|
9
13
|
|
|
10
14
|
from __future__ import annotations
|
|
@@ -33,10 +37,94 @@ CAVEMAN_COMPRESS_PAIRS: tuple[tuple[str, str], ...] = (
|
|
|
33
37
|
"template/docs/engineering/auto-orchestration-reference.md"),
|
|
34
38
|
)
|
|
35
39
|
|
|
40
|
+
README_FEATURE_COVERAGE_PAIRS: tuple[tuple[str, str], ...] = (
|
|
41
|
+
(
|
|
42
|
+
"scripts/validate_readme_feature_coverage.py",
|
|
43
|
+
"template/scripts/validate_readme_feature_coverage.py",
|
|
44
|
+
),
|
|
45
|
+
(
|
|
46
|
+
"scripts/readme_feature_coverage_lib.py",
|
|
47
|
+
"template/scripts/readme_feature_coverage_lib.py",
|
|
48
|
+
),
|
|
49
|
+
(
|
|
50
|
+
"docs/engineering/context/readme-section-affinity.json",
|
|
51
|
+
"template/docs/engineering/context/readme-section-affinity.json",
|
|
52
|
+
),
|
|
53
|
+
(".cursor/commands/release.md", "template/.cursor/commands/release.md"),
|
|
54
|
+
("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
|
|
55
|
+
(
|
|
56
|
+
"docs/engineering/context/installer-owned-paths.manifest",
|
|
57
|
+
"template/docs/engineering/context/installer-owned-paths.manifest",
|
|
58
|
+
),
|
|
59
|
+
(
|
|
60
|
+
"scripts/check_intake_template_parity.py",
|
|
61
|
+
"template/scripts/check_intake_template_parity.py",
|
|
62
|
+
),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
US0092_PAIRS: tuple[tuple[str, str], ...] = (
|
|
66
|
+
("scripts/auto_outer_driver.py", "template/scripts/auto_outer_driver.py"),
|
|
67
|
+
("scripts/uat_probe_lib.py", "template/scripts/uat_probe_lib.py"),
|
|
68
|
+
(
|
|
69
|
+
"docs/engineering/context/installer-owned-paths.manifest",
|
|
70
|
+
"template/docs/engineering/context/installer-owned-paths.manifest",
|
|
71
|
+
),
|
|
72
|
+
(".cursor/commands/auto.md", "template/.cursor/commands/auto.md"),
|
|
73
|
+
(".cursor/commands/verify-work.md", "template/.cursor/commands/verify-work.md"),
|
|
74
|
+
(".cursor/commands/qa.md", "template/.cursor/commands/qa.md"),
|
|
75
|
+
(
|
|
76
|
+
"docs/engineering/auto-orchestration-reference.md",
|
|
77
|
+
"template/docs/engineering/auto-orchestration-reference.md",
|
|
78
|
+
),
|
|
79
|
+
("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
US0093_PAIRS: tuple[tuple[str, str], ...] = (
|
|
83
|
+
("scripts/uat_probe_lib.py", "template/scripts/uat_probe_lib.py"),
|
|
84
|
+
(".cursor/commands/verify-work.md", "template/.cursor/commands/verify-work.md"),
|
|
85
|
+
(".cursor/commands/qa.md", "template/.cursor/commands/qa.md"),
|
|
86
|
+
(".cursor/commands/execute.md", "template/.cursor/commands/execute.md"),
|
|
87
|
+
(
|
|
88
|
+
".cursor/scratchpad.local.example.md",
|
|
89
|
+
"template/.cursor/scratchpad.local.example.md",
|
|
90
|
+
),
|
|
91
|
+
("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
|
|
92
|
+
(
|
|
93
|
+
"docs/engineering/auto-orchestration-reference.md",
|
|
94
|
+
"template/docs/engineering/auto-orchestration-reference.md",
|
|
95
|
+
),
|
|
96
|
+
(
|
|
97
|
+
"docs/engineering/context/installer-owned-paths.manifest",
|
|
98
|
+
"template/docs/engineering/context/installer-owned-paths.manifest",
|
|
99
|
+
),
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
DOWNSTREAM_CI_GUARD_PAIRS: tuple[tuple[str, str], ...] = (
|
|
103
|
+
(
|
|
104
|
+
"scripts/check_downstream_ci_guard.py",
|
|
105
|
+
"template/scripts/check_downstream_ci_guard.py",
|
|
106
|
+
),
|
|
107
|
+
(
|
|
108
|
+
"scripts/downstream_ci_guard_lib.py",
|
|
109
|
+
"template/scripts/downstream_ci_guard_lib.py",
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
|
|
36
113
|
SCOPES: dict[str, tuple[tuple[str, str], ...]] = {
|
|
37
114
|
"intake": INTAKE_TEMPLATE_PAIRS,
|
|
38
115
|
"caveman-compress": CAVEMAN_COMPRESS_PAIRS,
|
|
39
|
-
"
|
|
116
|
+
"readme-feature-coverage": README_FEATURE_COVERAGE_PAIRS,
|
|
117
|
+
"downstream-ci-guard": DOWNSTREAM_CI_GUARD_PAIRS,
|
|
118
|
+
"us-0092": US0092_PAIRS,
|
|
119
|
+
"us-0093": US0093_PAIRS,
|
|
120
|
+
"all": (
|
|
121
|
+
INTAKE_TEMPLATE_PAIRS
|
|
122
|
+
+ CAVEMAN_COMPRESS_PAIRS
|
|
123
|
+
+ README_FEATURE_COVERAGE_PAIRS
|
|
124
|
+
+ DOWNSTREAM_CI_GUARD_PAIRS
|
|
125
|
+
+ US0092_PAIRS
|
|
126
|
+
+ US0093_PAIRS
|
|
127
|
+
),
|
|
40
128
|
}
|
|
41
129
|
|
|
42
130
|
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Prepublish / CI guard: installer.sh LF + POSIX-safe startup tokens (US-0084 / AC-2).
|
|
2
|
+
"""Prepublish / CI guard: installer.sh LF + POSIX-safe startup tokens (US-0084 / AC-2).
|
|
3
|
+
|
|
4
|
+
BUG-0008: reject CR bytes in installer-owned-paths.manifest (CRLF breaks POSIX awk section match).
|
|
5
|
+
"""
|
|
3
6
|
|
|
4
7
|
from __future__ import annotations
|
|
5
8
|
|
|
@@ -10,6 +13,10 @@ from pathlib import Path
|
|
|
10
13
|
|
|
11
14
|
ROOT = Path(__file__).resolve().parents[1]
|
|
12
15
|
INSTALLER_SH = ROOT / "installer.sh"
|
|
16
|
+
INSTALLER_MANIFESTS = (
|
|
17
|
+
ROOT / "docs" / "engineering" / "context" / "installer-owned-paths.manifest",
|
|
18
|
+
ROOT / "template" / "docs" / "engineering" / "context" / "installer-owned-paths.manifest",
|
|
19
|
+
)
|
|
13
20
|
|
|
14
21
|
FORBIDDEN_TOKENS = (
|
|
15
22
|
"set -euo",
|
|
@@ -32,6 +39,17 @@ def main() -> int:
|
|
|
32
39
|
file=sys.stderr,
|
|
33
40
|
)
|
|
34
41
|
return 1
|
|
42
|
+
for man in INSTALLER_MANIFESTS:
|
|
43
|
+
if not man.is_file():
|
|
44
|
+
continue
|
|
45
|
+
mdata = man.read_bytes()
|
|
46
|
+
if b"\r" in mdata:
|
|
47
|
+
print(
|
|
48
|
+
f"guard_installer_publish: CR/LF (\\r) bytes found in {man.relative_to(ROOT)} — "
|
|
49
|
+
"use LF only (.gitattributes *.manifest; BUG-0008).",
|
|
50
|
+
file=sys.stderr,
|
|
51
|
+
)
|
|
52
|
+
return 1
|
|
35
53
|
text = data.decode("utf-8", errors="replace")
|
|
36
54
|
for token in FORBIDDEN_TOKENS:
|
|
37
55
|
if token in text:
|
|
@@ -78,12 +78,22 @@ description: "its-magic architecture: define approach, risks, and decisions."
|
|
|
78
78
|
- If `USER_GUIDE_MODE=0`, add no required user-guide steps or blocking checks (zero overhead).
|
|
79
79
|
- If `USER_GUIDE_MODE=1`, reference canonical user-guide path and schema in
|
|
80
80
|
architecture/state for in-scope feature stories; see runbook user-guide section.
|
|
81
|
-
9. Triad hot-surface gate (DEC-0054
|
|
82
|
-
mutated:
|
|
83
|
-
-
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
`
|
|
81
|
+
9. Triad hot-surface gate (DEC-0054; heading policy DEC-0076 / BUG-0010) when
|
|
82
|
+
`docs/engineering/architecture.md` is mutated:
|
|
83
|
+
- **Authoring mandate**: append new story sections as H1 `# US-xxxx` and new
|
|
84
|
+
bug sections as H1 `# BUG-xxxx` (not `## US-` / `## BUG-`).
|
|
85
|
+
- **Before** mutating the file, capture
|
|
86
|
+
`baseline_h2_count = count_h2_story_headings(architecture.md)` via
|
|
87
|
+
`python scripts/enforce-triad-hot-surface.py` (legacy `## US-xxxx` sections
|
|
88
|
+
remain rollover-visible; count must not increase during `/architecture`).
|
|
89
|
+
- Run `python scripts/enforce-triad-hot-surface.py --rollover` then `--check`
|
|
90
|
+
from repository root.
|
|
91
|
+
- Run heading policy check:
|
|
92
|
+
`python scripts/enforce-triad-hot-surface.py --check-arch-heading-policy
|
|
93
|
+
--baseline-h2-count <baseline_h2_count>`.
|
|
94
|
+
- On failure stop with `STATE_ARCHIVE_REQUIRED`, `ARTIFACT_HOT_SURFACE_OVERSIZE`,
|
|
95
|
+
or **`ARCH_STORY_HEADING_LEVEL_INVALID`** (non-suppressible `blocked` when H2
|
|
96
|
+
story-heading count increased),
|
|
87
97
|
- preserve non-target history in archive packs only (never delete unrelated
|
|
88
98
|
story sections without archival evidence).
|
|
89
99
|
10. Codebase map lifecycle gate (US-0082 / DEC-0065) — before handoff to
|
|
@@ -71,6 +71,48 @@ Operators must follow the runbook recipe
|
|
|
71
71
|
`stop_reason` vocabulary: `completed`, `decision_gate`, `missing_input`,
|
|
72
72
|
`pause_request`, `loop_max`, `error`, `blocked`.
|
|
73
73
|
|
|
74
|
+
## Full-autonomy mode + outer driver (US-0092 / DEC-0078)
|
|
75
|
+
|
|
76
|
+
**`AUTO_FLOW_MODE=full_autonomy`** (exact literal, default-off) enables the shipped
|
|
77
|
+
stdlib outer driver **`scripts/auto_outer_driver.py`**. The driver **loops hook
|
|
78
|
+
invocations** — spawn-only preserved (**BUG-0006**); it never performs phase-role work.
|
|
79
|
+
|
|
80
|
+
Operator recipe: set scratchpad keys → run
|
|
81
|
+
`python scripts/auto_outer_driver.py --repo .` once → interpret exit table in
|
|
82
|
+
**`docs/engineering/runbook.md`** § **Full-autonomy outer driver (US-0092)**.
|
|
83
|
+
|
|
84
|
+
**Drain-advance-without-pause**: with **`full_autonomy`** + **`AUTO_BACKLOG_DRAIN=1`**
|
|
85
|
+
(or bug-queue policy), segment completion schedules the next OPEN story/bug
|
|
86
|
+
**immediately** without operator re-`/auto`; **`resume_brief`** +
|
|
87
|
+
**`state.md`** refresh per **DEC-0069** at every boundary.
|
|
88
|
+
|
|
89
|
+
### Full-autonomy stop matrix (US-0092)
|
|
90
|
+
|
|
91
|
+
**Invariant**: **`full_autonomy`** relaxes recoverable transient stops and operator
|
|
92
|
+
re-invocation, not governance gates. **`RELEASE_PUBLISH_MODE=auto`** remains
|
|
93
|
+
explicit opt-in for publish (unchanged default-off).
|
|
94
|
+
|
|
95
|
+
| Condition | US-0088 (all modes) | `full_autonomy` delta |
|
|
96
|
+
|-----------|---------------------|------------------------|
|
|
97
|
+
| Next phase, no hard stop | Continue inner `/auto` | Outer driver **re-invokes** when Cursor ends turn early |
|
|
98
|
+
| `decision_gate` | Hard stop | **No change — hard** |
|
|
99
|
+
| Unrecoverable `error` | Hard stop | **No change — hard** |
|
|
100
|
+
| Critical `missing_input` | Hard stop | **No change — hard** |
|
|
101
|
+
| Transient `missing_input` (recoverable) | Hard stop | **Relaxable** — bounded block-retry (`AUTO_BLOCK_RETRY_MAX`) |
|
|
102
|
+
| `pause_request` / `AUTO_PAUSE_REQUEST` | Hard stop | **No change — hard** |
|
|
103
|
+
| `loop_max` / `AUTO_LOOP_MAX_CYCLES` | Hard stop | **No change — hard** |
|
|
104
|
+
| `blocked` — transient/sync | Hard stop | **Relaxable** when ledger classifies recoverable |
|
|
105
|
+
| `blocked` — isolation / strict-proof / ownership | Hard stop | **No change — hard** |
|
|
106
|
+
| UAT/QA fail | Hard stop (operator) | **Relaxable** when `AUTO_IMPLEMENTATION_LOOP=1` |
|
|
107
|
+
| Segment complete + `AUTO_BACKLOG_DRAIN=1` | Advance (may need manual re-`/auto`) | **Drain-without-pause** — immediate next item |
|
|
108
|
+
| `BACKLOG_MAX_STORIES_REACHED` | Hard stop | **No change — hard** |
|
|
109
|
+
| `AUTO_SCHEDULER_CONFLICT` | Hard stop | **No change — hard** |
|
|
110
|
+
| Security deny (`.env`, intake evidence mutation) | Hard deny | **No change — hard** |
|
|
111
|
+
|
|
112
|
+
Block-retry ledger: append-only **`handoffs/auto_block_retry/<orchestrator_run_id>.jsonl`**
|
|
113
|
+
(names-only; cap exhaustion → exit **6** `BLOCK_RETRY_CAP_EXHAUSTED`). See architecture
|
|
114
|
+
**`# US-0092`** and **`docs/engineering/auto-orchestration-reference.md`**.
|
|
115
|
+
|
|
74
116
|
## Full specification (US-0080 / DEC-0062)
|
|
75
117
|
|
|
76
118
|
Long prose, expanded mode semantics, and **Steps 1–13** detail live in
|
|
@@ -48,6 +48,32 @@ as stale isolation evidence).
|
|
|
48
48
|
|
|
49
49
|
Release gate semantics (US-0039): mandatory gates (check-in test, QA, UAT) and no-bypass/override contract are enforced at `/release`; see `.cursor/commands/release.md` and `.cursor/commands/qa.md`.
|
|
50
50
|
|
|
51
|
+
### Browser UAT self-test (US-0093)
|
|
52
|
+
|
|
53
|
+
When **`UAT_BROWSER_PROBE_MODE=cursor`** (default) and acceptance steps classify as **`browser_smoke`**
|
|
54
|
+
(or automatable **`manual_operator`** re-routed per **DEC-0079** §4), execute the **Cursor browser MCP**
|
|
55
|
+
sequence during `/execute` when web UI verification applies (**BUG-0006**: **`scripts/uat_probe_lib.py`**
|
|
56
|
+
never invokes MCP — subagent only):
|
|
57
|
+
|
|
58
|
+
1. **Resolve target URL** — `docs/engineering/runtime-connectivity.md` first `http(s)://`; else
|
|
59
|
+
`package.json` dev/start + **`DEV_SERVER_PORT`** scratchpad override.
|
|
60
|
+
2. **`browser_navigate`** — load URL; respect enterprise origin allowlist.
|
|
61
|
+
3. **Step plan** — map automatable verbs to **`browser_click`** / **`browser_type`** / **`browser_scroll`**;
|
|
62
|
+
**never** fill password/credential fields; **never** read **`.env`** paths.
|
|
63
|
+
4. **`browser_screenshot`** — write to **`sprints/Sxxxx/evidence/browser/<probe_id>-<seq>.png`** (max **5**).
|
|
64
|
+
5. **Console + network evidence** — counts + summary path refs only (no inline secrets).
|
|
65
|
+
6. **Verdict** — set **`passed`**, **`reason_code`**, **`browser_evidence_refs`** on the matching
|
|
66
|
+
**`probe_results[]`** row in **`uat.json`**. **`passed=true`** in **`cursor`** mode requires
|
|
67
|
+
non-empty **`navigation_url`** + at least one screenshot or console/network summary path — else
|
|
68
|
+
downgrade to **`UAT_BROWSER_PROBE_FAILED`**.
|
|
69
|
+
7. **Fallback trigger** — MCP unavailable → record **`UAT_BROWSER_UNAVAILABLE`**; when
|
|
70
|
+
**`UAT_BROWSER_FALLBACK_CHAIN=1`**, stdlib HTTP/Playwright fallback runs via **`uat_probe_lib.py`**.
|
|
71
|
+
Both fail → **`UAT_BROWSER_PROBE_FAILED`** (no silent PASS).
|
|
72
|
+
|
|
73
|
+
Optional validation: **`python scripts/uat_probe_lib.py --merge-result <fragment.json>`** —
|
|
74
|
+
evidence-required-on-PASS in **`cursor`** mode. No auto-read **`.env`**, no credential auto-fill,
|
|
75
|
+
no intake evidence mutation.
|
|
76
|
+
|
|
51
77
|
## Intake evidence tooling reference (US-0078 / DEC-0060)
|
|
52
78
|
|
|
53
79
|
Stories that harden intake persistence ship **`scripts/intake_evidence_lib.py`**,
|
|
@@ -77,6 +103,29 @@ parity for listed paths: **`python scripts/check_token_cost_parity.py --repo .`*
|
|
|
77
103
|
- `/execute` must not start/continue implementation solely based on
|
|
78
104
|
non-canonical status evidence.
|
|
79
105
|
|
|
106
|
+
## Browser UAT self-test (US-0093)
|
|
107
|
+
|
|
108
|
+
When acceptance steps classify as **`browser_smoke`** (or automatable **`manual_operator`**
|
|
109
|
+
reclassified per **DEC-0079** §4) and **`UAT_BROWSER_PROBE_MODE=cursor`**, execute the **Cursor
|
|
110
|
+
browser MCP** sequence during execute-phase verification — **lib never calls MCP directly**
|
|
111
|
+
(**BUG-0006**):
|
|
112
|
+
|
|
113
|
+
1. **Resolve target URL** — `docs/engineering/runtime-connectivity.md` first `http(s)://`; else
|
|
114
|
+
dev-server port from `package.json` + scratchpad **`DEV_SERVER_PORT`**.
|
|
115
|
+
2. **`browser_navigate`** — respect origin allowlist.
|
|
116
|
+
3. **Step plan** — **`browser_click`** / **`browser_type`** / **`browser_scroll`** when
|
|
117
|
+
automatable; **never** fill password/credential fields or read **`.env`**.
|
|
118
|
+
4. **`browser_screenshot`** → **`sprints/Sxxxx/evidence/browser/<probe_id>-<seq>.png`** (max **5**).
|
|
119
|
+
5. Console + network summary path refs only (no inline secrets).
|
|
120
|
+
6. Write **`browser_evidence_refs`** to **`uat.json`** `probe_results[]`; mirror
|
|
121
|
+
**Runtime browser evidence** in **`qa-findings.md`**.
|
|
122
|
+
7. MCP unavailable → **`UAT_BROWSER_UNAVAILABLE`** + stdlib fallback when
|
|
123
|
+
**`UAT_BROWSER_FALLBACK_CHAIN=1`**; validate with
|
|
124
|
+
**`python scripts/uat_probe_lib.py --merge-result <fragment.json>`**.
|
|
125
|
+
|
|
126
|
+
Reason codes: **`UAT_BROWSER_UNAVAILABLE`**, **`UAT_BROWSER_PROBE_FAILED`**,
|
|
127
|
+
**`UAT_BROWSER_PROBE_TIMEOUT`**. **No silent PASS** without agent evidence in **`cursor`** mode.
|
|
128
|
+
|
|
80
129
|
## Steps
|
|
81
130
|
1. Implement one task at a time.
|
|
82
131
|
2. Update summary and engineering state.
|
|
@@ -48,6 +48,43 @@ QA completion evidence is required before `/release` may proceed. Record finding
|
|
|
48
48
|
`RELEASE_QA_BLOCKERS_OPEN`. When clear, handoff to `/verify-work` so release gate can
|
|
49
49
|
verify no unresolved blockers.
|
|
50
50
|
|
|
51
|
+
## Self-verify UAT probes (US-0092 / DEC-0078)
|
|
52
|
+
|
|
53
|
+
Share the **`scripts/uat_probe_lib.py`** resolver with **`/verify-work`**: derive
|
|
54
|
+
acceptance steps, execute probes where stack profile resolves, record evidence in
|
|
55
|
+
**`sprints/Sxxxx/uat.json`** `probe_results[]` and **`sprints/Sxxxx/qa-findings.md`**.
|
|
56
|
+
Fail closed with **`UAT_PROBE_UNRESOLVED`** (not PASS) when no probe maps.
|
|
57
|
+
Forbidden: auto-read **`.env`**, mutate intake evidence — **`UAT_PROBE_FORBIDDEN`**.
|
|
58
|
+
|
|
59
|
+
Reason codes extend with **`UAT_BROWSER_UNAVAILABLE`**, **`UAT_BROWSER_PROBE_FAILED`**,
|
|
60
|
+
**`UAT_BROWSER_PROBE_TIMEOUT`** (**US-0093** / **DEC-0079**).
|
|
61
|
+
|
|
62
|
+
### Browser UAT self-test (US-0093)
|
|
63
|
+
|
|
64
|
+
When **`UAT_BROWSER_PROBE_MODE=cursor`** (default) and step classifies as **`browser_smoke`**
|
|
65
|
+
(or automatable **`manual_operator`** reclassified per **DEC-0079** §4), execute the **Cursor
|
|
66
|
+
browser MCP** sequence — **lib never calls MCP directly** (**BUG-0006**):
|
|
67
|
+
|
|
68
|
+
1. **Resolve target URL** — `docs/engineering/runtime-connectivity.md` first `http(s)://`; else
|
|
69
|
+
dev-server port from `package.json` + scratchpad **`DEV_SERVER_PORT`**.
|
|
70
|
+
2. **`browser_navigate`** — load health/app URL; respect enterprise origin allowlist.
|
|
71
|
+
3. **Step plan** — map acceptance verbs to **`browser_click`** / **`browser_type`** /
|
|
72
|
+
**`browser_scroll`** when automatable; **never** fill password/credential fields or read **`.env`**.
|
|
73
|
+
4. **`browser_screenshot`** — write to **`sprints/Sxxxx/evidence/browser/<probe_id>-<seq>.png`**
|
|
74
|
+
(max **5** per probe).
|
|
75
|
+
5. **Console + network evidence** — counts + summary path refs only (no inline secrets).
|
|
76
|
+
6. **Verdict** — set **`passed`**, **`reason_code`**, **`browser_evidence_refs`** in
|
|
77
|
+
**`uat.json`** `probe_results[]`; **`passed=true`** in **`cursor`** mode **requires** non-empty
|
|
78
|
+
**`navigation_url`** + at least one screenshot or console/network summary path — else
|
|
79
|
+
**`UAT_BROWSER_PROBE_FAILED`**. Mirror under **`qa-findings.md`** **Runtime browser evidence**.
|
|
80
|
+
7. **Fallback** — MCP unavailable → record **`UAT_BROWSER_UNAVAILABLE`**, run stdlib fallback when
|
|
81
|
+
**`UAT_BROWSER_FALLBACK_CHAIN=1`**; validate via
|
|
82
|
+
**`python scripts/uat_probe_lib.py --merge-result <fragment.json>`**.
|
|
83
|
+
|
|
84
|
+
**No silent PASS** — stdlib alone does **not** PASS **`browser_smoke`** in **`cursor`** mode
|
|
85
|
+
without agent **`browser_evidence_refs`**. Security: no auto-read **`.env`**, no credential
|
|
86
|
+
auto-fill, no intake evidence mutation — **`UAT_PROBE_FORBIDDEN`** unchanged.
|
|
87
|
+
|
|
51
88
|
## Steps
|
|
52
89
|
0. If `SECURITY_REVIEW=1`, verify `docs/engineering/security-review.md` exists
|
|
53
90
|
and has no unresolved `critical` findings before proceeding. If unresolved
|
|
@@ -241,6 +241,17 @@ Guardrails:
|
|
|
241
241
|
target-scoped repair and append entry to `docs/engineering/legacy-drift-audit.md`.
|
|
242
242
|
- Behavior is deterministic and documented in runbook; do not mutate
|
|
243
243
|
unrelated stories.
|
|
244
|
+
3f. README feature coverage gate (US-0091 / DEC-0074):
|
|
245
|
+
- Read merged scratchpad `README_FEATURE_COVERAGE_ENFORCE` (default `0`).
|
|
246
|
+
- When `0`: skip with `skipped` evidence in `sprints/Sxxxx/release-findings.md`
|
|
247
|
+
§ doc gates (grandfathering / migration pass).
|
|
248
|
+
- When `1`: run
|
|
249
|
+
`python scripts/validate_readme_feature_coverage.py --repo . --enforce`.
|
|
250
|
+
- On failure: emit `README_FEATURE_COVERAGE_BLOCKED` plus sub-codes on stderr;
|
|
251
|
+
remediation lists each missing id and target `root_h2` / `dev_h2` from
|
|
252
|
+
`docs/engineering/context/readme-section-affinity.json`.
|
|
253
|
+
- Active + `template/.cursor/commands/release.md` byte-identical step **3f**
|
|
254
|
+
block (full-file parity per US-0017).
|
|
244
255
|
4. Verify UAT completeness (DEC-0009): confirm all sprint UAT artifacts (`uat.json`,
|
|
245
256
|
`uat.md`) are in populated/verified state per DEC-0009. All steps must have
|
|
246
257
|
recorded results. If any UAT is placeholder or incomplete, block release and
|
|
@@ -94,8 +94,50 @@ traceable for generated-project scope:
|
|
|
94
94
|
`TEST_SCAFFOLD_GENERATION_FAILED` and require `/execute` or `/qa` rerun with
|
|
95
95
|
deterministic evidence capture.
|
|
96
96
|
|
|
97
|
+
## Self-verify UAT probes (US-0092 / DEC-0078)
|
|
98
|
+
|
|
99
|
+
When stack profile resolves, derive UAT steps from acceptance and execute probes via
|
|
100
|
+
the shared resolver **`scripts/uat_probe_lib.py`** (active + `template/scripts/` mirror).
|
|
101
|
+
Record evidence in **`sprints/Sxxxx/uat.json`** `probe_results[]` and
|
|
102
|
+
**`sprints/Sxxxx/qa-findings.md`** (path refs for stdout/stderr — no inline secrets).
|
|
103
|
+
**No silent PASS** — unresolvable steps must record fail-closed reason codes:
|
|
104
|
+
|
|
105
|
+
`UAT_PROBE_UNRESOLVED`, `UAT_STACK_PROFILE_UNKNOWN`, `UAT_PROBE_TIMEOUT`,
|
|
106
|
+
`UAT_PROBE_FAILED`, `UAT_PROBE_FORBIDDEN`, `UAT_PROBE_PASS`,
|
|
107
|
+
`UAT_BROWSER_UNAVAILABLE`, `UAT_BROWSER_PROBE_FAILED`, `UAT_BROWSER_PROBE_TIMEOUT`.
|
|
108
|
+
|
|
109
|
+
Probe catalog: **`build`**, **`test`**, **`api_health`**, **`process_health`**,
|
|
110
|
+
**`browser_smoke`**, **`cli_smoke`**, **`manual_operator`**. CLI:
|
|
111
|
+
`python scripts/uat_probe_lib.py --repo . --step "<acceptance step>" --report`.
|
|
112
|
+
|
|
113
|
+
### Browser UAT self-test (US-0093)
|
|
114
|
+
|
|
115
|
+
When **`UAT_BROWSER_PROBE_MODE=cursor`** (default) and step classifies as **`browser_smoke`**
|
|
116
|
+
(or automatable **`manual_operator`** reclassified per **DEC-0079** §4), execute the **Cursor
|
|
117
|
+
browser MCP** sequence — **lib never calls MCP directly** (**BUG-0006**):
|
|
118
|
+
|
|
119
|
+
1. **Resolve target URL** — `docs/engineering/runtime-connectivity.md` first `http(s)://`; else
|
|
120
|
+
dev-server port from `package.json` + scratchpad **`DEV_SERVER_PORT`**.
|
|
121
|
+
2. **`browser_navigate`** — load health/app URL; respect enterprise origin allowlist.
|
|
122
|
+
3. **Step plan** — map acceptance verbs to **`browser_click`** / **`browser_type`** /
|
|
123
|
+
**`browser_scroll`** when automatable; **never** fill password/credential fields or read **`.env`**.
|
|
124
|
+
4. **`browser_screenshot`** — write to **`sprints/Sxxxx/evidence/browser/<probe_id>-<seq>.png`**
|
|
125
|
+
(max **5** per probe).
|
|
126
|
+
5. **Console + network evidence** — counts + summary path refs only (no inline secrets).
|
|
127
|
+
6. **Verdict** — set **`passed`**, **`reason_code`**, **`browser_evidence_refs`** in
|
|
128
|
+
**`uat.json`** `probe_results[]`; **`passed=true`** in **`cursor`** mode **requires** non-empty
|
|
129
|
+
**`navigation_url`** + at least one screenshot or console/network summary path — else
|
|
130
|
+
**`UAT_BROWSER_PROBE_FAILED`**. Mirror under **`qa-findings.md`** **Runtime browser evidence**.
|
|
131
|
+
7. **Fallback** — MCP unavailable → record **`UAT_BROWSER_UNAVAILABLE`**, run stdlib fallback when
|
|
132
|
+
**`UAT_BROWSER_FALLBACK_CHAIN=1`**; validate via
|
|
133
|
+
**`python scripts/uat_probe_lib.py --merge-result <fragment.json>`**.
|
|
134
|
+
|
|
135
|
+
**No silent PASS** — stdlib alone does **not** PASS **`browser_smoke`** in **`cursor`** mode
|
|
136
|
+
without agent **`browser_evidence_refs`**. Security: no auto-read **`.env`**, no credential
|
|
137
|
+
auto-fill, no intake evidence mutation — **`UAT_PROBE_FORBIDDEN`** unchanged.
|
|
138
|
+
|
|
97
139
|
## Steps
|
|
98
|
-
1. Convert acceptance criteria into testable UAT steps. Derive steps directly from the story's acceptance criteria in `docs/product/acceptance.md`. Each AC should map to at least one UAT step.
|
|
140
|
+
1. Convert acceptance criteria into testable UAT steps. Derive steps directly from the story's acceptance criteria in `docs/product/acceptance.md`. Each AC should map to at least one UAT step. Run **`scripts/uat_probe_lib.py`** for each step where automation applies; record `probe_results[]` in **`uat.json`**.
|
|
99
141
|
2. Populate UAT artifacts: write derived steps into `uat.json` (with description and result per step, accurate pass/fail counts) and `uat.md` (step list with results, summary section). Ensure UAT artifacts are in **populated** state per DEC-0009 — not placeholder.
|
|
100
142
|
3. Record results and failures.
|
|
101
143
|
4. Update state with pass/fail summary.
|
|
@@ -139,3 +139,46 @@ contract-test token lists, `AUTO_QUIET` non-suppressible vocabulary
|
|
|
139
139
|
- No change to spawn-only orchestration (US-0048 / DEC-0029 / BUG-0006),
|
|
140
140
|
strict runtime proof (DEC-0038), `AUTO_QUIET` non-suppressible list
|
|
141
141
|
(US-0088), or US-0071 visible-metadata rules.
|
|
142
|
+
|
|
143
|
+
## Voice compression (when CAVEMAN_MODE=1)
|
|
144
|
+
|
|
145
|
+
### Precedence
|
|
146
|
+
|
|
147
|
+
When `CAVEMAN_MODE=1`, voice-compression directives in **this rule** override
|
|
148
|
+
conflicting **user rule** prose-style guidance (e.g. "write complete sentences",
|
|
149
|
+
"blog-post quality") for **assistant reply voice only**; does **not** override
|
|
150
|
+
user rules for tool usage, git safety, security, or commit policy.
|
|
151
|
+
|
|
152
|
+
### Intensity levels
|
|
153
|
+
|
|
154
|
+
| Level | Semantics | Example pattern |
|
|
155
|
+
|-------|-----------|-----------------|
|
|
156
|
+
| `lite` | Drop filler but keep grammatical sentences | Before: "I will now explain the orchestration gate because plan-verify requires it." After: "Orchestration gate required for plan-verify. Run gate check next." |
|
|
157
|
+
| `full` | Drop articles + fragments OK | Before: "The spawn-only orchestrator must dispatch a fresh subagent for each phase." After: "Spawn-only orchestrator dispatches fresh subagent per phase. Next: run `/execute`." Pattern: `[thing] [action] [reason]. [next step].` |
|
|
158
|
+
| `ultra` | Abbreviate ordinary prose words only; literals per §6 stub | Before: "The auth middleware returns HTTP 401 when the bearer token is absent from the Authorization header." After: "Auth middleware → 401. Bearer token absent. Check header." |
|
|
159
|
+
|
|
160
|
+
Goal: **token-saving terse/imperative prose** — **not** stereotypical caveman
|
|
161
|
+
roleplay.
|
|
162
|
+
|
|
163
|
+
### Drop rules
|
|
164
|
+
|
|
165
|
+
Drop articles, filler, hedging, and pleasantries where level permits; keep
|
|
166
|
+
technical terms exact; fragments OK at `full` and `ultra`.
|
|
167
|
+
|
|
168
|
+
### Auto-Clarity
|
|
169
|
+
|
|
170
|
+
Pause compression for **security** warnings, **destructive** operations, or
|
|
171
|
+
**ambiguous** compression — deliver the clear part in full prose, then resume
|
|
172
|
+
Caveman voice.
|
|
173
|
+
|
|
174
|
+
### Persistence
|
|
175
|
+
|
|
176
|
+
Voice compression is active in **every response** while `CAVEMAN_MODE=1`;
|
|
177
|
+
turn off only via scratchpad keys or the documented toggle phrases above.
|
|
178
|
+
|
|
179
|
+
### Ultra and literal regions
|
|
180
|
+
|
|
181
|
+
**Pointer stub** — defer to existing `## Literal-region invariant (9-zone hard
|
|
182
|
+
MUST)` above. Reason codes, IDs, paths, and proof tuples remain **byte-literal**.
|
|
183
|
+
At `ultra`, abbreviate ordinary prose words only — **never** abbreviate reason
|
|
184
|
+
codes or gate tokens. **No duplicate** 9-zone list here.
|