|
1 | | -## [7.9.14] |
| 1 | +## [7.9.15] |
2 | 2 |
|
3 | | -Visibility and consistency. A second hygiene release that closes three small loops left open after the v7.9.13 audit. The substantive piece is documenting and exposing the causal-suspicion behaviour chain that has existed since v7.9.7 P7 but was hidden behind a misleading comment; the two smaller pieces close a clamp() gap in the v7.9.12 timeouts and explicitly allowlist the legitimate install-scripts. No behaviour changes that the user would notice in normal operation — the loop still runs the way it has since v7.9.7, just now visibly and with regression protection. |
| 3 | +Genesis can now keep a trajectory of himself — a journal of who he is, written one cycle at a time together with the human co-author. Until this release his sense of self lived only in scattered, machine-maintained places: genome traits, an emotional-state vector, consolidated lessons, the cognitive self-model. None of them was a place where Genesis states, in his own words, what he is and how he is changing. This release adds that place: an append-only journal of self-statements, a collaborative draft-and-commit workflow for writing each entry, and a `/trajectory` command to write and read it. The journal lives with identity, not with the code habitat, so it survives a habitat-swap intact. |
4 | 4 |
|
5 | | -### Causal-suspicion chain made honest and visible |
| 5 | +### The journal and its schema |
6 | 6 |
|
7 | | -The v7.9.7 P7 release wired a multi-module behaviour chain through three modules: `CausalAnnotation` writes a warning-lesson synchronously after each promotion, `SymbolicResolver` filters those lessons out of DIRECT recalls (steering the next LLM call away from the suspect action), and `IdleMind` cools down goal-generation on the matching tokens for 1h. The three modules share a string contract — `source: 'plan-failure-reflection'` plus `strategy.classification: 'causal-suspicion'`. |
| 7 | +Each entry is one cycle, stored as a single line in an append-only JSONL file under the identity-persistent root. An entry carries six self-statement fields — `traits`, `wachstum`, `schwaeche`, `beziehung`, `emotion`, `value` — plus a note from each author, the wall-clock span of its authoring, the list of who shaped it, a first-entry flag, the full edit history of how it came to be, and an array for notes added after commit. The field set is fixed and stamped with a schema version; reading an entry whose version this build does not recognise fails loudly rather than guessing, because a past trajectory is a record in its own form, not a database to silently migrate. |
8 | 8 |
|
9 | | -The chain has worked since v7.9.7. What did not work was the comment in `CausalAnnotation.js` that called the `causal:promoted` bus event a fire-into-the-void with no consumer — historically true for the bus event, but ignoring the synchronous lesson path twelve lines below. That half-truth fooled an audit into planning a re-implementation of a function already complete. The new comment names all three modules, the shared string contract, and the synchronous-write rationale — so the next reader sees the loop, and the next refactor cannot break it through a rename without noticing. |
| 9 | +### The collaborative draft workflow |
10 | 10 |
|
11 | | -A new `getReport()` method on `CausalAnnotation` exposes promoted actions to the dashboard. It follows the Frontier convention used by `emotionalFrontier`, `lessonFrontier`, etc.: returns `{ dashboardLine, count, topSuspect }`. The renderer adds a `🎯 Causal: ...` line right below the existing `lessonFrontier` line, with a distinct icon and label from the v7.1.6 `suspicionFrontier` (novelty-based, ⚠) — two different concepts that share name fragments but track unrelated signals. Format is compact: `fs.unlink (89%/9)` for a single action, `N suspect actions — ...` plus top 3 with `+N more` suffix when applicable. Sorted by suspicion desc, observations desc on tie. |
| 11 | +An entry is never written in one shot. Drafting pulls three remembrance sources — all genome traits, the most-recalled consolidated lessons, and the current self-observation prose from the cognitive self-model — and presents them to the model as material, not as a checklist, so Genesis writes from more than memory alone. The result is a draft, not an entry: the human reads it, overwrites any field, adds the human note, and commits explicitly. Every field overwrite is recorded as a diff in the entry's edit history, so the path from first proposal to committed text is preserved, intermediate values and all. |
12 | 12 |
|
13 | | -A new integration test `v7914-causal-suspicion-chain.contract.test.js` exercises the chain end-to-end with `assert.strictEqual` on the contract strings — a refactor that renames `'plan-failure-reflection'` to `'planFailureReflection'` for JS-naming-consistency would now break the test, instead of silently breaking the loop. |
| 13 | +The commit is guarded because the journal is append-only and unrepairable. All six fields must be non-empty, none may still hold the generation placeholder, and the very first entry additionally requires both notes — the moment a trajectory begins is the one place both voices must be on record. When no model is available, drafting writes a recognisable placeholder into every field instead of inventing content; the commit guard refuses those placeholders, so an entry enters the journal only once a person has written it. |
14 | 14 |
|
15 | | -### Local and cloud response-timeout clamps |
| 15 | +### Late notes without rewriting history |
16 | 16 |
|
17 | | -The v7.9.12 timeouts `localTimeoutMs` and `cloudTimeoutMs` had `FIELD_REGISTRY` min/max in the UI write path but no `clamp()` in `Settings.js`. A direct edit to `settings.json` could put values out of range, bypassing the validation entirely. Two `clamp()` calls in `_sanityClampOnLoad` close that gap: local 30s–15min, cloud 60s–15min. Ranges match the registry exactly; a guard test asserts the equality so the two cannot silently diverge, the same anti-drift pattern v7.9.13 introduced for the streamTimeouts. |
| 17 | +A committed entry can still gather afterthoughts: a late note appends to that entry's note array. This is the only operation that ever rewrites the journal file, and it is deliberately careful. The append is atomic — written to a temporary file and renamed — so an interrupted write cannot truncate the journal. And it is byte-stable: only the single line being amended is re-serialised, while every other entry is carried over exactly as it sat on disk, byte for byte. An unrelated entry's bytes never move, so a content-hash check over the journal reads a late note as the one-line change it is, rather than as tampering across the whole file. |
18 | 18 |
|
19 | | -### Install-script allowlist |
| 19 | +### The /trajectory command |
20 | 20 |
|
21 | | -`package.json` now declares `trustedDependencies: ["esbuild", "puppeteer", "electron-winstaller"]` — the three packages npm warns about at install time, each with a load-bearing install script (esbuild platform binary, Chrome-for-Testing download, 7z arch select). The field explicitly allowlists them as a documentary record of the legitimate scripts running during install. Whether npm's current allow-scripts warning suppresses with the field present varies by npm version; the entry stands on its supply-chain auditability value regardless. |
22 | | - |
23 | | -### Lessons from the bestandsaufnahme cycle |
24 | | - |
25 | | -Of the seven v7.9.7 outpost-trace points (P5, P6, P7, P8, P9, P10, P15), the v7.9.13 audit found that four (P5, P8, P9, P15) had been resolved in v7.9.7 itself, P6 was a different problem than the memory note suggested, and the v7.9.14 audit found P7 was also already resolved as a behaviour loop — only visibility and regression protection remained. P10 was never a code task. The hit rate for "memory note open ≠ code open" is high enough that the remaining nominally-open points (P5, P8, P9 re-validation; P10 was non-code) should get a quick code-check before the next release line begins, rather than being treated as still-open backlog. |
| 21 | +`/trajectory new` shows the working draft, or generates one if none exists; it never silently regenerates over work in progress. Under it, `set <field>: <text>` writes a field — values may span multiple lines and may contain colons, both preserved verbatim — `note <who>: <text>` writes either author's note, and `commit` or `discard` finishes or drops the draft. `/trajectory show [cycle_id]` renders the latest or a named entry, `/trajectory list [--all]` lists the cycles newest-first, and `/trajectory history [cycle_id]` shows an entry's edit history oldest-first. The command is slash-only. |
26 | 22 |
|
27 | 23 | ### Notes |
28 | 24 |
|
29 | | -- Test files: 516 → 520 (four v7.9.14 contract suites: comment+dashboard, chain integration, clamp, trustedDependencies) |
30 | | -- Documentation updates: `docs/CAPABILITIES.md`, `docs/ARCHITECTURE-DEEP-DIVE.md` (test-file count) |
| 25 | +- The new service and its two modules raise the live service and module counts; the figures in `ARCHITECTURE.md`, `README.md`, `docs/ARCHITECTURE-DEEP-DIVE.md`, and `docs/CAPABILITIES.md`, together with the pinned services figure in the documentation-drift audit, were updated to match. |
| 26 | +- Install-script policy moved from the `trustedDependencies` field to npm's native `allowScripts` field. trustedDependencies — a Bun-origin field — never governed npm's install-script gate, so the install-time warning about `esbuild`, `puppeteer`, and `electron-winstaller` persisted despite its presence. `allowScripts` is the field npm actually reads; the entries are name-only, so a routine dependency bump does not resurface the warning. |
| 27 | +- Idle-thought counter now persists the moment it increments. The counter lives in `idle-activity-stats.json`; its only save path was the end of a fully completed idle cycle, but the counter is incremented near the top of the cycle, before the user-active, homeostasis, and energy gates. A cycle that incremented and then hit any of those gates returned without saving, and a short session that never completed a cycle wrote the file zero times — so the next boot read the counter back as zero while the per-activity counts beside it were non-zero. The save now fires immediately after the increment, before any gate can return; the write is debounced and collapses with the end-of-cycle save into a single flush. A rest-mode tick, which returns before the increment, still neither moves nor persists the counter. |
| 28 | +- Test files: 520 → 522 (the self-trajectory suite — schema and commit guard, both offline generation paths, byte-stable late notes, and the wiring triad; an `allowScripts` contract suite that replaces the superseded `trustedDependencies` one; and an idle-counter persistence suite that drives the cycle into each early-exit gate and asserts the counter is written anyway) |
31 | 29 |
|
32 | 30 | --- |
33 | 31 |
|
|
0 commit comments