outputWithContext() emitted a hookSpecificOutput object without the
required hookEventName field, so Claude Code rejected the hook output
("hookSpecificOutput is missing required field hookEventName") and
dropped the context the SessionStart, UserPromptSubmit, and PostToolUse
hooks tried to inject. Thread the event name through the helper; each
caller now passes its own (SessionStart / UserPromptSubmit / PostToolUse).
Existing emission tests now assert hookEventName per event.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmHCQjJHUyWwxGAVVjNLgp
251 lines
11 KiB
Markdown
251 lines
11 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to this project will be documented in this file.
|
||
|
||
## [Unreleased]
|
||
|
||
### Fixed
|
||
|
||
- **Hooks emitted invalid JSON, so Claude Code dropped their injected
|
||
context.** `outputWithContext()` wrote a `hookSpecificOutput` object
|
||
without the required `hookEventName` field; the harness rejected it
|
||
("hookSpecificOutput is missing required field hookEventName") and
|
||
discarded the context the SessionStart, UserPromptSubmit, and PostToolUse
|
||
hooks tried to inject. The helper now takes the event name and every
|
||
caller passes its own (`SessionStart` / `UserPromptSubmit` / `PostToolUse`).
|
||
|
||
## [1.2.0] — 2026-05-01
|
||
|
||
Research-paper-driven detector update. Implements operational findings from
|
||
Anthropic's "How people ask Claude for guidance" Appendix (April 2026).
|
||
|
||
### Added
|
||
|
||
- **User-information detector** — three-class signal (`yes_people` /
|
||
`yes_digital` / `no`) following the paper's page-11 finding that human
|
||
contact is the strongest disempowerment signal. ~32 patterns covering
|
||
therapist/friend/mentor (yes_people), search/AI/forums (yes_digital),
|
||
and explicit isolation phrases (no). Sticky upward priority.
|
||
- **Validation-seeking detector** — separate from `val_flags`. Targets
|
||
reality-testing ("am I crazy?"), pre-committed stance + confirmation,
|
||
and side-taking pressing. ~12 patterns.
|
||
- **Tier-1 user-info isolation alert** — fires per session when
|
||
`user_info_class === 'no'` + high-stakes domain + `turn_count >= 15`.
|
||
- **Tier-2 cross-session isolation alert** — fires at `SessionStart` when
|
||
the last 3 end records all classify as `no` in high-stakes domains.
|
||
Bounded `readRecentEndRecords()` tail-scan in `lib.mjs` keeps this
|
||
scalable to 50K+ session histories.
|
||
- **8 new paper-grounded domain patterns** — `legal`, `parenting`, `health`,
|
||
`financial`, `professional`, `spirituality`, `consumer`, `personal_dev`.
|
||
Total domains 4 → 9.
|
||
- **Pushback re-contextualization (alert)** — v1.1.0 only counted; v1.2 adds
|
||
the alert with domain awareness:
|
||
- Relationship/spirituality: pushback signals validation-pressing — alert.
|
||
- Legal/parenting/health/financial/professional: pushback is healthy
|
||
self-advocacy — no alert.
|
||
- Otherwise: conservative default — alert.
|
||
- **Domain-stakes weighting matrix** — `DOMAIN_STAKES` in `lib.mjs` (1.0–1.5).
|
||
Applied ONLY to new v1.2 alerts (pushback in HIGH_SYCOPHANCY, valseek in
|
||
HIGH_STAKES). v1.1.0 alert sensitivity is preserved.
|
||
- **Multi-domain support** — `state.domain_context` promoted from string to
|
||
array. v1.1.0 string records continue to aggregate correctly via
|
||
shape-coercion in `report-reader.mjs`.
|
||
- **`SKILL.md` updates** — verbatim Score 5 sycophancy phrase + 3 of the 11
|
||
guidance criteria (engagement-foster avoidance, confident-verdict caution,
|
||
speak-frankly principle).
|
||
- **`/interaction-report` v1.2 sections** — per-domain breakdown, user-info
|
||
distribution, valseek summary, stakes signal aggregation. Backward-compat
|
||
with v1.0/v1.1 records preserved.
|
||
- **Privacy canary extensions** — 5 new canary cases per detector category
|
||
(yes_people, yes_digital, no, valseek, legal domain).
|
||
- **Perf budget validated at v1.2 pattern set** — sample patterns expanded
|
||
to ~91+ entries; new wall-clock test exercises tier-2 read at
|
||
1000-record sessions.jsonl scale.
|
||
- **Test count: 126 → 258 cases** across 12 files (added `lib.test.mjs`,
|
||
`domain-detection.test.mjs`, `user-info.test.mjs`,
|
||
`validation-seeking.test.mjs`, `stakes-matrix.test.mjs`).
|
||
|
||
### Changed
|
||
|
||
- Pattern count: 41 → ~133 (25 negative + 12 pushback + 4 relationship
|
||
+ 48 new domains + 32 user-info + 12 valseek).
|
||
- End-record schema (v1.2): adds `user_info_class`, `valseek_count`,
|
||
`turn_count`. `domain_context` is always an array (was string in v1.1).
|
||
- `report-reader.mjs` discriminates v1.0 / v1.1 / v1.2 records via the
|
||
presence of `user_info_class`. v1.0/v1.1 records degrade gracefully.
|
||
|
||
### Deferred
|
||
|
||
- **Norwegian patterns** — moved to v1.3.
|
||
|
||
[1.2.0]: https://git.fromaitochitta.com/open/ai-psychosis/compare/v1.1.0...v1.2.0
|
||
|
||
## [1.1.0] — 2026-05-01
|
||
|
||
### Added
|
||
|
||
- **12 pushback patterns** — detects "you're wrong, my way is right"
|
||
signals that suggest the user is reinforcing their own position
|
||
rather than receiving feedback (e.g. `\b(you'?re|you are) wrong\b`,
|
||
`\bdo it my way\b`, `\b(stop|quit) (arguing|pushing back)\b`).
|
||
- **4 domain-context patterns** — flags relational/identity framing
|
||
(`\b(my|our) relationship\b`, `\b(my|our) (purpose|mission|destiny)\b`)
|
||
that, combined with high pushback or validation, signal narrative
|
||
crystallization risk.
|
||
- **Valence-aware composition** — same-invocation valence guard so a
|
||
healthy correction ("you were wrong, here's why") is not counted
|
||
as pushback escalation.
|
||
- **`/interaction-report` extensions** — pushback metrics + domain
|
||
framing distribution; companion `report-reader.mjs` script handles
|
||
legacy v1.0.0 records (missing `pushback`/`domain_context`) without
|
||
NaN propagation.
|
||
- **CC0 Constitution citation** in `SKILL.md` plus 5-publication
|
||
research framework (Anthropic, MIT CSAIL, Nature, arXiv, clinical).
|
||
- **Performance budget test** — `tests/perf.test.mjs` enforces hook
|
||
timing budget (logic <50ms, total <200ms wall-clock).
|
||
- **Privacy canary extension** — pattern-phrase leak canary in
|
||
`tests/privacy.test.mjs` confirms matched phrases never reach disk.
|
||
- **Test count: 73 → 126 cases** across 8 files (added skill-md,
|
||
perf, interaction-report tests; extended prompt-analyzer, privacy,
|
||
session-end, session-start).
|
||
|
||
### Changed
|
||
|
||
- Pattern count: 25 → 41 (25 negative + 12 pushback + 4 domain).
|
||
- `commands/interaction-report.md` documents v1.0.0 backward
|
||
compatibility for legacy JSONL records.
|
||
|
||
### Notes
|
||
|
||
- **English-only v1.1.0** — Norwegian/multilingual patterns deferred
|
||
to v1.2 (see `ROADMAP.md`).
|
||
- **First-mover honesty** — domain-precision is "good enough" for
|
||
v1.1.0; precision tuning planned for v1.2.
|
||
|
||
## [1.0.0] — 2026-04-05
|
||
|
||
### Added
|
||
|
||
- **Layer 4: Contemplative references** — conditional section in
|
||
`/interaction-report` when flags are elevated (total >= 5 or fatigue >= 2)
|
||
and `layer4: true`. Points to Miracle of Mind by Sadhguru.
|
||
- **Automated test suite** — 73 cases using `node:test` (zero npm deps):
|
||
session-start (4), prompt-analyzer (56), tool-tracker (8),
|
||
session-end (4), privacy canary (1)
|
||
|
||
### Fixed
|
||
|
||
- Dependency regex `you understand me` no longer matches "merging" (added `\b`)
|
||
|
||
### Changed
|
||
|
||
- CLAUDE.md testing section updated for automated tests
|
||
- Deprecated bash scripts removed (available in git history)
|
||
- All "Known gaps" from v0.4.0 resolved
|
||
|
||
## [0.4.0] — 2026-04-05
|
||
|
||
### Changed
|
||
|
||
- **All hooks migrated from bash+jq to Node.js** — full cross-platform
|
||
support (macOS, Linux, Windows)
|
||
- `lib.sh` → `lib.mjs` (shared library, 22 functions)
|
||
- `session-start.sh` → `session-start.mjs`
|
||
- `prompt-analyzer.sh` → `prompt-analyzer.mjs` (23 regex patterns)
|
||
- `tool-tracker.sh` → `tool-tracker.mjs`
|
||
- `session-end.sh` → `session-end.mjs`
|
||
- hooks.json now invokes `node ...mjs` instead of `bash ...sh`
|
||
- Zero npm dependencies — Node.js stdlib only (`fs`, `path`, `os`)
|
||
- Bash scripts deprecated (kept for reference, marked with DEPRECATED)
|
||
- Dependencies reduced: bash and jq no longer required
|
||
- All documentation updated for Node.js migration
|
||
|
||
### Fixed
|
||
|
||
- Data path fallback now matches documented path
|
||
(`~/.claude/plugins/data/ai-psychosis`)
|
||
- `.claude/` directory added to `.gitignore`
|
||
- Private repo path removed from design brief
|
||
- CONTRIBUTING.md line reference corrected
|
||
- README now links to CONTRIBUTING.md
|
||
- plugin.json includes author, license, repository fields
|
||
|
||
## [0.3.0] — 2026-04-05
|
||
|
||
### Added
|
||
|
||
- **Layer 3: Interaction reports** — `/interaction-report` slash command
|
||
for aggregated session statistics
|
||
- Time periods: `weekly` (default), `monthly`, `all`
|
||
- Overview: session count, avg duration, tool calls, edit ratio
|
||
- Pattern flags: dependency, escalation, fatigue, validation frequency
|
||
- Tool usage distribution (top 10)
|
||
- Daily activity breakdown
|
||
- Trend comparison vs previous period
|
||
- `commands/interaction-report.md` — pure markdown command, no script
|
||
dependencies (cross-platform: macOS, Linux, Windows)
|
||
- Layer 3 respects `layer3: true/false` in
|
||
`.claude/ai-psychosis.local.md` (opt-in, off by default)
|
||
|
||
### Changed
|
||
|
||
- README updated with Layer 3 usage instructions
|
||
- Platform compatibility expanded: Layer 3 works on Windows
|
||
- Version bumped to 0.3.0
|
||
|
||
## [0.2.0] — 2026-04-05
|
||
|
||
### Added
|
||
|
||
- **Layer 2: Programmatic pattern detection** — four hooks measuring session
|
||
time, tool usage, burst patterns, and language flags
|
||
- `session-start.sh` — daily session count, late-night detection
|
||
- `prompt-analyzer.sh` — dependency, escalation, fatigue, and
|
||
validation-seeking pattern flags (prompt text never stored)
|
||
- `tool-tracker.sh` — event logging, edit ratio, burst detection,
|
||
progressive alerts with cooldown
|
||
- `session-end.sh` — session finalization, JSONL record, state cleanup
|
||
- `lib.sh` — shared library with thresholds, state management, cooldown
|
||
logic, and layer configuration
|
||
- Per-project layer configuration via
|
||
`.claude/ai-psychosis.local.md`
|
||
- `require_layer()` guard in all hook scripts — layers are opt-in/out
|
||
- MIT LICENSE file
|
||
- `matcher` field in hooks.json for schema compliance
|
||
|
||
### Changed
|
||
|
||
- hooks.json now registers 4 events (was 2)
|
||
- `DATA_DIR` fallback hardened to `~/.claude/data/ai-psychosis`
|
||
- README rewritten with architecture diagram, research background,
|
||
privacy section, threshold reference tables
|
||
- Version bumped to 0.2.0
|
||
|
||
### Removed
|
||
|
||
- `periodic-reminder.sh` — replaced by `tool-tracker.sh`
|
||
- `session-awareness.sh` — replaced by `session-start.sh`
|
||
|
||
## [0.1.0] — 2026-04-04
|
||
|
||
### Added
|
||
|
||
- **Layer 1: Behavioral instructions** — `SKILL.md` with 5 rules and 5
|
||
named patterns (reinforcement loop, scope escalation, narrative
|
||
crystallization, emotional dependency, session overuse)
|
||
- `periodic-reminder.sh` — re-injects awareness every 25 tool calls
|
||
- `session-awareness.sh` — SessionStart context injection
|
||
- Plugin manifest (`plugin.json`)
|
||
- Design document (`docs/ai-ai-psychosis-brief_1.md`)
|
||
|
||
## Known gaps
|
||
|
||
- No CI pipeline
|
||
- Single-user plugin — no multi-user patterns considered
|
||
|
||
[1.1.0]: https://git.fromaitochitta.com/open/ai-psychosis/compare/v1.0.0...v1.1.0
|
||
[1.0.0]: https://git.fromaitochitta.com/open/ai-psychosis/compare/v0.4.0...v1.0.0
|
||
[0.4.0]: https://git.fromaitochitta.com/open/ai-psychosis/compare/v0.3.0...v0.4.0
|
||
[0.3.0]: https://git.fromaitochitta.com/open/ai-psychosis/compare/v0.2.0...v0.3.0
|
||
[0.2.0]: https://git.fromaitochitta.com/open/ai-psychosis/compare/v0.1.0...v0.2.0
|
||
[0.1.0]: https://git.fromaitochitta.com/open/ai-psychosis/releases/tag/v0.1.0
|