Skip to content

Releases: jasonhnd/life_OS

v1.8.7 · OpenHuman-inspired hardening + md-only ontological constraint

25 May 14:38

Choose a tag to compare

v1.8.7 · OpenHuman-inspired hardening + md-only ontological constraint

Released: 2026-05-25 · Type: patch · Breaking changes: none

Summary

7 borrowed patterns from tinyhumansai/openhuman absorbed into lifeos, every one expressed in md-only. DR-10 elevates md-only from "policy" to lifeos's ontological constraint — the definitional property of being lifeos. 3 cargo-cult borrows cut per DR-08 to keep the product simple.

Product upgrades

Capability-changing (new things lifeos can do)

  • 🧠 gotchas + memory-keeper (C6)pro/gotchas.md is a single flat file of project-level technical gotchas, written exclusively by the new memory-keeper agent. archiver wrap-up now has a Phase 5 that auto-extracts new gotchas at every adjourn. ROUTER can short-circuit known issues before major tasks. Adjourn report contract expanded from 6-H2 to 7-H2.

  • 🔄 Self-driven loops (B4)/verify-release-and-watch and /notion-sync-and-watch use Claude Code's ScheduleWakeup to poll every 270s (cache-window-optimized interval) for up to 12 ticks (60-minute hard cap) until terminal state. Auto-fixes missing GitHub Release publish. Spec at references/self-driven-loops-spec.md. Claude Code only; other hosts gracefully degrade to manual reruns.

  • 📋 verify-release expanded to 11 checks

    • Check 8 expanded to 9 forbidden extensions (added .bash / .yml / .yaml / .json / .sql / .db / .sqlite)
    • Check 9 NEW: i18n diff parity (WARN level v1.8.7, BLOCK target v1.8.8) — catches EN/zh/ja drift class
    • Check 10 NEW: diff-scoped forbidden extensions — catches files introduced since last tag
    • Check 11 (was check 9): All regression fixtures FAIL — renumbered
  • 🛡️ AUDITOR Mode 7 added — 7 sub-checks (M7-1 through M7-7) verify v1.8.7 artifacts stay present + md-only constraint not bypassed even at design-proposal level. M7-7 scans for "introduce a JSON config" / "add a Python script" / "create a SQLite database" patterns in new specs.

Hardening (existing behavior made explicit/enforced)

  • 📚 evals_scenarios required in planning docs (B5)pro/agents/planner.md template now requires evals_scenarios: frontmatter field; pro/agents/dispatcher.md rejects planning docs without it. lifeos's eval-first philosophy elevated from "should" to "must". Spec at references/feature-workflow-spec.md.

  • 🔢 concept-spec hotness thresholds explicit (A3) — promotion thresholds (≥3 sessions → confirmed, ≥10 sessions → canonical, 90-day dormancy → retirement candidate) were previously implicit in code; now documented in references/concept-spec.md with rationale. Behavior unchanged.

  • 🚧 Five WHEN-NOT-TO-ADD.md boundaries (F12)pro/agents/ / references/ / _meta/ / themes/ / scripts/ each get a "what does NOT belong here" doc plus three-language mirrors. 15 anti-pattern docs total. Inspired by OpenHuman .claude/rules/README.md "This directory is intentionally near-empty."

Spec-only proposal (frozen for v1.9/v2.0)

  • 🌳 Memory tree cascade seal (A1, proposal)references/memory-tree-spec.md defines L0 → L1 → L2 → L3 cascade seal architecture (status: proposal). archiver behavior UNCHANGED in v1.8.7. Implementation deferred to v1.9/v2.0 pending real-data validation in Jason's second-brain. Cost calibration TBD ($300-$800/year of LLM bills for sealing depending on activity).

Ontological constraint (DR-10)

SKILL.md HARD RULE upgraded from "No .py/.sh/.yml/.json" to "md-only is lifeos's ontological constraint, no escape hatch, permanent". Forbidden extensions: .py / .sh / .bash / .yml / .yaml / .json / .sql / .db / .sqlite. Audit gates: verify-release check 8 (full-repo) + check 10 (diff-scoped) + AUDITOR Mode 7 M7-7 (proposal-level).

md-only is the definitional property of lifeos. A "lifeos" that introduces SQL / JSON / sh / py is no longer lifeos — it's a different project. No escape hatch. Borrowing patterns from external projects = borrow the pattern, never the tech stack.

Cuts (cargo-cult avoidance, DR-08)

3 borrowed patterns from OpenHuman that would have added product complexity without solving real lifeos pain were cut:

Cut Why
A2 content_hash frontmatter No documented dedup pain in violations.md or sessions history. Adding "just in case" is product rot starter
D8 three-layer compression rules lifeos is single-user; three independent rule sources don't exist. Borrowing OpenHuman's JSON merge architecture would add abstraction for a non-existent need
C7 workpad directory No user-layer purpose distinguishing workpad from sessions; would force "where to put this note" decision without value
Stage 7 aggressive/hash-only migration modes A2/A1 cut eliminated need for these modes — zero-friction upgrade sufficient

Decision standard (DR-09)

v1.8.7 audit trail records the decision standard shift: from "save working days" to "product quality". Every cut and every kept feature judged by "does this make lifeos better or just more complex?" Time was not a factor — "I don't fear taking time, I want to make the product good" (user, 2026-05-25).

Upgrade path (v1.8.6 → v1.8.7, zero-friction)

1. cd <lifeos repo> && git pull origin main
2. /version-check
3. /install-agents --refresh
4. /verify-release v1.8.7

No migration command. archiver first wrap-up after upgrade auto-creates pro/gotchas.md and runs memory-keeper in seed mode to populate ≥10 seed entries from v1.8.4-1.8.6 RFC + violations history.

File changes summary

  • Created: 35 new md files (specs trilingual, agent, commands, fixtures, WHEN-NOT-TO-ADD ×15, RFC, release-notes)
  • Modified: 30 existing md files (SKILL/README/CHANGELOG/MIGRATION trilingual, 9 themes, archiver/planner/dispatcher/auditor agents, concept/wiki/session-index specs trilingual, verify-release command, hard-rules-index)
  • Cut: 0 (no removals — additions only)
  • Cut at proposal stage: 3 (A2/D8/C7 never reached implementation)

References

  • Full RFC: _meta/rfc/v1.8.7-openhuman-borrowed-patterns.md
  • 10 Decision Records: DR-01 through DR-10
  • Pattern source: tinyhumansai/openhuman @ b7b8ba6
  • Companion specs: references/{gotchas,self-driven-loops,i18n-diff-parity,feature-workflow,memory-tree}-spec.md
  • AUDITOR Mode 7: pro/agents/auditor.md

v1.8.6 — md-only enforcement

23 May 12:19

Choose a tag to compare

v1.8.6 — md-only enforcement

Ship date: 2026-07-16
Type: patch (extends v1.8.5 "No .py/.sh" HARD RULE)
Trigger: User instruction "lifeos 不需要 md 之外的任何形式的文件"


What changed

v1.8.6 extends the "No .py/.sh" HARD RULE established in v1.8.5 Stage 2 to also forbid .yml, .yaml, and .json files in the lifeos repo. All structured data formats migrate to .md with YAML frontmatter (the frontmatter is YAML syntax, but the file is .md — passes the rule).

File-format migrations

Before (v1.8.5) After (v1.8.6) Notes
evals/regression-fixtures/rc-*.yml × 14 rc-*.md × 14 Original yaml preserved as yaml code block inside md
_meta/runtime/<sid>/<subagent>-<step>.json .md (R12 → R13) YAML frontmatter holds machine-parseable fields; markdown body human-readable
_meta/incidents/<id>.no-change.yml .md Same 7-field schema as frontmatter
~/.claude/lifeos-memory/<key>.json <key>.md Key + value structure as frontmatter
.github/workflows/test.yml DELETED CI moves to user-side /run-eval

Exception kept

  • .claude/settings.json and .claude/settings.local.json — Claude Code platform requirement, gitignored (not in repo)
  • .gitignore / .gitattributes — git infrastructure (not data format)

Verification

find . -type f \( -name '*.py' -o -name '*.sh' -o -name '*.yml' -o -name '*.yaml' -o -name '*.json' \) \
  -not -path './.git/*' -not -path './backup/*' -not -path './.venv/*'

Expected output: empty (or only ./.claude/settings*.json which are gitignored platform-required exceptions).

/verify-release check #8 expanded to enforce.


Spec changes

audit-trail-spec.md R12 → R13

R13 trail file format:

  • Path: _meta/runtime/<sid>/<subagent>-<step>.md (was .json)
  • Structure: YAML frontmatter (all R12 fields preserved) + markdown body (narrative + tool calls + reasoning + value_invocations expanded)
  • AUDITOR Mode 3 parses frontmatter same way; reads body for human review context
  • Legacy R12 .json files remain readable; lazy migration via /migrate-trail-r13 slash command

violations.md (no change)

Already .md format. F-Code mapping extended to include F4-forbidden-extension-trail for .json/.yml files in runtime dir.

Other specs

  • SKILL.md: HARD RULE "No .py/.sh" upgraded to "No .py/.sh/.yml/.json" with platform-exception clause
  • 3 CHANGELOG (EN/ZH/JA): v1.8.6 entry added per changelog-spec v1 schema

Migration

For users on v1.8.5:

  1. Audit trails: existing _meta/runtime/<sid>/*.json remain readable. New session trails written from v1.8.6+ install onwards will be .md. No action needed.

  2. Regression fixtures: already converted at the source repo. After updating lifeos plugin, your local clone has .md fixtures.

  3. GitHub Actions: if you forked the repo and used CI, you'll need to run /run-eval locally before each release. CI was lightweight (single test.yml file calling claude CLI), so this is minor.

  4. Decision records: if you've written any _meta/incidents/<id>.no-change.yml manually, rename to .md and wrap content in --- frontmatter delimiters. Optional — old yml still works if your AUDITOR reads it.

  5. Memory KV: same — old .json files in ~/.claude/lifeos-memory/ still work; new memory writes from v1.8.6+ go to .md.


Statistics

  • Files converted: 14 (regression fixtures)
  • Files deleted: 1 (.github/workflows/test.yml)
  • Specs updated: 2 (audit-trail-spec.md R12→R13, SKILL.md HARD RULE)
  • CHANGELOG entries added: 3 (EN/ZH/JA)
  • Lines added: ~150 (specs + CHANGELOG entries + release notes)
  • Lines deleted: ~50 (workflow yml + brief cleanup)
  • Net delta: +100 lines (mostly documentation)

v1.8.5 — Hook Retirement + EOU-Hardening

23 May 11:11

Choose a tag to compare

v1.8.5 — Hook Retirement + EOU-Hardening

Ship date: 2026-07-15
Type: patch (contains breaking schema changes; legacy 12-month coexistence per D3)
RFC: _meta/rfc/v1.8.5-cleanup-and-hardening.md
Branch: v1.8.5-cleanup-hardeningmain
Tag baseline: v1.8.4-pre-1.8.5 (a46fdac)


The largest single release in life_OS history

v1.8.5 ships in one shot what would normally be 5-7 minor versions. Two parallel tracks merged:

Track A · Hook Layer Retirement (Stage 2)

  • 11 bash hooks deleted (scripts/hooks/*.sh)
  • 38 .sh files removed (~8328 lines) — operations scripts, eval runners, wiki bootstrap, CI
  • 9 new slash commands (.claude/commands/*.md) — verify-release, check-spec-drift, notion-sync, migrate-soul-v2, migrate-wiki-v2, install-agents, uninstall-agents, run-eval, run-tool-eval, setup-secondbrain, version-check, regression-from-violation
  • GitHub Actions yml rewritten — single-line claude --execute "/cmd" only; no inline bash
  • 5-layer defense → 4-layer — runtime hook layer (Layer 1) integrally retired per D1 ("accept any pass rate")
  • 0 .py + 0 .sh achieved in lifeos repo (excluding backup/, .git/, .venv/)

Track B · 30 EOU-Hardening Borrowed Designs (Stages 3-9)

From xiaolai/eou-foundry @ e4b12ce — 6 agents × 121K lines of source code reviewed; 30 design ideas borrowed with attribution.

Foundation reference docs (Stage 3, three-language)

  • references/failure-taxonomy.md — F1-F17 architecture failure taxonomy
  • references/refactoring-patterns.md — 8+2 canonical refactor patterns + minimality rule
  • references/risk-domains.md — 8 high-risk domains × 5 escalation requirements
  • references/lifecycle-gates.md — 8 promotion transitions with evidence checklists

SOUL v2 schema (Stage 4)

Borrowed from eou-foundry dev-docs/06-values-over-rules.md + schemas/captured-workflow.schema.yml:

  • Priority {1..N} total order — no ties, no gaps, higher wins conflict
  • X-over-Y formulation — Y must NOT be strawman
  • Inclusion test 6Q gate — Speed/elegance/output volume NOT valid constitutional values
  • 3-8 dimension count cap
  • Mandatory outlier role slot — anti-confirmation-bias defense
  • /migrate-soul-v2 interactive slash command + AUDITOR Mode 4 + 3 regression fixtures

wiki v2 schema (Stage 5)

Borrowed from eou-foundry schemas/eou.schema.yml + engine/eou-contract.md:

  • 6 facets classification (function / target_object / automation_mode / authority_level / risk_level / lifecycle_stage)
  • operating_hypothesis (Given/can/within form, ≥30 chars)
  • context_manifest 3-layer (source_of_truth / supporting / forbidden)
  • reference_set 5 role slots — outlier mandatory for active+
  • failure_modes 三件套 (known / warning_signs / repair_actions)
  • arguments_against — non-trivial, specific failure mode + observable counter-signal
  • /migrate-wiki-v2 + AUDITOR Mode 5 + 2 fixtures

Agent v2 frontmatter for all 23 subagents (Stage 6)

  • New references/agent-spec.md v2 (三语)
  • All 23 pro/agents/*.md files gain: id, version, classification, operating_hypothesis, context_manifest, blast_radius, failure_modes
  • AUDITOR Mode 6 enforces compliance + 2 fixtures
  • per-agent authority_level mapping (router: suggest_only | archiver: publish | reviewer: approve | etc.)

Process layer (Stage 7)

  • Decision Records HARD RULE — REVIEWER no_change_record 7-field schema ("missing record = uninvestigated incident")
  • Minimality Rule HARD RULE — 6Q gate before creating new agent/spec/skill
  • Risk Domains HARD RULE — 8 domains × 5 escalation requirements (R1 finance / R2 health / R3 legal / etc.)
  • R12 audit trail upgradevalue_invocations[] 5-field array on contested-case decisions
  • AUDITOR Mode 3 F14-F17 scenarios — silent judgment / value hierarchy / value drift / value hallucination detection

Schema infrastructure (Stage 8)

  • references/changelog-spec.md v1 — CHANGELOG YAML frontmatter schema for v1.8.5+ (7 required fields incl. alternatives_considered + ordering_dependency + regression_cases_added)
  • pro/compliance/violations.md — new format with F-Code column for v1.8.5+ rows + A-F → F-Code mapping reference
  • SKILL.md +3 new HARD RULES (No .py/.sh, F-Code required, CHANGELOG schema required)

Regression fixtures (Stage 9)

  • 7 new fixtures: rc-f14 / rc-f15 / rc-f16 / rc-f17 / rc-forbidden-extension-sh / rc-court-start-001 / rc-confabulated-path
  • Combined with Stages 4/5/6 fixtures = 14 regression fixtures protecting v1.8.5 surface
  • /regression-from-violation slash command for lazy conversion of remaining historical rows

Migration Guide

For existing users (v1.8.4 → v1.8.5)

Step 1 · Update plugin

# In Claude Code
/install-skill https://github.com/jasonhnd/life_OS

Step 2 · Clear old hook configuration (one-time)

# In Claude Code (or Codex/Gemini)
/uninstall-agents       # removes old lifeos-* wrappers
/install-agents         # registers v2 agents

After this, ~/.claude/settings.json will have empty hooks: {} block — the bash hook layer is gone. Cleanup is automatic; no manual edit needed.

Step 3 · SOUL.md migration (optional, 12-month grace)

/migrate-soul-v2

Interactive — asks you per-dim to reformulate as "X over Y", assign priority, answer inclusion test. Skip-able dims marked legacy. Auto-deprecate 2027-05-23.

Step 4 · wiki/ migration (optional, 12-month grace)

/migrate-wiki-v2

Interactive — asks per-entry for 6 facets, operating_hypothesis, outlier reference, arguments_against. Skip-able entries marked legacy. Auto-deprecate 2027-05-23.

What changed in your daily workflow

  • "上朝" / Start Session: same behavior; ROUTER launches retrospective subagent. Hook reminder no longer auto-injected — relies on SKILL.md HARD RULE + retrospective Subagent Self-Check.
  • "退朝" / Adjourn: same 4-phase flow (archive → knowledge-extractor → DREAM → Notion sync). Phase 2 candidate gates now stricter (v2 schema). archiver Phase 4 auto-launches AUDITOR Mode 3-6 patrol.
  • REVIEWER veto: now MUST populate value_invocations[] in R12 trail with SOUL dim_id + rule_conflict + chosen_path + rejected_alternative. Empty array on contested case = F14 violation.
  • High-risk domain decisions (finance / health / legal / etc.): ROUTER auto-escalates to full deliberation; REVIEWER cannot give "approved" without 5 escalation requirements met.
  • Notion sync: /notion-sync slash command replaces notion-sync.sh audit trail writing. ROUTER still calls Notion MCP directly at Step 10a.
  • Release process: /verify-release replaces verify-release.sh — same 8 checks (6 git/gh + new no-py-sh + new regression-fixtures-fail).

What didn't change

  • All 6 domains (people/finance/growth/execution/governance/infra) — same dispatch, same reports, just v2 frontmatter
  • Theme system — 9 themes × 3 languages unchanged
  • DREAM cycle — same 3 stages (organize / consolidate / creative connections)
  • Strategic Map — unchanged
  • Workflow state machine — same legal transitions

Risk Posture Post-v1.8.5

Risk v1.8.4 v1.8.5 Mitigation
COURT-START class violation (skip retrospective subagent) Layer 1 hook injects reminder No hook — SKILL.md HARD RULE only AUDITOR Mode 3 detects post-hoc; rc-court-start-001 regression fixture
Confabulated path / fabricated evidence Layer 1 hook scans Read/Write No hook — Cortex narrator citation discipline only AUDITOR Mode 3 F17 + rc-confabulated-path
Outbound PII to Notion Layer 1 pre-notion-write.sh scans content No hook/notion-sync slash command relies on LLM prompt-level check AUDITOR Mode 5 + outbound-pii-patterns.md still consulted
Silent judgment (REVIEWER veto without SOUL citation) No defense (v1.8.4 didn't have R12 value_invocations) AUDITOR Mode 3 F14 + rc-f14-silent-judgment Required field in R12 trail
SOUL dim hallucination (cite non-existent dim) No defense AUDITOR Mode 3 F17 + rc-f17-value-hallucination grep check against SOUL.md
Value drift over multiple sessions No defense AUDITOR Mode 3 F16 + rc-f16-value-drift 30-day window aggregation

D1 decision context: Day 21 hook-retired stress test was projected to validate the 5→4 layer trade. User accepted any pass rate ("接受") — no rollback even if regression rate increases. The bet is that v2 schema enforcement + AUDITOR Mode 3-6 + 14 regression fixtures compensate for runtime hook absence.


Acknowledgments

Original inspiration: xiaolai/eou-foundry @ e4b12ce (https://github.com/xiaolai/eou-foundry). The "EOU" (Executable Operating Unit) framework provided 30 design ideas borrowed across Stages 3-9. Every borrowed concept carries attribution in the relevant references/*.md spec.

Two systems independently converged to 5 governance attractors:

  1. Audit trail as filesystem evidence (life_OS R11/R12 ↔ eou runs/)
  2. Evidence-bound assertion (life_OS REVIEWER citations ↔ eou activated_by)
  3. Honest downgrade ("don't fake maturity") (life_OS lifecycle gates ↔ eou L0-L6)
  4. Generating ≠ Operating separation (life_OS authority_level ↔ eou function:generate forbidden_outputs)
  5. Self-approval paradox explicit (life_OS Rule of Conduct #7 ↔ eou ECP-0011 CI auto-merge exception)

That two independent agentic-governance systems reach the same 5 invariants is a strong signal these are real attractors of the design space — not coincidental.


Verify Release

After ship:

/verify-release v1.8.5

Must pass all 8 checks:

  1. HEAD == origin/main
  2. Tag v1.8.5 points to HEAD
  3. Tag on remote
  4. GitHub Release exists (not Draft)
  5. Marked as Latest
  6. No .py / .sh in repo (excluding backup/git/venv)
  7. All regression fixtures FAIL when run through validators
  8. CHANGELOG v1.8.5 entry conforms to schema (7 YAML fields)

Sta...

Read more

v1.8.4 — Anti-confabulation: DREAM + maintenance overdue

16 May 13:25

Choose a tag to compare

v1.8.4 — Anti-confabulation: DREAM stale-task validation + maintenance overdue source-of-truth

Two surgical fixes for briefing free-form-generation holes detected on 2026-05-16. Both bugs are class B (LLM fabrication of evidence) — the subagent invented numeric/state claims instead of reading primary source. v1.8.4 lifts each source-of-truth into something the subagent must call and forces ROUTER to re-verify before showing the briefing.

Bug R-DREAM-STALE-TASK · DREAM trigger validity re-check

DREAM journals are async overnight snapshots. A HARD trigger written at N-1's adjourn can already be resolved by the user before N's session boot — but retrospective Step 16 promoted it to today's P0 anyway. The 2026-05-16 briefing surfaced 8938 revenue-uplift task closure as a P0 follow-up even though that task had status: closed-superseded written the day before.

Fix:

  • pro/agents/retrospective.md Step 16 gains TRIGGER VALIDITY RE-CHECK HARD RULE. Subagent MUST Read referenced task frontmatter and inspect status: BEFORE promotion. Closed/done/superseded → render as ✅ auto-resolved, do NOT promote.
  • R11 audit trail gains dream_triggers_validated field (one entry per HARD trigger).
  • references/dream-spec.md triggered_actions schema gains optional task_ref: { task_path, task_slug, project } field (three-language lockstep).
  • 4-tier resolution: task_path direct read → task_slug + project fuzzy match → LLM-parse detection.hard_signalsstill-actionable fallback. Behavioral triggers (decision-fatigue, dormant-soul) skip validation entirely.

Bug R-MAINT-OVERDUE-HALLUCINATION · maintenance overdue single source of truth

The 2026-05-16 briefing reported archiver-recovery 13d overdue while the same session's session-start-inbox.sh hook had emitted 3d. The subagent free-form-estimated instead of running the script.

Fix · two-layer defense:

  1. Subagent layer · Step 0.5 marker list gains [Maintenance overdue: ...] literal marker. New HARD RULE forces subagent to run session-start-inbox.sh itself, strip <system-reminder> wrapper, paste verbatim. No copying transcript stale values, no re-estimating day count.
  2. ROUTER layer · SKILL.md fact-check rule 8 re-runs the same script and byte-equal compares. Mismatch → strike marker. Marker missing → refuse to show briefing.
  3. Mode 2 (Review) inherits same contract · Data Sources step 7 added. Mode 2 reviews span longer time windows = more drift exposure, so the marker is mandatory there too.
  4. <system-reminder> wrapper handling explicitly documented on both subagent and ROUTER sides.

Zero new infrastructure

v1.8.0 Zero-Python / Zero-new-script invariant preserved. No new SH/PY files. Reuses existing scripts/hooks/session-start-inbox.sh and scripts/verify-release.sh.

Files changed (11)

  • pro/agents/retrospective.md (Step 16 + Step 0.5 + Mode 2 step 7)
  • SKILL.md (version + rule 8 + wrapper-strip note)
  • references/dream-spec.md + i18n/zh/references/dream-spec.md + i18n/ja/references/dream-spec.md (task_ref schema)
  • README.md + i18n/zh/README.md + i18n/ja/README.md (badge)
  • CHANGELOG.md + i18n/zh/CHANGELOG.md + i18n/ja/CHANGELOG.md (entry)

See CHANGELOG.md for full details.

v1.8.3 — Outbound PII gate for Notion MCP writes

09 May 13:17

Choose a tag to compare

Closing the outbound privacy gap

v1.8.2 hardened what enters your vault (pre-write-scan.sh defends SOUL.md, wiki/, _meta/concepts/, user-patterns.md against secrets, prompt injection, invisible Unicode). But Decision/Task/Journal bodies — full of raw user prose, third-party names, specific amounts — were synced from _meta/outbox/<sid>/ straight to Notion at Step 10a with no privacy gate at all.

v1.8.3 adds the missing outbound counterpart: a PreToolUse hook intercepting every Notion MCP write call.

Why local outbox and Notion are not the same threat model

What can safely live under your private git repo is not the same as what should travel to Notion:

  • Notion workspaces may be shared (team Notion, accidental public link)
  • Notion AI may index page content for org-wide assistants
  • Mobile-device theft exposes the Notion app
  • Notion has had data-breach incidents historically

The same sentence ("我老婆觉得 X 公司给的 ¥850 万 …") can be acceptable in your private journal and unacceptable on Notion's servers.

Three-tier action model

Group hit Verdict Action
A — private key, AWS / GitHub / Slack token, full credit-card, SSN, JP MyNumber, ≥40-char high-entropy block exit 2, cancels the call, logs CLASS_F violation
B — third-party name + sensitive event (出轨/破产/被裁/divorced/fired) warn reminder; orchestrator MUST pause and ask (a) sanitize / (b) skip / (c) override
C — company name + specific amount, bank-account-shaped numbers warn same
D — email / international phone / JP+CN mobile / JP postal address warn same
E — URL trackers, JWT shape info quiet log only
no hit pass proceeds normally

Audit trail

_meta/runtime/<sid>/notion-pii-scan-<ts>.json records the matched-pattern category IDs (never raw content), so AUDITOR Mode 3 patrol can track outbound risk frequency over time.

Smoke-tested

8 cases pass: empty input / non-Notion tool / clean write / GitHub token block / email warn / family+amount combined warn / utm info / ID-key strip prevents A9 false-positive on database_id.

Migration

cd ~/.claude/skills/life_OS && git pull
bash scripts/setup-hooks.sh   # registers life-os-pre-notion-write

Idempotent. To uninstall: bash scripts/setup-hooks.sh --uninstall.

Files

  • references/outbound-pii-patterns.md (new — 5-group pattern catalogue)
  • scripts/hooks/pre-notion-write.sh (new — the gate, 335 lines bash, jq → python → raw fallback)
  • scripts/setup-hooks.sh — registers life-os-pre-notion-write
  • pro/CLAUDE.md — Step 10a outbound boundary HARD RULE
  • references/hooks-spec.md — §5.6 + CLASS_F in §8 severity table
  • SKILL.md — version 1.8.2 → 1.8.3
  • 3-language README (EN / ZH / JA) — badge + What's New section
  • 3-language CHANGELOG (EN / ZH / JA) — v1.8.3 entry

See CHANGELOG.md for full detail.

v1.8.2 - Obsidian-readable everything + binary output redirect

04 May 02:29

Choose a tag to compare

See CHANGELOG.md v1.8.2 entry for full details. Two user-driven features: (1) global Obsidian readability HARD RULE applied to ALL human-readable .md output (callouts, wikilinks, nested tags, mermaid, footnotes); (2) PreToolUse hook auto-redirects binary outputs (HTML/PDF/DOCX/...) to ~/Downloads/lifeos-export-/ instead of cluttering the vault. Plus 4 new wiki templates with kind: field, /wiki-obsidian-upgrade slash command, and 25/25 fixture smoke tests. https://github.com/jasonhnd/life_OS/blob/main/CHANGELOG.md#182---2026-05-04

v1.8.1 - Wiki pipeline + zero-command vault auto-bootstrap

01 May 09:07

Choose a tag to compare

Life OS v1.8.1 — Wiki pipeline + macOS portability + scanner regression-proof

Purely additive plus bugfixes on top of v1.8.0. No breaking changes; v1.8.0 sessions / wiki / SOUL fully forward-compatible.

Plan B wiki delivery (4 new features)

F1 · wiki/log.md activity timeline

Append-only one-line-per-op log. Action enum: created | updated | promoted | deprecated | merged | renamed | rejected | bulk. /inbox-process and /research write log entries automatically; manual edits should follow same pattern.

F2 · Obsidian vault setup

  • wiki/OBSIDIAN-SETUP.md template with Dataview queries, Graph Analysis recommendations, Templater binding instructions, and a graph.json color-group snippet for visually distinguishing wiki/ nodes.
  • wiki/.templates/wiki-entry-template.md SCHEMA-compliant stub for one-keystroke entry creation via Templater.
  • scripts/wiki/wiki-link-audit.sh — pure bash + awk, zero Python deps. Generates link health report at _meta/eval-history/wiki-link-audit-YYYY-MM-DD.md covering broken links, orphan entries, stale entries (>180d), low-confidence entries (<0.5). Replaces deleted v1.7 tools/wiki_decay.py auditor side.

F3 · Inbox ingest pipeline

  • New _meta/inbox/to-process/ drop-zone for any .md you want triaged later.
  • /inbox-process slash command + scripts/prompts/inbox-process.md LLM prompt. Triage loop: scan → propose disposition (accept→wiki / update→wiki / archive / reject / defer) → user-confirm → execute → log.
  • SessionStart hook (session-start-inbox.sh) now counts pending and deferred items and surfaces 📥 Inbox: N items waiting (run /inbox-process) as one line. Deferred items counted separately and not treated as actionable.

F4 · /research multi-agent command

  • Spawns 5 (or 8 with --depth deep) parallel general-purpose subagents covering academic / practitioner / contrarian / origin / adjacent (+ mechanistic / data-statistics / meta-review for deep mode).
  • Synthesizes a SCHEMA-compliant wiki draft with mandatory Counterpoints section.
  • Default counter-bias check launches 1 additional opposing-evidence agent; bumps confidence DOWN 0.1 if substantive opposition found.
  • Wall-time target ≤ 7 min. Cost ~$0.30-$0.80/run.

scripts/wiki/setup-secondbrain.sh — one-time deploy

Run once inside your second-brain vault on Mac:

cd ~/path/to/SecondBrain
bash ~/.claude/skills/life_OS/scripts/wiki/setup-secondbrain.sh

Idempotent (safe to re-run). Refuses to run inside the Life OS dev repo. Creates: wiki/log.md initial header, wiki/OBSIDIAN-SETUP.md, wiki/.templates/wiki-entry-template.md, _meta/inbox/to-process/.gitkeep, _meta/inbox/README.md. Prints SCHEMA logging-convention append snippet + graph.json color-group snippet for manual follow-up.

Critical bugfixes

macOS portability (P0 from downstream user 4-day field report)

  • pre-bash-approval.sh had 5 bare python -c invocations (lines 57/147/180/193/201). macOS 12+ removed bare python; only python3 exists. Hook fail-CLOSED with python: command not found → blocked every Bash command → Claude Code deadlock. R-1.8.0-020 commit title claimed this was fixed; the file was never edited until now. Added portable PYTHON=$(command -v python3 || command -v python) detection at top; replaced all 5 bare-python calls with "$PYTHON".

Scanner regression-proof

  • pre-write-scan.sh pattern #5 over-matched any backticked content, blocking legitimate markdown inline code (`python -m tools.embed`). Tightened to require shell-metacharacter content inside backticks (; / | / && / >> / $( / $VAR / known-dangerous command names). Markdown identifier-style backticks now pass; real shell-injection payloads still block.

Rolled-up from v1.8.0 maintenance line (R-1.8.0-021 + R-1.8.0-022)

  • session-start-inbox 2 wrong task names: auditor-patrolauditor-mode-2, monthly-summaryeval-history-monthly (now match pro/CLAUDE.md canonical 10-job table + actual scripts/prompts/*.md files).
  • NEVER_RUN bucket split from OVERDUE: tasks with no baseline now go under ## Available on-demand (do NOT proactively offer) with explicit instruction to stay silent unless user asks. Output compressed from 8+ lines to 1 comma-separated line for token budget.
  • Notion sync (pro/CLAUDE.md Step 10a) is now config-driven, not hardcoded to 4 entities. Reads _meta/config.md, only syncs configured entities, skips Step 10a entirely if no Notion configured, no false-fail lines in checklist.
  • pre-bash-approval pattern transparency: extracts key= + matched=<actual substring> + regex=<source pattern> instead of falling through to "unknown". Doc note: inline export LIFEOS_YOLO_MODE=1 doesn't work in Claude Code Bash tool (PreToolUse hook reads env BEFORE export executes); persistent bypass requires ~/.claude/settings.local.json env block.

Verification (CI matrix at this commit)

  • bash -n on all 32 tracked .sh: pass
  • STRICT=1 bash scripts/check-spec-drift.sh: exit 0
  • mypy --strict tools/: 0 errors / 16 source files
  • ruff check tools/ tests/: All checks passed
  • pytest tests/: 233 passed / 3 deselected
  • bash scripts/verify-release.sh: 7/7 ✅

Migration

# 1. Update Life OS skill
cd ~/.claude/skills/life_OS && git pull
bash scripts/setup-hooks.sh

# 2. In your second-brain vault (NOT this dev repo)
cd ~/path/to/SecondBrain
bash ~/.claude/skills/life_OS/scripts/wiki/setup-secondbrain.sh

# 3. (optional) Run baseline link audit
bash ~/.claude/skills/life_OS/scripts/wiki/wiki-link-audit.sh
# Report: _meta/eval-history/wiki-link-audit-YYYY-MM-DD.md

No second-brain data migration required. Existing wiki entries continue to work; new conventions apply to new writes only.

For full per-section detail see CHANGELOG.md (also 中文 / 日本語).

v1.8.0 - User-Invoked Maintenance + Spec GC + count-drift + Release alignment + macOS portability + Notion config-driven

01 May 06:33

Choose a tag to compare

Life OS v1.8.0 — User-Invoked Maintenance (post-pivot final)

Pivot summary: v1.8.0 originally shipped with cron autonomy + always-on Cortex. After two days of production testing the cron architecture failed every reliability test (silent data loss, LLM-in-cron permission stalls, stale script paths, multiple bash compatibility bugs). v1.8.0 was pivoted in-place (same version tag) to a simpler design: the user invokes everything, ROUTER does the work directly.

Core principle: cron required determinism, LLMs are non-deterministic — that mismatch can't be patched. Replace cron with explicit user prompts. The user types rebuild index or monthly review, ROUTER reads scripts/prompts/<job>.md and executes inline. No background processes. Nothing runs without you watching.

What's in v1.8.0

Two session modes

  • Mode 1 · Business session — your standard Claude Code chat. Long-lived: a session can span days/weeks. 上朝/退朝 are optional soft triggers. Cortex is now pull-based (ROUTER decides per-message whether to launch hippocampus / concept-lookup / soul-check / gwt-arbitrator) instead of always-on.
  • Mode 2 · Monitor session (/monitor) — view-and-invoke operations console. Shows maintenance task timestamps + recent reports + action items. You say "跑 X" / "都跑", monitor reads the matching prompt and executes. No cron, no background.

10 user-invoked maintenance jobs

Each is a markdown prompt at scripts/prompts/<job>.md that ROUTER reads + executes via Read/Write/Bash:

  • reindex · daily-briefing · backup · spec-compliance · wiki-decay (the v1.7.x "python tool" jobs, now LLM-driven)
  • archiver-recovery · auditor-mode-2 · advisor-monthly · eval-history-monthly · strategic-consistency (the v1.8.0 "prompt cron" jobs, now user-invoked)
  • Plus R-1.8.0-013 additions: review-queue · migrate-to-wikilinks

Hooks (only 1 fires automatically)

  • session-start-inbox — at session start, scans the maintenance jobs' last-run timestamps and shows a one-line "what's overdue" status. Does not execute anything; you decide what to invoke.
  • pre-prompt-guard — memory keyword auto-detect + 上朝/退朝 soft trigger. Cortex always-on enforcement REMOVED.
  • pre-bash-approval (kept) — security gate against dangerous bash.
  • post-task-audit-trail (weakened) — only enforces R11 audit trail for archiver + knowledge-extractor.

R-1.8.0-013 · 5 borrows from llm_wiki

  • Obsidian wikilinks ([[concept]]) replace plain-text concept ids
  • Async review queue for low-confidence wiki / SOUL writes
  • 4-signal relevance (recency, frequency, importance, semantic)
  • Page taxonomy refinement (entry / topic / index)
  • Vault-compatible _meta/concepts/ layout

R-1.8.0-014 ... R-1.8.0-019 · Spec GC + count-drift permanent fix

Six rounds of spec-drift cleanup driven by user audits:

  • R-1.8.0-014 Spec GC Sprint completion — STRICT scanner introduced, 71 v1.7-era files marked status: legacy
  • R-1.8.0-015 subagent count realigned 16 → 23, scanner adds count-drift detection
  • R-1.8.0-016 count-free wording across all active docs (drop hardcoded count entirely; "multiple subagents / 多个 subagent / 複数の subagent")
  • R-1.8.0-017 scanner EXEMPT_PATTERN narrowed (no more directory-level passes)
  • R-1.8.0-018 scanner lookback paragraph-aware (resets on blank lines + H1-H6)
  • R-1.8.0-019 active doc index no longer links to legacy 16-agents paths; scanner catches such links

Final scanner has 5 layered defenses against spec drift; future agent-count changes won't require any doc edit.

Removed in pivot

  • Cron infrastructure: scripts/setup-cron.sh, scripts/run-cron-now.sh, scripts/commands/run-cron.md, tools/missed_cron_check.py, tools/cron_health_report.py, all launchd plists.
  • Python middleware: tools/memory.py (now Write/Read directly to ~/.claude/lifeos-memory/), tools/session_search.py (now Grep directly), tools/cli.py (no longer needed), 5 maintenance python tools (replaced by user-invoked prompts above).
  • Cortex artifacts: pro/agents/narrator-validator.md (validator was tied to always-on flow).
  • Spec docs: references/automation-spec.md, references/session-modes-spec.md, docs/architecture/hermes-local.md (cron-era specs).

Migration

Re-pull the repo, then re-run bash ~/.claude/skills/life_OS/scripts/setup-hooks.sh (re-registers the simplified hook set). On macOS, launchctl unload ~/Library/LaunchAgents/com.lifeos.hermes-local.*.plist && rm ~/Library/LaunchAgents/com.lifeos.hermes-local.*.plist to remove the dead cron jobs. No second-brain data migration required. v1.7.x sessions / wiki / SOUL fully compatible.

CI matrix (verified at this commit)

  • STRICT=1 bash scripts/check-spec-drift.sh → exit 0 (broken paths: 0; subagent-count drift hits in active files: 0)
  • mypy --strict tools/ → 0 errors / 16 source files
  • ruff check tools/ tests/ → All checks passed
  • pytest tests/ → 233 passed / 3 deselected
  • bash -n on all 31 tracked .sh → pass

For full per-round detail see CHANGELOG.md (also available in 中文 / 日本語).

v1.7.3 - Cortex enforcement + auto-trigger + archiver Phase 2 carve-out + 4 dead modules removed (FINAL)

27 Apr 00:48

Choose a tag to compare

The "make tools actually usable" release window. Three iterations folded into the single v1.7.3 release per user request:

  1. v1.7.3 base (2026-04-26): Cortex always-on hook, 4 slash commands, approval guard wired, 4 dead modules removed.
  2. v1.7.3 auto-trigger patch (2026-04-27): slash commands demoted to backup mode after user feedback. pre-prompt-guard.sh memory keyword detection added.
  3. v1.7.3 archiver carve-out (2026-04-27): Phase 2 split into dedicated knowledge-extractor subagent to fix 80%+ recent archiver placeholder violations. spec consistency fixes + stop-session-verify LLM_FILL detection.

All three folded into single v1.7.3 release per user request: 「版本号不能变,还是 1.7.3,都要在这个版本里面全部修完」.

Added

  • Cortex always-on enforcement (hook injection): scripts/hooks/pre-prompt-guard.sh now emits a <system-reminder> block (trigger=cortex) that forces ROUTER to launch all 5 Cortex subagents (hippocampus / concept-lookup / soul-check / gwt-arbitrator / narrator-validator) in parallel before answering, whenever the prompt qualifies (length ≥ 80 chars OR decision keyword detected). Closes the silent-degradation gap found in v1.7.2 audit (0 _meta/runtime/<sid>/cortex-*.json audit trails across 17+ sessions). Skip rules: short conversational filler ("ok", "go on") bypasses Cortex.
  • 4 slash commands wired into Claude Code: new scripts/commands/{compress,search,memory,method}.md source files; scripts/setup-hooks.sh now copies them to ~/.claude/commands/ during install. Commands:
    • /compress [focus] — inline context compression with _meta/compression/<sid>-compress-<ts>.md archive.
    • /search <query> — FTS5 cross-session search via tools.session_search CLI.
    • /memory emit|read|remove|path — 24-48h short-term memory via tools.memory CLI.
    • /method create|update|list — method library management via tools.skill_manager CLI.
  • Approval guard wired (PreToolUse Bash hook): new scripts/hooks/pre-bash-approval.sh bridges every Bash command to tools/approval.py. Closes the v1.7.2 gap where 47 dangerous-command patterns + hardline + tirith guards sat with 0 callers. Hook reads Claude Code stdin JSON, runs check_dangerous_command(), exits 0 (silent approve) or exit 2 + stderr (block with reason). Bypass: export LIFEOS_YOLO_MODE=1. Registered in setup-hooks.sh as life-os-pre-bash-approval (PreToolUse · matcher Bash · timeout 5s).
  • Memory auto-emit detection (auto-trigger patch · 2026-04-27): pre-prompt-guard.sh also detects 中/英/日 memory keywords (记一下 / remind me / 覚えて / TODO etc) and injects <system-reminder> (trigger=memory) forcing ROUTER to auto-run python -m tools.memory emit instead of redirecting user to /memory. Adds trigger=memory value to hook activity log.
  • pro/CLAUDE.md → Auto-Trigger Rules section (auto-trigger patch · 2026-04-27): codifies memory auto-emit, compress auto-suggest, search auto-trigger (via Cortex hippocampus), method auto-create (via archiver Phase 2 → knowledge-extractor). Principle: "if ROUTER asks the user to switch to a slash command, that is a UX bug — just do the action".
  • knowledge-extractor subagent (Phase 2 carve-out · 2026-04-27): new pro/agents/knowledge-extractor.md (Opus tier, [Read, Grep, Glob, Bash, Write] tools). Performs the 7 Phase 2 sub-steps (wiki six-criteria gate / SOUL changes / methods / concepts + Hebbian / SessionSummary / snapshot / strategic-map) AND writes the 7 persistent files. Writes 7 extraction reports to _meta/runtime/<sid>/extraction/*.md for archiver to read back. R11 audit trail to _meta/runtime/<sid>/knowledge-extractor.json. Reason: previous monolithic archiver had 80%+ placeholder violations (10+ recent adjourn runs in pro/compliance/violations.md 2026-04-25 through 2026-04-27) because it had to do everything in one invocation. ROUTER MUST launch knowledge-extractor BEFORE archiver.

Changed

  • narrator-validator audit trail HARD RULE: pro/agents/narrator-validator.md frontmatter tools extended from [Read] to [Read, Bash, Write]; new "Audit Trail (R11, HARD RULE)" section added requiring _meta/runtime/<sid>/narrator-validator.json write before returning YAML output.
  • Version markers: SKILL.md frontmatter and 3 README badges updated to 1.7.3.
  • Spec docs updated for inline compression: SKILL.md Trigger Execution Templates /compress section, references/hard-rules-index.md manual compression bullet, and evals/scenarios/cortex-retrieval.md CX11 positive case all rewritten to describe ROUTER inline compression replacing the removed tools/context_compressor.py.
  • 4 slash command files demoted to backup mode (auto-trigger patch · 2026-04-27): each scripts/commands/{compress,search,memory,method}.md now starts with a "⚠️ Backup mode" header pointing to the relevant pro/CLAUDE.md Auto-Trigger Rules subsection. Slash commands remain functional for: (1) precise user control, (2) developer smoke test, (3) auto-trigger fallback.
  • archiver.md Phase 2 carve-out + spec consistency fix (carve-out · 2026-04-27): pro/agents/archiver.md line 77 fixed (was "12-section Adjourn Report Completeness Contract" legacy v1.7.2 wording, now matches v1.7.2.3 "6-H2"). Phase 2 entire spec rewritten: primary path delegates to knowledge-extractor subagent; legacy 7-sub-step inline spec preserved as fallback. pro/CLAUDE.md Step 10 updated: ROUTER MUST launch knowledge-extractor first, then archiver. New launch sequence template.
  • stop-session-verify hook LLM_FILL detection (carve-out · 2026-04-27): scripts/hooks/stop-session-verify.sh check_phase() enhanced. Previously only detected TBD / {...} / "placeholder" string in phase header lines. Now also scans the next 30 lines after each phase header for unfilled <!-- LLM_FILL: ... --> patterns and LLM_FILL: strings, marking that phase as placeholder_phases. Catches the actual root cause of recent archiver violations (LLM emitting Bash skeleton verbatim without filling placeholders).

Removed (4 dead modules · 1830 lines)

  • tools/prompt_cache.py deleted (118 lines, 0 callers): no value in Claude Code subscription mode.
  • tools/mcp_server.py deleted (227 lines, 0 callers, 0 client connections): MCP stdio wrapper never connected.
  • tools/context_compressor.py deleted (1370 lines, 0 callers): compression now inline by ROUTER.
  • tools/manual_compression_feedback.py deleted (51 lines, 0 callers): output helper for removed compressor.
  • docs/architecture/prompt-cache-strategy.md deleted: spec doc for removed prompt_cache.
  • docs/architecture/mcp-server.md deleted: spec doc for removed mcp_server.
  • docs/architecture/hermes-local.md cleaned: removed dead-module refs from related: frontmatter; rewrote Borrow/Fork Surface module list to reflect v1.7.3 reality (approval wired, memory + session_search + skill_manager remain); removed context_compressor naming-note paragraph.

Migration

Re-run bash ~/.claude/skills/life_OS/scripts/setup-hooks.sh to:

  1. Install 4 new slash commands to ~/.claude/commands/
  2. Register the new life-os-pre-bash-approval PreToolUse(Bash) hook
  3. Update pre-prompt-guard.sh (now with Cortex always-on + memory keyword detection)
  4. Update stop-session-verify.sh (now with LLM_FILL detection + 30-line section body scan)

After install, every Bash command Claude runs is screened against the 47 dangerous patterns; if blocked, you'll see the 🛡️ 守门人 message in stderr.

No second-brain migration required.

Audit Verdict (post-v1.7.3 final)

All v1.7.2 dead-weight findings AND v1.7.3 archiver-violation root cause are closed:

  • Cortex always-on: enforced (hook injection) ✅
  • approval.py 47 patterns: wired (PreToolUse Bash hook) ✅
  • 4 dead modules removed (1830 lines) ✅
  • Slash commands wired AND demoted to backup mode in favor of auto-trigger ✅
  • Memory auto-emit: hook detects keywords and forces ROUTER auto-emit ✅
  • archiver Phase 2 carved out into knowledge-extractor subagent ✅
  • archiver.md spec internal consistency restored (12-section vs 6-H2 fixed) ✅
  • stop-session-verify LLM_FILL detection added ✅

User feedback driving this release window:

  1. "我为什么要用这样的方式来启动这些命令?这些命令不可以直接自动启动吗?" → auto-trigger patch
  2. "重新检查一下上朝流程和退朝流程" → revealed 80%+ archiver placeholder violations → carve-out
  3. "C 还是1.7.3" + "版本号不能变,还是 1.7.3,都要在这个版本里面全部修完" → all changes squashed into single v1.7.3 release

v1.7.2.3 - Retrospective skeleton ownership + SOUL/DREAM display + Adjourn speed fix

26 Apr 12:37

Choose a tag to compare

Subagent D ownership patch. Scope limited to pro/agents/retrospective.md, SKILL.md, three README files, and three CHANGELOG files.

Changed

  • RETROSPECTIVE ownership narrowed: pro/agents/retrospective.md now states that ROUTER pre-renders roughly 80% of Mode 0 via Bash skeleton.
  • Single LLM fill slot: the subagent fills only <!-- LLM_FILL: today_focus_and_pending_decisions --> with about 5-15 lines for Today's Focus and Pending Decisions; ROUTER splices that block into the skeleton.
  • Version markers: SKILL.md and README badges now point to 1.7.2.3.
  • install_sha field for SHA gap fix: SKILL.md frontmatter now carries commit_sha and install_date fields. setup-hooks.sh auto-writes them on git clone deployments. New scripts/lib/sha-fallback.sh provides 3-tier resolution: SKILL.md frontmatter → .install-meta JSON → git rev-parse HEADunknown. Closes Local commit SHA: unknown bug on install-skill deployments.
  • SOUL/DREAM display restored (v1.6.x parity): scripts/retrospective-briefing-skeleton.sh now Bash-pastes full SOUL.md content and full latest _meta/journal/*-dream.md content verbatim in fenced markdown blocks. LLM only adds delta interpretation (confidence trend / today implications) on top, cannot compress structural SOUL/DREAM data. pro/agents/retrospective.md ## 2 / ## 3 spec updated to reflect new "Bash paste full content + LLM trend narrative" model. Reverses v1.7.2.1 over-subtraction that compressed SOUL Health to "changed dimensions only" and DREAM to "1-2 sentence digest".
  • Adjourn 12 H2 → 6 H2 + LLM token budget (speed fix): pro/agents/archiver.md Adjourn Report Completeness Contract reduced from 12 H2 to 6 core H2 (Phase 0/1/2/3/4 + Completion Checklist). AUDITOR Mode 3 / Subagent self-check / 子代理调用清单 / Hook fired / total tokens-cost folded as H3 sub-items under Completion Checklist. New "Phase 2/3 LLM Token Budget" HARD RULE: Phase 2 narrative ≤ 1500 tokens (combined wiki/SOUL/method/concept/strategic/SessionSummary/snapshot/last_activity), Phase 3 narrative ≤ 800 tokens. Verbatim DREAM journal does not count toward budget (Bash paste). Speed target: archiver Adjourn 25 min → 10-12 min.
  • archiver-briefing-skeleton.sh new (Bash skeleton for archiver): New scripts/archiver-briefing-skeleton.sh mirrors retrospective-briefing-skeleton.sh design — emits 6 H2 Adjourn Report framework with Bash-pasted Phase 0/1/4 + measured facts (outbox path / decision-task-journal counts / wiki-SOUL-DREAM stat / git status / Stop hook health). LLM only fills <!-- LLM_FILL --> placeholders for Phase 2/3 narrative + Completion Checklist values. Wired into pro/CLAUDE.md / pro/GEMINI.md / pro/AGENTS.md Step 10 Adjourn Session block. Complementary to existing archiver-phase-prefetch.sh (R11 audit trail).
  • Session Binding HARD RULE rewritten (product direction correction): pro/CLAUDE.md / pro/GEMINI.md / pro/AGENTS.md Session Binding HARD RULE clarified: discussion scope ≠ data write scope. Session binding constrains data persistence (where decisions/wiki/SOUL get written) but NOT discussion topics. ROUTER engages directly with whatever the user raises (financial / strategic / interpersonal / cross-project / abstract). ROUTER MUST NOT deflect with "本窗口角色只做 X" / "请转到其他窗口" / "translate to planner trigger paste for another window" / "召唤翰林院 panel" without explicit user request. Reverses 13-round hardening accumulated effect of LLMs treating session binding as business-topic forbidden zone. Restores Life OS to its founding purpose as a decision thinking assistant.

Migration

No second-brain migration required.