Skip to content

docs(SPEC-033): privacy-respecting Pages visitor analytics - #41

Open
larryxiao wants to merge 2 commits into
mainfrom
docs/spec-028-pages-analytics
Open

docs(SPEC-033): privacy-respecting Pages visitor analytics#41
larryxiao wants to merge 2 commits into
mainfrom
docs/spec-028-pages-analytics

Conversation

@larryxiao

@larryxiao larryxiao commented May 16, 2026

Copy link
Copy Markdown
Owner

Summary

Adds SPEC-033 — privacy-respecting visitor analytics for the GitHub Pages landing site at larryxiao.github.io/openquack.

Why

The Pages landing is now the canonical first-impression surface (awesome-list backlinks, DMs, newsletter pitches all point there). We have zero visibility into who lands there or which sections they read. GitHub Insights covers the repo views but not the Pages site.

What's specified

  • Provider: GoatCounter (open source, free tier ≤100K pageviews/month, no cookies, no PII, honors DNT)
  • What it captures: total + unique views, referrers, top countries, top entry pages
  • What it does NOT do: zero app-side telemetry, no cookies, no fingerprinting, no GA / Mixpanel / Heap
  • PR shape: one PR-A adds the snippet via _config.yml flag + FAQ disclosure line in README + docs/index.md
  • Larry's manual action: 1-min signup at goatcounter.com to get the site code; PR-A is gated only on that

Privacy framing

The app's no-telemetry promise (about the binary) is unchanged. The Pages site is HTML served by GitHub; visiting any web page involves standard HTTP telemetry. GoatCounter aggregates and discards before persistence. The FAQ entry makes this transparent.

Test plan

  • Review SPEC for any provider concerns (alternatives considered: Plausible, Umami, Cloudflare Web Analytics, Fathom Lite — all listed with reasons not picked)
  • Decide public-vs-private dashboard (default recommended: public, per project transparency ethos)
  • Merge → builder team picks up PR-A

Renumbered from SPEC-031 → SPEC-033 to resolve an ID collision (031 = agent-kickoff, already shipped; 028 = dictation-distribution, already merged). Paired with #42 (SPEC-034); cross-refs updated together.

🤖 Generated with Claude Code

@larryxiao
larryxiao force-pushed the docs/spec-028-pages-analytics branch from 248a6e9 to afdf677 Compare May 16, 2026 22:28
@larryxiao larryxiao changed the title docs(SPEC-028): privacy-respecting Pages visitor analytics docs(SPEC-029): privacy-respecting Pages visitor analytics May 16, 2026
larryxiao added a commit that referenced this pull request May 16, 2026
Renumbered from SPEC-029 — the dictation-distribution SPEC took the
SPEC-028 slot on main, cascading SPEC-029 (Pages analytics, PR #41) and
this SPEC up by one. SPEC-028 cross-references inside the file now point
at SPEC-029 (Pages analytics) to match.
Renumbered from SPEC-029 — the local ANE-cache investigation SPEC took
that slot. References to companion SPEC-030 (was: install count, now
SPEC-032) updated accordingly.
@larryxiao larryxiao changed the title docs(SPEC-029): privacy-respecting Pages visitor analytics docs(SPEC-031): privacy-respecting Pages visitor analytics May 17, 2026
@larryxiao
larryxiao force-pushed the docs/spec-028-pages-analytics branch from afdf677 to a9bda90 Compare May 17, 2026 07:28
…ID collision)

SPEC-031 is already assigned to agent-kickoff (shipped) and SPEC-028 (the
branch/body number) to dictation-distribution (merged). Renumber to the next
free monotonic ID 033 and repoint the appcast cross-ref to SPEC-034 (#42).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
larryxiao added a commit that referenced this pull request May 31, 2026
… collision)

