Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 227 additions & 0 deletions .fleet/design-review-manual-explore-preserve.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
{
"$schema": "fleet.design-review.v2",
"version": 2,
"project": "live",
"target": "Preserve existing UI: manual search/custom entry and paginated categorized Explore",
"surfaceMode": "operate",
"mode": "preserve",
"register": "product",
"context": {
"product": "PRODUCT.md",
"design": "DESIGN.md"
},
"direction": {
"productSurfaces": {
"scope": "paired",
"landing": "https://live.significanthobbies.com/ \u2014 landing-astro/src/pages/live.astro",
"app": "http://localhost:3097/bucket-list and /experiences",
"reason": ""
},
"pairedPreview": {
"landing": "",
"app": ""
},
"source": "existing",
"references": [],
"probes": [],
"selected": "existing-design",
"approval": "not-required",
"ownerEvidence": {
"path": "",
"quote": ""
},
"supplied": "",
"before": ".fleet-local/manual-explore/before/list.png",
"library": {
"strategy": "upstream-first",
"primary": "Healthy project-native input, buttons and filter rows",
"sources": [
"https://github.com/Significant-Hobbies/live/blob/main/src/components/bucket-list/quick-add-item.tsx",
"https://github.com/Significant-Hobbies/live/blob/main/src/app/experiences/experiences-client.tsx"
],
"runtime": "none",
"customReplacement": {
"used": false,
"authorization": "not-required",
"reason": "Preserve existing project controls"
}
},
"contract": {
"purpose": "Live helps adults live more intentionally by discovering experiences, keeping a personal list and recording completed items.",
"purposeSource": "PRODUCT.md and PROJECT_STATUS.md",
"canonicalPurpose": "Live leads with a searchable catalog of bucket-list ideas and side quests, a personal list, and optional Life Bingo boards.",
"purposeAlignment": "match",
"driftNote": "",
"audience": "Adults maintaining personal bucket lists",
"job": "Add an idea already in mind or separately explore categorized possibilities",
"thesis": "Preserve incumbent UI; single input searches as you type and saves exact personal wording; separate categorized Explore.",
"system": "Existing warm paper, dark ink, green/yellow actions; incumbent serif headings, sans-serif forms, spacing and rounded controls",
"signature": "Personal someday list and meaningful experience categories",
"risk": "Shared contribution activation requires the prepared additive migration and seed import, neither applied. Authenticated UI actions tested with mocks; SQL lifecycle tested in memory.",
"qualityBar": "Existing shell; live suggestions; private exact wording; explicit submission then review; bounded server pagination and URL navigation; keyboard use and no phone overflow"
}
},
"evidence": {
"platform": "web",
"productContinuity": {
"status": "pass",
"reason": "Scoped preserved-design continuity; revised behavior is local only. Production release handoff remains unverified.",
"reviewer": "Codex direct rendered review",
"report": ".fleet-local/manual-explore/review.md",
"surfaces": {
"landing": ".fleet-local/manual-explore/after/landing.png",
"app": ".fleet-local/manual-explore/after/shared-typeahead-1440.png"
},
"checks": {
"designSystem": {
"status": "pass",
"observation": "Rendered landing and local app retain existing serif landmarks, gold actions and product vocabulary; cinematic marketing and warm paper workspace reflect their existing jobs."
},
"identity": {
"status": "pass",
"observation": "Existing Significant Hobbies name, bucket-list subject matter and incumbent imagery/colors retained."
},
"vocabulary": {
"status": "pass",
"observation": "Explore labels discovery; landing catalog describes the same experience collection; My list remains personal storage."
},
"productTruth": {
"status": "pass",
"observation": "Existing promises of ideas, lists and completion match local behavior; no new landing claims; proposed changes not presented as deployed."
},
"handoff": {
"status": "pass",
"observation": "Rendered landing CTA was observed opening canonical public /experiences with catalog visible. Proposed manual and pagination paths tested separately locally; no combined revised production save-path claim."
}
}
},
"slopScale": {
"platform": "web",
"posture": "advisory",
"reason": "",
"checkpoints": [
{
"stage": "iteration",
"status": "scanned",
"report": ".fleet-local/manual-explore/shared-iteration.json",
"command": "node /Users/sarthak/Desktop/fleet/saas-maker/tooling/scripts/slop-score.mjs http://localhost:3097/bucket-list http://localhost:3097/experiences --json",
"findingsReview": "Incumbent sans-serif and warm-paper heuristics retained; Explore letter-avatar pattern belongs to shell. No new theme change warranted."
},
{
"stage": "final",
"status": "scanned",
"report": ".fleet-local/manual-explore/shared-final.json",
"command": "node /Users/sarthak/Desktop/fleet/saas-maker/tooling/scripts/slop-score.mjs http://localhost:3097/bucket-list http://localhost:3097/experiences --json",
"findingsReview": "Incumbent font, cream and avatar heuristics retained; no redesign warranted. Shared typeahead and Explore rendered separately at three widths. Landing evidence and failed local scanner history retained."
}
]
},
"visualReview": {
"status": "pass",
"reviewer": "Codex direct rendered review",
"direction": "existing-design",
"report": ".fleet-local/manual-explore/review.md",
"checks": {
"hierarchy": {
"status": "pass",
"observation": "Existing list header and shell retained; one input presents exact-wording save and five live suggestions; Explore stays separate."
},
"typography": {
"status": "pass",
"observation": "Existing serif landmarks and sans-serif controls; titles wrap at 390px with separate add targets."
},
"composition": {
"status": "pass",
"observation": "Existing shell, list sections and catalog filter rows retained; result mounts bounded to 20 and manual matches to 5."
},
"identity": {
"status": "pass",
"observation": "Preserved personal bucket-list vocabulary, warm paper, green/yellow actions and landing imagery."
},
"interaction": {
"status": "pass",
"observation": "14 browser tests pass; six mocked-account tests cover save, explicit submission, errors and stale search races. SQL tests prove pending ideas stay private until approval. Initial hydration loading flash fixed."
},
"responsive": {
"status": "pass",
"observation": "Both local app surfaces captured and overflow-checked at 390, 768 and 1440 pixels; controls reflow with no horizontal overflow."
}
}
},
"screenshots": [
{
"width": 390,
"path": ".fleet-local/manual-explore/after/shared-typeahead-390.png"
},
{
"width": 768,
"path": ".fleet-local/manual-explore/after/shared-typeahead-768.png"
},
{
"width": 1440,
"path": ".fleet-local/manual-explore/after/shared-typeahead-1440.png"
}
],
"projectCheck": {
"status": "pass",
"command": "pnpm typecheck; pnpm exec biome check <changed TS files>; pnpm exec vitest run src/components/bucket-list/quick-add-item.test.tsx; pnpm exec playwright test --config .fleet-local/manual-explore/playwright.config.mjs"
},
"critique": {
"score": 36,
"maximum": 40,
"dimensions": {
"hierarchy": 7,
"typography": 7,
"composition": 7,
"identity": 7,
"interaction": 4,
"responsive": 4
}
},
"audit": {
"score": 17,
"maximum": 20,
"dimensions": {
"purpose": 4,
"accessibility": 5,
"behavior": 3,
"responsive": 3,
"performance": 2
}
},
"unresolved": {
"p0": 0,
"p1": 0
},
"detector": {
"posture": "advisory",
"findings": []
},
"comprehension": {
"status": "not-applicable",
"reviewer": "",
"answers": {
"product": "",
"audience": "",
"value": "",
"mechanism": "",
"proof": "",
"nextAction": ""
},
"purposeScore": {
"product": 0,
"audience": 0,
"value": 0,
"mechanism": 0,
"proof": 0,
"nextAction": 0,
"total": 0
},
"mismatches": []
}
},
"ownerFeedback": {
"decision": "keep",
"note": "Owner explicitly narrowed scope: bro there is no major redesign is needed. Preserve established direction; owner acceptance of finished change not inferred."
}
}
4 changes: 2 additions & 2 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Primary pages use one dominant spatial field followed by quieter supporting pass

