Skip to content

Path to 10/10: activation, security, and product-readiness fixes - #9

Merged
harshabala merged 17 commits into
mainfrom
feat/path-to-10
Sep 25, 2026
Merged

harshabala merged 17 commits into
mainfrom
feat/path-to-10

Conversation

@harshabala

@harshabala harshabala commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner

Summary of Changes

This PR implements the Plan: Path to 10/10 for Subsume, elevating the product roast scorecard from 59/110 → 69/110 → 96/110 (Elite / Production-Ready Band).

The 8 Tasks Implemented

  1. T1 (Key Encryption at Rest):

    • WebCrypto AES-GCM 256-bit encryption for API keys in chrome.storage.local using an auto-provisioned per-install key (src/shared/keyCrypto.ts, src/background/storage.ts).
    • Hardened against concurrency races and storage corruption.
    • Comprehensive secret redaction in logging and diagnostics (tests/keyCrypto.test.ts, tests/loggerRedaction.test.ts).
  2. T2 (Product Roast Scorecards):

    • Baseline scorecard recorded at 69/110 (docs/design-reviews/2026-09-22/20-roast-my-product.md).
    • Post-implementation audit recorded at 96/110 (docs/design-reviews/2026-09-22/21-roast-my-product-final.md), achieving 9–10/10 across all execution-tier dimensions.
  3. T3 (Plain-English First 60 Seconds):

    • Centralized onboarding and gate copy in src/shared/productCopy.ts.
    • Applied plain, jargon-free phrasing to popup.tsx, Onboarding.tsx, FirstInscriptionGate.tsx, and empty Home.tsx states while preserving the deeper poetic tone in the repertoire.
    • Added anti-jargon regression tests (tests/productCopy.test.ts).
  4. T4 (Store Listing & 10-Second Pitch):

    • Refined store/LISTING.md and README.md to lead with the clear, direct pitch and explicit local-first privacy commitments.
  5. T5 (Encrypted Private Backup Tier):

    • Added an honest "Encrypted private backup" coming-soon row in Settings with a local-only notify toggle (no fake payments, no checkout, zero data collection).
    • Documented in docs/PRODUCT_INTENT.md.
  6. T6 (Relational Export Moat):

    • Added SubsumeExportV2 relational export format with cross-medium workRelations (docs/EXPORT_MOAT.md, tests/exportV2.test.ts).
  7. T7 (Activation & Cold-Install Load Test):

    • Automated browser walkthrough test (scripts/test_cold_install_activation.py) executing cold activation in 7.71s (bar: $\le$90s).
    • Status Note: Automated test suite passes; real unmanaged browser walkthrough remains open pending machine-level Screen Time clearance.
  8. T8 (Hygiene Baseline):

    • Full test suite passing (92 test files, 646 tests).
    • Strict TypeScript (tsc --noEmit) and linter pass with 0 errors.
    • Valid Vite MV3 production bundle (npm run build).

Behavior Changes

  • First-install demo seeding was removed: getDb no longer calls seedDatabaseIfEmpty, and mergeSeedCatalog now skips the library (includeLibrary: false). This is intended behavior so that fresh installs begin with a genuinely empty sanctuary library, allowing the cold-start activation flow (FirstInscriptionGate) to function properly without unrequested pre-populated titles. Demo seeding remains available via explicit demo restore (seedDemoLibraryIfEmpty).

Verification

  • npm test: 92/92 files, 646/646 tests passed
  • npx tsc --noEmit: Clean (0 errors)
  • npm run lint: Clean (0 errors)
  • npm run build: Built in <300ms (0 warnings)

harsha balakrishnan added 17 commits September 22, 2026 17:16
Fix TypeScript config deprecation warning, resolve ESLint regex errors and unassigned var, verify 585 Vitest tests passing, and record baseline audit metrics in roast review.
Wrap stored API keys with AES-GCM using per-install key in storage.

Silently migrate existing plaintext keys on read and redact secrets in logs.
Memoize in-flight install key promise, handle per-key decryption recovery gracefully, add Google AI key redaction pattern, and link shared sensitive preference keys.
…ding and gates

Centralize first-session copy constants in productCopy.ts and apply plain-English headlines and primary CTAs across popup.tsx, Onboarding.tsx, FirstInscriptionGate.tsx, and Home.tsx.

Ensure house jargon (inscribe, plaque, sanctuary, house) is kept one layer deeper while preserving established voice for retained users.
Local notify-me flag only — no checkout, no network. Export now includes
cross-medium workRelations so a backup round-trip keeps film/book links.
README and CWS copy lead with the journal pitch plus privacy stance.
T7 loaded the unpacked extension in a fresh Brave profile; family/admin
policy blocked the service worker, so first-save timing is still open.
…rd findings

Walk empty chrome.storage and IndexedDB through onboarding and practice reflection.

Verifies FirstInscriptionGate, 7.71s activation, zero-key weekly discovery, and alerts.
Instruct agents to record UI snapshots via narada snapshot when making visible frontend changes.
Synthesize Brand, Design/UX, and Code/Security audits into master issue report with prioritized P0/P1/P2 remediation plan.
…ing, and touch target floors

Resolve all Task 2 issues from docs/design-reviews/2026-09-23/00-COMPREHENSIVE-ISSUE-REPORT.md:

- [P0-DX1] Fix HoverCard primary button text contrast (1.91:1 -> 4.5:1+) using var(--on-primary-fg, #ffffff)
- [P0-DX2] Add explicit aria-label and id attributes to ReflectionTimeline form inputs
- [P0-DX3] Implement full background inert and aria-hidden isolation for DetailModal and PoeticCaptureCanvas
- [P1-DX1] Update spring drawer physics to STIFFNESS=550, SETTLE_POS=0.005, and MAX_SPRING_DURATION_MS=280
- [P1-DX2] Immediate unmount in HoverCard hideCard when prefers-reduced-motion is active
- [P1-DX3] Ensure flushPendingSaves commits draft rating slider changes on unmount/close
- [P1-DX4] Elevate interactive touch targets to 44px minimum floor across sanctuary, poetic, gate, and recommendations
- [P1-DX5] Add group semantics, scale labels, and per-button aria-label/aria-pressed to PoeticCaptureCanvas rating buttons
- [P1-DX6] Add high-contrast 2px focus-visible outlines to First-Inscription Gate actions
- [P1-DX7] Replace undefined var(--danger) token references in settings diagnostics with design tokens
- [P1-DX8] Add roving tabIndex and ArrowLeft/ArrowRight keyboard navigation in IntentNavigation tablists
- [P2-DX1 to P2-DX5] Polish 4px spacing rhythm, remove legacy sepia fallbacks, replace raw colors, and add error feedback for editions and re-experience
…ration

Do not generate a new install key or overwrite storage when chrome.storage.local read merely errors; only generate when key is genuinely absent. Reset initPreferencesPromise on load failure so subsequent messages can retry preference hydration.

Refs #9
@harshabala
harshabala merged commit 9b4123e into main Sep 25, 2026
1 check passed
@harshabala
harshabala deleted the feat/path-to-10 branch October 11, 2026 09:27
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