SPEC-032 is already assigned to engine-prompt-token-cache and SPEC-029 (the
branch/body number) to ane-cache-only-model. Renumber to the next free
monotonic ID 034 and repoint the pages-analytics cross-ref to SPEC-033 (#41).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@larryxiao larryxiao changed the title docs(SPEC-031): privacy-respecting Pages visitor analytics docs(SPEC-033): privacy-respecting Pages visitor analytics May 31, 2026
larryxiao added a commit that referenced this pull request May 31, 2026
Roadmap marked shipped work as spec-only and the spec index was missing 11
entries and listed shipped features as 'draft'. Reconcile both against main:

- ROADMAP: SPEC-026 Sparkle + SPEC-011 update-flow corrected to their real
  state, SPEC-025 (signing/notarisation) marked the top adoption task with
  its blocker noted, demo-GIF scoped to the actually-missing artifact, and
  #62 re-transcribe-from-History added as a recovery-flow idea.
- Spec index: rebuilt from disk (34 specs) with accurate implementation
  status (shipped / partial / draft / parked); reserves SPEC-033/034 for
  the renumbered docs PRs #41/#42.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
larryxiao added a commit that referenced this pull request Jun 8, 2026
ROADMAP's "Pending docs PRs" section already reserves SPEC-033 for PR #41
(Pages analytics) and SPEC-034 for PR #42 (active-install). The crash-sentinel
spec was a stray 033; move it to the next free id 039:
- rename SPEC-033-crash-sentinel-bug-report.md → SPEC-039-…
- update the 4 SPEC-033 code comments in OpenQuackApp.swift
- update the SPEC-036 "Report Bug" cross-ref

Also drop the "roughly doubling per-chunk inference" aside from SPEC-036's
background — the stream-bench A/B (min-detect 10 vs 9999) showed per-chunk
re-detect is free (WER + RTF identical), so the claim is false.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
larryxiao added a commit that referenced this pull request Jun 8, 2026
033/034 are reserved for PRs #41/#42 (ROADMAP "Pending docs PRs"). The
"Becoming autonomous" field-feedback row and SPEC-037's privacy note referenced
the crash-sentinel (→039) and the future consented-reporting spec (→040), so
point them at the free ids: SPEC-036 / 039 / 040.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
larryxiao added a commit that referenced this pull request Jun 8, 2026
ROADMAP's "Pending docs PRs" section already reserves SPEC-033 for PR #41
(Pages analytics) and SPEC-034 for PR #42 (active-install). The crash-sentinel
spec was a stray 033; move it to the next free id 039:
- rename SPEC-033-crash-sentinel-bug-report.md → SPEC-039-…
- update the 4 SPEC-039 code comments in OpenQuackApp.swift
- update the SPEC-036 "Report Bug" cross-ref

Also drop the "roughly doubling per-chunk inference" aside from SPEC-036's
background — the stream-bench A/B (min-detect 10 vs 9999) showed per-chunk
re-detect is free (WER + RTF identical), so the claim is false.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
larryxiao added a commit that referenced this pull request Jun 10, 2026
…utonomy reflection (#78)

* docs(SPEC-037/038): agent-harness + CI eval-gate proposals; ROADMAP autonomy reflection

Reflection on making the repo agent-autonomous across product / ops / GTM.

- ROADMAP.md gains a "## Becoming autonomous" north-star section: what exists
  (the contract), the meta-gap (no committed .claude/ harness), the three
  unlocks, and the per-domain autonomy ceilings (product privacy-capped, ops
  needs signing, GTM assisted-not-autonomous).
- SPEC-037 (proposal): committed .claude/ harness — six scoped subagent roles,
  saved workflows, cron + GitHub-event triggers, and a deny-by-default
  permissions model with HARD human gates at every irreversible/outward step
  (merge, release, public post). release-bot PREPs; the cut blocks on SPEC-025.
- SPEC-038 (proposal): CI eval-gate running medium-model WER/RTF on the real
  corpora (today gitignored → CI smokes tiny/short only). Hosted+cached corpus
  fetch (no audio in git, per AGENTS hard rule); WER hard-gate, RTF same-runner
  soft-gate; delta reported in the PR.

Design-first per AGENTS (spec PRs precede implementation). e2e/app-behaviour
test and the field-feedback loop noted as siblings/follow-ups.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: point field-feedback refs at free ids (033→039, 034→040)

033/034 are reserved for PRs #41/#42 (ROADMAP "Pending docs PRs"). The
"Becoming autonomous" field-feedback row and SPEC-037's privacy note referenced
the crash-sentinel (→039) and the future consented-reporting spec (→040), so
point them at the free ids: SPEC-036 / 039 / 040.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
larryxiao added a commit that referenced this pull request Jun 16, 2026
…77)

* feat(SPEC-036): recording diagnostics, health & graceful interruption

The "dictation stops mid-recording, waveform freezes, partial transcript"
class of bug is intermittent and was undiagnosable: the capture tap drives
the WAV write, level meter, and streaming frames from one closure, so when
it stops all three freeze together — and there was no observer, no logging,
and no captured-vs-wall check to notice or attribute it.

This adds (SPEC-036):
- OpenQuackPlatform/Diagnostics: os.Logger (recording/streaming/transcription
  /app) + a bounded in-memory event ring for an attachable text dump.
- RecordingHealth (pure): assess(wall, captured) → .incompleteCapture when the
  tap stopped feeding audio mid-recording (the freeze signature).
- DiagnosticsReport (pure): renders the attachable .txt (version/OS/chip,
  wall-vs-captured, chunks, RTF, lang, recent events).
- AudioRecorder: captured-frame counter → capturedSeconds; an
  AVAudioEngineConfigurationChange observer that auto-stops ONLY when the
  engine actually stopped (gated on !isRunning, so benign route changes don't
  truncate long dictations); lifecycle logging.
- StreamingTranscriber: per-chunk duration/decision/RTF logging — the data
  that confirms the SPEC-035 "slow + inaccurate" reports (per-chunk re-detect).
- App: graceful auto-stop + "interrupted" notice; health check + summary on
  every stop; a diagnostics .txt written + revealed in Finder from "Report Bug"
  and "Send feedback…".

Also lands the previously-uncommitted SPEC-033 crash-sentinel bug-report base
(checkAndMarkCrashSentinel / offerCrashBugReport / applicationWillTerminate),
which SPEC-036's bug-report enrichment hooks into — they share OpenQuackApp.swift
and can't be split. SPEC-033's acceptance criteria are manual (simulated crash)
and not yet verified.

Build + 196 tests green (12 new, covering RecordingHealth / DiagnosticsReport /
the event ring). Interruption path and the file-reveal still need manual
verification on a machine that reproduces the freeze.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(SPEC-036): Settings → Stats recording-health view

Surface the SPEC-036 diagnostics locally so you (and users) can self-diagnose
without filing a bug. Settings → Stats gains a "Recording health" subsection,
gated behind the existing showUsageStats display toggle (tracking stays
always-on, local):
- a session incomplete-capture count + a per-recording list (wall / captured /
  RTF / path / lang, warning-marked when the tap stopped early),
- a compact warn/error tail from Diagnostics.shared,
- a "Reveal diagnostics file" button into the existing reveal flow.

AppState gains a newest-first, cap-10 `recentRecordings` ring (pushed in
stopAndTranscribe); `writeDiagnosticsFileAndReveal` becomes internal so the pane
reaches it via the same (NSApp.delegate as? AppDelegate) handle it already uses
for usageStats. Local-only — nothing leaves the Mac. Build + 196 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(SPEC-039): renumber crash-sentinel 033→039 (033 reserved for #41)

ROADMAP's "Pending docs PRs" section already reserves SPEC-033 for PR #41
(Pages analytics) and SPEC-034 for PR #42 (active-install). The crash-sentinel
spec was a stray 033; move it to the next free id 039:
- rename SPEC-033-crash-sentinel-bug-report.md → SPEC-039-…
- update the 4 SPEC-039 code comments in OpenQuackApp.swift
- update the SPEC-036 "Report Bug" cross-ref

Also drop the "roughly doubling per-chunk inference" aside from SPEC-036's
background — the stream-bench A/B (min-detect 10 vs 9999) showed per-chunk
re-detect is free (WER + RTF identical), so the claim is false.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant