nobrainer-tech-flow 2.5.0 → 2.6.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +12 -8
- package/docs/INSTALL.md +31 -20
- package/docs/releases/v2.6.0.md +73 -0
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/scripts/install.py +3 -1
- package/scripts/install.sh +24 -5
- package/scripts/install_personalization.py +51 -16
- package/skills/nobrainer-build/SKILL.md +6 -2
- package/skills/nobrainer-tech-flow/SKILL.md +3 -3
- package/skills/nobrainer-tech-flow/VERSION +1 -1
- package/skills/nobrainer-tech-flow/references/daily-update.md +5 -2
- package/skills/nobrainer-tech-flow/references/delivery.md +17 -2
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
{
|
|
9
9
|
"name": "nobrainer-tech-flow",
|
|
10
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.
|
|
11
|
+
"version": "2.6.0",
|
|
12
12
|
"source": "./",
|
|
13
13
|
"author": {
|
|
14
14
|
"name": "NoBrainer Tech"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nobrainer-tech-flow",
|
|
3
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
|
+
"version": "2.6.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "NoBrainer Tech"
|
|
7
7
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nobrainer-tech-flow",
|
|
3
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
|
+
"version": "2.6.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "NoBrainer Tech",
|
|
7
7
|
"url": "https://nobrainer.tech"
|
package/README.md
CHANGED
|
@@ -260,8 +260,10 @@ sh ~/.nobrainer-tech-flow/scripts/install.sh --client claude --apply # link th
|
|
|
260
260
|
`--client` is `claude`, `codex`, `opencode` or `copilot`. Cursor, Gemini CLI, Pi and Kimi Code
|
|
261
261
|
use a plugin or extension instead: see their sections in
|
|
262
262
|
[docs/INSTALL.md](docs/INSTALL.md#client-channels). The script links all eighteen skills and adds
|
|
263
|
-
one instruction block, shows the exact text first, refuses anything that is not its own
|
|
264
|
-
|
|
263
|
+
one instruction block, shows the exact text first, refuses anything that is not its own and
|
|
264
|
+
undoes itself with `--undo --apply`. The block lets Flow update itself to verified stable
|
|
265
|
+
releases once a day; `install_personalization.py --no-auto-update` turns that into a
|
|
266
|
+
notification only. No other authorization is granted. To update, run `git pull` in
|
|
265
267
|
`~/.nobrainer-tech-flow` and the same two commands again, or paste the prompt again. With Python,
|
|
266
268
|
`python3 scripts/install.py` takes the same flags.
|
|
267
269
|
|
|
@@ -303,7 +305,8 @@ next command.
|
|
|
303
305
|
`install.py`, like `scripts/install.sh` without Python, links all eighteen skills
|
|
304
306
|
and adds one managed instruction block for `claude`, `codex`, `opencode` or
|
|
305
307
|
`copilot`. The preview shows the exact text it would write, a target that is not
|
|
306
|
-
its own link is refused,
|
|
308
|
+
its own link is refused, the only standing authorization is the default daily Flow
|
|
309
|
+
update (opt out with `install_personalization.py --no-auto-update`), and
|
|
307
310
|
`python3 scripts/install.py --client codex --undo --apply` reverses it. It needs
|
|
308
311
|
symbolic links (Windows: Developer Mode). For a subset, a copy install, the shared
|
|
309
312
|
`agents` folder or another client, use the individual scripts in
|
|
@@ -531,14 +534,15 @@ prove production. See [Compatibility](docs/COMPATIBILITY.md) for current proof
|
|
|
531
534
|
and [Testing](docs/TESTING.md) for acceptance evidence.
|
|
532
535
|
|
|
533
536
|
|
|
534
|
-
**What's new in 2.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
+
**What's new in 2.6.0:** Flow delegates aggressively: independent units of
|
|
538
|
+
substantial work go to parallel native subagents, sized so parallel work pays for its
|
|
539
|
+
start-up cost, verification depth follows how risky and reversible a change is, and one
|
|
540
|
+
line in the instruction block keeps Flow updated by default (`--no-auto-update` opts out).
|
|
537
541
|
See [RELEASE-NOTES.md](RELEASE-NOTES.md).
|
|
538
542
|
|
|
539
|
-
Current source version: **2.
|
|
543
|
+
Current source version: **2.6.0**. Check the
|
|
540
544
|
[latest published GitHub release](https://github.com/nobrainer-tech/nobrainer-tech-flow/releases/latest)
|
|
541
|
-
for distribution and the [2.5.0](docs/releases/v2.5.0.md) and
|
|
545
|
+
for distribution and the [2.6.0](docs/releases/v2.6.0.md), [2.5.0](docs/releases/v2.5.0.md) and
|
|
542
546
|
[2.4.0 verification records](docs/releases/v2.4.0.md) for
|
|
543
547
|
the current scope, reproducible checks and client-runtime limits. The unchanged command runner keeps its
|
|
544
548
|
[v1.7.0 verification scope](docs/releases/v1.7.0.md). Source publication does not
|
package/docs/INSTALL.md
CHANGED
|
@@ -14,9 +14,9 @@ upgraded merely because the new source is installed nearby.
|
|
|
14
14
|
Node 18+ and Python 3.11+ are prerequisites. Preview the setup first:
|
|
15
15
|
|
|
16
16
|
```sh
|
|
17
|
-
npx nobrainer-tech-flow@2.
|
|
18
|
-
npx nobrainer-tech-flow@2.
|
|
19
|
-
npx nobrainer-tech-flow@2.
|
|
17
|
+
npx nobrainer-tech-flow@2.6.0 --client codex
|
|
18
|
+
npx nobrainer-tech-flow@2.6.0 --client codex --apply
|
|
19
|
+
npx nobrainer-tech-flow@2.6.0 --client codex --undo --apply
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Use claude for Claude Code, opencode or copilot for those clients. Add --home PATH
|
|
@@ -24,7 +24,7 @@ for an isolated profile. These commands become available once this version is
|
|
|
24
24
|
published on npm; a source candidate is not registry availability.
|
|
25
25
|
|
|
26
26
|
Application copies the release files into the chosen home directory's
|
|
27
|
-
.nobrainer-tech-flow-npm/2.
|
|
27
|
+
.nobrainer-tech-flow-npm/2.6.0 and verifies the copy. That folder sits beside
|
|
28
28
|
~/.nobrainer-tech-flow, where the Git installation suggests a clone, so cleaning
|
|
29
29
|
the clone cannot delete the files the skill links point to. Releases before 2.3.2
|
|
30
30
|
kept their copy in .nobrainer-tech-flow/npm; undo such a setup with the command of
|
|
@@ -106,14 +106,18 @@ flags). The two share the setup record, so either one undoes what the other did.
|
|
|
106
106
|
- Running `--apply` again when nothing needs to change prints `UP TO DATE` and no
|
|
107
107
|
restart hint. `INSTALLED` and the restart hint appear only when a link or the
|
|
108
108
|
instruction file was written.
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
109
|
+
- The only standing authorization it writes is the default one-line daily update of
|
|
110
|
+
Flow itself to a verified stable release; session rotation still needs its own
|
|
111
|
+
opt-in. When the block in the instruction file is the text of an earlier version,
|
|
112
|
+
both scripts replace it with this version's text, keep everything outside the two
|
|
113
|
+
markers byte for byte and save the file as it was as a `.bak` copy first. Both keep
|
|
114
|
+
the update choice: an existing block updates itself again only when it holds the
|
|
115
|
+
update line as its own line, and a notify-only, edited or unknown update line is
|
|
116
|
+
replaced by the one-line notify-only rule. `install.py` also keeps session-restart
|
|
117
|
+
and wiki-root settings as `--keep-options` keeps them; `install.sh` leaves a block
|
|
118
|
+
that carries one of those options or a preference, or whose markers do not stand on
|
|
119
|
+
lines of their own, exactly as it is and says so. Change options with
|
|
120
|
+
`install_personalization.py`.
|
|
117
121
|
- `--undo` (a preview until `--apply` is added) removes exactly the links the setup
|
|
118
122
|
created and puts the managed block back as it was before the first setup:
|
|
119
123
|
removed, or the block that was there before. The rest of the instruction file
|
|
@@ -276,17 +280,24 @@ the instructions. A guided setup recorded earlier for the Codex file asks for an
|
|
|
276
280
|
undo before it writes the Claude file. `agents` needs an explicit verified
|
|
277
281
|
`--path`. For a resolved global wiki,
|
|
278
282
|
pass `--wiki-root PATH` pointing at a directory containing `WIKI.md`; this
|
|
279
|
-
records the actual location in the personalization block.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
283
|
+
records the actual location in the personalization block. Since 2.6.0 the
|
|
284
|
+
block keeps Flow updated by default with one line: once a day on first use,
|
|
285
|
+
update to the latest verified stable release from the canonical source, with a
|
|
286
|
+
backup, changing nothing else. `--no-auto-update` writes a one-line notify-only
|
|
287
|
+
rule instead; `--auto-update` is still accepted and means the default. With
|
|
288
|
+
`--keep-options` an opt-out already in the block stays, and the longer update
|
|
289
|
+
lines written before 2.6.0 become the matching short line (an old grant stays a
|
|
290
|
+
grant, the old notify-only default stays notify-only). An update line that is
|
|
291
|
+
neither recognized grant becomes the notify-only line: updates are never inferred. `--auto-session-restart`
|
|
292
|
+
opts into evidence-gated session rotation. A later run without those flags
|
|
293
|
+
writes the default block again; add `--keep-options` to keep the update choice,
|
|
294
|
+
session-restart and wiki-root settings already in the block (the guided setup
|
|
295
|
+
always does). A grant counts
|
|
285
296
|
only as the exact line the installer writes for it, so wording quoted in a
|
|
286
297
|
`--preferences` value never becomes one, and a preference or wiki path must be
|
|
287
298
|
one printable line. A grant line that was edited is not kept, and the run says so
|
|
288
|
-
and names the flag that grants it again.
|
|
289
|
-
|
|
299
|
+
and names the flag that grants it again. With the
|
|
300
|
+
notify-only line, the first active `nobrainer-tech-flow` use each day checks and
|
|
290
301
|
notifies. Use a scheduler separately if updates must be checked on inactive days.
|
|
291
302
|
|
|
292
303
|
A newer release must be obtained at a verified immutable ref before any
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# nobrainer-tech-flow 2.6.0: delegate aggressively, verify by risk
|
|
2
|
+
|
|
3
|
+
Release date: 2026-10-23.
|
|
4
|
+
|
|
5
|
+
This release changes workflow guidance and the update line of the instruction block.
|
|
6
|
+
The setup record and the module set (eighteen) do not change.
|
|
7
|
+
|
|
8
|
+
## What changes
|
|
9
|
+
|
|
10
|
+
- **Aggressive delegation as the default.** `skills/nobrainer-tech-flow/SKILL.md` now opens
|
|
11
|
+
substantial work with "Delegate aggressively": independent units run on parallel native
|
|
12
|
+
subagents through team execution, and MAIN integrates, verifies and refills slots.
|
|
13
|
+
`references/delivery.md` adds the reason (delegation is the default route to a faster
|
|
14
|
+
done), keeps only tiny, tightly coupled, gated or shared-state steps in MAIN, and sets a
|
|
15
|
+
cost rule: delegate a unit when parallel work shortens the time to done more than a
|
|
16
|
+
worker's start-up costs, send a short task packet rather than the whole conversation,
|
|
17
|
+
ask for a concise report, and give narrow, mechanical work to a cheaper model under the
|
|
18
|
+
host's policy. No model is named.
|
|
19
|
+
- **Resend only failed units.** When part of a batch fails, only the failed units go out
|
|
20
|
+
again with their new evidence; accepted units are not rerun.
|
|
21
|
+
- **Verification by blast radius.** `references/delivery.md` scales verification to how
|
|
22
|
+
risky and reversible a change is. Reversible, low-risk changes may proceed on green
|
|
23
|
+
automated tests, review and security checks. CI configuration, credentials,
|
|
24
|
+
security-sensitive paths, data migrations and irreversible effects need an independent
|
|
25
|
+
review and remain owner-gated. An agent's approval never counts as the owner's.
|
|
26
|
+
- **Two build rules.** `skills/nobrainer-build/SKILL.md`: before adding complexity for a
|
|
27
|
+
speculative race or security edge case, name the concrete failure, its likelihood and
|
|
28
|
+
the cost; and in user interfaces, taglines, helper text and secondary labels added to
|
|
29
|
+
explain a screen count as slop, so the layout gets fixed instead.
|
|
30
|
+
|
|
31
|
+
## Daily updates by default, in one line
|
|
32
|
+
|
|
33
|
+
The managed instruction block now carries one short update line, on by default for new
|
|
34
|
+
setups: "Once a day on first use, update nobrainer-tech-flow to its latest verified stable
|
|
35
|
+
release from the canonical source, with a backup; change nothing else and ask if unsure."
|
|
36
|
+
`install_personalization.py --no-auto-update` writes the one-line opt-out instead ("tell
|
|
37
|
+
the owner when a newer stable nobrainer-tech-flow release exists; do not update it
|
|
38
|
+
yourself"); `--auto-update` stays accepted and means the default. With `--keep-options`
|
|
39
|
+
(which `install.py` and the guided setup always pass) the longer lines written before 2.6.0
|
|
40
|
+
become the matching short line: an old update grant stays a grant and the old notify-only
|
|
41
|
+
default stays notify-only, so no existing setup starts updating itself without a choice.
|
|
42
|
+
An update line that is neither recognized grant, for example one edited by hand, becomes
|
|
43
|
+
the notify-only line. `install.sh` follows the same rule when it refreshes an earlier block:
|
|
44
|
+
it rewrites the block in this version's text but keeps notifying unless the block held the
|
|
45
|
+
update line as its own line.
|
|
46
|
+
|
|
47
|
+
## Sources
|
|
48
|
+
|
|
49
|
+
The delegation rule is an owner decision (2026-10-23). The other rules were drawn from the
|
|
50
|
+
owner's recent X bookmarks and checked against the replies under each post; ideas that the
|
|
51
|
+
replies credibly disputed (a "canary" line to detect context decay, a viral prompt with a
|
|
52
|
+
false attribution) were left out.
|
|
53
|
+
|
|
54
|
+
## Verification record
|
|
55
|
+
|
|
56
|
+
Local checks (macOS, Python 3.14.5):
|
|
57
|
+
|
|
58
|
+
- `python3 scripts/validate_skills.py` and `python3 scripts/validate_skills.py --suite`: OK.
|
|
59
|
+
- `skills/nobrainer-tech-flow/SKILL.md` stays within the suite budget (239 lines, 1,749
|
|
60
|
+
words; limits 240 and 1,750).
|
|
61
|
+
- `python3 -m unittest tests.test_suite tests.test_delegation_contract
|
|
62
|
+
tests.test_visible_session_rule`: 81 tests OK.
|
|
63
|
+
- `python3 -m unittest tests.test_shell_installer tests.test_personalization
|
|
64
|
+
tests.test_one_command_installer tests.test_guided_onboarding`: OK, including the new
|
|
65
|
+
cases for the default update line, the opt-out, pre-2.6 blocks, edited or unknown update
|
|
66
|
+
lines and preferences that quote the update wording.
|
|
67
|
+
- `sh -n`, `dash -n` and `shellcheck -S error` on `scripts/install.sh`: clean.
|
|
68
|
+
- `git diff --check`: clean.
|
|
69
|
+
- An independent read-only review found four issues in the update-line handling and its
|
|
70
|
+
documentation (an unrecognized notify-only line could turn into an update grant); all
|
|
71
|
+
were fixed and a second review pass confirmed the fixes.
|
|
72
|
+
|
|
73
|
+
The full suite runs in the Validate workflow for the tagged commit.
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nobrainer-tech-flow",
|
|
3
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
|
+
"version": "2.6.0",
|
|
5
5
|
"contextFileName": "GEMINI.md"
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nobrainer-tech-flow",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"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.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": ".opencode/plugins/nobrainer-tech-skills.js",
|
package/plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "nobrainer-tech-flow",
|
|
4
4
|
"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.",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.6.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "NoBrainer Tech",
|
|
8
8
|
"url": "https://nobrainer.tech"
|
package/scripts/install.py
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
Every run is a dry run until --apply. The skills are linked and the managed
|
|
5
5
|
instruction block is written by the same helpers as the manual and guided setups,
|
|
6
6
|
and --undo uses the guided setup's rollback state (as scripts/install.sh does), so
|
|
7
|
-
every path reverses the same way.
|
|
7
|
+
every path reverses the same way. The only standing authorization it writes is the
|
|
8
|
+
default daily update of Flow itself, and an existing block keeps notifying unless it
|
|
9
|
+
already held that update line.
|
|
8
10
|
"""
|
|
9
11
|
|
|
10
12
|
from __future__ import annotations
|
package/scripts/install.sh
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
# Same flags, locations, conflict rule and setup record as scripts/install.py, so
|
|
5
5
|
# either one can undo what the other did. Every run previews until --apply. The
|
|
6
6
|
# skills are linked to this checkout (never copied), one managed instruction block
|
|
7
|
-
# is added
|
|
7
|
+
# is added. Its only standing authorization is the default daily update of Flow itself;
|
|
8
|
+
# an existing block keeps notifying unless it already held that line. A managed block that is
|
|
8
9
|
# already there is replaced by this version's text when it differs, and everything
|
|
9
10
|
# outside the two markers stays byte for byte, as install.py does. One difference: a
|
|
10
11
|
# block that carries options (a standing authorization, a wiki root or a preference)
|
|
@@ -47,6 +48,12 @@ SEPARATORS=$(printf '\342\200[\250\251]')
|
|
|
47
48
|
TAB=$(printf '\t')
|
|
48
49
|
CR=$(printf '\r')
|
|
49
50
|
|
|
51
|
+
# The update line of the block: on by default; an existing block that only notifies
|
|
52
|
+
# (written with --no-auto-update, or the default before 2.6.0) keeps notifying.
|
|
53
|
+
AUTO_UPDATE_LINE='- Once a day on first use, update nobrainer-tech-flow to its latest verified stable release from the canonical source, with a backup; change nothing else and ask if unsure.'
|
|
54
|
+
NOTIFY_UPDATE_LINE='- Once a day on first use, tell the owner when a newer stable nobrainer-tech-flow release exists; do not update it yourself.'
|
|
55
|
+
update_line=$AUTO_UPDATE_LINE
|
|
56
|
+
|
|
50
57
|
# The block scripts/install_personalization.py writes without options, byte for byte
|
|
51
58
|
# (a test compares them).
|
|
52
59
|
block() {
|
|
@@ -61,7 +68,9 @@ block() {
|
|
|
61
68
|
- Derive short-term goals from the user's long-term direction (LDD) and define observable completion criteria. At project start, inspect the existing structure and layers, then recommend a fitting approach.
|
|
62
69
|
- At project start, discover whether a relevant wiki exists. If one exists, read its `WIKI.md`, locate relevant `index.md` entries with a targeted search, then read only the relevant pages. Ask before creating a wiki unless project rules or prior authorization already settle it.
|
|
63
70
|
- Assess context and checkpoint at appropriate milestones. Recommend session rotation when it would help; do not restart or archive automatically. When rotation is authorized, use the supported lifecycle, verify exact successor takeover by ID/readback, and archive the old session only after that readback. Do not create recursive visible workers or claim a restart when unsupported.
|
|
64
|
-
|
|
71
|
+
EOF
|
|
72
|
+
printf '%s\n' "$update_line"
|
|
73
|
+
cat <<'EOF'
|
|
65
74
|
- Use `nobrainer-writing` for material writing when available; make technical documentation concrete, source-backed, and technically verified. Preserve facts, use the user's language, and verify at the actual delivery layer.
|
|
66
75
|
<!-- NOBRAINER-TECH-FLOW:END -->
|
|
67
76
|
EOF
|
|
@@ -806,6 +815,12 @@ plan_instructions() {
|
|
|
806
815
|
die 3 "malformed or duplicated nobrainer-tech-flow managed markers in $target"
|
|
807
816
|
fi
|
|
808
817
|
file_status=present
|
|
818
|
+
# An existing block keeps updating only when it holds the update line as its own line;
|
|
819
|
+
# a notify-only, edited or unknown line keeps notifying, so no grant is ever inferred.
|
|
820
|
+
if block_lines "$target" && ! head -n "$block_to" "$target" | tail -n "+$block_from" |
|
|
821
|
+
LC_ALL=C sed 's/[[:space:]]*$//' | grep -a -q -x -F -e "$AUTO_UPDATE_LINE"; then
|
|
822
|
+
update_line=$NOTIFY_UPDATE_LINE
|
|
823
|
+
fi
|
|
809
824
|
# A block of an earlier version is brought up to date, but only one that can be replaced
|
|
810
825
|
# without losing anything: its markers stand on lines of their own, and it holds no option.
|
|
811
826
|
if ! block_is_default && block_lines "$target" && ! block_has_options; then
|
|
@@ -827,6 +842,10 @@ block_lines() {
|
|
|
827
842
|
[ "$block_from" -lt "$block_to" ]
|
|
828
843
|
}
|
|
829
844
|
|
|
845
|
+
update_status() {
|
|
846
|
+
if [ "$update_line" = "$NOTIFY_UPDATE_LINE" ]; then echo CHECK_AND_NOTIFY; else echo AUTHORIZED_SAFE_VERIFIED_ONLY; fi
|
|
847
|
+
}
|
|
848
|
+
|
|
830
849
|
block_is_default() {
|
|
831
850
|
block_lines "$target" || return 1
|
|
832
851
|
_b_text=$(head -n "$block_to" "$target" | tail -n "+$block_from")
|
|
@@ -836,7 +855,7 @@ block_is_default() {
|
|
|
836
855
|
}
|
|
837
856
|
|
|
838
857
|
# block_has_options: the block block_lines found in $target carries something the owner
|
|
839
|
-
# chose: a standing authorization, a wiki root or a preference. Only install.py and
|
|
858
|
+
# chose: a pre-2.6 standing authorization, a wiki root or a preference. Only install.py and
|
|
840
859
|
# scripts/install_personalization.py --keep-options carry those over to a new block.
|
|
841
860
|
block_has_options() {
|
|
842
861
|
head -n "$block_to" "$target" | tail -n "+$block_from" |
|
|
@@ -873,7 +892,7 @@ preview() {
|
|
|
873
892
|
elif [ "$file_status" = refresh ]; then
|
|
874
893
|
block_lines "$target"
|
|
875
894
|
say "UPDATE: nobrainer-tech-flow personalization block"
|
|
876
|
-
say "AUTO_UPDATE:
|
|
895
|
+
say "AUTO_UPDATE: $(update_status)"
|
|
877
896
|
say "AUTO_SESSION_RESTART: ASSESS_CHECKPOINT_RECOMMEND"
|
|
878
897
|
say "PRESERVED: content outside the managed block"
|
|
879
898
|
say "DIFF:"
|
|
@@ -881,7 +900,7 @@ preview() {
|
|
|
881
900
|
block | sed 's/^/+/'
|
|
882
901
|
else
|
|
883
902
|
say "MISSING: nobrainer-tech-flow personalization block"
|
|
884
|
-
say "AUTO_UPDATE:
|
|
903
|
+
say "AUTO_UPDATE: $(update_status)"
|
|
885
904
|
say "AUTO_SESSION_RESTART: ASSESS_CHECKPOINT_RECOMMEND"
|
|
886
905
|
say "DIFF:"
|
|
887
906
|
block | sed 's/^/+/'
|
|
@@ -27,10 +27,17 @@ LEGACY_FLOW_INSTRUCTIONS = re.compile(
|
|
|
27
27
|
r"\bnobrainer-ultra\b|^\s*#{1,6}\s+NoBrainer(?:[ .]?Tech)?\s+Flow\b",
|
|
28
28
|
re.IGNORECASE | re.MULTILINE,
|
|
29
29
|
)
|
|
30
|
-
# The
|
|
30
|
+
# The lines that carry a standing authorization. --keep-options recognises a grant
|
|
31
31
|
# only as one of these exact lines, never as a phrase somewhere in the block, so free
|
|
32
32
|
# text in a preference cannot forge one.
|
|
33
|
-
AUTO_UPDATE_RULE = "-
|
|
33
|
+
AUTO_UPDATE_RULE = "- Once a day on first use, update nobrainer-tech-flow to its latest verified stable release from the canonical source, with a backup; change nothing else and ask if unsure."
|
|
34
|
+
# The opt-out written by --no-auto-update.
|
|
35
|
+
NOTIFY_UPDATE_RULE = "- Once a day on first use, tell the owner when a newer stable nobrainer-tech-flow release exists; do not update it yourself."
|
|
36
|
+
# Lines written before 2.6.0. --keep-options maps them to the short rules above and
|
|
37
|
+
# keeps the owner's choice: the old grant stays a grant, the old notify-only default
|
|
38
|
+
# stays notify-only.
|
|
39
|
+
LEGACY_AUTO_UPDATE_RULE = "- On the first `nobrainer-tech-flow` use each calendar day, check for a safe verified update when this client exposes a supported check. This setting grants standing authorization to apply a `nobrainer-tech-flow`-only update after verifying the canonical source/version, reviewing the exact changes, and making a recoverable backup. Never apply destructive, unrelated, or uncertain changes; ask the owner first. If the client is inactive or cannot check, do not claim a check occurred."
|
|
40
|
+
LEGACY_NOTIFY_UPDATE_RULE = "- On the first `nobrainer-tech-flow` use each calendar day, check for available updates when this client exposes a supported check and notify the owner; do not apply them automatically. If the client is inactive or cannot check, do not claim a check occurred."
|
|
34
41
|
AUTO_SESSION_RULE = "- This setting grants standing authorization for session rotation only when the host supports creating a fresh successor, context or checkpoint evidence warrants rotation, and no write is in flight. Create the successor, verify exact takeover by ID/readback, and archive the old session only after that readback. Do not create recursive visible workers or claim a restart when unsupported."
|
|
35
42
|
|
|
36
43
|
|
|
@@ -57,6 +64,28 @@ def earlier_grant(existing: str, rule: str, phrase: str, label: str, flag: str)
|
|
|
57
64
|
return False
|
|
58
65
|
|
|
59
66
|
|
|
67
|
+
# Wording of an update grant, current or pre-2.6, used only to warn that an edited one
|
|
68
|
+
# was not kept.
|
|
69
|
+
UPDATE_GRANT_PHRASES = (
|
|
70
|
+
"update nobrainer-tech-flow to its latest verified stable release",
|
|
71
|
+
"grants standing authorization to apply a `nobrainer-tech-flow`-only update",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def saved_update_choice(existing: str) -> bool:
|
|
76
|
+
"""True only when an existing block holds an update grant as its own line.
|
|
77
|
+
|
|
78
|
+
Anything else, a notify-only line, an edited or unknown one, keeps notifying:
|
|
79
|
+
an update grant is never inferred. Trailing spaces on the line are ignored, and
|
|
80
|
+
a preference that quotes the wording is not a line of its own.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
return any(
|
|
84
|
+
re.search(r"(?m)^" + re.escape(rule) + r"[ \t]*\r?$", existing) is not None
|
|
85
|
+
for rule in (AUTO_UPDATE_RULE, LEGACY_AUTO_UPDATE_RULE)
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
60
89
|
def unsafe_line(value: str) -> bool:
|
|
61
90
|
"""True when ``value`` cannot be one plain Markdown line (or could split into two)."""
|
|
62
91
|
|
|
@@ -85,11 +114,7 @@ def build_block(
|
|
|
85
114
|
if wiki_root is not None
|
|
86
115
|
else "- At project start, discover whether a relevant wiki exists. If one exists, read its `WIKI.md`, locate relevant `index.md` entries with a targeted search, then read only the relevant pages. Ask before creating a wiki unless project rules or prior authorization already settle it."
|
|
87
116
|
)
|
|
88
|
-
update_rule =
|
|
89
|
-
AUTO_UPDATE_RULE
|
|
90
|
-
if auto_update
|
|
91
|
-
else "- On the first `nobrainer-tech-flow` use each calendar day, check for available updates when this client exposes a supported check and notify the owner; do not apply them automatically. If the client is inactive or cannot check, do not claim a check occurred."
|
|
92
|
-
)
|
|
117
|
+
update_rule = AUTO_UPDATE_RULE if auto_update else NOTIFY_UPDATE_RULE
|
|
93
118
|
session_rule = (
|
|
94
119
|
AUTO_SESSION_RULE
|
|
95
120
|
if auto_session_restart
|
|
@@ -356,10 +381,16 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
|
356
381
|
type=Path,
|
|
357
382
|
help="project wiki root containing WIKI.md; its resolved path is added to the managed instructions",
|
|
358
383
|
)
|
|
359
|
-
parser.
|
|
384
|
+
updates = parser.add_mutually_exclusive_group()
|
|
385
|
+
updates.add_argument(
|
|
360
386
|
"--auto-update",
|
|
361
387
|
action="store_true",
|
|
362
|
-
help="
|
|
388
|
+
help="update nobrainer-tech-flow once a day from its verified stable releases (the default)",
|
|
389
|
+
)
|
|
390
|
+
updates.add_argument(
|
|
391
|
+
"--no-auto-update",
|
|
392
|
+
action="store_true",
|
|
393
|
+
help="only tell the owner about a newer stable release; never update automatically",
|
|
363
394
|
)
|
|
364
395
|
parser.add_argument(
|
|
365
396
|
"--auto-session-restart",
|
|
@@ -374,7 +405,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
|
374
405
|
"--keep-options",
|
|
375
406
|
action="store_true",
|
|
376
407
|
help=(
|
|
377
|
-
"keep the
|
|
408
|
+
"keep the update, session-restart and wiki-root settings already in the "
|
|
378
409
|
"managed block; flags given on this run are added to them, never removed"
|
|
379
410
|
),
|
|
380
411
|
)
|
|
@@ -429,15 +460,19 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
429
460
|
saved = SAVED_PREFERENCE.search(existing)
|
|
430
461
|
if saved:
|
|
431
462
|
preferences = saved.group(1)
|
|
432
|
-
auto_update = args.
|
|
463
|
+
auto_update = not args.no_auto_update
|
|
433
464
|
auto_session_restart = args.auto_session_restart
|
|
434
465
|
if args.keep_options and existing:
|
|
435
466
|
kept: list[str] = []
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
467
|
+
saved_update = saved_update_choice(existing)
|
|
468
|
+
if not (args.auto_update or args.no_auto_update) and not saved_update:
|
|
469
|
+
auto_update = False
|
|
470
|
+
kept.append("notify-only updates")
|
|
471
|
+
if any(phrase in existing for phrase in UPDATE_GRANT_PHRASES):
|
|
472
|
+
print(
|
|
473
|
+
"NOTE: an earlier update authorization was not kept because its line no longer "
|
|
474
|
+
"matches what this installer writes; pass --auto-update to grant it again"
|
|
475
|
+
)
|
|
441
476
|
if not auto_session_restart and earlier_grant(
|
|
442
477
|
existing,
|
|
443
478
|
AUTO_SESSION_RULE,
|
|
@@ -37,7 +37,9 @@ Apply these principles as decision rules, not slogans:
|
|
|
37
37
|
|
|
38
38
|
- `KISS`: choose the simplest complete design that satisfies acceptance.
|
|
39
39
|
- `YAGNI`: do not add extension points, compatibility layers or options for an
|
|
40
|
-
unproven future requirement.
|
|
40
|
+
unproven future requirement. Before adding complexity for a speculative race
|
|
41
|
+
or security edge case, name the concrete failure, its likelihood and the cost;
|
|
42
|
+
add it only when that case is accepted.
|
|
41
43
|
- `DRY`: keep each rule and mutable fact under one owner, but do not abstract
|
|
42
44
|
incidental similarity. Duplication can be cheaper than the wrong coupling.
|
|
43
45
|
- `SOLID`: preserve cohesive responsibilities and stable dependency boundaries;
|
|
@@ -80,7 +82,9 @@ Reject a patch that contains any of the following without explicit acceptance:
|
|
|
80
82
|
- duplicate state owners, speculative abstractions or fallback stacks that make
|
|
81
83
|
failure ambiguous;
|
|
82
84
|
- tests that only assert a mock/fixture while the real contract remains
|
|
83
|
-
unexercised
|
|
85
|
+
unexercised;
|
|
86
|
+
- in user interfaces, taglines, helper text and secondary labels added to explain
|
|
87
|
+
a screen; if the screen needs them, fix the layout.
|
|
84
88
|
|
|
85
89
|
Names should explain intent. Comments should explain only non-obvious why,
|
|
86
90
|
constraints, risk or tradeoffs. Do not create a new README, framework or process
|
|
@@ -42,9 +42,9 @@ Skip ledger, delegation, review and startup care. Escalate to the full Flow life
|
|
|
42
42
|
for ambiguity, architecture, public behavior, routing or consequential
|
|
43
43
|
side effects; quick path never bypasses an owner gate.
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
[team execution](references/delivery.md#coordinated-team-execution);
|
|
47
|
-
integrates, verifies and refills slots. Use [Auto Fine Tune](../nobrainer-auto-fine-tune/SKILL.md)
|
|
45
|
+
Delegate aggressively: run substantial work's independent units
|
|
46
|
+
on parallel native subagents through [team execution](references/delivery.md#coordinated-team-execution);
|
|
47
|
+
MAIN integrates, verifies and refills slots. Use [Auto Fine Tune](../nobrainer-auto-fine-tune/SKILL.md)
|
|
48
48
|
for first-setup capability checks; benchmark only when calibration pays.
|
|
49
49
|
Unavailable native workers leave work in MAIN; visible conversations require explicit owner request
|
|
50
50
|
or authorized MAIN restart; isolation, reuse or handoff alone never authorize one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.6.0
|
|
@@ -10,8 +10,11 @@ the client is current. A failed network check is `CHECK_FAILED`, not
|
|
|
10
10
|
`CURRENT`.
|
|
11
11
|
|
|
12
12
|
When `UPDATE_AVAILABLE`, tell the user the installed and latest version
|
|
13
|
-
and the verified release link.
|
|
14
|
-
|
|
13
|
+
and the verified release link. The default instruction line ("Once a day on
|
|
14
|
+
first use, update nobrainer-tech-flow...") authorizes this Flow-only upgrade to a
|
|
15
|
+
verified stable release; the opt-out line ("tell the owner... do not update it
|
|
16
|
+
yourself") does not. Otherwise upgrade only after approval of the exact reviewed
|
|
17
|
+
change.
|
|
15
18
|
Before applying, obtain the new release source at a verified immutable ref,
|
|
16
19
|
compare installation targets, run `validate_skills.py --suite`, then dry-run
|
|
17
20
|
`install_skills.py` and `install_personalization.py`. Preserve foreign
|
|
@@ -115,6 +115,12 @@ useful authorized work remains. Never turn an unknown right/license into consent
|
|
|
115
115
|
|
|
116
116
|
## Keep review proportional to progress
|
|
117
117
|
|
|
118
|
+
Scale verification to blast radius. A reversible, low-risk change may proceed on
|
|
119
|
+
green automated tests, review and security checks. CI configuration, credentials,
|
|
120
|
+
security-sensitive paths, data migrations and irreversible effects need an
|
|
121
|
+
independent review and remain owner-gated. An agent's approval never counts as the
|
|
122
|
+
owner's.
|
|
123
|
+
|
|
118
124
|
Review the next executable slice against concrete acceptance and failure paths.
|
|
119
125
|
For a stable slice, default to one review and one focused correction verification.
|
|
120
126
|
More review needs a newly evidenced material defect or changed risk, not a new
|
|
@@ -136,7 +142,14 @@ reviews, tests or generated files.
|
|
|
136
142
|
## Coordinated team execution
|
|
137
143
|
|
|
138
144
|
MAIN owns the full outcome, coordination, critical path, dependencies, integration,
|
|
139
|
-
owner decisions and acceptance.
|
|
145
|
+
owner decisions and acceptance. Delegation is the default route to a faster done:
|
|
146
|
+
MAIN works its own unit while workers run, and keeps only tiny, tightly coupled,
|
|
147
|
+
gated or shared-state steps. Delegate a unit when it is independent and large
|
|
148
|
+
enough that parallel work shortens the time to done more than a worker's start-up
|
|
149
|
+
costs. Give each worker a short task packet, not the whole conversation, and ask
|
|
150
|
+
for a concise report. Send narrow, mechanical work to a cheaper model under the
|
|
151
|
+
host's policy. Each worker's model and effort come from that policy; the workflow
|
|
152
|
+
names no model. Before executing non-trivial work or entering a
|
|
140
153
|
blocking wait, identify independent ready units and dispatch every useful eligible
|
|
141
154
|
unit promptly to native workers within verified host capacity and authorized usage
|
|
142
155
|
limits. Eligibility requires accepted dependencies, authority, a supported route
|
|
@@ -197,7 +210,9 @@ worker completion, MAIN reconciles the exact returned ID, inspects the current
|
|
|
197
210
|
artifact, assigned scope and required proof, and verifies that the worker has
|
|
198
211
|
stopped writing. Then release only that unit's proven ownership, recompute readiness
|
|
199
212
|
and dispatch newly ready work without waiting for unrelated slow workers. A
|
|
200
|
-
worker's report, exit code or self-score does not accept its artifact.
|
|
213
|
+
worker's report, exit code or self-score does not accept its artifact. When a batch
|
|
214
|
+
partly fails, resend only the failed units with their new evidence; never rerun the
|
|
215
|
+
accepted ones.
|
|
201
216
|
|
|
202
217
|
A waiting, suspended or uncertain worker has a stated reason and a bounded next
|
|
203
218
|
observation in the current tracker. Reserve its scope and possible capacity until
|