LoadContext wraps SessionStart context in <system-reminder>, which Claude Code 2.1.292+ escapes, so the model sees a literal <system-reminder> tag (LoadContext.hook.ts:547,552)
Maintainers usually reply within 6 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 76/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- typescript
- Domain
- tooling
Research direction
Start in LoadContext.hook.ts around lines 547 and 552, where the message string is wrapped in <system-reminder> tags, and check the header comment at line 26. Remove the wrapper so the block prints as plain text, then update the matching description in LIFEOS/DOCUMENTATION/Hooks/HookSystem.md near line 77. Done when no shipped hook emits the tag and a test that scans hook scripts for the tag passes.
Written by the indexing model from the issue text.
Description
Version
LifeOS 7.40.4, Claude Code 2.1.292 or newer (verified on 2.1.294). Same code on main today.
What is broken
Claude Code 2.1.292 changed how hook output is handled. The changelog says:
Improved hook output handling:
<system-reminder>tags written in a hook's output are escaped before they reach Claude
LoadContext.hook.ts still wraps its SessionStart dynamic context in <system-reminder>…</system-reminder>. On 2.1.292+ the model gets the tag as escaped literal text (<system-reminder>) around the block instead of a reminder frame. The content still arrives, because SessionStart stdout goes into the context as plain text either way, but every session now opens with a stray escaped tag.
Where (file:line)
LifeOS/install/hooks/LoadContext.hook.ts:547and:552open and close the wrapper aroundmessage.LifeOS/install/hooks/LoadContext.hook.ts:26header says "stdout: containing dynamic context".LifeOS/install/LIFEOS/DOCUMENTATION/Hooks/HookSystem.md:77describes the same output.
The other shipped files that mention the tag (PromptProcessing, SatisfactionCapture, VoiceCompletion, TranscriptParser, IntegrityMaintenance) only strip it with a regex, so they are unaffected.
Fix we run locally
Drop the wrapper and print the block as plain text:
const message = `LifeOS Dynamic Context (Auto-loaded at Session Start)
${relationshipContext ?? ''}${learningContext ? '\n---\n' + learningContext : ''}${advisoryContext ? '\n---\n' + advisoryContext : ''}
---
Dynamic context loaded. Constitutional rules are in the system prompt (LIFEOS/LIFEOS_SYSTEM_PROMPT.md). Operational procedures are in CLAUDE.md.`;
We also guard the class with a test: for every script a settings.json hook command runs, plus everything under hooks/, flag any line that contains <system-reminder> or </system-reminder>, skipping comments and regex literals (/<system-reminder>, /^<system-reminder>). On 7.40.4 it flags exactly LoadContext.hook.ts:547,552. Happy to open a PR with the fix and the test if useful.
- Dominant language
- TypeScript
- Stars
- 19.3k
- Forks
- 2.5k
- PR merge metrics
- No merged PRs in 30d
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from danielmiessler/LifeOS
-
MergeSettings: an append annotation inside an overlay-only object is emitted raw into settings.jsonOpen
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
danielmiessler/LifeOS#2307 ·
Maintainers usually reply within 6 days
-
Difficulty 1/5 Under an hour Newbie friendliness 88/100
danielmiessler/LifeOS#2305 ·
Maintainers usually reply within 6 days
-
Upgrade: Anthropic.ts report exists only on stdout while state is saved, and --help runs a full scanOpen
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
danielmiessler/LifeOS#2290 ·
Maintainers usually reply within 6 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
danielmiessler/LifeOS#2289 ·
Maintainers usually reply within 6 days
-
Difficulty 1/5 Under an hour Newbie friendliness 84/100
danielmiessler/LifeOS#2288 ·
Maintainers usually reply within 6 days
All issues in danielmiessler/LifeOS
Similar issues
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
area:cowork area:desktop documentation enhancement platform:macos
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
anthropics/claude-code#101720 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
apache/rocketmq-dashboard#6610 ·
Maintainers usually reply within 3 days
-
Add: MS NOWOpencheck:passed streams:add
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
Maintainers usually reply within 1 day
-
Global update drops overrideAccess, so Local API updateGlobal fails filterOptions validation (3.90 regression)Possibly taken @PINYOPATTANAWASANPORN claimed this today. Openarea: core Bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
payloadcms/payload#18674 · 1 comment ·
Maintainers usually reply within 1 day