Releases: Zenetusken/consolidate-memory
Release list
v0.4.23
Patch — the defrag detector flags flow, not stock (the footnote polish).
Two dream-session footnotes root-caused (docs/defrag-flow-and-emoji-index.spec.md
— advisor + adversarial review-to-zero, amend-1/2):
- P1 — the defrag re-nag:
defrag_candidatesflagged every fact with a body2.5× the store median — a structural property of any roadmap, so a KEEP'd doc
re-nagged every dream. The--justify-defragwatermark (defrag_justifyin the
state file, REFRESH semantics — never the demotion skip-if-present no-op, which
would re-anchor the very re-nag) quiets a justified stem until it genuinely
grows (+40 tokens AND +25%, malformed entries fail open); the Phase-0 report
shows the watermark line independent of the candidate count;--forceis the
post-curation re-anchor repair. The justify collectors stop at an existing
directory — the demotion sibling's trailing-project-dir swallow, same class. - P2 — the emoji flag names its beat:
⚠ emoji in beat(s): 3(1-based, the
archive's Passage numbering). - P3 — the debrief discipline: claims about the rendered archive are verified
against the rendered file (the log line is attempt-scoped).
Smoke 1762/0 (+13 pins — 8 discriminating vs the merge-base, 5 semantic regression guards), mypy clean, sim, manifests, browser 1108.
v0.4.22
Patch — the unverifiable tally names its claims (the alert-carrier defect).
The dream's dashboard rendered ⚠ 1 unverifiable with no surface naming the claim
(docs/unverifiable-carrier.spec.md — advisor + review-to-zero, amend-1/2): the
verification tally was a count with no named carrier in the contract. Four layers:
- The SKILL mandate (bidirectional): every claim judged unverifiable is
tallied AND gets one entries[] row (skippedwhen dropped,reconciledwhen
kept with approval) whosenamenames the claim and whosereasonbegins the
canonicalunverifiable:token (theextractor-skip:precedent). - The validator binding:
validate_cycle_recordwarns when the tally and the
marked rows disagree in either direction — a count with no/unequal rows, or
marked rows without a tally — container/scalar-guarded under the never-raises
contract (junk shapes skip the check). - Both dashboards name the claims at the ⚠: the ASCII
VERIFIEDline and the
HTML assess/KPI surfaces join the marked rows' names after the count
(cap-with-counter); the legacy bare-count fallback stays byte-identical, and the
KPI sub-label escapes each joined name. - The browser fixture's skipped row gains the token — the validate-assert
over all 8 history cycles stays green, and the row doubles as the name-pin
vehicle for both renderers.
Smoke 1749/0 (+9 pins), mypy clean, sim, manifests, browser 1108.
v0.4.21
Patch — the defect sweep (six measured defects from the dream session, root-caused and pinned).
- D1 — the marker could be stamped with a literal placeholder and silently ignored.
Two dreams ran--stamp-marker HEADwith the literal arg; the stamp wrote the string
"HEAD" verbatim (no validation), and the next read's_valid_shaguard silently
cleared it → the first-consolidation fallback mis-scoped the whole pass. The stamp
now RESOLVES its argument (rev-parse --verify <arg>^{commit}— barerev-parse
echoes any 40-hex without an object-DB lookup, the dead-SHA door), stamps the honest
commit: ""+ timestamp on a no-git/unborn-HEAD store (a refusal would exit-5 every
no-git dream — the persist gate is timestamp-only), and REFUSES only unresolvable
args in commit-ful repos (the state file stays byte-identical). The read now WARNS
when it silently clears a non-empty invalid commit. - D2 — the demotion verdict could contradict the scripted block. The validator now
flags a verdict whose probative-count phrase contradictswindows_observed, and the
SKILL binds the verdict's numbers to the block's own fields. - D3 — the SKILL command template glued an argument into the quoted script path
(copying it verbatim failed). Fixed + a smoke pin that no command line glues an arg
inside the quotes. - D5 — the distill scan's counts lived only in capped list lengths. The
scanned
block now carries the TRUE filtered pre-capn_recurring/n_chains; the injection
and the report's scale line use them (the capped lengths stay the output cap), the
validator's "impossible count" backstop is dropped (the count is script-truth), and
the SKILL names the exact fields to read — the class where the record's numbers and
the model's verdict contradicted each other is closed. - D6 — the suite's exact-count pin. An orphaned section (the double print/exit
class) can never print green again: the final count is pinned exactly.
D4 (beat reuse) is a documented authorship ceiling, no code. Design-of-record:
docs/defect-sweep-v0421.spec.md (advisor + review-to-zero, amend-1/2/3 — the final
sweep's R1–R5 closed: the doc-wide quote-close pin, the mandate-format verdict
digits, the reconcile_marker gate, the resolution cwd + 40-hex belt, the dual-count
over-cap fixture). Backward-compatible → patch. Suite 1739 · browser 1105 ·
sim / manifests / mypy green.
v0.4.20
Patch — the network capture teeth (the skipped fleet capture is no longer silent).
The first dream judged by the v0.4.19 gates exposed the capture-side gap: Phase-5
step 4's --tokens --fleet capture never ran in the pass, the record persisted
with no network block, and the archive stacked "No project nodes captured for
this view" on "Network details were not captured for this dream" — absence read
as fleet disconnection, with no teeth anywhere.
- NET — the persist-side advisory. A dream-bearing record whose
network
block has nonodeslist (absent OR present-without-nodes — the ONE predicate
the panel, the beta oracle, and the archive's note ladder share: the producer
always emits nodes) gets a loud NETWORK CAPTURE MISSING panel at the terminal
--persist— advisory only, no exit change (the capture is an enrichment of a
completed dream; the exit key stays frozen). Suppressed on a maintenance/
bootstrap pivot (its scope excludes the capture by design) with the
string-coercion discipline, and on the dreamless legacy carve-out. - The
network_capturebeta-oracle family — the fourth member of the
skipped-by-scope set (_maintenance_pivoted), on the_latest_capture_check
scaffold (min_version 0.4.13, the--fleetmandate floor); the WARN's actual
string branches (era caveat tail for an absent block, a corruption tail for a
present nodes-less one). The frozen A1 fixture pin re-baselined to 2 named
expected WARNs. - Archive readability — on an absent block the network panel collapses to the
not-captured note alone (map, controls, legend, and detail all hide); a
present-but-empty capture keeps the chrome with the honest empty-fleet text.
Absence ≠ emptiness, and each renders alone.
Design-of-record: docs/network-capture-teeth.spec.md (advisor + review-to-zero,
amend-1/2). Backward-compatible → patch. Suite 1729 · browser 1105 · sim /
manifests / mypy green · beta gate 0 FAIL (2 by-design advisories).
v0.4.19
Patch — the narration teeth (conversation-truth verification at the terminal --persist).
The v0.4.1 persist gates are record-side: they read what the record says about
itself. A post-dream audit measured the class they cannot see — the dream block
filled at record-fill instead of narrated in the session, and Phase 2's extractor
never run with no skip note. dream_procedure.py adds the ground truth the terminal
render can actually read: the dream's own session transcript.
- NAR — narration verification. The
dream.sleepstanza + the sixdream.beats
entries must each appear verbatim-normalized in an ASSISTANT TEXT BLOCK of the
transcript window (anchored on the record's Phase-0-seeded
marker.before_timestamp— never the persist-time state file). The match domain
is text blocks only — never tool inputs or their echoed results (the record-fill
Write/Edit carries the whole dream block), never thinking blocks. Gaps → a loud
CONVERSATION-TRUTH GAPS panel naming each missing text + its first ~15 words,
narration.verdict: "failed"on the log line, exit 4. A gap re-reads the
window once (~500 ms) before firing — the flush-race guard. - EXT — extractor accountability. The window must contain an executed
extract_signals.pyin the Phase-2 form (--jsonor the human table;--recalls
does not count — the match is anchored on execution, so grep/sed targets,$(…)
substitutions, and prose mentions never count) or anentries[]reason beginning
with the canonicalextractor-skip:marker + a why (the SKILL now defines that
fixed token). Neither → exit 3. - The honest degrade. A missing/unreadable transcript (zero kept window lines)
degrades both arms loudly — the CONVERSATION-TRUTH UNVERIFIABLE panel,
narration.verdict: "degraded", no exit change — never a hard block. Every judged
persist writes the additivenarrationblock pre-append (verified | degraded |
failed; absence on a log line = pre-feature), riding the full schema lockstep.
Legacy/dreamless records stay outside both arms. - The beta oracle gains the
narration_capturefamily: the latest-record block
check on the_latest_capture_checkscaffold plus hermetic detector self-test legs
(a fabricated-beat pair must FAIL the detector; the skip-note must pass).
Known ceilings documented in harness-map.md: the check verifies presence of
narration text and calls — conversation-truth, not performed-truth — and exact
containment assumes verbatim mirroring (a rewording model false-fires cheaply;
narrate + re-render in the same window). Design-of-record:
docs/dream-narration-teeth.spec.md.
Backward-compatible → patch. Suite 1712 · browser 1101 · sim / concurrency /
manifests / mypy green.
v0.4.18
Patch — the Nocturne QA rework + the v0.4.17 audit residuals.
The Nocturne archive polish: the report sections' narration reworked — the
countLabel singular/plural helper (a one-window dormant pass reads "1 window",
never "1 windows"), the honest "not captured" language replacing the fabricated
dormant fallbacks (the SKILL's verdict contract is the single source), the
captured-evidence note chain for every record class (older snapshot / not captured
/ partial — keyed on real truncation signals, never absent keys), the diff-modal's
capturedDiff() migration, and the browser suite grown 320 → 1101 checks (the
narration-order pin, the hostile-string round-trips, the sparse-workflow fixture,
the header-geometry golden pins).
The v0.4.17 shipped-state audit residuals (two audit passes + the per-PR
review): the spec's drifted line citations refreshed, the preflight STATUS date
swept, the codeql.yml comment corrected to the live config, the roadmap's
formatting blemish fixed, and the doc counts swept to the tree truth.
Backward-compatible → patch. Suite 1688 · browser 1101 · sim / concurrency /
manifests / mypy green.
v0.4.17
Patch — the captured-network truth layer + the v0.4.16 audit residuals.
Network identity / fact-holdings incidence: the fleet feed now captures physical
holder identities — NetworkNode.display_name, FactHolding, and NetworkCapture
(emitted/held counts, unresolved identities, read-failures, conservatively measured
per-capture caps) — so the HTML network view reconstructs who actually holds each
shared fact, with the captured-evidence inspector, the explicit absence contract, and
legacy records rendering through an honest "not captured" note. The template's JS is
split into bundled modules (dashboard.network.js / dashboard.sections.js, inlined
at render with a case-insensitive </script-seam guard and exactly-once markers — the
single offline artifact is retained); render_html degrades gracefully when a bundle
is missing. New standalone suite tests/network_identity.py + 320 browser checks +
the header-geometry golden fixture.
The v0.4.16 shipped-state audit residuals (two audit passes + the per-PR review):
the mode-gate keys on the read-only flags alone (--triage --json no longer mints the
native plane); the no-sqlite3 beacon-silence pin and the non-list-fails absence pin
landed; the spec gained amend-4; AGENTS.md's plugin-table row and assertion count
swept; the capture chips use the numeric fallback for partial records; the incidence
byte-cap conservatism documented.
Backward-compatible → patch. Suite 1689 assertions · browser 320 · sim /
concurrency / manifests / mypy green.
v0.4.16
Patch — the environment pre-flight. A new preflight.py answers the deployment
questions deterministically: 14 checks — Python 3.8+, POSIX/fcntl (win32/cygwin fail
closed per ADR 016), the sqlite3 stdlib module, the SQLite ≥ 3.24 UPSERT floor, a
real-schema + flock round-trip inside the plugin-data dir, plugin self-integrity, the
native memory dir (skipped when auto-memory is disabled — native Auto-Memory is NOT a
prerequisite), git presence/repo/shallow (warn-only degradations per the shipped
policy), python3 on PATH, TMPDIR writability with a free-space floor, transcript
inventory, and a synthetic store-resolution check for the brokenest environment. Exit
0 = clean, 2 = any FAIL; --json emits the envelope.
- Surfaces:
cm doctorembeds the PRE-FLIGHT table (+ rc 2 on FAIL); a resolution
failure (EACCES config root, or a no-sqlite3 interpreter) now yields a verdict
instead of a traceback. The SessionStart beacon prints ONE line when a fresh FAIL
verdict is cached (warns/pass/stale → silent; never quieted by snooze;
disabled-auto-memory stays silent). Phase 0 seeds the record'spreflightblock
(record-producing modes only — read-only modes stay write-free) and renders a red
line when fails were recorded. - Honest boundary: a no-sqlite3 environment is itself a resolution failure — it
reaches the sentinel verdict via doctor/Phase 0, but the beacon cannot cover it (no
resolved ctx → no cache); stated, not solved. - The gated arc: spec (
docs/env-preflight.spec.md) → advisor (11 findings) →
adversarial review-to-zero (11 findings, incl. the F1 reachability contradiction
re-folded to the one-writer routing) → implementation → per-PR review (8 findings) —
every finding fixed + pinned (the suite grew 1620 → 1660 assertions, incl. the
PYTHONPATH-shim sabotage runs and the cache-reachability proofs).
Backward-compatible → patch (additive script + additive record/state/dict keys; legacy
records render).
v0.4.15
Patch — the version-sweep hotfix. The 0.4.14 Nocturne release updated plugin.json, the CHANGELOG, and AGENTS.md's CI paragraph, but left several current-version statements behind. This release completes the sweep to the shipping version: the CLAUDE.md banner, AGENTS.md's "verified against the live tree" line, the SKILL.md banner, harness-map's lead line, the README's current-release blurb, and the 1.0-preflight STATUS line.
Doc-only. No cycle-record schema, store policy, canonical writer, command, or hook contract changes. Backward-compatible → patch.
v0.4.14
Patch — Nocturne, a memory observatory. The HTML summary now leads with the
project's context outlook, evidence, and shared-memory network on a midnight-blue
canvas. The theme control also offers Original, preserving the previous dark
espresso palette, plus Light and System modes. Preferences persist locally; print
stays legible and reduced-motion settings are respected.
- A network you can read: domain lanes show trust boundaries, selected group
routes show permission, and shared-fact edges show captured holdings. Project
inspection and complete captured-data tables preserve details beyond the bounded
16-node diagram. Missing measurements are explicit, and legacy records still render. - Evidence stays accessible: all existing observation panes remain, with a full
embedded-record inspector. Workflow lists reset between cycles, partial records
retain recorded problems, mobile archives retain every column, and diff dialogs
support keyboard focus and return. - A clearer entry point: the README explains practical value before mechanics;
a complete multi-domain network guide covers enrollment, group grants, sharing,
inspection, revocation, and migration. Synthetic HTML, screenshots, and SVGs make
the design reviewable without exposing personal memory. - Browser regression coverage: Chromium exercises themes, data completeness,
archive navigation, sparse and legacy records, network bounds, accessibility,
and narrow screens in a separate development-only CI job. The runtime and core
test matrix remain Python stdlib-only.
No cycle-record schema, store policy, canonical writer, or command contract changes.
Backward-compatible → patch.