nobrainer-tech-flow 0.0.0-stage → 2.4.1

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 (151) 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 +205 -0
  9. package/CLAUDE.md +205 -0
  10. package/CONTRIBUTING.md +70 -0
  11. package/GEMINI.md +1 -0
  12. package/LICENSE +21 -0
  13. package/README.md +659 -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/RELEASING.md +24 -0
  28. package/docs/SESSION_RESTART.md +70 -0
  29. package/docs/SKILL_CURATION.md +124 -0
  30. package/docs/TESTING.md +232 -0
  31. package/docs/TRY_IT.md +109 -0
  32. package/docs/releases/v1.0.0.md +81 -0
  33. package/docs/releases/v1.1.0.md +85 -0
  34. package/docs/releases/v1.10.0.md +34 -0
  35. package/docs/releases/v1.11.0-publication-readback.md +25 -0
  36. package/docs/releases/v1.11.0.md +42 -0
  37. package/docs/releases/v1.12.0.md +30 -0
  38. package/docs/releases/v1.13.0.md +46 -0
  39. package/docs/releases/v1.14.0.md +43 -0
  40. package/docs/releases/v1.14.1.md +21 -0
  41. package/docs/releases/v1.2.0.md +87 -0
  42. package/docs/releases/v1.2.1.md +92 -0
  43. package/docs/releases/v1.3.0-publication-readback.md +69 -0
  44. package/docs/releases/v1.3.0.md +66 -0
  45. package/docs/releases/v1.3.1-publication-readback.md +76 -0
  46. package/docs/releases/v1.3.1.md +59 -0
  47. package/docs/releases/v1.4.0-publication-readback.md +81 -0
  48. package/docs/releases/v1.4.0.md +43 -0
  49. package/docs/releases/v1.5.0-publication-readback.md +76 -0
  50. package/docs/releases/v1.5.0.md +54 -0
  51. package/docs/releases/v1.6.0.md +64 -0
  52. package/docs/releases/v1.6.1-publication-readback.md +53 -0
  53. package/docs/releases/v1.6.1.md +82 -0
  54. package/docs/releases/v1.7.0.md +42 -0
  55. package/docs/releases/v1.7.1-publication-readback.md +64 -0
  56. package/docs/releases/v1.7.1.md +49 -0
  57. package/docs/releases/v1.8.0.md +63 -0
  58. package/docs/releases/v1.8.1.md +32 -0
  59. package/docs/releases/v1.9.0.md +33 -0
  60. package/docs/releases/v2.0.0-candidate.md +28 -0
  61. package/docs/releases/v2.0.0.md +53 -0
  62. package/docs/releases/v2.0.1.md +135 -0
  63. package/docs/releases/v2.0.2.md +189 -0
  64. package/docs/releases/v2.1.0.md +64 -0
  65. package/docs/releases/v2.1.1.md +43 -0
  66. package/docs/releases/v2.2.0.md +64 -0
  67. package/docs/releases/v2.2.1.md +11 -0
  68. package/docs/releases/v2.3.0.md +97 -0
  69. package/docs/releases/v2.3.1.md +71 -0
  70. package/docs/releases/v2.3.2.md +242 -0
  71. package/docs/releases/v2.4.0.md +126 -0
  72. package/docs/releases/v2.4.1.md +63 -0
  73. package/gemini-extension.json +6 -0
  74. package/hooks/claude-hooks.json +17 -0
  75. package/hooks/hooks-cursor.json +10 -0
  76. package/hooks/run-hook.cmd +36 -0
  77. package/hooks/session-start +38 -0
  78. package/package.json +69 -4
  79. package/plugin.json +51 -0
  80. package/scripts/build_plugin.py +50 -0
  81. package/scripts/check_flow_update.py +18 -0
  82. package/scripts/check_public_commit.py +86 -0
  83. package/scripts/fetch_public_refs.py +69 -0
  84. package/scripts/install.py +600 -0
  85. package/scripts/install.sh +1420 -0
  86. package/scripts/install_guards.py +279 -0
  87. package/scripts/install_personalization.py +527 -0
  88. package/scripts/install_skills.py +951 -0
  89. package/scripts/npm_install.py +85 -0
  90. package/scripts/recommend_flow_setup.py +1537 -0
  91. package/scripts/validate_skills.py +465 -0
  92. package/skills/nobrainer-auto-fine-tune/SKILL.md +79 -0
  93. package/skills/nobrainer-auto-fine-tune/references/capacity-audit.md +49 -0
  94. package/skills/nobrainer-autoimprove/SKILL.md +212 -0
  95. package/skills/nobrainer-autoimprove/scripts/count_words.py +22 -0
  96. package/skills/nobrainer-browser/SKILL.md +234 -0
  97. package/skills/nobrainer-browser/references/cdp-profile-restart.md +93 -0
  98. package/skills/nobrainer-build/SKILL.md +173 -0
  99. package/skills/nobrainer-codex-context/SKILL.md +111 -0
  100. package/skills/nobrainer-codex-context/scripts/codex_context.py +175 -0
  101. package/skills/nobrainer-decide/SKILL.md +198 -0
  102. package/skills/nobrainer-dispatcher/SKILL.md +256 -0
  103. package/skills/nobrainer-dispatcher/agents/openai.yaml +4 -0
  104. package/skills/nobrainer-rca/SKILL.md +163 -0
  105. package/skills/nobrainer-research/SKILL.md +131 -0
  106. package/skills/nobrainer-review/SKILL.md +195 -0
  107. package/skills/nobrainer-security/SKILL.md +166 -0
  108. package/skills/nobrainer-sessions/SKILL.md +223 -0
  109. package/skills/nobrainer-sessions/references/evidence-receipt.md +55 -0
  110. package/skills/nobrainer-sessions/references/protocol.md +337 -0
  111. package/skills/nobrainer-sessions/references/session-restart.md +255 -0
  112. package/skills/nobrainer-sessions/scripts/evidence_receipt.py +373 -0
  113. package/skills/nobrainer-sessions/scripts/restart_gate.py +140 -0
  114. package/skills/nobrainer-sessions/scripts/run_bounded.py +390 -0
  115. package/skills/nobrainer-sessions/scripts/session_title.py +43 -0
  116. package/skills/nobrainer-skill-doctor/SKILL.md +149 -0
  117. package/skills/nobrainer-skill-doctor/references/astra.md +19 -0
  118. package/skills/nobrainer-skill-doctor/scripts/audit.py +100 -0
  119. package/skills/nobrainer-skill-doctor/scripts/context_candidates.py +133 -0
  120. package/skills/nobrainer-spec-driven-development/SKILL.md +132 -0
  121. package/skills/nobrainer-spec-driven-development/references/spec-template.md +114 -0
  122. package/skills/nobrainer-team/SKILL.md +165 -0
  123. package/skills/nobrainer-team/references/team-plan.md +64 -0
  124. package/skills/nobrainer-tech-flow/SKILL.md +239 -0
  125. package/skills/nobrainer-tech-flow/VERSION +1 -0
  126. package/skills/nobrainer-tech-flow/references/autopilot.md +72 -0
  127. package/skills/nobrainer-tech-flow/references/codex-routing.md +21 -0
  128. package/skills/nobrainer-tech-flow/references/communication.md +108 -0
  129. package/skills/nobrainer-tech-flow/references/correction-hooks.md +110 -0
  130. package/skills/nobrainer-tech-flow/references/daily-update.md +28 -0
  131. package/skills/nobrainer-tech-flow/references/delivery.md +243 -0
  132. package/skills/nobrainer-tech-flow/references/idea-to-delivery.md +82 -0
  133. package/skills/nobrainer-tech-flow/references/long-run-state.md +209 -0
  134. package/skills/nobrainer-tech-flow/references/model-routing.md +83 -0
  135. package/skills/nobrainer-tech-flow/references/optional-decisions.md +83 -0
  136. package/skills/nobrainer-tech-flow/references/project-start.md +22 -0
  137. package/skills/nobrainer-tech-flow/references/routing.md +125 -0
  138. package/skills/nobrainer-tech-flow/references/setup.md +180 -0
  139. package/skills/nobrainer-tech-flow/references/worktrees.md +138 -0
  140. package/skills/nobrainer-tech-flow/scripts/check_flow_update.py +298 -0
  141. package/skills/nobrainer-tech-flow/scripts/cleanup_worktree.py +327 -0
  142. package/skills/nobrainer-tech-flow/scripts/decision_config.py +107 -0
  143. package/skills/nobrainer-tech-flow/scripts/flow_guard.py +252 -0
  144. package/skills/nobrainer-tech-flow/scripts/typed_decisions.py +210 -0
  145. package/skills/nobrainer-wiki/SKILL.md +164 -0
  146. package/skills/nobrainer-wiki/references/setup.md +88 -0
  147. package/skills/nobrainer-writing/SKILL.md +272 -0
  148. package/skills/nobrainer-writing/agents/openai.yaml +4 -0
  149. package/skills/nobrainer-writing/references/brief-artifacts.md +357 -0
  150. package/skills/nobrainer-writing/references/plain-technical-english.md +76 -0
  151. package/skills/nobrainer-writing/references/research.md +86 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "nobrainer-tech",
