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.
Files changed (149) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +18 -0
  3. package/.claude-plugin/plugin.json +21 -0
  4. package/.codex-plugin/plugin.json +47 -0
  5. package/.opencode/INSTALL.md +37 -0
  6. package/.opencode/plugins/nobrainer-tech-skills.js +66 -0
  7. package/.pi/extensions/nobrainer-tech-skills.js +64 -0
  8. package/AGENTS.md +204 -0
  9. package/CLAUDE.md +204 -0
  10. package/CONTRIBUTING.md +70 -0
  11. package/GEMINI.md +1 -0
  12. package/LICENSE +21 -0
  13. package/README.md +658 -2
  14. package/SECURITY.md +33 -0
  15. package/adapters/bootstrap.md +27 -0
  16. package/assets/nobrainer-tech-logo.svg +1 -0
  17. package/assets/nobrainer-workflow.svg +155 -0
  18. package/assets/plugin-logo.png +0 -0
  19. package/bin/nobrainer-tech-flow.mjs +48 -0
  20. package/docs/BOUNDED_RUNNER.md +60 -0
  21. package/docs/CHAT_PLUGINS.md +29 -0
  22. package/docs/COMPATIBILITY.md +371 -0
  23. package/docs/INSTALL.md +626 -0
  24. package/docs/MIGRATION_TO_FLOW.md +117 -0
  25. package/docs/NAMING.md +39 -0
  26. package/docs/PRIVACY.md +9 -0
  27. package/docs/SESSION_RESTART.md +70 -0
  28. package/docs/SKILL_CURATION.md +124 -0
  29. package/docs/TESTING.md +232 -0
  30. package/docs/TRY_IT.md +109 -0
  31. package/docs/releases/v1.0.0.md +81 -0
  32. package/docs/releases/v1.1.0.md +85 -0
  33. package/docs/releases/v1.10.0.md +34 -0
  34. package/docs/releases/v1.11.0-publication-readback.md +25 -0
  35. package/docs/releases/v1.11.0.md +42 -0
  36. package/docs/releases/v1.12.0.md +30 -0
  37. package/docs/releases/v1.13.0.md +46 -0
  38. package/docs/releases/v1.14.0.md +43 -0
  39. package/docs/releases/v1.14.1.md +21 -0
  40. package/docs/releases/v1.2.0.md +87 -0
  41. package/docs/releases/v1.2.1.md +92 -0
  42. package/docs/releases/v1.3.0-publication-readback.md +69 -0
  43. package/docs/releases/v1.3.0.md +66 -0
  44. package/docs/releases/v1.3.1-publication-readback.md +76 -0
  45. package/docs/releases/v1.3.1.md +59 -0
  46. package/docs/releases/v1.4.0-publication-readback.md +81 -0
  47. package/docs/releases/v1.4.0.md +43 -0
  48. package/docs/releases/v1.5.0-publication-readback.md +76 -0
  49. package/docs/releases/v1.5.0.md +54 -0
  50. package/docs/releases/v1.6.0.md +64 -0
  51. package/docs/releases/v1.6.1-publication-readback.md +53 -0
  52. package/docs/releases/v1.6.1.md +82 -0
  53. package/docs/releases/v1.7.0.md +42 -0
  54. package/docs/releases/v1.7.1-publication-readback.md +64 -0
  55. package/docs/releases/v1.7.1.md +49 -0
  56. package/docs/releases/v1.8.0.md +63 -0
  57. package/docs/releases/v1.8.1.md +32 -0
  58. package/docs/releases/v1.9.0.md +33 -0
  59. package/docs/releases/v2.0.0-candidate.md +28 -0
  60. package/docs/releases/v2.0.0.md +53 -0
  61. package/docs/releases/v2.0.1.md +135 -0
  62. package/docs/releases/v2.0.2.md +189 -0
  63. package/docs/releases/v2.1.0.md +64 -0
  64. package/docs/releases/v2.1.1.md +43 -0
  65. package/docs/releases/v2.2.0.md +64 -0
  66. package/docs/releases/v2.2.1.md +11 -0
  67. package/docs/releases/v2.3.0.md +97 -0
  68. package/docs/releases/v2.3.1.md +71 -0
  69. package/docs/releases/v2.3.2.md +242 -0
  70. package/docs/releases/v2.4.0.md +126 -0
  71. package/gemini-extension.json +6 -0
  72. package/hooks/claude-hooks.json +17 -0
  73. package/hooks/hooks-cursor.json +10 -0
  74. package/hooks/run-hook.cmd +36 -0
  75. package/hooks/session-start +38 -0
  76. package/package.json +69 -4
  77. package/plugin.json +51 -0
  78. package/scripts/build_plugin.py +50 -0
  79. package/scripts/check_flow_update.py +18 -0
  80. package/scripts/check_public_commit.py +86 -0
  81. package/scripts/fetch_public_refs.py +69 -0
  82. package/scripts/install.py +600 -0
  83. package/scripts/install.sh +1392 -0
  84. package/scripts/install_guards.py +279 -0
  85. package/scripts/install_personalization.py +527 -0
  86. package/scripts/install_skills.py +951 -0
  87. package/scripts/npm_install.py +85 -0
  88. package/scripts/recommend_flow_setup.py +1522 -0
  89. package/scripts/validate_skills.py +465 -0
  90. package/skills/nobrainer-auto-fine-tune/SKILL.md +79 -0
  91. package/skills/nobrainer-auto-fine-tune/references/capacity-audit.md +49 -0
  92. package/skills/nobrainer-autoimprove/SKILL.md +212 -0
  93. package/skills/nobrainer-autoimprove/scripts/count_words.py +22 -0
  94. package/skills/nobrainer-browser/SKILL.md +234 -0
  95. package/skills/nobrainer-browser/references/cdp-profile-restart.md +93 -0
  96. package/skills/nobrainer-build/SKILL.md +173 -0
  97. package/skills/nobrainer-codex-context/SKILL.md +111 -0
  98. package/skills/nobrainer-codex-context/scripts/codex_context.py +175 -0
  99. package/skills/nobrainer-decide/SKILL.md +198 -0
  100. package/skills/nobrainer-dispatcher/SKILL.md +256 -0
  101. package/skills/nobrainer-dispatcher/agents/openai.yaml +4 -0
  102. package/skills/nobrainer-rca/SKILL.md +163 -0
  103. package/skills/nobrainer-research/SKILL.md +131 -0
  104. package/skills/nobrainer-review/SKILL.md +195 -0
  105. package/skills/nobrainer-security/SKILL.md +166 -0
  106. package/skills/nobrainer-sessions/SKILL.md +223 -0
  107. package/skills/nobrainer-sessions/references/evidence-receipt.md +55 -0
  108. package/skills/nobrainer-sessions/references/protocol.md +337 -0
  109. package/skills/nobrainer-sessions/references/session-restart.md +255 -0
  110. package/skills/nobrainer-sessions/scripts/evidence_receipt.py +373 -0
  111. package/skills/nobrainer-sessions/scripts/restart_gate.py +140 -0
  112. package/skills/nobrainer-sessions/scripts/run_bounded.py +390 -0
  113. package/skills/nobrainer-sessions/scripts/session_title.py +43 -0
  114. package/skills/nobrainer-skill-doctor/SKILL.md +149 -0
  115. package/skills/nobrainer-skill-doctor/references/astra.md +19 -0
  116. package/skills/nobrainer-skill-doctor/scripts/audit.py +100 -0
  117. package/skills/nobrainer-skill-doctor/scripts/context_candidates.py +133 -0
  118. package/skills/nobrainer-spec-driven-development/SKILL.md +132 -0
  119. package/skills/nobrainer-spec-driven-development/references/spec-template.md +114 -0
  120. package/skills/nobrainer-team/SKILL.md +165 -0
  121. package/skills/nobrainer-team/references/team-plan.md +64 -0
  122. package/skills/nobrainer-tech-flow/SKILL.md +239 -0
  123. package/skills/nobrainer-tech-flow/VERSION +1 -0
  124. package/skills/nobrainer-tech-flow/references/autopilot.md +72 -0
  125. package/skills/nobrainer-tech-flow/references/codex-routing.md +21 -0
  126. package/skills/nobrainer-tech-flow/references/communication.md +108 -0
  127. package/skills/nobrainer-tech-flow/references/correction-hooks.md +110 -0
  128. package/skills/nobrainer-tech-flow/references/daily-update.md +28 -0
  129. package/skills/nobrainer-tech-flow/references/delivery.md +243 -0
  130. package/skills/nobrainer-tech-flow/references/idea-to-delivery.md +82 -0
  131. package/skills/nobrainer-tech-flow/references/long-run-state.md +209 -0
  132. package/skills/nobrainer-tech-flow/references/model-routing.md +83 -0
  133. package/skills/nobrainer-tech-flow/references/optional-decisions.md +83 -0
  134. package/skills/nobrainer-tech-flow/references/project-start.md +22 -0
  135. package/skills/nobrainer-tech-flow/references/routing.md +125 -0
  136. package/skills/nobrainer-tech-flow/references/setup.md +180 -0
  137. package/skills/nobrainer-tech-flow/references/worktrees.md +138 -0
  138. package/skills/nobrainer-tech-flow/scripts/check_flow_update.py +298 -0
  139. package/skills/nobrainer-tech-flow/scripts/cleanup_worktree.py +327 -0
  140. package/skills/nobrainer-tech-flow/scripts/decision_config.py +107 -0
  141. package/skills/nobrainer-tech-flow/scripts/flow_guard.py +252 -0
  142. package/skills/nobrainer-tech-flow/scripts/typed_decisions.py +210 -0
  143. package/skills/nobrainer-wiki/SKILL.md +164 -0
  144. package/skills/nobrainer-wiki/references/setup.md +88 -0
  145. package/skills/nobrainer-writing/SKILL.md +272 -0
  146. package/skills/nobrainer-writing/agents/openai.yaml +4 -0
  147. package/skills/nobrainer-writing/references/brief-artifacts.md +357 -0
  148. package/skills/nobrainer-writing/references/plain-technical-english.md +76 -0
  149. 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.