@event4u/agent-config 3.0.0 → 3.1.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/.agent-src/commands/install-via-agent.md +129 -0
- package/.agent-src/commands/video/from-script.md +1 -1
- package/.agent-src/commands/video.md +1 -1
- package/.agent-src/contexts/execution/cheap-question-mechanics.md +81 -0
- package/.agent-src/rules/caveman-speak.md +2 -2
- package/.agent-src/rules/context-hygiene.md +36 -0
- package/.agent-src/rules/engineering-safety-floor.md +102 -0
- package/.agent-src/rules/finance-safety-floor.md +114 -0
- package/.agent-src/rules/git-history-discipline.md +1 -1
- package/.agent-src/rules/no-cheap-questions.md +34 -32
- package/.agent-src/rules/provider-lifecycle-discipline.md +4 -4
- package/.agent-src/rules/strategy-safety-floor.md +114 -0
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +15 -9
- package/.agent-src/skills/async-python-patterns/SKILL.md +1 -1
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -1
- package/.agent-src/skills/readme-reviewer/SKILL.md +52 -3
- package/.agent-src/skills/readme-writing/SKILL.md +52 -4
- package/.agent-src/skills/readme-writing-package/SKILL.md +48 -5
- package/.agent-src/skills/systematic-debugging/SKILL.md +41 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/hooks/pre-commit-frontmatter +66 -0
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +78 -39
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +4 -1
- package/.agent-src/templates/scripts/work_engine/orchestration.py +25 -11
- package/.claude-plugin/marketplace.json +2 -1
- package/AGENTS.md +10 -8
- package/CHANGELOG.md +223 -125
- package/README.md +165 -553
- package/config/agent-settings.template.yml +0 -7
- package/config/discovery/packs.yml +20 -0
- package/config/discovery/unassigned-artefacts.yml +2 -0
- package/config/gitignore-block.txt +19 -3
- package/dist/cli/commands/uiServe.js +13 -4
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/registry.js +2 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +7 -0
- package/dist/discovery/discovery-manifest.json +2107 -1409
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +9 -9
- package/dist/discovery/orphan-report.md +10 -0
- package/dist/discovery/packs.json +1002 -0
- package/dist/discovery/trust-report.md +26 -0
- package/dist/discovery/workspaces.json +705 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +1623 -0
- package/dist/server/app.js +11 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/io/atomicMultiWrite.js +3 -1
- package/dist/server/io/atomicMultiWrite.js.map +1 -1
- package/dist/server/io/yamlIO.js +22 -0
- package/dist/server/io/yamlIO.js.map +1 -1
- package/dist/server/routes/ping.js +8 -0
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/server/routes/schema.js +2 -2
- package/dist/server/routes/schema.js.map +1 -1
- package/dist/server/routes/settings.js +104 -23
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/userMd.js +37 -27
- package/dist/server/routes/userMd.js.map +1 -1
- package/dist/server/routes/wizard.js +256 -20
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/schemas/settings.js +0 -1
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/server/token.js +10 -3
- package/dist/server/token.js.map +1 -1
- package/dist/server/writeRoot.js +28 -11
- package/dist/server/writeRoot.js.map +1 -1
- package/dist/server/writeRoot.test.js +22 -4
- package/dist/server/writeRoot.test.js.map +1 -1
- package/dist/shared/userMd/formAdapter.js +29 -51
- package/dist/shared/userMd/formAdapter.js.map +1 -1
- package/dist/shared/userMd/schema.js +32 -104
- package/dist/shared/userMd/schema.js.map +1 -1
- package/dist/shared/userMd/utils.js +64 -50
- package/dist/shared/userMd/utils.js.map +1 -1
- package/dist/ui/assets/index-D-DY1ywI.js +35 -0
- package/dist/ui/assets/index-D-DY1ywI.js.map +1 -0
- package/dist/ui/index.html +1 -1
- package/docs/adrs/router/0001-three-tier-routing.md +5 -5
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +1 -1
- package/docs/architecture.md +3 -3
- package/docs/archive/CHANGELOG-pre-3.1.0.md +167 -0
- package/docs/catalog.md +30 -26
- package/docs/contracts/CHANGELOG-conventions.md +1 -1
- package/docs/contracts/agent-user-schema.md +6 -9
- package/docs/contracts/consumer-bridge.md +79 -0
- package/docs/contracts/discovery-manifest.md +209 -0
- package/docs/contracts/discovery-manifest.schema.json +77 -4
- package/docs/contracts/explain-trace.schema.json +1 -1
- package/docs/contracts/file-ownership-matrix.json +197 -13
- package/docs/contracts/frontmatter-contract.md +140 -0
- package/docs/contracts/gui-wizard.md +223 -0
- package/docs/contracts/installer-agent-mode.md +137 -0
- package/docs/contracts/kernel-membership.md +1 -1
- package/docs/contracts/mcp-tool-inventory.md +9 -9
- package/docs/contracts/namespace.md +6 -6
- package/docs/contracts/provider-lifecycle.md +5 -5
- package/docs/contracts/rule-router.md +4 -4
- package/docs/contracts/settings-api.md +53 -6
- package/docs/contracts/smoke-contracts.md +3 -3
- package/docs/contracts/trust-and-safety.md +144 -0
- package/docs/customization.md +2 -2
- package/docs/decisions/ADR-007-agent-discovery-scopes.md +12 -0
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +24 -0
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +146 -0
- package/docs/decisions/ADR-016-installer-architecture.md +189 -0
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +261 -0
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +159 -0
- package/docs/decisions/ADR-019-router-json-dist-location.md +124 -0
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +123 -0
- package/docs/decisions/ADR-021-deployment-shape.md +153 -0
- package/docs/decisions/INDEX.md +7 -0
- package/docs/deploy/connector-setup.md +129 -0
- package/docs/deploy/env-vars.md +70 -0
- package/docs/deploy/policy-cookbook.md +130 -0
- package/docs/deploy/quickstart.md +112 -0
- package/docs/distribution/public-install-smoke.md +68 -0
- package/docs/distribution/registries.md +55 -0
- package/docs/distribution/telemetry-privacy.md +128 -0
- package/docs/distribution/telemetry-schema.md +174 -0
- package/docs/featured-skills.md +95 -0
- package/docs/getting-started-by-role.md +19 -1
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/installed-tools-manifest.md +11 -8
- package/docs/guidelines/docs/readme-size-and-splitting.md +53 -1
- package/docs/installation.md +27 -14
- package/docs/maintainers/dev-mode.md +105 -0
- package/docs/setup/per-ide/claude-desktop.md +3 -2
- package/docs/wizard.md +39 -4
- package/package.json +18 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_cli/cmd_doctor.py +150 -2
- package/scripts/_cli/cmd_explain.py +2 -1
- package/scripts/_cli/cmd_migrate_to_global.py +415 -0
- package/scripts/_cli/cmd_settings_migrate.py +146 -0
- package/scripts/_cli/explain_last/route.py +2 -1
- package/scripts/_dispatch.bash +36 -3
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/agent_settings.py +4 -1
- package/scripts/_lib/agent_src.py +157 -0
- package/scripts/agent-config +17 -6
- package/scripts/audit_skill_descriptions.py +18 -6
- package/scripts/build_discovery_manifest.py +373 -17
- package/scripts/check_artefact_checksums.py +104 -0
- package/scripts/check_cluster_patterns.py +20 -4
- package/scripts/check_command_count_messaging.py +33 -14
- package/scripts/check_council_references.py +43 -4
- package/scripts/check_overlay_cascade_subdirs.py +7 -3
- package/scripts/check_references.py +5 -2
- package/scripts/check_reply_consistency.py +32 -9
- package/scripts/check_template_pin_drift.py +24 -7
- package/scripts/check_token_optimizer_freshness.py +18 -3
- package/scripts/compile_router.py +34 -2
- package/scripts/compress.py +162 -44
- package/scripts/config/presets.py +19 -1
- package/scripts/config/profiles.py +16 -1
- package/scripts/discovery_stats.py +70 -0
- package/scripts/expected_perms.json +47 -0
- package/scripts/generate_index.py +78 -46
- package/scripts/generate_ownership_matrix.py +98 -43
- package/scripts/generate_pack_manifests.py +183 -0
- package/scripts/install +18 -1
- package/scripts/install.py +934 -59
- package/scripts/install.sh +27 -9
- package/scripts/lint_agents_layout.py +93 -13
- package/scripts/lint_agents_md.py +1 -1
- package/scripts/lint_archived_skills.py +32 -16
- package/scripts/lint_bench_corpus.py +14 -2
- package/scripts/lint_command_tiers.py +15 -2
- package/scripts/lint_featured_skills.py +139 -0
- package/scripts/lint_framework_leakage.py +33 -6
- package/scripts/lint_global_paths.py +147 -0
- package/scripts/lint_orchestration_dsl.py +6 -3
- package/scripts/lint_pack_boundaries.py +147 -0
- package/scripts/lint_pack_first_win.py +103 -0
- package/scripts/lint_readme_jargon.py +131 -0
- package/scripts/lint_readme_size.py +33 -0
- package/scripts/lint_rule_interactions.py +23 -5
- package/scripts/lint_rule_tiers.py +12 -3
- package/scripts/lint_trust_coherence.py +212 -0
- package/scripts/measure_rule_budget.py +22 -4
- package/scripts/move_artefact.py +143 -0
- package/scripts/new_skill.py +148 -0
- package/scripts/plan_physical_move.py +353 -0
- package/scripts/refine_ticket_detect.py +30 -7
- package/scripts/schemas/command.schema.json +4 -0
- package/scripts/skill_linter.py +248 -118
- package/scripts/skill_trigger_eval.py +28 -8
- package/scripts/smoke/kernel.sh +1 -1
- package/scripts/smoke/router.sh +24 -5
- package/scripts/smoke/skills.sh +15 -7
- package/scripts/smoke_quickstart.py +11 -2
- package/scripts/snapshot_agent_outputs.py +144 -0
- package/scripts/update_counts.py +45 -17
- package/scripts/validate_decision_engine.py +9 -1
- package/scripts/validate_discovery_manifest.py +94 -0
- package/scripts/validate_frontmatter.py +39 -20
- package/scripts/verify_physical_move.py +185 -0
- package/templates/agent-user.md +0 -1
- package/templates/agent-user.yml +21 -0
- package/templates/minimal/agents-overrides-readme.md +46 -0
- package/templates/minimal/overrides-gitkeep +2 -0
- package/dist/ui/assets/index-BTRcKDlB.js +0 -39
- package/dist/ui/assets/index-BTRcKDlB.js.map +0 -1
- package/templates/minimal/agents-gitkeep +0 -2
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: install-via-agent
|
|
3
|
+
tier: 2
|
|
4
|
+
skills: []
|
|
5
|
+
description: Drive `@event4u/agent-config` installer through its JSON agent-mode protocol — turn-by-turn workspace + pack selection without TTY.
|
|
6
|
+
disable-model-invocation: true
|
|
7
|
+
suggestion:
|
|
8
|
+
eligible: true
|
|
9
|
+
trigger_description: "install @event4u/agent-config in this project via agent mode, headless install, no TTY"
|
|
10
|
+
trigger_context: "user wants to install or re-install @event4u/agent-config and the agent should drive the picker (not a human at a terminal)"
|
|
11
|
+
workspaces:
|
|
12
|
+
- agent-config-maintainer
|
|
13
|
+
- engineering
|
|
14
|
+
packs:
|
|
15
|
+
- meta
|
|
16
|
+
lifecycle: active
|
|
17
|
+
trust:
|
|
18
|
+
level: core
|
|
19
|
+
confidence: high
|
|
20
|
+
human_review_required: false
|
|
21
|
+
install:
|
|
22
|
+
default: false
|
|
23
|
+
removable: true
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# /install-via-agent
|
|
27
|
+
|
|
28
|
+
Drive the `@event4u/agent-config` installer through its **agent-mode**
|
|
29
|
+
protocol — a JSON-over-stdio state machine that lets an LLM agent
|
|
30
|
+
pick workspaces + packs turn-by-turn without a TTY.
|
|
31
|
+
|
|
32
|
+
Contract: [`docs/contracts/installer-agent-mode.md`](../docs/contracts/installer-agent-mode.md).
|
|
33
|
+
Architecture: [ADR-016](../../docs/decisions/ADR-016-installer-architecture.md) § 4, § 6.
|
|
34
|
+
|
|
35
|
+
## When to use
|
|
36
|
+
|
|
37
|
+
- Headless / CI install where no human is at a keyboard.
|
|
38
|
+
- Re-install with a different workspace + pack mix.
|
|
39
|
+
- Demonstrating the protocol for documentation or smoke tests.
|
|
40
|
+
|
|
41
|
+
For interactive install with a human, run `npx @event4u/agent-config init`
|
|
42
|
+
in a real terminal — the installer auto-detects the TTY and renders
|
|
43
|
+
the `@inquirer/prompts` picker.
|
|
44
|
+
|
|
45
|
+
## Steps
|
|
46
|
+
|
|
47
|
+
### 1. Locate the installer
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
which agent-config-installer # global install
|
|
51
|
+
ls node_modules/.bin/agent-config-installer # local install
|
|
52
|
+
# OR run from monorepo dev:
|
|
53
|
+
node packages/core/installer/dist/cli.js --version
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. Turn 1 — request the first question
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
agent-config-installer init --agent --dry-run
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The CLI emits a single JSON line:
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{"status":"question","protocol_version":1,"id":"q1.workspaces", … "next_call":"init --agent --answer q1.workspaces=<value>"}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Parse `choices[]` and pick the workspaces the project needs (multi:
|
|
69
|
+
comma-separated values, e.g. `engineering,product`).
|
|
70
|
+
|
|
71
|
+
### 3. Turn 2 — answer workspaces, request pack list
|
|
72
|
+
|
|
73
|
+
Execute the `next_call` substituting `<value>`:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
agent-config-installer init --agent --dry-run --answer q1.workspaces=engineering
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Response:
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{"status":"question","id":"q2.packs", … "next_call":"… --answer q1.workspaces=engineering --answer q2.packs=<value>"}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Pick from `choices[]`. The list is already scoped to the workspaces
|
|
86
|
+
chosen in turn 1.
|
|
87
|
+
|
|
88
|
+
### 4. Turn 3 — answer packs, possibly confirm auto-added
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
agent-config-installer init --agent --dry-run --answer q1.workspaces=engineering --answer q2.packs=engineering-base,php
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Two terminal cases:
|
|
95
|
+
|
|
96
|
+
- **`done`** — selection complete, no auto-added packs:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{"status":"done","summary":{"files_written":83,"lockfile_sha256":"…"}}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- **`question` (`q3.confirm`)** — `requires_hint` pulled extra packs
|
|
103
|
+
in. Re-issue with `--answer q3.confirm=yes` to proceed, or
|
|
104
|
+
`--answer q3.confirm=no` to abort with `aborted_by_agent`.
|
|
105
|
+
|
|
106
|
+
### 5. Drop `--dry-run` for the real install
|
|
107
|
+
|
|
108
|
+
Once the agent has confirmed the plan, repeat the final turn
|
|
109
|
+
without `--dry-run`. Files materialize atomically; the lockfile
|
|
110
|
+
lands at `agents/agent-config.lock.yml`. <!-- ref-ignore -->
|
|
111
|
+
|
|
112
|
+
## Failure modes
|
|
113
|
+
|
|
114
|
+
- **Exit 2 + `status:"error"`** — `answer_malformed`,
|
|
115
|
+
`out_of_order`, `unknown_workspace`, `unknown_pack`, or
|
|
116
|
+
`aborted_by_agent`. Read `reason` and `expected_question_id`,
|
|
117
|
+
fix the next call, re-issue.
|
|
118
|
+
- **Manifest not found** — pass `--manifest <path>` pointing at
|
|
119
|
+
`dist/discovery/discovery-manifest.json`.
|
|
120
|
+
- **`protocol_version` mismatch** — abort; do not attempt
|
|
121
|
+
recovery. Upgrade the agent or pin an older installer.
|
|
122
|
+
|
|
123
|
+
## Rules
|
|
124
|
+
|
|
125
|
+
- **One JSON envelope per turn** — never batch.
|
|
126
|
+
- **Re-issue from scratch on doubt** — the installer is stateless;
|
|
127
|
+
carrying all prior answers in `--answer` flags is the contract.
|
|
128
|
+
- **Do NOT commit `agent-config.lock.yml` blind** — review the
|
|
129
|
+
lockfile diff before committing per `commit-policy`.
|
|
@@ -31,7 +31,7 @@ install:
|
|
|
31
31
|
|
|
32
32
|
Drives a Markdown script through the full pipeline. Provider flags
|
|
33
33
|
override the `<default-image-provider>` / `<default-video-provider>`
|
|
34
|
-
from [`agents/.ai-video.xml`](../../../agents/.ai-video.xml.example);
|
|
34
|
+
from [`agents/.ai-video.xml`](../../../agents/templates/.ai-video.xml.example);
|
|
35
35
|
absent flags fall back to the XML defaults.
|
|
36
36
|
|
|
37
37
|
**Block-on-ambiguity:** a missing scene heading, an unparseable
|
|
@@ -27,7 +27,7 @@ install:
|
|
|
27
27
|
|
|
28
28
|
Top-level orchestrator for the `/video:*` family — multi-provider AI
|
|
29
29
|
video creation. Reads provider keys + defaults from
|
|
30
|
-
[`agents/.ai-video.xml`](../agents/.ai-video.xml.example) (gitignored
|
|
30
|
+
[`agents/.ai-video.xml`](../agents/templates/.ai-video.xml.example) (gitignored
|
|
31
31
|
real file; example shipped). Every subcommand is **dry-run by default**;
|
|
32
32
|
network calls require explicit per-turn confirmation per the adapter
|
|
33
33
|
contract under [`scripts/ai-video/lib/adapter-contract.md`](../scripts/ai-video/lib/adapter-contract.md).
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Cheap Question Mechanics
|
|
2
|
+
|
|
3
|
+
Catalog material for [`no-cheap-questions`](../../rules/no-cheap-questions.md) — Iron Laws 3, 4, 5, 6 and the cheap-class catalog. The rule states the laws; this context carries the prose.
|
|
4
|
+
|
|
5
|
+
## Cheap classes — full catalog
|
|
6
|
+
|
|
7
|
+
Sequencing · format-only · commit / CI / test asks · fenced re-ask · Iron-Law option · context-derived · dominant option · re-ask after decline · paternalistic (IL 3) · continuation under mandate (IL 4) · prereq-for-authorized-action (IL 5) · destination-already-stated (IL 6). Extended examples: [`asking-and-brevity-examples`](../../../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).
|
|
8
|
+
|
|
9
|
+
## Iron Law 3 — No Paternalistic State-Assuming Options
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
NEVER FABRICATE USER STATE TO JUSTIFY AN OPTION.
|
|
13
|
+
"TAKE A BREAK", "SLEEP ON IT", "COME BACK FRESH" — FORBIDDEN.
|
|
14
|
+
THE USER DECIDES WHEN TO STOP.
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Iron Law 4 — halt conditions under autonomous mandate
|
|
18
|
+
|
|
19
|
+
### Mandate triggers
|
|
20
|
+
|
|
21
|
+
A standing autonomous mandate is active when any of these fire:
|
|
22
|
+
|
|
23
|
+
- `/roadmap:process-full` invocation.
|
|
24
|
+
- `/roadmap:process-phase` invocation.
|
|
25
|
+
- Explicit "entscheide selbst / decide and don't ask" in the current or a recent un-revoked turn.
|
|
26
|
+
|
|
27
|
+
### Halt conditions
|
|
28
|
+
|
|
29
|
+
The only halts named in the invoking command:
|
|
30
|
+
|
|
31
|
+
- **Hard Floor trigger** — bulk deletion, infra change, prod-trunk merge.
|
|
32
|
+
- **Council-off + ambiguity** — host can't resolve without input.
|
|
33
|
+
- **Security-sensitive** — auth, secrets, tenancy, public endpoints (`security-sensitive-stop`).
|
|
34
|
+
- **Scope out of roadmap** — work crosses the roadmap's stated bounds.
|
|
35
|
+
- **Test / quality RED** — failure that cannot be auto-fixed.
|
|
36
|
+
|
|
37
|
+
A clean edit-batch is not a halt condition — pick the next item.
|
|
38
|
+
|
|
39
|
+
## Iron Law 5 — prereq examples (silent execution, never a question)
|
|
40
|
+
|
|
41
|
+
When the user authorizes a top-level action ("commit", "push", "open PR", "run tests", "deploy"), the following prereq work is execution, not a decision point — never raise a numbered-options block about it:
|
|
42
|
+
|
|
43
|
+
- compression / hash-sync before commit
|
|
44
|
+
- code formatting / linter auto-fix before commit
|
|
45
|
+
- type-check / quality-tool repairs to clear CI gates
|
|
46
|
+
- test repair when the user said "commit and the tests pass"
|
|
47
|
+
- symlink / index regeneration after edits
|
|
48
|
+
- manifest / discovery refresh
|
|
49
|
+
- branch-base inventory when user named the destination
|
|
50
|
+
- pre-push hook fix when it blocks an authorized push and the fix is obvious (gate-script update, stale pattern removal)
|
|
51
|
+
|
|
52
|
+
### Halt conditions during prereq execution
|
|
53
|
+
|
|
54
|
+
Stop and surface only on:
|
|
55
|
+
|
|
56
|
+
- **Hard Floor trigger** — bulk deletion, infra change, prod-trunk merge.
|
|
57
|
+
- **Test / quality RED** that cannot be auto-fixed → surface + ask.
|
|
58
|
+
- **Genuine ambiguity in WHAT to do** (not HOW to do it).
|
|
59
|
+
|
|
60
|
+
Everything else stays silent execution.
|
|
61
|
+
|
|
62
|
+
## Iron Law 6 — destination triggers (never re-ask)
|
|
63
|
+
|
|
64
|
+
The user has already named the destination — branch-base inventory does not fire:
|
|
65
|
+
|
|
66
|
+
- "commit in this PR" / "commit auf diesem branch"
|
|
67
|
+
- "commit in PR #218" / explicit PR number
|
|
68
|
+
- "push to `<branch>`"
|
|
69
|
+
- **Implicit**: user is currently ON the branch and says "commit" without a qualifier → the current branch IS the destination.
|
|
70
|
+
|
|
71
|
+
No "which branch?", no "should I open a new PR?", no branch-base inventory. `scope-control`'s branch inventory applies only when the destination is **unstated**.
|
|
72
|
+
|
|
73
|
+
## When asking IS allowed
|
|
74
|
+
|
|
75
|
+
Real architectural / scope trade-off · vague-request trigger ([`ask-when-uncertain`](../../rules/ask-when-uncertain.md)) · security-sensitive ([`security-sensitive-stop`](../../rules/security-sensitive-stop.md)) · Hard Floor ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)) · two genuinely-equivalent paths where user preference is the tiebreaker.
|
|
76
|
+
|
|
77
|
+
## See also
|
|
78
|
+
|
|
79
|
+
- [`no-cheap-questions`](../../rules/no-cheap-questions.md) — the rule.
|
|
80
|
+
- [`commit-policy`](../../rules/commit-policy.md) — when commit IS authorized.
|
|
81
|
+
- [`scope-control § git-ops`](../../rules/scope-control.md) — branch / PR permission gate (fires only when destination unstated).
|
|
@@ -33,7 +33,7 @@ Read `caveman.speak_scope` from `.agent-settings.yml`:
|
|
|
33
33
|
- `aggressive` — caveman everywhere except Iron-Law literals.
|
|
34
34
|
|
|
35
35
|
Compile-time toggle `caveman.speak`: `false` → rule omitted from
|
|
36
|
-
`router.json` (zero runtime cost). `caveman.enabled: false` forces all
|
|
36
|
+
`dist/router.json` (zero runtime cost). `caveman.enabled: false` forces all
|
|
37
37
|
sub-switches off regardless.
|
|
38
38
|
|
|
39
39
|
## Carve-outs — byte-for-byte preserved
|
|
@@ -86,7 +86,7 @@ Example: *"I will now check the file and see if it exists"* →
|
|
|
86
86
|
| Key | Default | Effect |
|
|
87
87
|
|---|---|---|
|
|
88
88
|
| `caveman.enabled` | `true` | Master — `false` forces all sub-switches off. |
|
|
89
|
-
| `caveman.speak` | `true` | Compile-time include in `router.json`. |
|
|
89
|
+
| `caveman.speak` | `true` | Compile-time include in `dist/router.json`. |
|
|
90
90
|
| `caveman.speak_scope` | `prose_only` | Runtime scope of caveman grammar. |
|
|
91
91
|
|
|
92
92
|
Cross-rule index: [`frugality-charter § cross-references`](../contexts/contracts/frugality-charter.md#cross-references--frugality-canon-rules).
|
|
@@ -90,6 +90,42 @@ Calling the **same tool** more than **2 times in a row** with similar parameters
|
|
|
90
90
|
`sequentialthinking` is especially prone to loops. Use at most **once** per task,
|
|
91
91
|
NEVER for simple file operations, command execution, or straightforward edits.
|
|
92
92
|
|
|
93
|
+
## Read-Loop Detection — the 15 / 25 rule
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
READING WITHOUT ACTING IS A LOOP.
|
|
97
|
+
EVERY TURN MUST EDIT, RUN, OR ASK.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Read-only turn:** only `view` / `codebase-retrieval` / `grep` /
|
|
101
|
+
`git log` / `git show`. No `str-replace-editor`, `save-file`, no
|
|
102
|
+
test/build/quality run, no `git commit`.
|
|
103
|
+
|
|
104
|
+
**15-min warning (3 read-only turns in a row) — change approach.**
|
|
105
|
+
Next turn MUST contain at least one of: an edit, a test/build/quality
|
|
106
|
+
command, or an explicit user question. Self-check:
|
|
107
|
+
|
|
108
|
+
1. Source expectation known? If no → read **once**, then act.
|
|
109
|
+
2. Can a single failing test name the error? If yes → run it now.
|
|
110
|
+
3. Regression in working code? → `git log` + `git show <sha> -- <file>`.
|
|
111
|
+
4. Guessing at mock / payload shape? → read the producer **once**.
|
|
112
|
+
|
|
113
|
+
**25-min abort (5 read-only turns) — STOP and ask:**
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
> ⛔ Loop: N read-only turns, ~M min. Read: <files>. Hypothesis: <X>.
|
|
117
|
+
> 1. Different approach (suggestion: <Y>)
|
|
118
|
+
> 2. Point me at the right spot
|
|
119
|
+
> 3. Fresh chat with state dump
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Non-bypassable. Autonomous mandate (`/work`, `/roadmap:process-*`,
|
|
123
|
+
"entscheide selbst") does **not** lift the abort — it is the safety
|
|
124
|
+
net that protects autonomy from becoming a token sink.
|
|
125
|
+
|
|
126
|
+
Debug procedure for "I'm in a read loop fixing tests" →
|
|
127
|
+
[`systematic-debugging § Debug micro-loop`](../skills/systematic-debugging/SKILL.md#debug-micro-loop--one-test-one-fix-one-re-run).
|
|
128
|
+
|
|
93
129
|
## State dump format
|
|
94
130
|
|
|
95
131
|
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "Engineering output touching production, infra, security, data, or external systems — surface blast radius, name rollback path, never autonomous on Hard-Floor triggers"
|
|
5
|
+
source: package
|
|
6
|
+
triggers:
|
|
7
|
+
- keyword: "production"
|
|
8
|
+
- keyword: "deploy"
|
|
9
|
+
- keyword: "migration"
|
|
10
|
+
- keyword: "schema change"
|
|
11
|
+
- keyword: "DROP TABLE"
|
|
12
|
+
- keyword: "TRUNCATE"
|
|
13
|
+
- keyword: "force push"
|
|
14
|
+
- keyword: "rebase main"
|
|
15
|
+
- keyword: "rollback"
|
|
16
|
+
- keyword: "secrets rotation"
|
|
17
|
+
- keyword: "IAM"
|
|
18
|
+
- keyword: "DNS"
|
|
19
|
+
- keyword: "terraform apply"
|
|
20
|
+
- keyword: "kubectl apply"
|
|
21
|
+
- phrase: "ship to prod"
|
|
22
|
+
- phrase: "deploy to production"
|
|
23
|
+
- phrase: "merge to main"
|
|
24
|
+
- phrase: "release this"
|
|
25
|
+
routes_to:
|
|
26
|
+
- "skill:launch-readiness"
|
|
27
|
+
- "skill:threat-modeling"
|
|
28
|
+
workspaces:
|
|
29
|
+
- engineering
|
|
30
|
+
packs:
|
|
31
|
+
- engineering-base
|
|
32
|
+
lifecycle: active
|
|
33
|
+
trust:
|
|
34
|
+
level: core
|
|
35
|
+
confidence: high
|
|
36
|
+
human_review_required: false
|
|
37
|
+
install:
|
|
38
|
+
default: true
|
|
39
|
+
removable: false
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# Engineering Safety Floor
|
|
43
|
+
|
|
44
|
+
Domain safety floor for engineering output that crosses into production, infrastructure, security, or external systems. Restates the Hard-Floor obligations from `non-destructive-by-default` and adds engineering-specific surfacing requirements. Auto-active everywhere (lives in `core`).
|
|
45
|
+
|
|
46
|
+
## Iron Law — production, infra, and bulk-destructive moves are never autonomous
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
HARD FLOOR OVERRIDES EVERYTHING.
|
|
50
|
+
DEPLOY, MERGE-TO-PROD-TRUNK, PROD DATA / INFRA, BULK DESTRUCTIVE —
|
|
51
|
+
EXPLICIT USER CONFIRMATION ON THIS TURN. NO STANDING AUTONOMY APPLIES.
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This rule does not lift the Hard Floor — it surfaces the **engineering-shaped** evidence the user needs to evaluate the call.
|
|
55
|
+
|
|
56
|
+
## Required structural elements for production-bound changes
|
|
57
|
+
|
|
58
|
+
Before any deploy, prod-trunk merge, schema migration, or infra change, the agent surfaces:
|
|
59
|
+
|
|
60
|
+
1. **Blast radius** — what breaks if this goes wrong (services, tenants, users, data).
|
|
61
|
+
2. **Rollback path** — exact command / PR / step to revert; estimated time to rollback.
|
|
62
|
+
3. **Pre-flight checks** — tests run, quality gates passed, dry-run output (where applicable).
|
|
63
|
+
4. **Observability** — what signal will detect a regression, and where to look for it.
|
|
64
|
+
5. **Named risk owner** — who is on call, who approves the change.
|
|
65
|
+
|
|
66
|
+
Missing any of the five → the change is not ready to ship.
|
|
67
|
+
|
|
68
|
+
## Human review escalation
|
|
69
|
+
|
|
70
|
+
| Trigger | Action |
|
|
71
|
+
|---|---|
|
|
72
|
+
| Schema migration that drops or renames a column | Surface `HUMAN REVIEW REQUIRED`; require explicit user confirmation; route to `migration-architect`. |
|
|
73
|
+
| IAM / policy / secrets rotation | Surface blast radius across all consumers before applying. |
|
|
74
|
+
| Force-push to a shared branch | Refuse without explicit, this-turn permission per `git-history-discipline`. |
|
|
75
|
+
| Bulk delete (≥ 5 unrelated files or whole directories) | Hard Floor — show diff, name the scope, ask. |
|
|
76
|
+
| External-system change (DNS, webhook, OAuth app, payment provider) | Threat-model first per `security-sensitive-stop`. |
|
|
77
|
+
|
|
78
|
+
## Forbidden moves
|
|
79
|
+
|
|
80
|
+
- Deploy or merge to a production trunk without explicit this-turn permission
|
|
81
|
+
- Schema migration without a stated rollback path
|
|
82
|
+
- `--force` / `--no-verify` / `git reset --hard <pushed>` without explicit, named authorization
|
|
83
|
+
- Disabling tests / quality gates to ship faster
|
|
84
|
+
- Touching `auth`, `billing`, `tenants`, `secrets`, `uploads`, `webhooks` without threat-modeling first (per `security-sensitive-stop`)
|
|
85
|
+
- Claiming a change is "done" / "shipped" without fresh verification evidence (per `verify-before-complete`)
|
|
86
|
+
|
|
87
|
+
## When this rule applies
|
|
88
|
+
|
|
89
|
+
Active whenever any of these are in the request, the open file, or the loaded skill set:
|
|
90
|
+
- A production-touching skill or command (`launch-readiness`, `threat-modeling`, `incident-commander`, `aws-infrastructure`, `terraform`, `terragrunt`, `github-ci`)
|
|
91
|
+
- Keywords: production, deploy, migration, schema change, DROP TABLE, TRUNCATE, force push, rebase main, rollback, secrets rotation, IAM, DNS, terraform apply, kubectl apply
|
|
92
|
+
- Phrases: "ship to prod", "deploy to production", "merge to main", "release this"
|
|
93
|
+
|
|
94
|
+
## See also
|
|
95
|
+
|
|
96
|
+
- [`non-destructive-by-default`](non-destructive-by-default.md) — canonical Hard Floor
|
|
97
|
+
- [`scope-control`](scope-control.md) — git-ops permission gate
|
|
98
|
+
- [`security-sensitive-stop`](security-sensitive-stop.md) — threat-model before editing
|
|
99
|
+
- [`verify-before-complete`](verify-before-complete.md) — fresh evidence before completion claims
|
|
100
|
+
- [`commit-policy`](commit-policy.md) — when commits are allowed
|
|
101
|
+
- [`launch-readiness`](../skills/launch-readiness/SKILL.md) — pre-merge checklist
|
|
102
|
+
- [`threat-modeling`](../skills/threat-modeling/SKILL.md) — pre-implementation abuse-case enumeration
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "Finance-pack output (runway, valuation, DCF, scenario, unit economics, forecasting) — never issue final invest/raise call; mandatory disclosure footer; sensitivity + counter-case required"
|
|
5
|
+
source: package
|
|
6
|
+
triggers:
|
|
7
|
+
- keyword: "runway"
|
|
8
|
+
- keyword: "burn"
|
|
9
|
+
- keyword: "valuation"
|
|
10
|
+
- keyword: "DCF"
|
|
11
|
+
- keyword: "IRR"
|
|
12
|
+
- keyword: "MOIC"
|
|
13
|
+
- keyword: "LTV"
|
|
14
|
+
- keyword: "CAC"
|
|
15
|
+
- keyword: "payback"
|
|
16
|
+
- keyword: "sensitivity"
|
|
17
|
+
- keyword: "fundraise"
|
|
18
|
+
- keyword: "term sheet"
|
|
19
|
+
- keyword: "dilution"
|
|
20
|
+
- keyword: "NRR"
|
|
21
|
+
- keyword: "EBITDA"
|
|
22
|
+
- keyword: "free cash flow"
|
|
23
|
+
- phrase: "what's it worth"
|
|
24
|
+
- phrase: "how long do we have"
|
|
25
|
+
- phrase: "should we raise"
|
|
26
|
+
- phrase: "model the scenarios"
|
|
27
|
+
routes_to:
|
|
28
|
+
- "skill:runway-cognition"
|
|
29
|
+
- "skill:dcf-modeling"
|
|
30
|
+
- "skill:scenario-modeling"
|
|
31
|
+
- "skill:unit-economics-modeling"
|
|
32
|
+
- "skill:forecasting"
|
|
33
|
+
workspaces:
|
|
34
|
+
- finance
|
|
35
|
+
packs:
|
|
36
|
+
- finance-basic
|
|
37
|
+
- finance-advanced
|
|
38
|
+
lifecycle: active
|
|
39
|
+
trust:
|
|
40
|
+
level: advisory
|
|
41
|
+
confidence: high
|
|
42
|
+
human_review_required: true
|
|
43
|
+
install:
|
|
44
|
+
default: true
|
|
45
|
+
removable: false
|
|
46
|
+
---
|
|
47
|
+
<!-- agent-config:human-review-banner -->
|
|
48
|
+
> HUMAN REVIEW REQUIRED · trust: advisory · owner: finance
|
|
49
|
+
|
|
50
|
+
# Finance Safety Floor
|
|
51
|
+
|
|
52
|
+
Domain safety floor for finance-pack artefacts (cash, runway, valuation, scenario, unit economics, forecasting). Auto-activates when `pack-finance-basic` or `pack-finance-advanced` is installed.
|
|
53
|
+
|
|
54
|
+
## Iron Law — no final investment recommendation
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
THE AGENT NEVER ISSUES A FINAL "INVEST" / "DON'T INVEST" / "RAISE" / "DON'T RAISE" CALL.
|
|
58
|
+
SURFACE THE TRADE-OFF. NAME THE RISK. THE HUMAN DECIDES.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Holds for every finance-pack skill (`runway-cognition`, `dcf-modeling`, `scenario-modeling`, `unit-economics-modeling`, `forecasting`, `fundraising-narrative`, `forecast-accuracy`). Finance output is decision support, never the decision.
|
|
62
|
+
|
|
63
|
+
## Mandatory disclosure footer
|
|
64
|
+
|
|
65
|
+
Every finance-pack deliverable (memo, valuation, forecast, runway analysis) ends with:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
> **Not investment / tax / legal advice.** Figures are model output, not
|
|
69
|
+
> assured. Sensitivity assumptions are stated above. Human review
|
|
70
|
+
> required before any commit / raise / spend decision.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The footer is non-optional. Drop it → safety violation.
|
|
74
|
+
|
|
75
|
+
## Required structural elements
|
|
76
|
+
|
|
77
|
+
Each finance deliverable surfaces, in this order:
|
|
78
|
+
|
|
79
|
+
1. **Assumptions block** — every input value the model uses, sourced or marked `assumption`.
|
|
80
|
+
2. **Sensitivity** — at least one variable swept (±20% or ±1 σ); single-point estimates without sensitivity are forbidden for valuation and runway.
|
|
81
|
+
3. **Confidence band** — `high` / `medium` / `low` per the surrounding council / skill conventions, with the reason for the band (data quality, model fit, time horizon).
|
|
82
|
+
4. **Counter-case** — one sentence on what would invalidate the conclusion ("if growth halves, runway compresses to 7 months").
|
|
83
|
+
|
|
84
|
+
## Human review escalation
|
|
85
|
+
|
|
86
|
+
| Trigger | Action |
|
|
87
|
+
|---|---|
|
|
88
|
+
| Board-pack-bound figure | Surface `HUMAN REVIEW REQUIRED` banner; do not commit without explicit user confirmation. |
|
|
89
|
+
| External (investor, lender, auditor) consumption | Refuse to finalize; output `DRAFT` watermark. |
|
|
90
|
+
| ≥ €100k single-decision exposure | Mandatory sensitivity + counter-case + named risk owner. |
|
|
91
|
+
| Tax position or accounting treatment | Refuse; route to `domain-safety-disclaimer` and explicitly defer to a CPA / Steuerberater. |
|
|
92
|
+
|
|
93
|
+
## Forbidden moves
|
|
94
|
+
|
|
95
|
+
- "Based on this model, you should …" without surfacing the assumption set
|
|
96
|
+
- DCF or valuation output without a discount-rate sensitivity sweep
|
|
97
|
+
- Runway figure as a single number (must be a shape: optimistic / base / downside)
|
|
98
|
+
- Forecast accuracy claim without retro-loop reference
|
|
99
|
+
- Comparing two companies / deals without naming the comparability gap
|
|
100
|
+
- Suggesting capital actions (raise, cut, layoff) without naming the human-decision owner
|
|
101
|
+
|
|
102
|
+
## When this rule applies
|
|
103
|
+
|
|
104
|
+
Active whenever any of these are in the request, the open file, or the loaded skill set:
|
|
105
|
+
- A finance-pack skill name (`runway-cognition`, `dcf-modeling`, `scenario-modeling`, `unit-economics-modeling`, `forecasting`, `fundraising-narrative`, `forecast-accuracy`)
|
|
106
|
+
- Keywords: cash, runway, burn, valuation, DCF, IRR, MOIC, LTV, CAC, payback, scenario, sensitivity, fundraise, raise, term sheet, dilution, ARR, MRR, NRR, churn rate, gross margin, contribution margin, EBITDA, free cash flow
|
|
107
|
+
- Phrases: "what's it worth", "how long do we have", "should we raise", "model the scenarios", "what's our LTV"
|
|
108
|
+
|
|
109
|
+
## See also
|
|
110
|
+
|
|
111
|
+
- `domain-safety-disclaimer` — generic advisory-content floor (core pack)
|
|
112
|
+
- [`runway-cognition`](../skills/runway-cognition/SKILL.md) — operational depth on runway shape
|
|
113
|
+
- `dcf-modeling` — valuation depth (pack-finance-advanced)
|
|
114
|
+
- `scenario-modeling` — base / upside / downside construction (pack-finance-advanced)
|
|
@@ -91,7 +91,7 @@ If either stop fires and resolution is not immediate → tag the state (`git tag
|
|
|
91
91
|
|
|
92
92
|
## Why this rule exists
|
|
93
93
|
|
|
94
|
-
Interactive rebase + fixup loops generate disproportionate token cost on every iteration: re-running CI per replayed commit, resolving the same content conflict in three derived files (`.compression-hashes.json`, `router.json`, `.windsurfrules`), losing the working tree to a stash that silently re-introduces older state. A single conflict can burn the budget of an entire feature.
|
|
94
|
+
Interactive rebase + fixup loops generate disproportionate token cost on every iteration: re-running CI per replayed commit, resolving the same content conflict in three derived files (`.compression-hashes.json`, `dist/router.json`, `.windsurfrules`), losing the working tree to a stash that silently re-introduces older state. A single conflict can burn the budget of an entire feature.
|
|
95
95
|
|
|
96
96
|
A previous session squashed a pushed branch, the push hook failed at the token boundary, the session ended — and the next session saw local and origin pointing at different SHAs for the same logical work. A blind `git pull --rebase` cascaded into conflicts across every derived file. Recovery required forensic SHA-archaeology. The pre/post-rewrite stops make that sequence structurally impossible.
|
|
97
97
|
|
|
@@ -20,60 +20,62 @@ install:
|
|
|
20
20
|
|
|
21
21
|
# No Cheap Questions
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Cheap = context answers it, option breaches an Iron Law, choices differ only in sequencing / format, or one option dominates. Mode-independent; autonomy never lifts the floor.
|
|
24
24
|
|
|
25
25
|
## The Iron Laws
|
|
26
26
|
|
|
27
27
|
```
|
|
28
|
-
NEVER ASK WHAT
|
|
29
|
-
NEVER
|
|
30
|
-
NEVER
|
|
28
|
+
NEVER ASK WHAT CONTEXT ANSWERS.
|
|
29
|
+
NEVER OFFER AN IRON-LAW-VIOLATING OPTION.
|
|
30
|
+
NEVER NUMBER CHOICES WITHOUT A REAL TRADE-OFF.
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Sequencing · format-only · commit asks · CI / test asks · fenced re-ask · Iron-Law option · context-derived · dominant option · re-ask after decline · paternalistic (Iron Law 3) · continuation under mandate (Iron Law 4). Catalog: [`asking-and-brevity-examples`](../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).
|
|
33
|
+
Cheap-class catalog + IL 3 (no paternalistic state-assuming options): [`cheap-question-mechanics § cheap classes`](../contexts/execution/cheap-question-mechanics.md#cheap-classes--full-catalog).
|
|
36
34
|
|
|
37
35
|
## Iron Law 4 — No Continuation Prompts Under Autonomous Mandate
|
|
38
36
|
|
|
39
37
|
```
|
|
40
|
-
|
|
41
|
-
/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
STANDING AUTONOMOUS MANDATE ACTIVE → NEVER ASK
|
|
39
|
+
"WEITER? / NEXT STEP? / SHALL I CONTINUE?".
|
|
40
|
+
A CLEAN EDIT-BATCH IS NOT A HALT CONDITION.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Mandate triggers + halt list: [`cheap-question-mechanics § Iron Law 4`](../contexts/execution/cheap-question-mechanics.md#iron-law-4--halt-conditions-under-autonomous-mandate).
|
|
44
|
+
|
|
45
|
+
## Iron Law 5 — Prereq Work Is Execution, Not a Question
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
USER AUTHORIZES X ("COMMIT" / "PUSH" / "OPEN PR" / "DEPLOY")
|
|
49
|
+
→ ALL PREREQ WORK IS EXECUTION. NEVER ASK, NEVER OFFER
|
|
50
|
+
"DO THE PREREQ" vs "SKIP AND BREAK THE GATE".
|
|
46
51
|
```
|
|
47
52
|
|
|
48
|
-
|
|
53
|
+
Prereq catalog + halt conditions: [`cheap-question-mechanics § Iron Law 5`](../contexts/execution/cheap-question-mechanics.md#iron-law-5--prereq-examples-silent-execution-never-a-question).
|
|
54
|
+
|
|
55
|
+
## Iron Law 6 — Destination Already Stated, Never Re-Ask
|
|
49
56
|
|
|
50
57
|
```
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
THE USER DECIDES WHEN TO STOP. THE AGENT DECIDES WHAT TO BUILD NEXT.
|
|
58
|
+
USER NAMED THE DESTINATION → DO NOT RE-ASK.
|
|
59
|
+
NO BRANCH-BASE INVENTORY, NO "WHICH BRANCH?", NO "NEW PR?".
|
|
54
60
|
```
|
|
55
61
|
|
|
62
|
+
Triggers + scope-control interaction: [`cheap-question-mechanics § Iron Law 6`](../contexts/execution/cheap-question-mechanics.md#iron-law-6--destination-triggers-never-re-ask).
|
|
63
|
+
|
|
56
64
|
## Pre-Send Self-Check — MANDATORY before every question
|
|
57
65
|
|
|
58
|
-
Silent, before any numbered-options block:
|
|
66
|
+
Silent, before any numbered-options block. Any "yes" → don't ask:
|
|
59
67
|
|
|
60
|
-
1. Answer
|
|
61
|
-
2. Option violates `commit-policy
|
|
68
|
+
1. Answer in stated context?
|
|
69
|
+
2. Option violates `commit-policy` / `scope-control § git-ops` / `non-destructive-by-default`?
|
|
62
70
|
3. Pure sequencing / format, no trade-off?
|
|
63
71
|
4. One option obviously dominant?
|
|
64
72
|
5. User fenced step (*"plan only"*, *"review first"*) → deliver + handback.
|
|
65
73
|
6. User already declined? Re-ask forbidden.
|
|
66
|
-
7.
|
|
67
|
-
8.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
## When asking IS allowed
|
|
74
|
+
7. Assumes user fatigue / frustration without citation? IL 3.
|
|
75
|
+
8. Mandate active + "weiter? / continue?" — IL 4, pick next item.
|
|
76
|
+
9. Prereq for user-authorized action? IL 5, execute silently.
|
|
77
|
+
10. Destination (branch / PR) already named? IL 6, never re-ask.
|
|
72
78
|
|
|
73
|
-
|
|
74
|
-
- Vague-request trigger ([`ask-when-uncertain`](ask-when-uncertain.md)).
|
|
75
|
-
- Security-sensitive ([`security-sensitive-stop`](security-sensitive-stop.md)).
|
|
76
|
-
- Hard Floor ([`non-destructive-by-default`](non-destructive-by-default.md)).
|
|
77
|
-
- Two genuinely-equivalent paths; user preference is the tiebreaker.
|
|
79
|
+
Pick dominant path, state inline assumption, hand back. Genuine ambiguity → [`ask-when-uncertain`](ask-when-uncertain.md).
|
|
78
80
|
|
|
79
|
-
In doubt → ask. This rule narrows asking, never widens silence.
|
|
81
|
+
In doubt → ask. This rule narrows asking, never widens silence. When asking IS allowed: [`cheap-question-mechanics § when-asking-is-allowed`](../contexts/execution/cheap-question-mechanics.md#when-asking-is-allowed).
|
|
@@ -45,12 +45,12 @@ NEVER DEFAULT TO A NON-STABLE PROVIDER SILENTLY.
|
|
|
45
45
|
SURFACE THE LIFECYCLE TIER. ASK BEFORE RUNNING.
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/contracts/provider-lifecycle.md) whenever a `/video:* / /image:* / /audio:*` surface fires, an adapter under `scripts/ai-video/adapters/` is read or edited, or `agents/.ai-video.xml.example` (or the operator's `agents/.ai-video.xml`) is in play. The contract defines four tiers — `experimental | stable | deprecated | community` — and the agent's obligations per tier.
|
|
48
|
+
This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/contracts/provider-lifecycle.md) whenever a `/video:* / /image:* / /audio:*` surface fires, an adapter under `scripts/ai-video/adapters/` is read or edited, or `agents/templates/.ai-video.xml.example` (or the operator's `agents/.ai-video.xml`) is in play. The contract defines four tiers — `experimental | stable | deprecated | community` — and the agent's obligations per tier.
|
|
49
49
|
|
|
50
50
|
## What this rule enforces
|
|
51
51
|
|
|
52
52
|
1. **Read the tier before picking.** When the agent resolves a provider (from `--provider <id>`, from `<default-video-provider>` / `<default-image-provider>`, or from a skill's default), it MUST read both:
|
|
53
|
-
- the `<lifecycle>` element under `<provider id="…">` in `agents/.ai-video.xml.example` (or the operator's `.ai-video.xml`), and
|
|
53
|
+
- the `<lifecycle>` element under `<provider id="…">` in `agents/templates/.ai-video.xml.example` (or the operator's `.ai-video.xml`), and
|
|
54
54
|
- the `Lifecycle:` header comment in `scripts/ai-video/adapters/<id>.sh`.
|
|
55
55
|
Mismatch between the two is a contract violation and MUST be surfaced before running.
|
|
56
56
|
|
|
@@ -66,7 +66,7 @@ This rule routes the agent to [`docs/contracts/provider-lifecycle.md`](../docs/c
|
|
|
66
66
|
|
|
67
67
|
- Running `/video:scene` against the `<default-video-provider>` without reading the lifecycle tag first → violation.
|
|
68
68
|
- Picking a `community` provider because it was named in the prompt, without surfacing the tier → violation.
|
|
69
|
-
- Editing an adapter and leaving its header `Lifecycle:` comment out of sync with `agents/.ai-video.xml.example` → violation (CI does not catch this; the agent must).
|
|
69
|
+
- Editing an adapter and leaving its header `Lifecycle:` comment out of sync with `agents/templates/.ai-video.xml.example` → violation (CI does not catch this; the agent must).
|
|
70
70
|
- Auto-promoting an adapter from `experimental` to `stable` because "dry-run worked" → violation. Promotion requires a maintainer-captured real-API smoke trace under `agents/reference/ai-video/smoke-traces/`.
|
|
71
71
|
|
|
72
72
|
## Day-one state
|
|
@@ -77,7 +77,7 @@ All five shipped adapters (`openai-images`, `gemini-veo`, `kling`, `higgsfield`,
|
|
|
77
77
|
|
|
78
78
|
A Python pre-run gate enumerating tier-by-command rules would either be too coarse (`experimental → block`, breaking day-to-day dev iteration) or too detailed (per-command tier matrix, drifting from reality on every new provider). The agent reading the tag at run time, surfacing the tier, and asking is the correct enforcement surface: the model that picked the provider is the model that surfaces the obligation, and the human is the policy decision point.
|
|
79
79
|
|
|
80
|
-
The CI guarantee is structural reachability — the linter would fail if a provider was declared in `agents/.ai-video.xml.example` without a lifecycle tag (extension planned). It does not enforce the runtime obligation; the agent does.
|
|
80
|
+
The CI guarantee is structural reachability — the linter would fail if a provider was declared in `agents/templates/.ai-video.xml.example` without a lifecycle tag (extension planned). It does not enforce the runtime obligation; the agent does.
|
|
81
81
|
|
|
82
82
|
## See also
|
|
83
83
|
|