3
+ "interface": {
4
+ "displayName": "nobrainer-tech-flow"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "nobrainer-tech-flow",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_INSTALL"
16
+ },
17
+ "category": "Developer Tools"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "nobrainer-tech",
3
+ "description": "nobrainer-tech-flow: one workflow of 18 modules for AI coding agents.",
4
+ "owner": {
5
+ "name": "NoBrainer Tech"
6
+ },
7
+ "plugins": [
8
+ {
9
+ "name": "nobrainer-tech-flow",
10
+ "description": "From task to done. nobrainer-tech-flow is one workflow of 18 modules for AI coding agents: it scopes the task, delegates ready work, checks the result and hands over the evidence, including what was not checked.",
11
+ "version": "2.4.1",
12
+ "source": "./",
13
+ "author": {
14
+ "name": "NoBrainer Tech"
15
+ }
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "nobrainer-tech-flow",
3
+ "description": "From task to done. nobrainer-tech-flow is one workflow of 18 modules for AI coding agents: it scopes the task, delegates ready work, checks the result and hands over the evidence, including what was not checked.",
4
+ "version": "2.4.1",
5
+ "author": {
6
+ "name": "NoBrainer Tech"
7
+ },
8
+ "homepage": "https://nobrainer.tech/flow/",
9
+ "repository": "https://github.com/nobrainer-tech/nobrainer-tech-flow",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "agent-skills",
13
+ "agentic-workflows",
14
+ "claude-code",
15
+ "codex",
16
+ "verification",
17
+ "spec-driven-development",
18
+ "multi-agent"
19
+ ],
20
+ "hooks": "./hooks/claude-hooks.json"
21
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "nobrainer-tech-flow",
3
+ "description": "From task to done. nobrainer-tech-flow is one workflow of 18 modules for AI coding agents: it scopes the task, delegates ready work, checks the result and hands over the evidence, including what was not checked.",
4
+ "version": "2.4.1",
5
+ "author": {
6
+ "name": "NoBrainer Tech",
7
+ "url": "https://nobrainer.tech"
8
+ },
9
+ "homepage": "https://nobrainer.tech/flow/",
10
+ "repository": "https://github.com/nobrainer-tech/nobrainer-tech-flow",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "agent-skills",
14
+ "agentic-workflows",
15
+ "claude-code",
16
+ "codex",
17
+ "verification",
18
+ "spec-driven-development",
19
+ "multi-agent"
20
+ ],
21
+ "skills": "./skills/",
22
+ "interface": {
23
+ "displayName": "nobrainer-tech-flow",
24
+ "shortDescription": "From task to done.",
25
+ "longDescription": "nobrainer-tech-flow is one workflow of 18 modules for coding, research, writing and planning. It clarifies the outcome, delegates independent ready work to native workers, shares concise progress, checks the result and hands over what was delivered, the evidence and what was not checked. It uses the tools and permissions your client already grants.",
26
+ "developerName": "NoBrainer Tech",
27
+ "category": "Developer Tools",
28
+ "capabilities": [
29
+ "Interactive",
30
+ "Read",
31
+ "Write"
32
+ ],
33
+ "defaultPrompt": [
34
+ "Use `nobrainer-tech-flow` to fix this bug: reproduce it, make the smallest fix, run the check and say what is unverified.",
35
+ "Use `nobrainer-tech-flow` to turn my idea into a plan with acceptance checks, then deliver and verify it.",
36
+ "Use `nobrainer-tech-flow` to compare these options with sources and give one recommendation."
37
+ ],
38
+ "websiteURL": "https://nobrainer.tech/flow/",
39
+ "privacyPolicyURL": "https://github.com/nobrainer-tech/nobrainer-tech-flow/blob/main/docs/PRIVACY.md",
40
+ "termsOfServiceURL": "https://github.com/nobrainer-tech/nobrainer-tech-flow/blob/main/LICENSE",
41
+ "brandColor": "#2948B8",
42
+ "composerIcon": "./assets/plugin-logo.png",
43
+ "logo": "./assets/plugin-logo.png",
44
+ "screenshots": [],
45
+ "supportURL": "https://github.com/nobrainer-tech/nobrainer-tech-flow/issues"
46
+ }
47
+ }
@@ -0,0 +1,37 @@
1
+ # Installing nobrainer-tech-flow for OpenCode
2
+
3
+ Add the git-backed package to the `plugin` array in the global or project
4
+ `opencode.json`:
5
+
6
+ Use an immutable reviewed commit, not the moving default branch. Replace the
7
+ example ref only after the new commit passes the repository suite and its
8
+ public-clean/readback checks. For pre-merge review, use a local checkout and
9
+ explicit skills path instead.
10
+
11
+ ```json
12
+ {
13
+ "plugin": [
14
+ "nobrainer-tech-flow@git+https://github.com/nobrainer-tech/nobrainer-tech-flow.git#NB_REVIEWED_COMMIT_SHA"
15
+ ]
16
+ }
17
+ ```
18
+
19
+ `NB_REVIEWED_COMMIT_SHA` is an intentionally non-runnable placeholder. Replace
20
+ it with the full SHA of the exact reviewed release. Record that SHA in the
21
+ release notes; do not silently follow `main` or copy an older package pin.
22
+
23
+ Restart OpenCode, list native skills, and confirm `nobrainer-tech-flow` is present.
24
+ The adapter registers the canonical `skills/` directory and prepends the small
25
+ shared `adapters/bootstrap.md` context to the first user message once. It does
26
+ not copy skill bodies into the prompt, add alternate skill trees, or inject on
27
+ every step when the marker is already present.
28
+
29
+ For a local checkout, either run `sh scripts/install.sh --client opencode` (no
30
+ Python needed; `scripts/install_skills.py --client opencode` installs the skills
31
+ alone) or configure the checkout's `skills/` directory as an OpenCode skills path.
32
+ See [the full installation guide](../docs/INSTALL.md).
33
+
34
+ The package ID is `nobrainer-tech-flow`. Existing
35
+ `nobrainer-tech-skills` registrations require the
36
+ [migration guide](../docs/MIGRATION_TO_FLOW.md) so old and new adapters do not
37
+ load together unnoticed.
@@ -0,0 +1,66 @@
1
+ import { readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "url";
4
+
5
+ const currentDirectory = path.dirname(fileURLToPath(import.meta.url));
6
+ const skillsDirectory = path.resolve(currentDirectory, "../../skills");
7
+ const bootstrapPath = path.resolve(currentDirectory, "../../adapters/bootstrap.md");
8
+ const bootstrapMarker = "NOBRAINER_BOOTSTRAP_V1";
9
+ let bootstrapCache;
10
+
11
+ const getBootstrap = () => {
12
+ if (bootstrapCache === undefined) {
13
+ bootstrapCache = readFileSync(bootstrapPath, "utf8");
14
+ }
15
+ return bootstrapCache;
16
+ };
17
+
18
+ const hasBootstrap = (parts) =>
19
+ parts.some(
20
+ (part) =>
21
+ part?.type === "text" &&
22
+ typeof part.text === "string" &&
23
+ part.text.includes(bootstrapMarker),
24
+ );
25
+
26
+ export const NoBrainerTechSkillsPlugin = async () => ({
27
+ config: async (config) => {
28
+ config.skills = config.skills || {};
29
+ config.skills.paths = config.skills.paths || [];
30
+ if (!config.skills.paths.includes(skillsDirectory)) {
31
+ config.skills.paths.push(skillsDirectory);
32
+ }
33
+ },
34
+ "experimental.chat.messages.transform": async (_input, output) => {
35
+ try {
36
+ if (!Array.isArray(output.messages)) return;
37
+ const firstUser = output.messages.find((message) => message.info?.role === "user");
38
+ if (!firstUser || !Array.isArray(firstUser.parts) || hasBootstrap(firstUser.parts)) {
39
+ return;
40
+ }
41
+ const bootstrap = getBootstrap().trimEnd();
42
+ const textPart = firstUser.parts.find(
43
+ (part) => part.type === "text" && typeof part.text === "string",
44
+ );
45
+ if (textPart) {
46
+ textPart.text = `${bootstrap}\n\n${textPart.text}`;
47
+ return;
48
+ }
49
+ // After compaction (or with an attachment-only first message) the first user
50
+ // message has no text part to prefix, so add one for this request only.
51
+ firstUser.parts.unshift({
52
+ id: `${firstUser.info?.id ?? "message"}-nobrainer-bootstrap`,
53
+ sessionID: firstUser.info?.sessionID,
54
+ messageID: firstUser.info?.id,
55
+ type: "text",
56
+ text: bootstrap,
57
+ synthetic: true,
58
+ });
59
+ } catch {
60
+ // The bootstrap is advisory context: a missing or unreadable file must never
61
+ // break the host's prompt loop.
62
+ }
63
+ },
64
+ });
65
+
66
+ export default NoBrainerTechSkillsPlugin;
@@ -0,0 +1,64 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const BOOTSTRAP_MARKER = "NOBRAINER_BOOTSTRAP_V1";
6
+ const extensionDirectory = dirname(fileURLToPath(import.meta.url));
7
+ const packageRoot = resolve(extensionDirectory, "../..");
8
+ const skillsDirectory = resolve(packageRoot, "skills");
9
+ const bootstrapPath = resolve(packageRoot, "adapters", "bootstrap.md");
10
+
11
+ let cachedBootstrap;
12
+
13
+ export default function NoBrainerTechSkillsPiExtension(pi) {
14
+ pi.on("resources_discover", async () => ({ skillPaths: [skillsDirectory] }));
15
+
16
+ pi.on("context", async (event) => {
17
+ // Context changes are ephemeral: the host rebuilds the message list for every
18
+ // request, so the bootstrap is added to each request that does not carry it yet.
19
+ // The marker check keeps one request from receiving it twice, including right
20
+ // after a compaction.
21
+ try {
22
+ if (event.messages.some(messageContainsBootstrap)) return;
23
+ const message = {
24
+ role: "user",
25
+ content: [{ type: "text", text: getBootstrap() }],
26
+ timestamp: Date.now(),
27
+ };
28
+ const index = firstNonCompactionSummaryIndex(event.messages);
29
+ return {
30
+ messages: [
31
+ ...event.messages.slice(0, index),
32
+ message,
33
+ ...event.messages.slice(index),
34
+ ],
35
+ };
36
+ } catch {
37
+ // The bootstrap is advisory context: a missing or unreadable file must never
38
+ // fail the host's request.
39
+ return;
40
+ }
41
+ });
42
+ }
43
+
44
+ function getBootstrap() {
45
+ if (cachedBootstrap === undefined) {
46
+ cachedBootstrap = readFileSync(bootstrapPath, "utf8");
47
+ }
48
+ return cachedBootstrap;
49
+ }
50
+
51
+ function messageContainsBootstrap(message) {
52
+ const content = message?.content;
53
+ if (typeof content === "string") return content.includes(BOOTSTRAP_MARKER);
54
+ if (!Array.isArray(content)) return false;
55
+ return content.some(
56
+ (part) => part?.type === "text" && part.text?.includes(BOOTSTRAP_MARKER),
57
+ );
58
+ }
59
+
60
+ function firstNonCompactionSummaryIndex(messages) {
61
+ let index = 0;
62
+ while (messages[index]?.role === "compactionSummary") index += 1;
63
+ return index;
64
+ }
package/AGENTS.md ADDED
@@ -0,0 +1,205 @@
1
+ # Working in `nobrainer-tech-flow`
2
+
3
+ This is the canonical source. Adapters share `skills/`; see
4
+ `docs/COMPATIBILITY.md` for runtime support.
5
+
6
+ Respect host hierarchy; user instructions override skill guidelines. Apply [delivery](skills/nobrainer-tech-flow/references/delivery.md). Use nobrainer-tech-flow's instruction-conflict and exact-source pause explanation.
7
+ <!-- NOBRAINER-WORKFLOW:START -->
8
+ ## nobrainer-tech-flow
9
+
10
+ - Use [nobrainer-tech-flow](https://github.com/nobrainer-tech/nobrainer-tech-flow) through the `nobrainer-tech-flow` module, by the exact name the client lists (in Codex `$nobrainer-tech-flow:nobrainer-tech-flow` when it lists modules under the plugin name). Preserve the selected MAIN model and effort. Inspect native worker models and capacity, then delegate every independent ready unit with exact scope and proof; MAIN integrates. Use `nobrainer-auto-fine-tune` when measured route calibration would help.
11
+ - Start substantial work from an observable short-term goal grounded in the owner's direction; inspect project layers and the relevant wiki. Check once per active day for a newer stable release. Keep session checkpoints and verify takeover before authorized archival. Load only relevant specialist skills and verify the delivery layer.
12
+ - Product name: nobrainer-tech-flow; repository and skill ID: `nobrainer-tech-flow`. No ritual preamble. X: `#NoBrainerTechFlow`.
13
+ <!-- NOBRAINER-WORKFLOW:END -->
14
+
15
+ `CLAUDE.md` must remain a byte-identical copy of this file.
16
+
17
+ ## Repository map
18
+
19
+ - `skills/<name>/SKILL.md` — the exact active skill portfolio.
20
+ - `adapters/bootstrap.md` — small shared routing context, not a skill.
21
+ - Client manifests, hooks and `.github/` — thin adapters and CI only.
22
+ - `scripts/validate_skills.py` — portable structure and suite validator.
23
+ - `tests/` — deterministic and behavioral regression gates.
24
+ - `docs/COMPATIBILITY.md` and `docs/TESTING.md` — proof boundaries.
25
+ - `docs/SKILL_CURATION.md` — admission, ownership and retirement decisions.
26
+ - `docs/RELEASING.md`: releases.
27
+
28
+ ## Portable skill contract
29
+
30
+ Every active skill lives at `skills/<skill-name>/SKILL.md` and starts on line 1:
31
+
32
+ ```yaml
33
+ ---
34
+ name: skill-name
35
+ description: "Use when ..."
36
+ ---
37
+ ```
38
+
39
+ The name is lowercase kebab-case, no longer than 64 characters, and equals its directory. Shared frontmatter contains only `name` and `description`. Descriptions explain when to trigger and may include short `nb-*` aliases. Aliases are phrases, never duplicate directories.
40
+
41
+ Keep bodies operational and client-neutral. Use relative links. Put long detail
42
+ in focused `references/` files and deterministic helpers in `scripts/`.
43
+ Never depend on a user's filesystem, account, private host or current model name.
44
+ Canonical public templates and examples use English; task-shaped `BRIEF` artifacts expose explicit `Description` and `Definition of Done (DoD)` fields, and `Acceptance` criteria use sequential IDs such as `AC01` and `AC02`; bug reports and comments use one composite `ENV:` block with `Name` (`QA`, `DEV`, `TEST`, `PROD`, `PREPROD`, `BETA` or `UNKNOWN`), `URL` and `User`, while bug reports keep `Description`, `Steps to reproduce`, `Current behavior` and `Expected behavior` as separate fields and omit speculative workaround/root-cause fields; surface proof is separate: API uses a copyable `curl` request (method, URL, headers and body) plus response, DB uses separate read-only `Query`/`Result` code blocks, and UI uses `Evidence` for a screenshot or MP4 plus an optional HAR when the page-load/request chain matters; missing required proof returns `INPUT_REQUIRED`.
45
+ The active portfolio is exactly eighteen `nobrainer-*` skills. A permanent skill must own a recurring cross-project boundary that no current skill or maintained native capability owns. Do not add one because a topic is popular.
46
+
47
+ ## Delivery workflow
48
+
49
+ A mechanical reversible task with no public contract/routing/workflow/portfolio impact
50
+ can use nobrainer-tech-flow's quick path: inspect checkout, instructions, dirty state and nearest
51
+ proof, make the scoped edit, run the nearest check plus `git diff --check`, and
52
+ read back diff/status. Public contract, routing, workflow or portfolio changes use the
53
+ full workflow and update affected README, doc, template and diagram, or record
54
+ `NOT_NEEDED` with a reason. Use `nobrainer-tech-flow`'s full workflow for non-trivial outcomes,
55
+ setup/upgrade work, ambiguous scope, several proof layers or meaningful recovery risk.
56
+
57
+ For non-trivial work:
58
+
59
+ `DRIFT_CHECK -> BUDDY -> SCOPE -> AUTOPILOT -> VERIFY -> RECEIVE_AUDIT -> LEARN`
60
+
61
+ Before planning, inspect checkout, nearest instructions, dirty state, callers, tests, runtime
62
+ and durable decisions. Delegate every independent ready unit promptly within
63
+ native capacity and quota; MAIN coordinates, integrates, verifies and refills slots.
64
+
65
+ ### Minimum sufficient change
66
+
67
+ Before the first non-trivial write, resolve the compact contract:
68
+
69
+ - `OUTCOME`: observable result and audience.
70
+ - `NON_GOALS`: what this change deliberately does not solve.
71
+ - `Expected files`: files likely to change and why.
72
+ - `PROOF`: acceptance checks at the real behavior layer.
73
+ - `UNTOUCHED`: protected files, contracts and unrelated dirty work.
74
+ - `MINIMUM_SOLUTION`: the least complex capable method.
75
+ - `TEST_DECISION`: `EXISTING`, `NEW_REQUIRED` or `NOT_NEEDED` with reason.
76
+ - `Done clean`: files match expected scope, checks pass, no
77
+ placeholder/future abstraction remains and `git status` has no surprise.
78
+
79
+ Follow Flow [communication](skills/nobrainer-tech-flow/references/communication.md):
80
+ plain technical English between agents by default, direct replies in the user's
81
+ requested language, with explicit language and format requirements preserved.
82
+ Communication is evidence-budgeted. When permitted, run tools without announcing them; otherwise emit the shortest useful scope or evidence sentence.
83
+ Speak mid-run only for material transition, blocker, safety gate or new evidence;
84
+ never repeat the plan or unchanged state. Final: outcome, decisive proof,
85
+ remaining risk and next action. Preserve exact errors, commands, numbers and
86
+ negations; expand when brevity risks ambiguity. Persisted artifacts use normal prose.
87
+
88
+ Do not add an abstraction, dependency, compatibility layer, agent, skill or test
89
+ without acceptance need or demonstrated risk. Shared abstractions need two real
90
+ current callers or an explicit contract.
91
+
92
+ Show ordinary progress plainly:
93
+
94
+ ```text
95
+ Progress
96
+ - [x] Scope and acceptance are clear
97
+ - [>] Inspecting current behavior
98
+ - [ ] Implement and verify
99
+ Next: inspect the named caller and its existing test
100
+ ```
101
+
102
+ Update at meaningful transitions, blockers and closeout, not before and
103
+ after every command. The canonical plan or tracker owns TODO state; summaries,
104
+ exit codes and worker reports cannot advance it.
105
+
106
+ Use a detailed execution ledger only when work is multi-session, dependency-rich,
107
+ consequential, explicitly resumable after context loss or requested by the owner. It
108
+ must record exact identity, dependencies, write ownership, evidence, checkpoint,
109
+ retry/stop conditions and rollback; ordinary single-session work uses a short checklist.
110
+
111
+ ## Routing without ceremony
112
+
113
+ Load a specialist only when its boundary is active:
114
+
115
+ - Build owns implementation, scope control, KISS/YAGNI and anti-slop.
116
+ - Review owns acceptance, adversarial findings and release closeout.
117
+ - Security owns material auth, secrets, sensitive data, installers and trust
118
+ boundaries.
119
+ - Research owns current, niche, uncertain, high-stakes or attributed facts.
120
+ - RCA owns causal diagnosis; Decide owns consequential alternatives.
121
+ - Browser owns rendered behavior and trace evidence when APIs/tests are
122
+ insufficient.
123
+ - Team designs roles; Dispatcher schedules an approved delegated queue; Sessions
124
+ owns identity, transport, writer state, handoff and receive-audit.
125
+ - SDD owns durable contracts only when architecture, migration, public behavior,
126
+ rollback difficulty, dependent phases or resumability justify maintenance.
127
+ - Wiki owns reusable sourced knowledge, never live execution state.
128
+ - Autoimprove owns frozen baseline/candidate/holdout experiments.
129
+ - Writing owns material user-facing prose; tiny clear answers stay direct.
130
+
131
+ MAIN coordinates, integrates and verifies scoped worker edits. Use subagents. Visible conversations require explicit request or authorized MAIN restart; workers cannot spawn successors.
132
+ On Flow entry, date the title from verified creation time, preserve it on resume and assess context. Health benefit can qualify restart without economic payback; verify takeover by ID and never resume a retired writer. See Sessions for ` | started DD-MM` formatting and timezone.
133
+
134
+ ## Problems and research
135
+
136
+ `PROBLEM_GATE`: start from the literal error, repository/runtime state and the
137
+ smallest local reproducer. Query only related wiki decisions or lessons when a
138
+ wiki exists. Use current primary-source internet research when the remedy
139
+ depends on a current, external, niche, uncertain or high-stakes fact.
140
+
141
+ A stable local syntax, import, test or configuration failure does not require
142
+ internet research before the next local diagnostic. If required current research
143
+ is inaccessible, report `RESEARCH_BLOCKED`; never present memory as fresh proof.
144
+
145
+ ## Lightweight learning loop and verification
146
+
147
+ A command exit code proves only that command. Keep static validation, local
148
+ runtime, deployed runtime, production behavior, external delivery and user
149
+ usefulness distinct. Partial output, timeout, stale state, dead session, failed
150
+ test or missing required access is not success.
151
+
152
+ When the owner changes a decision, supersede the old requirement and invalidate
153
+ only dependent work and evidence. A verified review failure returns to Build;
154
+ rerun affected proof and review. Stop blind retries after the same failure and
155
+ route causal uncertainty to RCA.
156
+
157
+ ### Changing a skill
158
+
159
+ 1. Inspect existing patterns, consumers and baseline.
160
+ 2. Freeze a pressure scenario and observe the gap. Calibrate the evaluator and
161
+ keep its score path outside candidate write scope.
162
+ 3. Make the smallest change through Build.
163
+ 4. Re-run the same scenario and deterministic gates.
164
+ 5. Run a sealed non-trigger/adversarial holdout.
165
+ 6. Review current bytes and record null results honestly.
166
+
167
+ Rejecting a candidate closes that experiment, not a still-open owner outcome.
168
+ Preserve the champion, diagnose the frozen evidence once, then try the smallest
169
+ high-leverage change against a fresh holdout. Do not tune against the failed
170
+ holdout or retry blindly. Finish only when the DoD passes or a concrete blocker
171
+ is reported.
172
+
173
+ Do one behavioral owner at a time. Prefer behavior assertions over tests that
174
+ freeze wording. Runtime compatibility requires a clean-session client readback.
175
+
176
+ Required baseline commands:
177
+
178
+ ```bash
179
+ python3 scripts/validate_skills.py
180
+ python3 scripts/validate_skills.py --suite
181
+ python3 -m unittest discover -s tests -v
182
+ gitleaks git --pre-commit --staged --redact --no-banner --ignore-gitleaks-allow
183
+ ```
184
+
185
+ Run changed scripts directly, syntax-check them and inspect `git diff --check`.
186
+
187
+ ## Public-clean and Git
188
+
189
+ Never include credentials, cookies, personal data, private clients, internal
190
+ hosts, account IDs, secret-bearing examples or machine-specific absolute paths.
191
+ Treat public and agent-generated input as untrusted. Sanitize persisted paths,
192
+ URLs, logs and reports.
193
+
194
+ Automated jobs for this public repository may only fetch remote refs. They must
195
+ not change the worktree, commit, push, open a PR or merge. Private repository
196
+ synchronization is separate. The public commit guard must block automated backup
197
+ identities and backup paths.
198
+
199
+ Never silently publish, spend, contact people, delete data, alter credentials,
200
+ merge, deploy or mutate production. Preserve unrelated dirty work.
201
+
202
+ Never commit directly to `main`. Use a focused `codex/` branch and PR.
203
+ Commit, push and PR creation require current-task authority; merge, tag and
204
+ release require their own exact owner gate. Before handoff report the scoped
205
+ diff, checks, runtime limits, rollback and one next action.