Releases: jasonhnd/life_OS
v1.8.7 · OpenHuman-inspired hardening + md-only ontological constraint
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.mdis a single flat file of project-level technical gotchas, written exclusively by the newmemory-keeperagent. 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-watchand/notion-sync-and-watchuse Claude Code'sScheduleWakeupto 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 atreferences/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
- Check 8 expanded to 9 forbidden extensions (added
-
🛡️ 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.mdtemplate now requiresevals_scenarios:frontmatter field;pro/agents/dispatcher.mdrejects planning docs without it. lifeos's eval-first philosophy elevated from "should" to "must". Spec atreferences/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.mdwith 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.mddefines 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
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.jsonand.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
.jsonfiles remain readable; lazy migration via/migrate-trail-r13slash 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:
-
Audit trails: existing
_meta/runtime/<sid>/*.jsonremain readable. New session trails written from v1.8.6+ install onwards will be.md. No action needed. -
Regression fixtures: already converted at the source repo. After updating lifeos plugin, your local clone has
.mdfixtures. -
GitHub Actions: if you forked the repo and used CI, you'll need to run
/run-evallocally before each release. CI was lightweight (single test.yml file calling claude CLI), so this is minor. -
Decision records: if you've written any
_meta/incidents/<id>.no-change.ymlmanually, rename to.mdand wrap content in---frontmatter delimiters. Optional — old yml still works if your AUDITOR reads it. -
Memory KV: same — old
.jsonfiles 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
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-hardening → main
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 taxonomyreferences/refactoring-patterns.md— 8+2 canonical refactor patterns + minimality rulereferences/risk-domains.md— 8 high-risk domains × 5 escalation requirementsreferences/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
outlierrole slot — anti-confirmation-bias defense /migrate-soul-v2interactive 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_manifest3-layer (source_of_truth / supporting / forbidden)reference_set5 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.mdv2 (三语) - All 23
pro/agents/*.mdfiles 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_record7-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 upgrade —
value_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.mdv1 — 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-violationslash 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_OSStep 2 · Clear old hook configuration (one-time)
# In Claude Code (or Codex/Gemini)
/uninstall-agents # removes old lifeos-* wrappers
/install-agents # registers v2 agentsAfter 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-v2Interactive — 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-v2Interactive — 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-syncslash command replacesnotion-sync.shaudit trail writing. ROUTER still calls Notion MCP directly at Step 10a. - Release process:
/verify-releasereplacesverify-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:
- Audit trail as filesystem evidence (life_OS R11/R12 ↔ eou
runs/) - Evidence-bound assertion (life_OS REVIEWER citations ↔ eou
activated_by) - Honest downgrade ("don't fake maturity") (life_OS lifecycle gates ↔ eou L0-L6)
- Generating ≠ Operating separation (life_OS authority_level ↔ eou
function:generateforbidden_outputs) - 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:
- HEAD == origin/main
- Tag v1.8.5 points to HEAD
- Tag on remote
- GitHub Release exists (not Draft)
- Marked as Latest
- No .py / .sh in repo (excluding backup/git/venv)
- All regression fixtures FAIL when run through validators
- CHANGELOG v1.8.5 entry conforms to schema (7 YAML fields)
Sta...
v1.8.4 — Anti-confabulation: DREAM + maintenance overdue
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.mdStep 16 gains TRIGGER VALIDITY RE-CHECK HARD RULE. Subagent MUSTReadreferenced task frontmatter and inspectstatus:BEFORE promotion. Closed/done/superseded → render as✅ auto-resolved, do NOT promote.- R11 audit trail gains
dream_triggers_validatedfield (one entry per HARD trigger). references/dream-spec.mdtriggered_actions schema gains optionaltask_ref: { task_path, task_slug, project }field (three-language lockstep).- 4-tier resolution:
task_pathdirect read →task_slug + projectfuzzy match → LLM-parsedetection.hard_signals→still-actionablefallback. 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:
- Subagent layer · Step 0.5 marker list gains
[Maintenance overdue: ...]literal marker. New HARD RULE forces subagent to runsession-start-inbox.shitself, strip<system-reminder>wrapper, paste verbatim. No copying transcript stale values, no re-estimating day count. - ROUTER layer ·
SKILL.mdfact-check rule 8 re-runs the same script and byte-equal compares. Mismatch → strike marker. Marker missing → refuse to show briefing. - 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.
<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
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-writeIdempotent. 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— registerslife-os-pre-notion-writepro/CLAUDE.md— Step 10a outbound boundary HARD RULEreferences/hooks-spec.md— §5.6 +CLASS_Fin §8 severity tableSKILL.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
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
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.mdtemplate 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.mdSCHEMA-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.mdcovering broken links, orphan entries, stale entries (>180d), low-confidence entries (<0.5). Replaces deleted v1.7tools/wiki_decay.pyauditor side.
F3 · Inbox ingest pipeline
- New
_meta/inbox/to-process/drop-zone for any.mdyou want triaged later. /inbox-processslash command +scripts/prompts/inbox-process.mdLLM 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) parallelgeneral-purposesubagents covering academic / practitioner / contrarian / origin / adjacent (+ mechanistic / data-statistics / meta-review for deep mode). - Synthesizes a SCHEMA-compliant wiki draft with mandatory
Counterpointssection. - 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.shIdempotent (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.shhad 5 barepython -cinvocations (lines 57/147/180/193/201). macOS 12+ removed barepython; onlypython3exists. Hook fail-CLOSED withpython: 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 portablePYTHON=$(command -v python3 || command -v python)detection at top; replaced all 5 bare-python calls with"$PYTHON".
Scanner regression-proof
pre-write-scan.shpattern #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-patrol→auditor-mode-2,monthly-summary→eval-history-monthly(now matchpro/CLAUDE.mdcanonical 10-job table + actualscripts/prompts/*.mdfiles). - 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.mdStep 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-approvalpattern transparency: extractskey=+matched=<actual substring>+regex=<source pattern>instead of falling through to "unknown". Doc note: inlineexport LIFEOS_YOLO_MODE=1doesn't work in Claude Code Bash tool (PreToolUse hook reads env BEFORE export executes); persistent bypass requires~/.claude/settings.local.jsonenv block.
Verification (CI matrix at this commit)
bash -non all 32 tracked .sh: passSTRICT=1 bash scripts/check-spec-drift.sh: exit 0mypy --strict tools/: 0 errors / 16 source filesruff check tools/ tests/: All checks passedpytest tests/: 233 passed / 3 deselectedbash 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.mdNo 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
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_PATTERNnarrowed (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-agentspaths; 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 filesruff check tools/ tests/→ All checks passedpytest tests/→ 233 passed / 3 deselectedbash -non 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)
The "make tools actually usable" release window. Three iterations folded into the single v1.7.3 release per user request:
- v1.7.3 base (2026-04-26): Cortex always-on hook, 4 slash commands, approval guard wired, 4 dead modules removed.
- 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.
- v1.7.3 archiver carve-out (2026-04-27): Phase 2 split into dedicated
knowledge-extractorsubagent 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.shnow 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-*.jsonaudit 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}.mdsource files;scripts/setup-hooks.shnow copies them to~/.claude/commands/during install. Commands:/compress [focus]— inline context compression with_meta/compression/<sid>-compress-<ts>.mdarchive./search <query>— FTS5 cross-session search viatools.session_searchCLI./memory emit|read|remove|path— 24-48h short-term memory viatools.memoryCLI./method create|update|list— method library management viatools.skill_managerCLI.
- Approval guard wired (PreToolUse Bash hook): new
scripts/hooks/pre-bash-approval.shbridges every Bash command totools/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, runscheck_dangerous_command(), exits 0 (silent approve) or exit 2 + stderr (block with reason). Bypass:export LIFEOS_YOLO_MODE=1. Registered insetup-hooks.shaslife-os-pre-bash-approval(PreToolUse · matcher Bash · timeout 5s). - Memory auto-emit detection (auto-trigger patch · 2026-04-27):
pre-prompt-guard.shalso detects 中/英/日 memory keywords (记一下 / remind me / 覚えて / TODO etc) and injects<system-reminder>(trigger=memory) forcing ROUTER to auto-runpython -m tools.memory emitinstead of redirecting user to/memory. Addstrigger=memoryvalue 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/*.mdfor 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 inpro/compliance/violations.md2026-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.mdfrontmattertoolsextended from[Read]to[Read, Bash, Write]; new "Audit Trail (R11, HARD RULE)" section added requiring_meta/runtime/<sid>/narrator-validator.jsonwrite before returning YAML output. - Version markers:
SKILL.mdfrontmatter and 3 README badges updated to1.7.3. - Spec docs updated for inline compression:
SKILL.mdTrigger Execution Templates/compresssection,references/hard-rules-index.mdmanual compression bullet, andevals/scenarios/cortex-retrieval.mdCX11 positive case all rewritten to describe ROUTER inline compression replacing the removedtools/context_compressor.py. - 4 slash command files demoted to backup mode (auto-trigger patch · 2026-04-27): each
scripts/commands/{compress,search,memory,method}.mdnow 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.mdline 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 toknowledge-extractorsubagent; legacy 7-sub-step inline spec preserved as fallback.pro/CLAUDE.mdStep 10 updated: ROUTER MUST launchknowledge-extractorfirst, thenarchiver. 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 andLLM_FILL:strings, marking that phase asplaceholder_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.pydeleted (118 lines, 0 callers): no value in Claude Code subscription mode.tools/mcp_server.pydeleted (227 lines, 0 callers, 0 client connections): MCP stdio wrapper never connected.tools/context_compressor.pydeleted (1370 lines, 0 callers): compression now inline by ROUTER.tools/manual_compression_feedback.pydeleted (51 lines, 0 callers): output helper for removed compressor.docs/architecture/prompt-cache-strategy.mddeleted: spec doc for removed prompt_cache.docs/architecture/mcp-server.mddeleted: spec doc for removed mcp_server.docs/architecture/hermes-local.mdcleaned: removed dead-module refs fromrelated:frontmatter; rewrote Borrow/Fork Surface module list to reflect v1.7.3 reality (approval wired, memory + session_search + skill_manager remain); removedcontext_compressornaming-note paragraph.
Migration
Re-run bash ~/.claude/skills/life_OS/scripts/setup-hooks.sh to:
- Install 4 new slash commands to
~/.claude/commands/ - Register the new
life-os-pre-bash-approvalPreToolUse(Bash) hook - Update
pre-prompt-guard.sh(now with Cortex always-on + memory keyword detection) - 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:
- "我为什么要用这样的方式来启动这些命令?这些命令不可以直接自动启动吗?" → auto-trigger patch
- "重新检查一下上朝流程和退朝流程" → revealed 80%+ archiver placeholder violations → carve-out
- "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
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.mdnow 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.mdand README badges now point to1.7.2.3. - install_sha field for SHA gap fix:
SKILL.mdfrontmatter now carriescommit_shaandinstall_datefields.setup-hooks.shauto-writes them on git clone deployments. Newscripts/lib/sha-fallback.shprovides 3-tier resolution:SKILL.mdfrontmatter →.install-metaJSON →git rev-parse HEAD→unknown. ClosesLocal commit SHA: unknownbug on install-skill deployments. - SOUL/DREAM display restored (v1.6.x parity):
scripts/retrospective-briefing-skeleton.shnow Bash-pastes fullSOUL.mdcontent and full latest_meta/journal/*-dream.mdcontent 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.mdAdjourn 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.shmirrorsretrospective-briefing-skeleton.shdesign — 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 intopro/CLAUDE.md/pro/GEMINI.md/pro/AGENTS.mdStep 10 Adjourn Session block. Complementary to existingarchiver-phase-prefetch.sh(R11 audit trail). - Session Binding HARD RULE rewritten (product direction correction):
pro/CLAUDE.md/pro/GEMINI.md/pro/AGENTS.mdSession 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.