nobrainer-tech-flow 0.0.0-stage → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +18 -0
- package/.claude-plugin/plugin.json +21 -0
- package/.codex-plugin/plugin.json +47 -0
- package/.opencode/INSTALL.md +37 -0
- package/.opencode/plugins/nobrainer-tech-skills.js +66 -0
- package/.pi/extensions/nobrainer-tech-skills.js +64 -0
- package/AGENTS.md +204 -0
- package/CLAUDE.md +204 -0
- package/CONTRIBUTING.md +70 -0
- package/GEMINI.md +1 -0
- package/LICENSE +21 -0
- package/README.md +658 -2
- package/SECURITY.md +33 -0
- package/adapters/bootstrap.md +27 -0
- package/assets/nobrainer-tech-logo.svg +1 -0
- package/assets/nobrainer-workflow.svg +155 -0
- package/assets/plugin-logo.png +0 -0
- package/bin/nobrainer-tech-flow.mjs +48 -0
- package/docs/BOUNDED_RUNNER.md +60 -0
- package/docs/CHAT_PLUGINS.md +29 -0
- package/docs/COMPATIBILITY.md +371 -0
- package/docs/INSTALL.md +626 -0
- package/docs/MIGRATION_TO_FLOW.md +117 -0
- package/docs/NAMING.md +39 -0
- package/docs/PRIVACY.md +9 -0
- package/docs/SESSION_RESTART.md +70 -0
- package/docs/SKILL_CURATION.md +124 -0
- package/docs/TESTING.md +232 -0
- package/docs/TRY_IT.md +109 -0
- package/docs/releases/v1.0.0.md +81 -0
- package/docs/releases/v1.1.0.md +85 -0
- package/docs/releases/v1.10.0.md +34 -0
- package/docs/releases/v1.11.0-publication-readback.md +25 -0
- package/docs/releases/v1.11.0.md +42 -0
- package/docs/releases/v1.12.0.md +30 -0
- package/docs/releases/v1.13.0.md +46 -0
- package/docs/releases/v1.14.0.md +43 -0
- package/docs/releases/v1.14.1.md +21 -0
- package/docs/releases/v1.2.0.md +87 -0
- package/docs/releases/v1.2.1.md +92 -0
- package/docs/releases/v1.3.0-publication-readback.md +69 -0
- package/docs/releases/v1.3.0.md +66 -0
- package/docs/releases/v1.3.1-publication-readback.md +76 -0
- package/docs/releases/v1.3.1.md +59 -0
- package/docs/releases/v1.4.0-publication-readback.md +81 -0
- package/docs/releases/v1.4.0.md +43 -0
- package/docs/releases/v1.5.0-publication-readback.md +76 -0
- package/docs/releases/v1.5.0.md +54 -0
- package/docs/releases/v1.6.0.md +64 -0
- package/docs/releases/v1.6.1-publication-readback.md +53 -0
- package/docs/releases/v1.6.1.md +82 -0
- package/docs/releases/v1.7.0.md +42 -0
- package/docs/releases/v1.7.1-publication-readback.md +64 -0
- package/docs/releases/v1.7.1.md +49 -0
- package/docs/releases/v1.8.0.md +63 -0
- package/docs/releases/v1.8.1.md +32 -0
- package/docs/releases/v1.9.0.md +33 -0
- package/docs/releases/v2.0.0-candidate.md +28 -0
- package/docs/releases/v2.0.0.md +53 -0
- package/docs/releases/v2.0.1.md +135 -0
- package/docs/releases/v2.0.2.md +189 -0
- package/docs/releases/v2.1.0.md +64 -0
- package/docs/releases/v2.1.1.md +43 -0
- package/docs/releases/v2.2.0.md +64 -0
- package/docs/releases/v2.2.1.md +11 -0
- package/docs/releases/v2.3.0.md +97 -0
- package/docs/releases/v2.3.1.md +71 -0
- package/docs/releases/v2.3.2.md +242 -0
- package/docs/releases/v2.4.0.md +126 -0
- package/gemini-extension.json +6 -0
- package/hooks/claude-hooks.json +17 -0
- package/hooks/hooks-cursor.json +10 -0
- package/hooks/run-hook.cmd +36 -0
- package/hooks/session-start +38 -0
- package/package.json +69 -4
- package/plugin.json +51 -0
- package/scripts/build_plugin.py +50 -0
- package/scripts/check_flow_update.py +18 -0
- package/scripts/check_public_commit.py +86 -0
- package/scripts/fetch_public_refs.py +69 -0
- package/scripts/install.py +600 -0
- package/scripts/install.sh +1392 -0
- package/scripts/install_guards.py +279 -0
- package/scripts/install_personalization.py +527 -0
- package/scripts/install_skills.py +951 -0
- package/scripts/npm_install.py +85 -0
- package/scripts/recommend_flow_setup.py +1522 -0
- package/scripts/validate_skills.py +465 -0
- package/skills/nobrainer-auto-fine-tune/SKILL.md +79 -0
- package/skills/nobrainer-auto-fine-tune/references/capacity-audit.md +49 -0
- package/skills/nobrainer-autoimprove/SKILL.md +212 -0
- package/skills/nobrainer-autoimprove/scripts/count_words.py +22 -0
- package/skills/nobrainer-browser/SKILL.md +234 -0
- package/skills/nobrainer-browser/references/cdp-profile-restart.md +93 -0
- package/skills/nobrainer-build/SKILL.md +173 -0
- package/skills/nobrainer-codex-context/SKILL.md +111 -0
- package/skills/nobrainer-codex-context/scripts/codex_context.py +175 -0
- package/skills/nobrainer-decide/SKILL.md +198 -0
- package/skills/nobrainer-dispatcher/SKILL.md +256 -0
- package/skills/nobrainer-dispatcher/agents/openai.yaml +4 -0
- package/skills/nobrainer-rca/SKILL.md +163 -0
- package/skills/nobrainer-research/SKILL.md +131 -0
- package/skills/nobrainer-review/SKILL.md +195 -0
- package/skills/nobrainer-security/SKILL.md +166 -0
- package/skills/nobrainer-sessions/SKILL.md +223 -0
- package/skills/nobrainer-sessions/references/evidence-receipt.md +55 -0
- package/skills/nobrainer-sessions/references/protocol.md +337 -0
- package/skills/nobrainer-sessions/references/session-restart.md +255 -0
- package/skills/nobrainer-sessions/scripts/evidence_receipt.py +373 -0
- package/skills/nobrainer-sessions/scripts/restart_gate.py +140 -0
- package/skills/nobrainer-sessions/scripts/run_bounded.py +390 -0
- package/skills/nobrainer-sessions/scripts/session_title.py +43 -0
- package/skills/nobrainer-skill-doctor/SKILL.md +149 -0
- package/skills/nobrainer-skill-doctor/references/astra.md +19 -0
- package/skills/nobrainer-skill-doctor/scripts/audit.py +100 -0
- package/skills/nobrainer-skill-doctor/scripts/context_candidates.py +133 -0
- package/skills/nobrainer-spec-driven-development/SKILL.md +132 -0
- package/skills/nobrainer-spec-driven-development/references/spec-template.md +114 -0
- package/skills/nobrainer-team/SKILL.md +165 -0
- package/skills/nobrainer-team/references/team-plan.md +64 -0
- package/skills/nobrainer-tech-flow/SKILL.md +239 -0
- package/skills/nobrainer-tech-flow/VERSION +1 -0
- package/skills/nobrainer-tech-flow/references/autopilot.md +72 -0
- package/skills/nobrainer-tech-flow/references/codex-routing.md +21 -0
- package/skills/nobrainer-tech-flow/references/communication.md +108 -0
- package/skills/nobrainer-tech-flow/references/correction-hooks.md +110 -0
- package/skills/nobrainer-tech-flow/references/daily-update.md +28 -0
- package/skills/nobrainer-tech-flow/references/delivery.md +243 -0
- package/skills/nobrainer-tech-flow/references/idea-to-delivery.md +82 -0
- package/skills/nobrainer-tech-flow/references/long-run-state.md +209 -0
- package/skills/nobrainer-tech-flow/references/model-routing.md +83 -0
- package/skills/nobrainer-tech-flow/references/optional-decisions.md +83 -0
- package/skills/nobrainer-tech-flow/references/project-start.md +22 -0
- package/skills/nobrainer-tech-flow/references/routing.md +125 -0
- package/skills/nobrainer-tech-flow/references/setup.md +180 -0
- package/skills/nobrainer-tech-flow/references/worktrees.md +138 -0
- package/skills/nobrainer-tech-flow/scripts/check_flow_update.py +298 -0
- package/skills/nobrainer-tech-flow/scripts/cleanup_worktree.py +327 -0
- package/skills/nobrainer-tech-flow/scripts/decision_config.py +107 -0
- package/skills/nobrainer-tech-flow/scripts/flow_guard.py +252 -0
- package/skills/nobrainer-tech-flow/scripts/typed_decisions.py +210 -0
- package/skills/nobrainer-wiki/SKILL.md +164 -0
- package/skills/nobrainer-wiki/references/setup.md +88 -0
- package/skills/nobrainer-writing/SKILL.md +272 -0
- package/skills/nobrainer-writing/agents/openai.yaml +4 -0
- package/skills/nobrainer-writing/references/brief-artifacts.md +357 -0
- package/skills/nobrainer-writing/references/plain-technical-english.md +76 -0
- package/skills/nobrainer-writing/references/research.md +86 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nobrainer-build
|
|
3
|
+
description: "Use when the owner says nb-build, engineering-standards, or nobrainer-simplifier, or asks to implement or simplify an approved bounded code, configuration, documentation, or test change after outcome and acceptance are clear; apply the smallest verified edit with calibrated KISS, DRY, SOLID, YAGNI and anti-slop gates."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# NoBrainer Build
|
|
7
|
+
|
|
8
|
+
Implement one bounded work unit without expanding the product or hiding weak
|
|
9
|
+
evidence behind polished output. This skill owns the edit loop. Route ambiguous
|
|
10
|
+
requirements to `nobrainer-tech-flow`, causal diagnosis to `nobrainer-rca`, and the
|
|
11
|
+
independent close gate to `nobrainer-review`.
|
|
12
|
+
|
|
13
|
+
## Start gate
|
|
14
|
+
|
|
15
|
+
Use the actual task workspace, including an ordinary folder without Git. Repository,
|
|
16
|
+
branch, commit and build fields are `NOT_APPLICABLE` when absent; do not initialize
|
|
17
|
+
Git or request a repository merely to deliver an artifact. Verify documents through
|
|
18
|
+
their source facts, acceptance and content/rendered readback.
|
|
19
|
+
|
|
20
|
+
Before the first write, resolve:
|
|
21
|
+
|
|
22
|
+
- observable outcome and acceptance IDs or checks;
|
|
23
|
+
- exact repository, checkout, dirty state, write scope and exclusions;
|
|
24
|
+
- expected files with one reason each, plus protected untouched files;
|
|
25
|
+
- relevant instructions, current callers/consumers and baseline behavior;
|
|
26
|
+
- cheapest useful failing proof, target tests, broader verifier/build/runtime;
|
|
27
|
+
- side effects, owner gates, rollback and the `Done clean` condition.
|
|
28
|
+
|
|
29
|
+
Preserve unrelated changes. Use an isolated worktree or disjoint write scope
|
|
30
|
+
when another writer is active. If a missing requirement changes architecture,
|
|
31
|
+
scope, public behavior or safety, stop at `SPEC_CHANGE_PROPOSED`; do not invent it
|
|
32
|
+
inside the patch.
|
|
33
|
+
|
|
34
|
+
## Engineering gate
|
|
35
|
+
|
|
36
|
+
Apply these principles as decision rules, not slogans:
|
|
37
|
+
|
|
38
|
+
- `KISS`: choose the simplest complete design that satisfies acceptance.
|
|
39
|
+
- `YAGNI`: do not add extension points, compatibility layers or options for an
|
|
40
|
+
unproven future requirement.
|
|
41
|
+
- `DRY`: keep each rule and mutable fact under one owner, but do not abstract
|
|
42
|
+
incidental similarity. Duplication can be cheaper than the wrong coupling.
|
|
43
|
+
- `SOLID`: preserve cohesive responsibilities and stable dependency boundaries;
|
|
44
|
+
this is not a mandate for object-oriented ceremony, tiny classes or needless
|
|
45
|
+
interfaces.
|
|
46
|
+
|
|
47
|
+
Before writing, stop at the first complete option that satisfies acceptance:
|
|
48
|
+
|
|
49
|
+
1. skip or delete work when the outcome already exists or the artifact is unnecessary;
|
|
50
|
+
2. reuse existing code or a maintained project capability;
|
|
51
|
+
3. use the standard library or native platform;
|
|
52
|
+
4. use an already-installed dependency;
|
|
53
|
+
5. add the minimum local implementation.
|
|
54
|
+
|
|
55
|
+
Configuration owns values that vary by environment or run; code owns invariants.
|
|
56
|
+
|
|
57
|
+
When an accepted simplification has a known operational ceiling, record the
|
|
58
|
+
ceiling, observable trigger to revisit it, and responsible owner in the current
|
|
59
|
+
task plan/report. For example, a single-writer design must be revisited before
|
|
60
|
+
introducing concurrent writers. Do not turn ordinary minimal code into a debt
|
|
61
|
+
backlog: omit this record when there is no known ceiling. This never permits
|
|
62
|
+
cutting required validation, security, accessibility or acceptance. A later task
|
|
63
|
+
that crosses the trigger must revisit the design before relying on the shortcut.
|
|
64
|
+
|
|
65
|
+
A new shared abstraction requires two real current callers or an explicit
|
|
66
|
+
acceptance contract that needs the boundary. A hypothetical future caller does
|
|
67
|
+
not justify it. If inspection expands the expected file set, update scope before
|
|
68
|
+
editing the newly required file.
|
|
69
|
+
|
|
70
|
+
## Anti-slop gate
|
|
71
|
+
|
|
72
|
+
Reject a patch that contains any of the following without explicit acceptance:
|
|
73
|
+
|
|
74
|
+
- invented APIs, packages, commands, files, facts or runtime claims;
|
|
75
|
+
- placeholder logic, fake data, swallowed errors or success on partial output;
|
|
76
|
+
- comments that restate visible code, generic generated documentation or
|
|
77
|
+
self-congratulatory best-practice prose;
|
|
78
|
+
- broad renames, formatting churn or neighboring refactors unrelated to the
|
|
79
|
+
work unit;
|
|
80
|
+
- duplicate state owners, speculative abstractions or fallback stacks that make
|
|
81
|
+
failure ambiguous;
|
|
82
|
+
- tests that only assert a mock/fixture while the real contract remains
|
|
83
|
+
unexercised.
|
|
84
|
+
|
|
85
|
+
Names should explain intent. Comments should explain only non-obvious why,
|
|
86
|
+
constraints, risk or tradeoffs. Do not create a new README, framework or process
|
|
87
|
+
artifact merely to make the change look substantial.
|
|
88
|
+
|
|
89
|
+
## Build loop
|
|
90
|
+
|
|
91
|
+
1. Re-open the relevant source and tests from disk. Trace the affected behavior
|
|
92
|
+
through its caller and consumer boundary.
|
|
93
|
+
2. For a behavior change, create a failing proof before implementation when it
|
|
94
|
+
is feasible and reliable. Otherwise record why and preserve the closest
|
|
95
|
+
reproducible baseline.
|
|
96
|
+
3. Make the smallest coherent patch. Keep one behavioral concern per change and
|
|
97
|
+
update the expected file set for routine changes within the approved outcome;
|
|
98
|
+
stop only when the actual approved scope or consequences change.
|
|
99
|
+
4. Run the focused proof, then affected baseline tests and the repository's
|
|
100
|
+
required verifier/build/runtime in increasing cost order.
|
|
101
|
+
Once acceptance and required checks pass, broaden or repeat only for a new
|
|
102
|
+
change, failure or unresolved concern.
|
|
103
|
+
Before changing shared fixtures, runners, mocks, defaults or test
|
|
104
|
+
infrastructure, inventory all consumers and run at least one representative
|
|
105
|
+
suite per affected behavior class. A test-helper cleanup must not silently
|
|
106
|
+
change unrelated projects' defaults.
|
|
107
|
+
5. Re-read the final diff and run an acceptance trace from promised outcome back
|
|
108
|
+
through output, state, caller, validation and source data.
|
|
109
|
+
Perform a behavior-preserving simplification pass: remove unused indirection,
|
|
110
|
+
duplicate state and needless fallback layers only when references and tests
|
|
111
|
+
prove the simpler path. Do not compress readable code merely to reduce lines.
|
|
112
|
+
For a behavior-preserving rewrite, prove the tests would notice a change:
|
|
113
|
+
seed one deliberate fault per changed behavior class in a disposable copy (or
|
|
114
|
+
revert it at once), confirm a test fails, revert, and confirm a clean diff.
|
|
115
|
+
Report `TEST_SENSITIVITY: PROVEN | PARTLY_PROVEN | NOT_PROVEN` (all, some or no
|
|
116
|
+
classes caught); `NOT_PROVEN` leaves the preservation claim `UNVERIFIED`.
|
|
117
|
+
Check `Done clean`: actual files match the expected scope, no unexpected
|
|
118
|
+
status entry remains, and no placeholder or speculative layer survived.
|
|
119
|
+
If a pull request is part of the authorized delivery, bind its reported checks
|
|
120
|
+
and review state to the exact current head SHA; evidence from a replaced head is
|
|
121
|
+
stale.
|
|
122
|
+
6. Route a consequential or user-requested final gate to `nobrainer-review`.
|
|
123
|
+
Every fix invalidates earlier evidence for the changed path and must be
|
|
124
|
+
rechecked.
|
|
125
|
+
|
|
126
|
+
A command exit code proves only that command. Distinguish static validation,
|
|
127
|
+
local runtime, deployed runtime, production behavior and user usefulness.
|
|
128
|
+
|
|
129
|
+
If the work crosses authentication, authorization, secrets, sensitive data,
|
|
130
|
+
untrusted input, dependency installers or another trust boundary, add a bounded
|
|
131
|
+
`nobrainer-security` stage before final acceptance.
|
|
132
|
+
|
|
133
|
+
## Stop and owner gates
|
|
134
|
+
|
|
135
|
+
Pause the affected operation on changed frozen inputs, conflicting writer, failed required check,
|
|
136
|
+
unknown destructive effect, missing credentials/toolchain or a scope-changing
|
|
137
|
+
decision. Merge, deploy, publish, spend, delete, contact people, migrate data, change
|
|
138
|
+
credentials, mutate production or weaken safety controls only with their explicit authority.
|
|
139
|
+
|
|
140
|
+
A failed check routes to repair; a missing tool or credential routes through
|
|
141
|
+
[delivery obstacle resolution](../nobrainer-tech-flow/references/delivery.md). Check
|
|
142
|
+
permitted alternatives and continue independent work before reporting BLOCKED.
|
|
143
|
+
|
|
144
|
+
When the [Flow corrective-attempt budget](../nobrainer-tech-flow/SKILL.md) is spent,
|
|
145
|
+
preserve the failing proof, return to `nobrainer-rca` or revise the design with the owner.
|
|
146
|
+
|
|
147
|
+
## Build report
|
|
148
|
+
|
|
149
|
+
This schema is an audit input for Flow or another machine handoff. In ordinary
|
|
150
|
+
conversation, translate it into a short natural-language outcome, evidence,
|
|
151
|
+
uncertainty, rollback and next action instead of dumping the form.
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
RESULT: FINISHED | BLOCKED | FAILED | SPEC_CHANGE_PROPOSED
|
|
155
|
+
WORK_UNIT:
|
|
156
|
+
FILES_CHANGED:
|
|
157
|
+
ACCEPTANCE_TRACE:
|
|
158
|
+
FAILING_PROOF_BEFORE:
|
|
159
|
+
TARGETED_CHECKS:
|
|
160
|
+
BROADER_CHECKS:
|
|
161
|
+
TEST_SENSITIVITY: PROVEN | PARTLY_PROVEN | NOT_PROVEN | NOT_APPLICABLE
|
|
162
|
+
RUNTIME_EVIDENCE:
|
|
163
|
+
REVIEW:
|
|
164
|
+
SIDE_EFFECTS:
|
|
165
|
+
UNVERIFIED:
|
|
166
|
+
DEFERRED_CEILINGS: <known ceiling, revisit trigger and owner | NONE>
|
|
167
|
+
ROLLBACK:
|
|
168
|
+
NEXT_ACTION:
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Report `FINISHED` only when the approved work unit and required evidence pass.
|
|
172
|
+
Do not claim merge, deployment or production state without readback from that
|
|
173
|
+
system.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nobrainer-codex-context
|
|
3
|
+
description: "Use when setting up, auditing or repairing one project's Codex context; use nb-codex-context to inspect AGENTS files, configured fallbacks and byte limits, then make one evidence-backed project-local context change without changing global Codex configuration by default."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# NoBrainer Codex Context
|
|
7
|
+
|
|
8
|
+
Prepare the smallest useful project context for Codex. This skill owns the
|
|
9
|
+
project-instruction boundary that Codex reads before a turn; it does not own
|
|
10
|
+
model selection, subagent topology, session transfer, or the whole delivery
|
|
11
|
+
workflow.
|
|
12
|
+
|
|
13
|
+
## Select a mode
|
|
14
|
+
|
|
15
|
+
- `inspect` - read the current project root, instruction candidates, configured
|
|
16
|
+
fallbacks, byte cap and effective document set. Do not write.
|
|
17
|
+
- `setup` - inspect first, reconcile the existing instruction files, and add or
|
|
18
|
+
update one marked project-local context block only when it improves the
|
|
19
|
+
actual repository. Run the inspection again after the edit.
|
|
20
|
+
- `repair` - fix a known context defect such as duplicate managed markers,
|
|
21
|
+
stale generated content or a truncation-risk block. Do not rewrite unrelated
|
|
22
|
+
instructions.
|
|
23
|
+
|
|
24
|
+
Use `inspect` for a question. Use `setup` only when the owner asks to prepare
|
|
25
|
+
the project or the project has a demonstrated context gap. A clean result is
|
|
26
|
+
`CURRENT`; absence, truncation or an unknown runtime is evidence to report, not
|
|
27
|
+
permission to invent a fix.
|
|
28
|
+
|
|
29
|
+
## Codex context contract
|
|
30
|
+
|
|
31
|
+
Codex's effective project instructions are assembled from the nearest project
|
|
32
|
+
root through the current directory. The normal candidates are
|
|
33
|
+
`AGENTS.override.md` and `AGENTS.md`; configured fallback names are considered
|
|
34
|
+
after them. The configured project-document byte budget applies to the loaded
|
|
35
|
+
instruction set and defaults to the host's documented value when no override is
|
|
36
|
+
read.
|
|
37
|
+
|
|
38
|
+
Run the bundled read-only probe with Python 3.11+ before deciding what to change.
|
|
39
|
+
Run it from the project, replacing `<context-skill-dir>` with this skill's
|
|
40
|
+
directory wherever it is installed; the probe inspects the current directory,
|
|
41
|
+
or the one given with `--cwd`:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
python3 <context-skill-dir>/scripts/codex_context.py --check --json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The probe is an inventory and truncation check; its exit status does not prove
|
|
48
|
+
that a live Codex client followed the instructions.
|
|
49
|
+
|
|
50
|
+
When a project needs a durable NoBrainer context block, preserve all existing
|
|
51
|
+
bytes and use exactly these markers in the applicable `AGENTS.md`:
|
|
52
|
+
|
|
53
|
+
```markdown
|
|
54
|
+
<!-- NOBRAINER-CODEX-CONTEXT:START -->
|
|
55
|
+
## Project context
|
|
56
|
+
|
|
57
|
+
- Source of truth: `<verified project files>`.
|
|
58
|
+
- First checks: `<verified commands or tests>`.
|
|
59
|
+
- Keep this block compact; link to deeper project docs instead of copying them.
|
|
60
|
+
<!-- NOBRAINER-CODEX-CONTEXT:END -->
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Replace the placeholders only with facts read from the current project. Do not
|
|
64
|
+
put credentials, private machine paths, mutable runtime state, guessed commands
|
|
65
|
+
or model names in the block. If an existing managed block is present, update it
|
|
66
|
+
in place; do not create a second one. If an `AGENTS.md` is absent, create it
|
|
67
|
+
only when setup is explicitly requested and the project has enough inspected
|
|
68
|
+
source facts to make the block useful.
|
|
69
|
+
|
|
70
|
+
Do not create a `CODEX_CONTEXT.md` file and call it automatically loaded. Codex
|
|
71
|
+
will only use an alternate filename when the host's `project_doc_fallback_filenames`
|
|
72
|
+
configuration actually includes it; changing that global configuration is an
|
|
73
|
+
owner-gated action outside this skill's default setup.
|
|
74
|
+
|
|
75
|
+
## Safe setup boundaries
|
|
76
|
+
|
|
77
|
+
- Keep `AGENTS.override.md` precedence and client-managed blocks intact.
|
|
78
|
+
- Never replace a whole `AGENTS.md` because it is long, old or from another
|
|
79
|
+
client. Reduce duplication only when the exact duplicate and its owner are
|
|
80
|
+
clear.
|
|
81
|
+
- Do not edit `~/.codex/config.toml`, credentials, plugin installation or
|
|
82
|
+
client settings unless the owner explicitly requests that separate action.
|
|
83
|
+
- Do not claim `RUNTIME_VERIFIED` from a file read, probe exit code or installed
|
|
84
|
+
skill. If `codex debug prompt-input` or `codex debug agents-md` is available,
|
|
85
|
+
use it for a fresh readback; otherwise report `RUNTIME_READBACK: UNKNOWN`.
|
|
86
|
+
- Keep the context block below the project's own required instructions when the
|
|
87
|
+
file's structure makes that safer. Follow the nearest `AGENTS.md` rules.
|
|
88
|
+
|
|
89
|
+
## Closeout
|
|
90
|
+
|
|
91
|
+
Return a compact readback:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
CODEX_CONTEXT: CURRENT | UPDATED | BLOCKED
|
|
95
|
+
PROJECT_ROOT: <path or UNKNOWN>
|
|
96
|
+
DOCUMENTS: <ordered discovered files>
|
|
97
|
+
FALLBACKS: <configured names or NONE>
|
|
98
|
+
BYTE_BUDGET: <observed value or UNKNOWN>
|
|
99
|
+
LOADED_BYTES: <observed value or UNKNOWN>
|
|
100
|
+
TRUNCATED: YES | NO | UNKNOWN
|
|
101
|
+
PROJECT_WRITE: NONE | AGENTS_BLOCK_UPDATED | AGENTS_CREATED
|
|
102
|
+
RUNTIME_READBACK: VERIFIED | UNKNOWN | UNSUPPORTED
|
|
103
|
+
OWNER_ACTION_REQUIRED: <one exact action or NONE>
|
|
104
|
+
ROLLBACK: <exact preimage or NOT_APPLICABLE>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Route portfolio-wide semantic instruction or skill audits to
|
|
108
|
+
`nobrainer-skill-doctor`; keep one-project Codex context setup and repair here.
|
|
109
|
+
Route broader setup, installation or delivery work back to `nobrainer-tech-flow`.
|
|
110
|
+
Use `nobrainer-sessions` for context transfer and `nobrainer-review` for a
|
|
111
|
+
release or adversarial closeout; do not duplicate their contracts here.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Read-only inspection of the project instructions Codex can load."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
import tomllib
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
DEFAULT_MAX_BYTES = 32 * 1024
|
|
16
|
+
DEFAULT_MARKERS = (".git",)
|
|
17
|
+
DEFAULT_FILENAMES = ("AGENTS.override.md", "AGENTS.md")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _section(config: dict[str, Any], name: str) -> dict[str, Any]:
|
|
21
|
+
value = config.get(name)
|
|
22
|
+
return value if isinstance(value, dict) else {}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def load_config(path: Path) -> tuple[dict[str, Any], list[str]]:
|
|
26
|
+
if not path.is_file():
|
|
27
|
+
return {}, []
|
|
28
|
+
try:
|
|
29
|
+
return tomllib.loads(path.read_text(encoding="utf-8")), []
|
|
30
|
+
except (OSError, tomllib.TOMLDecodeError) as exc:
|
|
31
|
+
return {}, [f"config unreadable: {exc}"]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def config_value(config: dict[str, Any], key: str, default: Any) -> Any:
|
|
35
|
+
project = _section(config, "project")
|
|
36
|
+
if key in project:
|
|
37
|
+
return project[key]
|
|
38
|
+
return config.get(key, default)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def find_root(cwd: Path, markers: tuple[str, ...]) -> tuple[Path | None, str | None]:
|
|
42
|
+
if not markers:
|
|
43
|
+
return cwd, "<cwd>"
|
|
44
|
+
cursor = cwd
|
|
45
|
+
while True:
|
|
46
|
+
for marker in markers:
|
|
47
|
+
if (cursor / marker).exists():
|
|
48
|
+
return cursor, marker
|
|
49
|
+
if cursor.parent == cursor:
|
|
50
|
+
return None, None
|
|
51
|
+
cursor = cursor.parent
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def search_dirs(root: Path | None, cwd: Path) -> list[Path]:
|
|
55
|
+
if root is None:
|
|
56
|
+
return [cwd]
|
|
57
|
+
dirs: list[Path] = []
|
|
58
|
+
cursor = cwd
|
|
59
|
+
while True:
|
|
60
|
+
dirs.append(cursor)
|
|
61
|
+
if cursor == root:
|
|
62
|
+
return list(reversed(dirs))
|
|
63
|
+
if cursor.parent == cursor:
|
|
64
|
+
return list(reversed(dirs))
|
|
65
|
+
cursor = cursor.parent
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def unique_names(names: list[str]) -> list[str]:
|
|
69
|
+
result: list[str] = []
|
|
70
|
+
for name in names:
|
|
71
|
+
if isinstance(name, str) and name and name not in result:
|
|
72
|
+
result.append(name)
|
|
73
|
+
return result
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def inspect_context(cwd: Path, config_path: Path) -> dict[str, Any]:
|
|
77
|
+
config, config_errors = load_config(config_path)
|
|
78
|
+
raw_markers = config_value(config, "project_root_markers", list(DEFAULT_MARKERS))
|
|
79
|
+
markers = (
|
|
80
|
+
tuple(item for item in raw_markers if isinstance(item, str))
|
|
81
|
+
if isinstance(raw_markers, list)
|
|
82
|
+
else DEFAULT_MARKERS
|
|
83
|
+
)
|
|
84
|
+
raw_fallbacks = config_value(config, "project_doc_fallback_filenames", [])
|
|
85
|
+
fallbacks = (
|
|
86
|
+
[item for item in raw_fallbacks if isinstance(item, str)]
|
|
87
|
+
if isinstance(raw_fallbacks, list)
|
|
88
|
+
else []
|
|
89
|
+
)
|
|
90
|
+
raw_max = config_value(config, "project_doc_max_bytes", DEFAULT_MAX_BYTES)
|
|
91
|
+
max_bytes = raw_max if isinstance(raw_max, int) and raw_max >= 0 else DEFAULT_MAX_BYTES
|
|
92
|
+
names = unique_names([*DEFAULT_FILENAMES, *fallbacks])
|
|
93
|
+
root, root_marker = find_root(cwd, markers)
|
|
94
|
+
documents: list[dict[str, Any]] = []
|
|
95
|
+
for directory in search_dirs(root, cwd):
|
|
96
|
+
selected: Path | None = None
|
|
97
|
+
for name in names:
|
|
98
|
+
candidate = directory / name
|
|
99
|
+
if candidate.is_file():
|
|
100
|
+
selected = candidate
|
|
101
|
+
break
|
|
102
|
+
if selected is None:
|
|
103
|
+
continue
|
|
104
|
+
size = selected.stat().st_size
|
|
105
|
+
documents.append({"path": str(selected), "bytes": size})
|
|
106
|
+
|
|
107
|
+
loaded = 0
|
|
108
|
+
for document in documents:
|
|
109
|
+
remaining = max(max_bytes - loaded, 0)
|
|
110
|
+
used = min(document["bytes"], remaining)
|
|
111
|
+
document["loaded_bytes"] = used
|
|
112
|
+
document["truncated"] = used < document["bytes"]
|
|
113
|
+
loaded += used
|
|
114
|
+
|
|
115
|
+
truncated = any(document["truncated"] for document in documents)
|
|
116
|
+
if config_errors:
|
|
117
|
+
status = "CONFIG_INVALID"
|
|
118
|
+
elif not documents:
|
|
119
|
+
status = "MISSING"
|
|
120
|
+
elif truncated:
|
|
121
|
+
status = "TRUNCATED"
|
|
122
|
+
else:
|
|
123
|
+
status = "CURRENT"
|
|
124
|
+
return {
|
|
125
|
+
"schema": 1,
|
|
126
|
+
"status": status,
|
|
127
|
+
"cwd": str(cwd),
|
|
128
|
+
"project_root": str(root) if root else None,
|
|
129
|
+
"root_marker": root_marker,
|
|
130
|
+
"config_path": str(config_path),
|
|
131
|
+
"config_errors": config_errors,
|
|
132
|
+
"candidate_filenames": names,
|
|
133
|
+
"project_doc_max_bytes": max_bytes,
|
|
134
|
+
"loaded_bytes": loaded,
|
|
135
|
+
"documents": documents,
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def parse_args() -> argparse.Namespace:
|
|
140
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
141
|
+
parser.add_argument("--cwd", type=Path, default=Path.cwd())
|
|
142
|
+
parser.add_argument("--config", type=Path, help="Codex config.toml to inspect")
|
|
143
|
+
parser.add_argument(
|
|
144
|
+
"--json", action="store_true", help="print machine-readable JSON"
|
|
145
|
+
)
|
|
146
|
+
parser.add_argument(
|
|
147
|
+
"--check", action="store_true", help="return non-zero unless context is CURRENT"
|
|
148
|
+
)
|
|
149
|
+
return parser.parse_args()
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def main() -> int:
|
|
153
|
+
args = parse_args()
|
|
154
|
+
cwd = args.cwd.expanduser().resolve()
|
|
155
|
+
config_path = (
|
|
156
|
+
args.config.expanduser().resolve()
|
|
157
|
+
if args.config
|
|
158
|
+
else Path(os.environ.get("CODEX_HOME", "~/.codex")).expanduser().resolve()
|
|
159
|
+
/ "config.toml"
|
|
160
|
+
)
|
|
161
|
+
result = inspect_context(cwd, config_path)
|
|
162
|
+
if args.json:
|
|
163
|
+
print(json.dumps(result, indent=2, sort_keys=True))
|
|
164
|
+
else:
|
|
165
|
+
print(f"CODEX_CONTEXT: {result['status']}")
|
|
166
|
+
print(f"PROJECT_ROOT: {result['project_root'] or 'UNKNOWN'}")
|
|
167
|
+
print(f"DOCUMENTS: {', '.join(item['path'] for item in result['documents']) or 'NONE'}")
|
|
168
|
+
print(f"BYTE_BUDGET: {result['project_doc_max_bytes']}")
|
|
169
|
+
print(f"LOADED_BYTES: {result['loaded_bytes']}")
|
|
170
|
+
print(f"TRUNCATED: {'YES' if result['status'] == 'TRUNCATED' else 'NO'}")
|
|
171
|
+
return 0 if not args.check or result["status"] == "CURRENT" else 1
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
if __name__ == "__main__":
|
|
175
|
+
sys.exit(main())
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nobrainer-decide
|
|
3
|
+
description: "Use when choosing between options: just decide for a quick choice, decide or nb-decide for standard analysis, deep decide or deep-decide for deep analysis. Evaluate feasibility, reliability, total cost, delivery time, scale and reversibility."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# NoBrainer Decide
|
|
7
|
+
|
|
8
|
+
Deliver one ranked decision with evidence, confidence, watchpoints and kill
|
|
9
|
+
criteria. Do not hide behind several flavors of "it depends". This skill decides;
|
|
10
|
+
it does not diagnose an unknown failure or execute the chosen option.
|
|
11
|
+
|
|
12
|
+
Use `nobrainer-rca` first when the unresolved question is causal. Use
|
|
13
|
+
`nobrainer-research` when current external facts or a broader option space must
|
|
14
|
+
be established before scoring.
|
|
15
|
+
|
|
16
|
+
## Select the requested depth
|
|
17
|
+
|
|
18
|
+
Do not run a panel for a factual lookup, an already-made choice, or an obvious
|
|
19
|
+
reversible edit.
|
|
20
|
+
|
|
21
|
+
Match the owner's invocation, case-insensitively, longest phrase first:
|
|
22
|
+
|
|
23
|
+
| Invocation | Rigor | Work and output |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `just decide`, `just-decide` | LIGHT | One pass; compare the credible alternatives and status quo; choice, decisive reason, main risk and next action in a short paragraph. No mandatory scorecard or panel. |
|
|
26
|
+
| `decide`, `nb-decide`, `nobrainer-decide` | STANDARD | Compare at least three distinct mechanisms including status quo; feasibility screen, compact comparison, challenge the leader and recommend one next action. |
|
|
27
|
+
| `deep decide`, `deep-decide` | HIGH | Standard analysis plus future scenarios, sensitivity, strongest counterargument, exit plan and bounded evidence gathering. |
|
|
28
|
+
|
|
29
|
+
Treat phrases as instructions only when the owner invokes them, not when they
|
|
30
|
+
occur in a quotation, filename or a request to edit this skill. An implicit
|
|
31
|
+
decision request defaults to STANDARD. A later explicit depth choice overrides
|
|
32
|
+
an earlier one. Depth never changes the selected model, permissions or budget.
|
|
33
|
+
|
|
34
|
+
Preserve the owner's model, effort, depth and budget. Delegate independent research,
|
|
35
|
+
comparison or challenge units promptly under nobrainer-tech-flow
|
|
36
|
+
[team execution](../nobrainer-tech-flow/references/delivery.md#coordinated-team-execution);
|
|
37
|
+
keep a tiny or tightly coupled step in MAIN. MAIN reconciles findings; do not require a fixed panel
|
|
38
|
+
size. Never create visible conversations as substitutes. If independent review is
|
|
39
|
+
unavailable, complete the analysis in MAIN and disclose that limitation; self-review
|
|
40
|
+
is not an independent review. Blind attacks and fresh review apply only to actual
|
|
41
|
+
independent runs; otherwise perform their checks once in MAIN without claiming blindness.
|
|
42
|
+
|
|
43
|
+
Set a finite analysis budget appropriate to stakes and the owner's deadline.
|
|
44
|
+
Default to one comparison and one challenge/revision cycle; further research
|
|
45
|
+
needs a named uncertainty that could change the choice. Stop when the choice is
|
|
46
|
+
stable, the evidence budget is exhausted or a decisive fact remains unavailable.
|
|
47
|
+
LIGHT still checks hard constraints and serious downside. For a high-stakes
|
|
48
|
+
quick request, give a concise conditional recommendation or bounded next check;
|
|
49
|
+
do not silently launch HIGH or manufacture certainty to finish quickly.
|
|
50
|
+
|
|
51
|
+
## 1. Frame the actual decision
|
|
52
|
+
|
|
53
|
+
Restate:
|
|
54
|
+
|
|
55
|
+
- decision, owner, deadline and observable outcome;
|
|
56
|
+
- baseline/status quo and what happens if nothing changes;
|
|
57
|
+
- hard constraints, reversible vs irreversible effects, and owner gates;
|
|
58
|
+
- evidence freshness and consequential unknowns.
|
|
59
|
+
|
|
60
|
+
Rewrite the problem once without project nouns. Ask "what system property makes
|
|
61
|
+
this decision necessary?" until symptom and root cause are separated. If a
|
|
62
|
+
candidate appears immediately, record it as an anchor to challenge, not the
|
|
63
|
+
answer.
|
|
64
|
+
|
|
65
|
+
Ask at most one focused clarification round. Then either decide or identify the
|
|
66
|
+
single missing owner choice/evidence that truly blocks a decision.
|
|
67
|
+
|
|
68
|
+
## 2. Generate different shapes
|
|
69
|
+
|
|
70
|
+
For STANDARD and HIGH produce at least three mechanisms, not parameter variants. Always include the
|
|
71
|
+
status quo. Include at least one shape from outside the user's initial frame:
|
|
72
|
+
|
|
73
|
+
- measure first;
|
|
74
|
+
- fix the systemic cause;
|
|
75
|
+
- remove the requirement;
|
|
76
|
+
- accept and observe within an explicit budget.
|
|
77
|
+
|
|
78
|
+
For every option state mechanism, expected benefit, key dependency, worst
|
|
79
|
+
failure, reversibility and earliest useful evidence. Reject duplicate shapes.
|
|
80
|
+
|
|
81
|
+
## 3. Score transparently
|
|
82
|
+
|
|
83
|
+
Before ranking, mark each option FEASIBLE, INFEASIBLE or UNVERIFIED against the
|
|
84
|
+
owner's hard limits: delivery deadline, implementation effort, available skills,
|
|
85
|
+
budget and minimum reliability. Reliability must mean an observable requirement
|
|
86
|
+
appropriate to the decision (for example acceptable downtime, error rate,
|
|
87
|
+
recovery time or loss). Never invent a threshold or treat an unknown as passing.
|
|
88
|
+
An infeasible option cannot win through points elsewhere. If no option passes,
|
|
89
|
+
recommend one bounded experiment or identify the constraint that needs changing;
|
|
90
|
+
do not relax it silently.
|
|
91
|
+
|
|
92
|
+
Prefer the simplest feasible solution that achieves the outcome. Estimate total
|
|
93
|
+
cost over the same stated horizon: build, migration, operation, maintenance,
|
|
94
|
+
attention, failure recovery and exit. Use ranges and sources; label estimates.
|
|
95
|
+
Include time to first useful result and time to a reliable finished solution.
|
|
96
|
+
Do not equate a cheap subscription with low total cost.
|
|
97
|
+
|
|
98
|
+
For HIGH compare current demand, plausible growth and an adverse scenario.
|
|
99
|
+
State capacity evidence, likely bottleneck and the measurable trigger for an
|
|
100
|
+
upgrade. Preserve a practical migration path instead of paying now for imagined
|
|
101
|
+
scale. A staged decision (X now, Y after threshold Z) is a valid single choice.
|
|
102
|
+
|
|
103
|
+
Define criteria from the actual outcome before scoring. The default ledger is:
|
|
104
|
+
|
|
105
|
+
| Criterion | Default weight |
|
|
106
|
+
|---|---:|
|
|
107
|
+
| outcome/metric movement | 3 |
|
|
108
|
+
| correctness and evidence | 3 |
|
|
109
|
+
| optionality and lock-in | 3 |
|
|
110
|
+
| downside/antifragility | 3 |
|
|
111
|
+
| production or operational readiness | 2 |
|
|
112
|
+
| recurring cost and attention tax | 2 |
|
|
113
|
+
| simplicity and maintainability | 2 |
|
|
114
|
+
| reversibility | 1 |
|
|
115
|
+
| one-time cost | 1 |
|
|
116
|
+
| time to useful result | 3 |
|
|
117
|
+
|
|
118
|
+
Change weights only with an explicit reason. Score 1–5 and show weighted totals,
|
|
119
|
+
source quality, sensitivity to uncertain assumptions, one-time and recurring
|
|
120
|
+
cost. Use a qualitative comparison when numeric scores would imply unsupported
|
|
121
|
+
precision. Numbers do not auto-select the winner; they expose the tradeoff.
|
|
122
|
+
Accept ties. Prefer the simpler, cheaper-to-reverse feasible option when evidence
|
|
123
|
+
does not distinguish them; state that tie-break. Do not re-score to force a gap.
|
|
124
|
+
|
|
125
|
+
Distinguish robustness (survives stress), resilience (recovers) and antifragility
|
|
126
|
+
(improves through bounded exposure and feedback). Redundancy alone proves none
|
|
127
|
+
of the improvement claim. Name the feedback mechanism and measurable improvement
|
|
128
|
+
before crediting antifragility. Never introduce harmful stress or uncontrolled
|
|
129
|
+
downside to earn that label. Check correlated failures and costly exit paths.
|
|
130
|
+
|
|
131
|
+
## 4. Attack the leader
|
|
132
|
+
|
|
133
|
+
A blind attacker receives the problem, evidence and leading option but not the
|
|
134
|
+
scorer's rationale. It must answer:
|
|
135
|
+
|
|
136
|
+
1. What if the problem framing is wrong?
|
|
137
|
+
2. Which rejected option deserves the strongest steelman?
|
|
138
|
+
3. Is the leader winning because it is familiar or easy?
|
|
139
|
+
4. Which assumption can reverse the ranking?
|
|
140
|
+
5. Is this systemic, a fallback, or a workaround?
|
|
141
|
+
|
|
142
|
+
Re-score when an attack changes a criterion or assumption. A fallback may win,
|
|
143
|
+
but name the systemic alternative and the trigger for revisiting it.
|
|
144
|
+
|
|
145
|
+
## 5. Cold review and commitment
|
|
146
|
+
|
|
147
|
+
A fresh reviewer sees the original decision, evidence and options, not prior
|
|
148
|
+
reasoning. It checks missing shapes, stale evidence, score sensitivity,
|
|
149
|
+
operational burden, rollback and owner gates. The synthesizer reconciles both
|
|
150
|
+
attacks and selects exactly one option.
|
|
151
|
+
|
|
152
|
+
Do not turn a recommendation into execution authority. Publishing, spending,
|
|
153
|
+
merging, deployment, credentials, production mutation, destructive action, and
|
|
154
|
+
safety changes remain explicit owner gates.
|
|
155
|
+
|
|
156
|
+
## Decision record
|
|
157
|
+
|
|
158
|
+
Use the short output above for LIGHT. For STANDARD keep only useful fields;
|
|
159
|
+
HIGH uses the fuller record below. Include feasibility, delivery range, total
|
|
160
|
+
cost horizon and reliability evidence in the comparison. Separate confirmed
|
|
161
|
+
facts, assumptions and forecasts. Confidence reflects evidence and ranking
|
|
162
|
+
stability, not the number of agents. An unresolved decisive fact permits a
|
|
163
|
+
conditional choice or time-boxed experiment, not an unsupported commitment.
|
|
164
|
+
|
|
165
|
+
```text
|
|
166
|
+
DECISION
|
|
167
|
+
Choice: <one option>
|
|
168
|
+
Confidence: LOW | MEDIUM | HIGH - <reason>
|
|
169
|
+
Why it beats #2: <one evidence-bound sentence>
|
|
170
|
+
Type: SYSTEMIC | FALLBACK | WORKAROUND
|
|
171
|
+
Rigor: LIGHT | STANDARD | HIGH
|
|
172
|
+
|
|
173
|
+
SCORECARD
|
|
174
|
+
<criteria, weights, scores, totals, sensitivity>
|
|
175
|
+
|
|
176
|
+
WATCHPOINTS
|
|
177
|
+
- <metric + threshold + review/action>
|
|
178
|
+
- <metric + threshold + review/action>
|
|
179
|
+
|
|
180
|
+
KILL_CRITERIA
|
|
181
|
+
- If <observable condition> by <time/event>, stop or revert to <option>.
|
|
182
|
+
|
|
183
|
+
ROLLBACK
|
|
184
|
+
- <procedure, owner, and readback>
|
|
185
|
+
|
|
186
|
+
REJECTED_OPTIONS
|
|
187
|
+
- <option>: <decisive reason and revisit trigger>
|
|
188
|
+
|
|
189
|
+
OPEN_ASSUMPTIONS
|
|
190
|
+
- <at most two genuinely decision-relevant assumptions or NONE>
|
|
191
|
+
|
|
192
|
+
OWNER_GATE
|
|
193
|
+
- <exact approval needed before action or NONE>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
End with one next action. Preserve the decision and evidence in the project's
|
|
197
|
+
existing durable record only when it will guide future work; do not create a
|
|
198
|
+
second source of truth.
|