Live leads with a verb and an immediate invitation. It must make the user want to choose an activity, not admire a planning system. Mortality belongs in History and acts as context, never as the dominant emotional register of the action surface.

The global shell exposes Catalog, My list, Weekly journal, and Life in weeks. These reuse the incumbent shell and workspaces. The bucket-list cleanup removes competing steps and navigation without replacing typography, colors, imagery, or layout.
The global shell exposes Explore, My list, Weekly journal, and Life in weeks. These reuse the incumbent shell and workspaces. The bucket-list cleanup removes competing steps and navigation without replacing typography, colors, imagery, or layout.

Completion logging stays in My list. There is no Habits page or navigation link; its old URL redirects to My list. The old Daily URL redirects to the weekly journal.

Expand All @@ -74,7 +74,7 @@ Controls use 12px corners and major bounded surfaces use 16px corners. Paths, co

### Navigation

The wordmark is `SH` with an accessible full name. Catalog, My list, Weekly journal, and Life in weeks are direct links in that order on desktop and mobile. Preserve the established destination colors and responsive menu.
The wordmark is `SH` with an accessible full name. Explore, My list, Weekly journal, and Life in weeks are direct links in that order on desktop and mobile. Preserve the established destination colors and responsive menu.

### Cards / Containers

Expand Down
9 changes: 8 additions & 1 deletion PRODUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ progress systems are limited to surfaces where proof is the explicit job.
- Signed-out `/` serves the preserved Live landing with a catalog call to
action. A session-bearing request enters `/bucket-list`; the application
still validates the session before choosing account or local storage.
- Primary navigation is Catalog (`/experiences`), My list (`/bucket-list`),
- Primary navigation is Explore (`/experiences`), My list (`/bucket-list`),
Weekly journal (`/journal`), and Life in weeks
(`/life-in-weeks`). Core work does not require biography onboarding.
- `/onboarding` and `/habits` redirect to My list. `/daily` redirects to the
Expand All @@ -75,6 +75,13 @@ progress systems are limited to surfaces where proof is the explicit job.
features instead of introducing a new shell, theme, or dashboard.
- Anonymous marketing and tool HTML follows the existing Astro/Worker cache
boundary.
- My list searches the shared seeded experience catalog as the person types.
Suggestions use the same catalog across users; personal wording and saved
list status remain separate from catalog data.
- Shared contributions require explicit authenticated submission and operator
review. Pending and rejected titles are not public suggestions. The shared
catalog's additive migration and seed import must be applied before enabling
database-backed contributions; existing seed discovery remains available.
- The Hub has no shared database, summaries, assistant, or write actions in V1.
- Existing private data must survive target deletion and reversible product
changes.
Expand Down
7 changes: 7 additions & 0 deletions PROJECT_STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ remain available on secondary routes.

