Skip to content

Claudinite growth: discover local pack on-device-privacy - #43

Merged
missingbulb merged 1 commit into
mainfrom
claudinite/discover-packs-w2026-07-26
Jul 26, 2026
Merged

Claudinite growth: discover local pack on-device-privacy#43
missingbulb merged 1 commit into
mainfrom
claudinite/discover-packs-w2026-07-26

Conversation

@missingbulb

Copy link
Copy Markdown
Owner

Weekly growth-discover-packs run (#37). The repo had no local packs; its captured knowledge lives in dev/procedures/ (CI/release, macOS audio lifecycle). Held the repo's stack against the canon shelf (basics, barriers, git-github, github-actions, grow_with_claudinite, tidy-repo) and one domain came out genuinely unhomed: the on-device privacy boundary — an always-on living-room mic whose audio never leaves the machine. It is the product's founding requirement (docs/DESIGN-AND-TRADEOFFS.md §0/§6, README Privacy, the Info.plist usage strings) and was enforced nowhere, in either implementation.

The pack: .claudinite/local/packs/on-device-privacy/

Three deterministic rules, each with a red-first fixture in pack.test.mjs (fires on a violating input, quiet on the repo's real files — node --test .claudinite/local/packs/on-device-privacy/pack.test.mjs, 6/6 green):

Rule What it holds
no-network-client no outbound client API in the capture path (laughcounter/**.py, mac/Sources/**.swift). Token-based, not URL-based, so the optional extras' documented one-time model download (the TF-Hub handle in detector/yamnet.py, SpeechBrain's in speaker.py) stays legal.
loopback-default host defaults in laughcounter/ must be loopback — the dashboard serves the entire laugh log with no auth (config.py:56, dashboard.py:40/122).
on-device-speech every SFSpeechAudioBufferRecognitionRequest must set requiresOnDeviceRecognition, or Speech streams the room to Apple (VoiceCommand.swift:48).

RULES.md carries only what no check can: metadata persists but audio doesn't, one deletable home directory, the single accepted egress, the dashboard's application/json CSRF guard, and keeping the Info.plist usage strings true as behaviour changes.

Declared as local/on-device-privacy in .claudinite-checks.json; check_the_world --list shows all three rules registered, and the sweep reports no new findings (the one blocking claudinite-isolation hit on CLAUDE.md:4 predates this branch).

Fixtures live inside the pack rather than in tests/ because a consumer file outside .claudinite/ may not reference into it (the claudinite-isolation barrier) — the first attempt at a tests/ bridge tripped exactly that.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Mi6CmRAnQgKW3XEDg2xhiL


Generated by Claude Code

The repo's defining constraint — an always-on living-room mic whose audio
never leaves the machine — was stated in docs/DESIGN-AND-TRADEOFFS.md §0/§6
and the README's Privacy section, and enforced nowhere. No canon pack homes
it and the repo had no local packs, so it lands as one, spanning both
implementations (laughcounter/ and mac/Sources/) because the boundary is the
same on either side.

Three deterministic rules, each red-first fixtured in pack.test.mjs
(fires on a violating input, quiet on the repo's real files):

- on-device-privacy/no-network-client — no outbound client API in the
  capture path; token-based, so the optional extras' documented one-time
  model download (the TF-Hub handle, SpeechBrain's weights) stays legal.
- on-device-privacy/loopback-default — host defaults in laughcounter/ must
  be loopback; the dashboard serves the whole laugh log unauthenticated.
- on-device-privacy/on-device-speech — every
  SFSpeechAudioBufferRecognitionRequest must set requiresOnDeviceRecognition,
  or Speech streams living-room audio to Apple.

What no check can carry is RULES.md prose: metadata persists but audio
doesn't, one deletable home directory, the single accepted egress, the
dashboard's CSRF guard, and keeping the Info.plist usage strings true.

Refs #37

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mi6CmRAnQgKW3XEDg2xhiL
@missingbulb
missingbulb merged commit fc5c488 into main Jul 26, 2026
@missingbulb
missingbulb deleted the claudinite/discover-packs-w2026-07-26 branch July 26, 2026 21:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants