Files
Alex Newman 2dcb556d26 feat: cowork plugin + Memory Prize scorecard (worktree consolidation) (#3733)
* feat(cowork): add claude-mem-cowork plugin — memory for Claude app cloud sessions

Cowork/Claude-app cloud sessions run in ephemeral containers where the
local worker can't live. This plugin replaces it with thin HTTP hook
shims: PostToolUse streams raw tool-use fragments to POST /api/hooks/ingest
(spool + batch-flush on failure), SessionStart injects compiled context
from GET /api/hooks/context with a project-scoped fallback to the live
/api/mcp memory_search, and PreToolUse on Task/Agent prepends relevant
observations into every spawned agent's prompt via updatedInput.

- project naming is always automatic (cmem_work_root / cmem_work_<folder>),
  deliberately not a setting
- empty projects inject a 'Claude-Mem is taking notes' notice with the
  local worker viewer link (port from ~/.claude-mem/settings.json)
- unpaired installs are fully inert; every hook exits 0 unconditionally
- bundled skills: mem-search (progressive search) and mem-setup (pairing)
- PRO-ENDPOINT-SPEC.md documents the two server endpoints; ingest maps 1:1
  onto the existing worker fragment queue
- 32-test mock-server suite in cowork/test/run-tests.mjs
- registered in .claude-plugin/marketplace.json

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012mXp3icorS7jwf42fFv9Wt

* fix(cowork): read real claude-mem settings keys in the ~/.claude-mem fallback

The compat fallback looked for syncToken/userId/syncHubUrl/workerPort, but a
local claude-mem install writes CLAUDE_MEM_CLOUD_SYNC_TOKEN / _USER_ID /
_HUB_URL / CLAUDE_MEM_WORKER_PORT (SettingsDefaultsManager). Honor those
first (old short names still accepted), update mem-setup + README, and make
the fallback test use the real key names.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): include cwd in the session-end envelope so the summary lands on the session's project

Verified live: a session-end sent from a different working directory filed
its summary under the hook process's project instead of the session's.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): redact secrets before envelope, per-user 0600 spool, merge-don't-clobber spool recovery

Addresses greptile P1 findings on PR #3707:
- observation/prompt payloads pass a secret-redaction pass (PEM blocks, auth
  headers, JWTs, vendor token prefixes, key=value assignments) before the
  envelope is built, so neither ingest nor the retry spool sees raw credentials
- spool moved from world-readable /tmp to ~/.claude-mem/cowork-spool.jsonl,
  created 0600
- failed spool flush now merges the claim back via append instead of
  renameSync over a replacement spool created by a concurrent hook, so
  concurrent events are no longer dropped
- test harness: hermetic $HOME, redaction + spool-permission checks (38 checks)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): strip <private>-tagged regions before observation envelopes