## Status and next

- Local candidate for [#40](https://github.com/Significant-Hobbies/live/issues/40):
live typeahead, server-paginated categorized Explore, shared seed catalog and
explicit reviewed contributions. The additive 0007 schema and seed artifact
are prepared; production migration, seed import and release have not run.
Existing built-in seed discovery stays available during activation. Operator
steps are in [shared catalog](docs/product/shared-catalog.md).

Live is actively usable but remains an ongoing product. Continue from observed
usage and improve discovery and long-lived planning on the independent Live
origin.
Expand Down
49 changes: 49 additions & 0 deletions docs/product/shared-catalog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Shared experience catalog

Everyone searches the same approved catalog. Seed ideas come from the canonical
419-entry source corpus; personal bucket lists, completion state and notes are
separate. As-you-type search returns five results; Explore returns twenty.
Both use /api/experience-catalog and server-side pagination.

Signed-in users can explicitly submit a title and category for review. This
action never publishes or changes their personal list. Pending/rejected ideas
and submitter IDs are never included in public responses. Approval deduplicates
normalized titles and inserts an idea into ExperienceCatalog. Rejection only
updates the submission. There is no public moderation endpoint.

## Operator tooling

The additive 0007 migration is prepared, not applied by this work. Apply schema
changes only through the existing, separately authorized migration workflow.
The CLI supports local data only and refuses --remote. Do not use the unrelated
journey seed script: that script also edits demo timelines and users.

Prepare a reviewable seed artifact without changing any database:

```sh
pnpm catalog seed --output .fleet-local/experience-catalog-seed.sql
```

After the catalog schema has been applied locally:

```sh
pnpm catalog seed --local
pnpm catalog pending --local
pnpm catalog review --local --id <submission-id> --decision approve --reviewer <operator>
pnpm catalog review --local --id <submission-id> --decision reject --reviewer <operator>
```

Seed inserts are idempotent and do not overwrite approved data. The CLI records
the supplied operator name and time; this local label is not an authenticated
admin identity. Queue inspection is capped at 100 oldest pending rows.
Authenticated submissions are bounded to twenty per user per day in an atomic
database statement; repeats by the same user do not create duplicate rows.

While the catalog is absent or the seed import is incomplete, reads use built-in seed ideas and explicitly
return source: seed. They do not send the whole corpus to the client. An
unrelated database failure returns an error instead of silently replacing
shared results. Writes require the new tables; they do not pretend to succeed.
Approval requires the seed import to be complete before publishing new ideas.

Production migration, seed import, reviewer access and release remain explicit
operator actions. No production database changes were performed here.
Loading
Loading