Skip to content

[1.4.1] — 2026-08-27

Choose a tag to compare

@yama-learns yama-learns released this 28 Aug 14:49
· 2 commits to main since this release

[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 rules P-xx, with the framework's rules copied verbatim into §1),
    MY_INCIDENTS.md (moved from incidents/, now also holds the project's own failure
    families 專-①), and tools/ for scripts the project writes itself.
    ⚠️ tools/ exists because a self-written script placed in scripts/ is deleted by the
    next upgrade — observed in a live downstream project.
  • 🔴 scripts/harness/sensor_my_rules.py — checks that my/MY_RULES.md covers 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.json now 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 of ledgers/.
  • 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.py and watched by sensor_my_index.py; the descriptions
    live in my/MY_INDEX_notes.json and are AI-maintained.
    ⚠️ Why: a project that adopted v1.3.0 stopped maintaining its own file index — its
    file_index.md holds not one research-related entry. 🔴 file_index.md began 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_docs was folded into denied in code, so no configuration could turn T0
    protection off — while the config comment said the opposite. T0 is now listed in the
    deny default instead. ✅ "Clear deny and you have full authorisation" is true for the
    first time.
  • 🔴 The permission check was skipped entirely when write_scopes was empty — and
    PROFILE_solo.md tells solo projects to leave it empty. So deny had never been in
    effect in a solo project.
    Now a solo project gets a WARN listing the files.
  • 🔴 An unrecognised key in governance_config.json was 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 to governance/.
  • 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_globs pointed at outputs/ and reports/, 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/ replaces incidents/,
    the ledger specs appear on the framework side, handoffs/ and governance_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.

⚠️ Verified with Chromium 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.py crashed with AttributeError when git returned exit 0
    with stdout set to None. ⚠️ The code path had been there since v1.0.0 and had never
    once run
    , because the old code skipped the whole block when write_scopes was empty and
    PROFILE_solo.md tells solo projects to leave it empty. Making deny effective did not
    cause the crash; it revealed it.
    🔴 Cause, established by a diagnostic run on that machine (⛔ not guessed):
    with text=True and no encoding, Python decodes the child's output with the locale
    encoding — cp950 on Traditional-Chinese Windows — and git prints paths in UTF-8.
    The decode fails inside subprocess's reader thread, that thread dies, the exception
    never propagates, and communicate() returns None.
    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.py and review_changes.py both 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.run in the harness that decodes without naming
    an encoding is a FAIL, named as file: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 by tool_my_index.py on its first run, because they
    appeared in the list of "things the framework does not own".
    .gitignore and .gitattributes are 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.py does not judge the quality of a P-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.md in the Chinese edition).
    ⚠️ PROFILE_multi_agent.md told 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 theseINITIALIZE_PROMPT.md still covers it.
  • A title-accuracy clause in _COMMON_BLOCKS.md block 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.txt now 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 in prompts/README.md explaining 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.md rewritten. ⛔ 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 .gitignore by definition, since a sandbox
    under version control is not a sandbox. SETUP.md and PROFILE_multi_agent.md now say
    to create it yourself.

⚠️ Upgrade notes / 升級注意

  • Nothing breaks. These are additions and a rewritten template.
  • No rule IDs changed. R-01R-35 are unchanged.

⛔ What this release does not claim / 這一版不宣稱什麼

  • The two copies of the block text are not watched. Stated in prompts/README.md and
    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.