Ports the local plugin's tag-stripping convention (src/utils/tag-stripping.ts)
into the cowork shim: <private>, <claude-mem-context>, <system-instruction>,
<persisted-output>, and <system-reminder> regions are removed from tool
payloads and session-init prompts before the envelope exists, so explicitly
non-storable content reaches neither ingest nor the retry spool. Stripping
runs before truncation so a cut-off closing tag can never leak a partial
private region. 4 new harness checks (42 total).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): redact connection-string credentials (scheme://user:pass@)

URI userinfo with a password now redacts to scheme://[cmem-redacted]@host —
covers postgres/mysql/redis/amqp/mongodb-style DATABASE_URLs that matched
neither the vendor-token patterns nor KEYVALUE_RE. Bare user@ URIs
(ssh://git@github.com) stay intact — that's signal, not secret. Mirrors the
userinfo rule in src/services/telemetry/error-scrub.ts. 3 new harness checks
(45 total).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): full URI userinfo redaction, Cookie header redaction, oldest-first spool recovery

Round 3 of greptile P1s:
- URI credential redaction now covers passwords containing literal '/', ':'
  or '@' — userinfo is everything up to the LAST '@' in the URI token, so
  postgresql://admin:pa/ss@host and admin:pa@ss@host both fully redact
  (bare user@ like ssh://git@github.com still passes through as signal)
- Cookie:/Set-Cookie: header values redact wholesale regardless of cookie name
- failed-flush recovery drains a concurrent replacement spool onto the claim's
  tail (old→new) and restores via wx (no clobber, append fallback); flushSpool
  additionally stable-sorts the batch by ts so replay is always oldest-first
- 6 new harness checks (50 total)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): overflow spool re-spools the remainder instead of dropping oldest events

flushSpool sent only the newest SPOOL_MAX lines but deleted the whole claim on
success, permanently losing anything older once the spool exceeded 200 events.
It now sends the OLDEST 200 and re-spools the remainder for the next flush —
bounded batches, zero silent drops. On failure the untouched claim still
restores in full. 4 new harness checks incl. a 201-event drain (54 total).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* fix(cowork): claim spool before reading it; redact any Authorization scheme

- flushSpool now renames (claims) the spool FIRST and reads the claim, so an
  event appended between read and rename can no longer travel into the claim
  unread and be deleted on success — later appenders always write a fresh spool
- Authorization/Proxy-Authorization header values redact wholesale regardless
  of scheme (Token, ApiKey, custom), and the inline scheme pattern gains Token
- 2 new harness checks: Token credential absent from request body and from the
  failed-delivery spool (56 total)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JAjZBD6Qi5A8EuFmbcycDH

* docs: add Memory Prize scorecard and slides (hackathon 05)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(cowork): redact short and whitespace-bearing credential values; align marketplace version

- KEYVALUE_RE no longer requires 6+ non-whitespace chars: sensitive-key
  values are redacted in full through the line or record delimiter, so
  short passwords and passphrases containing spaces never reach the
  ingest payload or spool (Greptile P1)
- marketplace.json bumped to 0.1.3 to match plugin.json and the
  X-CMEM-Plugin runtime header (Greptile P2)
- regression tests for short, whitespace-bearing, and short query-string
  credential values

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 16:01:35 -07:00
..
2026-08-19 15:39:29 -07:00

Claude-Mem Hackathon Kit — Sunday Aug 23, 2026

Everything for the $1,000 Memory Prize track: decks, cheatsheet, tutorial, source docs.

Deck Pages Link Best for
Field Guide — Story 15 https://wooow.now/claude-mem-field-guide-story Richest single deck; covers everything
Field Guide — Picture Book 12 https://wooow.now/claude-mem-field-guide-picture-book Live talk — one idea per slide, minimal text
Cheat Sheet 14 https://wooow.now/claude-mem-cheat-sheet Handout / reference; flat, scannable
Tutorial 9 https://wooow.now/claude-mem-tutorial Walkthrough: do this / you'll see / what it means
Memory Prize 13 https://wooow.now/the-memory-prize Prize pitch: one slide per direction

One-page HTML cheatsheet (printable): https://claude.ai/code/artifact/e6c93b0d-0f8f-45f9-9b15-1c07c63b2d6c

  1. Picture Book p1–p2 — forgetful builder, every morning is day one
  2. Story p3 — the three costs (time / money / lost decisions)
  3. Story p2 — builder vs observer spread
  4. Story p5 — every action → "is this worth a note?"
  5. Picture Book p6 — the funnel: only the "aha" moments
  6. Story p6 — anatomy of a note (glowing notebook)
  7. Cheat Sheet p6 — anatomy of a note (clean, accurate example)
  8. Story p8 — titles first, details on demand
  9. Cheat Sheet p8 — three-layer recall
  10. Story p9 — observer's job description is swappable
  11. Story p10 — photo / transcript / Slack dump → structured notes
  12. Cheat Sheet p10 — modes that exist + /mode-creator
  13. Cheat Sheet p11 — building blocks
  14. Prize p3 — "make memory matter" (not bigger context, not stuffing)
  15. Cheat Sheet p13 or Prize p4–p10 — seven directions
  16. Prize p11 — Monday-morning test
  17. Story p14 — five-minute start + FASTHACK30

Known render glitches (NotebookLM)

  • Story p7: "context. context." duplicated; p13: "Claude-Mem rrropers" (should be "developers")
  • Picture Book p2: "the the same files"; p12: "100,000 100,000 developers"
  • Cheat Sheet p3: builder card layout slightly garbled
  • Tutorial / Prize: clean

Regenerate any deck cheaply: notebook + source already exist; just rerun generate with a tweaked prompt.

Source docs (plain-English, no jargon)

  • 01-what-is-claude-mem-field-guide.md — master guide (3.2k words)
  • 02-claude-mem-cheatsheet.md — cheatsheet
  • 03-claude-mem-tutorial.md — stage-by-stage tutorial
  • 04-the-memory-prize.md — prize copy + plain-English framing
  • claude-mem-cheatsheet.html — printable one-pager

NotebookLM notebooks (for regenerating)

  • Story: 158427e7-80d8-437a-8e92-c581054a7afc
  • Picture Book: ddc457db-0430-4e8f-956e-5c2fb9fe0425
  • Cheat Sheet: 4ad95081-a12a-4fd1-8d15-4f537399c76d
  • Tutorial: 979aec4c-74bb-4cfd-8012-3bb5c4ea5863
  • Prize: 77ab6061-e560-4488-a44c-6a0718abbd06