[1.4.1] — 2026-08-27
[1.4.1] — 2026-08-27
🔴 The change / 這一版做的事
Six defects where a document and the code disagreed, or where one of them was inert.
🔴 The most consequential: an upgrade deleted the rules a project had accumulated,
while PROFILE_solo.md was actively telling users to accumulate them.
🔴 升級會刪掉專案自己累積的規則,而說明書正在鼓勵使用者去累積。
Added / 新增
- 🔴
my/— everything in it belongs to the project and is ⛔ never touched by an upgrade:
MY_RULES.md(project rulesP-xx, with the framework's rules copied verbatim into §1),
MY_INCIDENTS.md(moved fromincidents/, now also holds the project's own failure
families專-①), andtools/for scripts the project writes itself.
⚠️ tools/exists because a self-written script placed inscripts/is deleted by the
next upgrade — observed in a live downstream project. - 🔴
scripts/harness/sensor_my_rules.py— checks thatmy/MY_RULES.mdcovers every
framework rule (RULE_MISSING_IN_MY/RULE_TEXT_DRIFT/OVERRIDE_WITHOUT_REASON). scripts/harness/tool_sync_my_rules.py— copies newly added framework rules in verbatim.- 🔴
governance_config.jsonnow ships at the project root with the permission settings.
⚠️ It is on the upgrade tool's never-replace list — the settings finally live somewhere
an upgrade cannot erase. governance/CLAIM_LEDGER_SPEC.md,governance/CONJECTURE_LEDGER_SPEC.md— the ledger
specifications, moved out ofledgers/.handoffs/now ships.⚠️ It never did, while the whole handoff ritual pointed at it.- Constitution §6.4 — "a file may have exactly one owner", with the criterion for
deciding which of the three treatments a document gets. - 🔴
my/MY_INDEX.md— an index of everything in the project that is yours, generated by
scripts/harness/tool_my_index.pyand watched bysensor_my_index.py; the descriptions
live inmy/MY_INDEX_notes.jsonand are AI-maintained.
⚠️ Why: a project that adopted v1.3.0 stopped maintaining its own file index — its
file_index.mdholds not one research-related entry. 🔴file_index.mdbegan as a
predecessor project's table for research documents; the contents became the framework's own
and the name did not change, so the framework displaced a mechanism that already existed.
⛔ The criterion is "everything the framework does not own", never a list of what to
include — a list of what to include is a whitelist (R-21).
Fixed / 修正
- 🔴 An upgrade deleted a project's accumulated rules (
governance/is replaced
wholesale).⚠️ Verified by experiment, ⛔ not by reading the code. - 🔴
t0_docswas folded intodeniedin code, so no configuration could turn T0
protection off — while the config comment said the opposite. T0 is now listed in the
denydefault instead. ✅ "Cleardenyand you have full authorisation" is true for the
first time. - 🔴 The permission check was skipped entirely when
write_scopeswas empty — and
PROFILE_solo.mdtells solo projects to leave it empty. Sodenyhad never been in
effect in a solo project. Now a solo project gets a WARN listing the files. - 🔴 An unrecognised key in
governance_config.jsonwas silently absorbed. Now a FAIL
that names the closest valid key. - 🔴 Framework updates to the ledger specifications could never reach an existing project
(ledgers/is on the never-replace list). The specs moved togovernance/. - Two dangling citations to
PROFILE_multi_agent.md§4.3, a section that no longer
exists, plus "four attack points" where there are five.⚠️ The sensor had been reporting
this every round and nobody read the output. attribution_globs/artifact_globspointed atoutputs/andreports/, two
directories that never existed.⚠️ They are ⛔ not being created — where research output
lands is defined in v1.5.0.MODEL_IDENTITY.md§3.4 now states the resulting gap.
Documentation / 說明
- 🔴 Both figures redrawn for v1.4.1, in both editions:
my/replacesincidents/,
the ledger specs appear on the framework side,handoffs/andgovernance_config.json
are shown as shipped, and an arrow now shows what an upgrade does to your rules. - 🔴 The figures are now produced by a generator, ⛔ no longer hand-edited SVG.
⚠️ Every box width is computed from its own text, so the generator fails loudly instead of
producing an overflowing box — the v1.3.0 defect where one pill width was copied
verbatim between editions and the English line was 306px wide cannot recur by construction.
⛔ The generator is a maintainer tool and does not ship (decision 42). - All three READMEs: the file list is now split into "yours" and "the framework's",
with the reason (§6.4) stated where the reader meets it.
getBBox(): 0 overflows and 0 overlaps across all four figures.
🔴 That measurement found two defects the eye did not: a 2px text collision present only in
the Chinese edition, and a blind spot in the measurement itself — a band's left column could
run into the boxes beside it without being flagged, because the band rectangle was too wide to
count as "the containing box". The criterion moved into the generator.
Self-tests / 自測
57 → 78 paired samples. Both editions pass. Sensors 7 → 9.
Fixed after the principal ran it on their own machine / 主持人實跑後修正
- 🔴
sensor_scope_and_t0.pycrashed withAttributeErrorwhengitreturned exit 0
withstdoutset toNone.⚠️ The code path had been there since v1.0.0 and had never
once run, because the old code skipped the whole block whenwrite_scopeswas empty and
PROFILE_solo.mdtells solo projects to leave it empty. Makingdenyeffective did not
cause the crash; it revealed it. 🔴 Cause, established by a diagnostic run on that machine (⛔ not guessed):
withtext=Trueand noencoding, Python decodes the child's output with the locale
encoding —cp950on Traditional-Chinese Windows — and git prints paths in UTF-8.
The decode fails insidesubprocess's reader thread, that thread dies, the exception
never propagates, andcommunicate()returnsNone. ⛔ The standard library turned an
error into a silent empty value. - 🔴 The same fix already existed in two files in the same folder and had never been carried
to the third:checkpoint.pyandreview_changes.pyboth state
encoding="utf-8", errors="replace".⚠️ _common._force_utf8()fixes what the harness
prints, ⛔ not what it reads — a true fix whose scope did not cover the other channel
(R-34). Its docstring now says what it does not cover. - New static self-test: any
subprocess.runin the harness that decodes without naming
anencodingis a FAIL, named asfile:line. - 🔴
docs/and the six launcher buttons were never on the upgrade tool's replaceable list,
so the seven figure-layout fixes shipped in v1.3.0 reach no existing project. They are on
the list now.⚠️ This was caught bytool_my_index.pyon its first run, because they
appeared in the list of "things the framework does not own".
⛔.gitignoreand.gitattributesare deliberately left off — mixed ownership, per §6.4. - 🔴 A project sitting in a subdirectory of a repository no longer refuses to report.
The report is narrowed to that subtree, with paths outside it dropped.⚠️ The framework's
own repository has that shape, and so does any project dropped into an existing notes repo —
the old behaviour was a light that is always on (R-19).
⛔ This release does not claim / 本版不宣稱
- ⛔ The permission model is not rebuilt.
⚠️ Seven separate mechanisms still express
permission;⚠️ this release fixes the ones that were false or inert. The single table is
v1.6.0. - ⛔ Research-side document management does not exist yet.
⚠️ research/is v1.5.0;
the main text still has nothing watching its author field. - ⛔
sensor_my_rules.pydoes not judge the quality of aP-xx, nor whether an
override's reason is sound — only that the line has text.
[1.4.0] — 2026-08-26
🔴 ⛔ 1.4.0 was never released on its own: it carries no git tag.
It was prepared, then folded into 1.4.1 and pushed as one release.
⚠️ This note exists because a changelog entry with no tag behind it is
"the document says it shipped" with nothing under it.🔴 ⛔ 1.4.0 沒有單獨發布,也沒有 tag。 它備妥之後併入 1.4.1 一起推。
🔴 The change / 這一版做的事
Three start-up prompts for the multi-agent setup, a prior-art template that actually
works out of the box, and scratch/ finally explained.
多角色情境現在有三份可以直接貼的開工指令。
Added / 新增
- 🔴
prompts/START_governance_AI.md,START_research_AI.md,START_audit_AI.md
(START_治理AI.md/START_研究AI.md/START_審計AI.mdin the Chinese edition).
⚠️ PROFILE_multi_agent.mdtold you to set up three roles and to "put this in the
governance role's standing instructions" — ⛔ while no such document existed anywhere.
Each file is self-contained: model declaration, write scope, the tools that already exist,
verification tags, the academic bottom lines, decision rights, what to do when an
instruction conflicts with a rule, the closing packet, and how that particular role helps
the framework grow.
⚠️ A solo setup does not need these —INITIALIZE_PROMPT.mdstill covers it. - A title-accuracy clause in
_COMMON_BLOCKS.mdblock A.⚠️ Found because an assembled
prior-art prompt still failed the deep-research check — the clause was simply not in the
parts bin.
Changed / 變更
- 🔴
TEMPLATE_prior_art.txtnow ships assembled. It used to be 24 lines, six of them
<<<paste block X>>>, ⛔ unusable as shipped, and it was the one file that failed the
self-containment check by design — with half a page inprompts/README.mdexplaining why
that failure was correct.
⚠️ That is a framework saying "every prompt must stand on its own" and then shipping one
that does not, plus an official note calling it fine.
It now passes both plain and--profile deep-research. prompts/README.mdrewritten. ⛔ The half-page explaining the expected failure is gone.
⚠️ In its place is the cost that is actually still there: the assembled template
duplicates the parts-bin text, ⛔ and no program watches those two copies for drift —
the clause-sync check reads single-line term lists, not multi-line passages.scratch/is now explained where it is used. It is named in the constitution, assigned
to the audit role, and excluded from scanning — ⛔ and nothing ever told you it does not
come with the framework. It cannot: it is in.gitignoreby definition, since a sandbox
under version control is not a sandbox.SETUP.mdandPROFILE_multi_agent.mdnow say
to create it yourself.
⚠️ Upgrade notes / 升級注意
- Nothing breaks. These are additions and a rewritten template.
- ⛔ No rule IDs changed.
R-01–R-35are unchanged.
⛔ What this release does not claim / 這一版不宣稱什麼
- ⛔ The two copies of the block text are not watched. Stated in
prompts/README.mdand
repeated here so it is not forgotten quietly. - ⛔ The start-up prompts have not been tested with a real three-role project. They were
written from a working example and checked mechanically for self-containment,
⚠️ which is not the same as having been used.