Repository navigation
Infraestructura base: monorepo pnpm + TanStack Start + MongoDB en Docker + console-runner #1
Description
Summary
Memora no tiene todavía ni una línea de código de producto: esta tarea entrega el terreno de trabajo y nada de producto. Un monorepo pnpm + Turborepo cuyo package.json raíz es la única puerta de entrada; apps/web con TanStack Start + Tailwind + shadcn (new-york / neutral) mostrando un «Hola Mundo» que demuestra que la cadena de estilos aplica de punta a punta; MongoDB 8 en Docker Compose (sin credenciales, volumen nombrado, solo para local) con los scripts db:up / db:down / db:reset; packages/db como único sitio del repositorio que resuelve MONGODB_URI y construye el cliente de Mongo; y console-runner en la raíz (por petición explícita) con un menú interactivo de mantenimiento que comprueba la conexión, limpia la base de datos tras una confirmación explícita e imprime un TODO en la opción de datos de prueba — un hueco señalizado, nunca trabajo fingido. La calidad la sostienen tsc --noEmit y Prettier, sin linter por decisión explícita, con un workflow de GitHub Actions que ejecuta typecheck, format:check, test y build en cada PR para que el gate de merge del harness tenga un verde real que leer. El criterio de éxito es operativo: quien clona el repositorio levanta la base de datos, arranca el front y ejecuta el runner con comandos de la raíz — y eso se verifica a mano (db:up → runner → dev → la página carga), porque la suite de tests es hermética y no cubre la infra real.
Requirements — Infraestructura y estructura base del monorepo
Source PRD: docs/prds/infra-monorepo-2026-10-17.md
Task: #1 — branchharness/1-infra-monorepo
Scope note: this delivery is infrastructure only. No product surface, no domain
model, no auth. The success criterion is operational: a fresh clone can bring up the
database, start the front and run the maintenance runner from root package.json
scripts, and the PR passes the mechanical gates.
A. Monorepo root — one install, one entry point (US1)
- R1 (ubiquitous): The repository root shall be a private pnpm workspace whose
pnpm-workspace.yamldeclaresapps/*,packages/*andconsole-runneras
workspace packages. - R2 (ubiquitous): The root
package.jsonshall pin the package manager with
packageManager: "pnpm@10.19.0"and declare the supported Node version inengines
(node: ">=24.16.0 <25"), matched by a committed.nvmrcholding24.16.0. - R3 (event): When
pnpm installis run at the repository root, the system shall
install and link every workspace package's dependencies in a single command, with no
further manual configuration. - R4 (ubiquitous): After the migration the repository shall contain exactly one
lockfile —pnpm-lock.yaml— and nopackage-lock.json. - R5 (ubiquitous): The harness CLI shall stay resolvable at
<repo-root>/node_modules/.bin/lemonyafter a pnpm install, because
.claude/hooks/lib/lemony.shresolves that exact path. - R6 (ubiquitous): The root
package.jsonshall be the only entry point and expose
exactly these scripts:dev,build,test,typecheck,format,format:check,
db:up,db:down,db:reset,runner. - R7 (event): When one of the workspace-spanning root scripts (
dev,build,
test,typecheck) is run, the system shall delegate the work to Turborepo through
turbo.json, not to a hand-written loop over directories. - R8 (ubiquitous): Every workspace package shall compile under TypeScript strict
mode (strict: true) from a shared roottsconfig.base.json. - R9 (event): When
pnpm typecheckis run, the system shall runtsc --noEmitfor
every workspace and exit non-zero if any workspace reports a type error. - R10 (event): When
pnpm format:checkis run, the system shall verify Prettier
formatting across the project's own tracked files and exit non-zero if any file is
unformatted. - R11 (ubiquitous): The Prettier scope shall exclude vendor and generated paths —
node_modules,.claude/,pnpm-lock.yaml, build outputs and caches — so a harness
vendor update can never fail the format gate. - R12 (event): When
pnpm build,pnpm testorpnpm devhas been run,
git status --porcelainshall report no new untracked and no modified tracked files
(every build output and cache is gitignored).
Acceptance criteria
- A fresh clone +
pnpm install+pnpm typecheck+pnpm test+pnpm build
succeeds with no step outside the rootpackage.json. -
pnpm-lock.yamlis committed;package-lock.jsonis gone from the worktree and
from the index. -
.claude/hooks/lib/lemony.sh emit …still works after the install (the launcher
finds the local bin). -
git status --porcelainis empty after a fullbuild+test+ adevsession.
B. Front end — «Hola Mundo» proving the TanStack Start → Tailwind → shadcn chain (US4)
- R13 (ubiquitous):
apps/webshall be a TanStack Start application in TypeScript
strict mode, with Tailwind configured and shadcn initialised with stylenew-york
and base colourneutral. - R14 (event): When
pnpm devis run, the system shall serveapps/webon a local
port and its root route shall render the «Hola Mundo» page. - R15 (ubiquitous): The «Hola Mundo» route shall render its content inside a shadcn
Cardand shall include a shadcnButton, so the styling chain is demonstrably
applied end to end. - R16 (ubiquitous): The page shall use the shadcn/Tailwind default tokens only — no
theme switcher, no dark-mode toggle, no custom palette (deferred by the PRD). - R17 (event): When
pnpm buildis run, the system shall produce a production build
ofapps/weband exit zero. - R18 (ubiquitous): The repository shall contain no file, route, asset, script or
dependency left behind by a scaffolding CLI that is not used by the «Hola Mundo»
page, the tests, the gates or the build. - R19 (event): When the front smoke test runs, it shall render the «Hola Mundo»
route component and assert both the greeting text and the presence of the shadcn
Button, without Docker, a live Mongo or network access. - R20 (ubiquitous): The front end shall perform no database access in this delivery,
andapps/webshall declare no dependency on@memora/db. - R21 (unwanted): If the current shadcn release is incompatible with the Tailwind
version TanStack Start installs, then the implementation shall pin the exact
combination that works and state the pinned versions inprogress.mdand the PR
description, instead of leaving a broken or half-working styling chain.
Acceptance criteria
-
pnpm devserves a page showing the greeting inside aCardwith a styled
Button(Tailwind classes visibly applied). -
pnpm testruns the smoke test green with Docker stopped and no network. -
apps/web/package.jsonlists no unused dependency and no@memora/db.
C. MongoDB in Docker — reproducible local database (US2, US3)
- R22 (ubiquitous):
docker-compose.ymlat the repository root shall define a
single service built from imagemongo:8, publishing port27017, with no
credentials, a named volume mounted at/data/db, and a healthcheck that reports
the server as ready. - R23 (ubiquitous):
docker-compose.ymlshall carry a header comment stating it is
for local development only — no credentials, never for an externally reachable
environment. - R24 (event): When
pnpm db:upis run, the system shall start the Mongo container
detached and return only once the container reports healthy. - R25 (event): When
pnpm db:downis run, the system shall stop and remove the
container while preserving the named volume, so the data survives. - R26 (event): When
pnpm db:resetis run, the system shall remove the container
and its named volume and then start a fresh healthy container, so the database
comes back empty. - R27 (unwanted): If the Docker daemon is not running, or port 27017 is already
bound, then thedb:*script shall surface Docker's own error message unchanged and
exit non-zero — no masking, no retry loop, no silent success. - R28 (ubiquitous): The database name shall be
memoraand the canonical local URI
mongodb://localhost:27017/memora.
Acceptance criteria
-
pnpm db:up→docker compose psshows the service healthy. - Data written between
db:upanddb:downis still there afterdb:upagain. - After
pnpm db:resetthememoradatabase is empty. - With Docker stopped,
pnpm db:upexits non-zero and prints Docker's error.
D. packages/db — the only place that knows how to reach Mongo (technical decision)
- R29 (ubiquitous):
packages/db, published in the workspace as@memora/db, shall
be the only location in the repository that resolvesMONGODB_URIor constructs a
Mongo client; no other workspace shall import themongodbdriver directly. - R30 (ubiquitous):
@memora/dbshall expose a pure resolver
(resolveMongoUri(env)) that returns the configured URI for a given environment
record, without reading global state itself. - R31 (unwanted): If
MONGODB_URIis absent, empty or whitespace-only in the given
environment, then the resolver shall throw an explicit error naming the variable and
pointing at.env.example, and shall not fall back to any default URI. - R32 (ubiquitous):
@memora/dbshall expose a client factory
(createMongoClient(uri)) that applies a server-selection timeout of at most
5000 ms, so an unreachable server fails fast instead of hanging on the driver's
default. - R33 (ubiquitous):
@memora/dbshall expose the two maintenance primitives the
runner needs — a connectivity check (ping) and a database drop — operating on the
database encoded in the URI, with no hard-coded database name. - R34 (ubiquitous):
.env.exampleshall be versioned at the repository root with
MONGODB_URI=mongodb://localhost:27017/memora, and.envshall be gitignored. - R35 (event): When an entry point starts, the system shall load the
repository-root.envinto the process environment if the file exists, and shall not
fail when it is absent — the missing-variable failure of R31 is the only
configuration failure path. - R36 (ubiquitous):
@memora/dbshall be consumed as TypeScript source (no build
step, no emitteddist/) and shall typecheck on its own viapnpm typecheck. - R37 (ubiquitous): The driver shall be the official
mongodbpackage with generic
collection typing; no ODM (no Mongoose, no Prisma) shall be added.
Acceptance criteria
- A unit test proves
resolveMongoUrireturns the value when present. - A unit test proves the absent/empty variable throws, and the message names
MONGODB_URI. -
grepforfrom 'mongodb'outsidepackages/dbreturns nothing.
E. Console runner — discoverable maintenance menu (US5, US7)
- R38 (event): When
pnpm runneris run, the system shall display an interactive
arrow-key menu offering exactly: check Mongo connection, clean database, load seed
data, exit — requiring no command-line flags. - R39 (event): When an operation finishes, the system shall return to the menu, and
whenexitis chosen it shall close any open Mongo client and exit with code 0,
leaving no hanging process. - R40 (event): When «check connection» is chosen, the system shall connect with the
resolved URI, issue aping, and report success naming the host and database it
reached. - R41 (unwanted): If the connection or
pingfails (server down, timeout), then the
system shall report the failure with the driver's message plus a hint to run
pnpm db:up, return to the menu, and not crash with an unhandled-exception stack
trace. - R42 (unwanted): If
MONGODB_URIcannot be resolved when an operation needs it,
then the runner shall print that explicit configuration error (R31) and return to the
menu without attempting a connection. - R43 (event): When «load seed data» is chosen, the system shall print a message
marking the operation as pending (TODO), perform no database access, and return
a pending result marker — it shall never report work it did not do. - R44 (unwanted): If the user interrupts a prompt (Ctrl+C), then the runner shall
terminate quietly — no unhandled-exception stack trace — closing any open client. - R45 (ubiquitous): Each runner operation shall be a function independent of the
prompt layer, receiving its Mongo client/db as a parameter, so it can be tested
against a double. - R46 (ubiquitous): The runner shall be executed with
tsxdirectly over
TypeScript, with no build step.
Acceptance criteria
-
pnpm runnershows the four-entry menu and navigates with arrow keys. - With Mongo down, «check connection» reports the failure and the menu is still
usable. - «Load seed data» prints a
TODOand the test proves no client method was called. - Unit tests cover every operation function against a Mongo double.
F. Clean database — the destructive operation (US6)
- R47 (event): When «clean database» is chosen, the system shall first ask for an
explicit confirmation that names the target database, before touching anything. - R48 (ubiquitous): The confirmation prompt shall default to no, so proceeding
requires a deliberate keystroke. - R49 (state+event): While the confirmation has been accepted, the system shall call
dropDatabaseon the database resolved from the URI and report the outcome. - R50 (unwanted): If the confirmation is declined, then the system shall perform no
write of any kind —dropDatabaseshall not be called — and shall return a cancelled
marker. - R51 (unwanted): If
dropDatabasefails, then the system shall report the error
and return to the menu, leaving the runner usable.
Acceptance criteria
- A unit test proves accepted confirmation ⇒
dropDatabasecalled exactly once. - A unit test proves declined confirmation ⇒ no method called on the double, result
marked cancelled. - Manual check: cleaning the real local database actually empties it.
G. CI and declared gates (US8)
- R52 (event): When a pull request targeting
mainis opened or updated, GitHub
Actions shall run a workflow that installs with pnpm (--frozen-lockfile, with the
pnpm store cached) and then runstypecheck,format:check,testandbuild. - R53 (unwanted): If any of those four commands exits non-zero, then the workflow
shall fail — nocontinue-on-error, no step allowed to swallow a red gate. - R54 (ubiquitous): The workflow shall take the Node version from
.nvmrcand the
pnpm version from the rootpackageManagerfield, so CI and local use the same
versions. - R55 (ubiquitous):
harness.config.ymlshall declaregates:as exactly
typecheck,format:check,test,build, and shall leavemerge.allow_no_checks
at its defaultfalse. - R56 (ubiquitous): The whole test suite shall be hermetic — no test shall require
Docker, a live Mongo instance or network access. - R57 (ubiquitous):
README.mdshall document the quickstart for a fresh clone:
install,db:up/db:down/db:reset,dev,runner, and the gate commands.
Acceptance criteria
- The PR for this task shows a green GitHub Actions check with the four gate steps.
- A deliberately broken type (locally) turns the
typecheckstep red. -
harness.config.ymllists the four gates undergates:.
H. Definition of done — manual real-run verification
- R58 (event): When the implementation is signalled done,
progress.mdshall record
the outcome of the manual real-run sequence, executed in this order:pnpm db:up→
pnpm runner→ «check connection» reports success →pnpm dev→ the «Hola Mundo»
page loads in a browser →pnpm db:down. - R59 (ubiquitous): This manual sequence shall be treated as part of done; the
hermetic suite does not cover it, and a green suite alone shall not be read as
evidence that the infrastructure runs.
Acceptance criteria
-
progress.mdcontains the six-step verification with its result.
Design
See .claude/state/tasks/1/spec/design.md.
Tasks
See .claude/state/tasks/1/spec/tasks.md.
Activity
brauliodiez commentedon Oct 17, 2026
Review — APPROVE
Full pass, fresh context, on PR #2 at
dcce210. Anchor: merge-base95075e8of thefreshly fetched
mainand the PR head — 48 files added/modified, 1 deleted(
package-lock.json), 42 changed non-test files.Verdict: APPROVE. No requirement fails. 58 of 59 PASS; R48 is PARTIAL on test
coverage by a design decision the human approved at the spec gate. Six advisory /
hardening findings, none blocking — two of them new to this pass.
Evidence ledger:
.claude/state/tasks/1/review-ledger/full-pass.json— validated greenat this anchor (
criteria 59/59,gates 4/4,passes 5/5, no spec-side problems).A pre-gate pass reviewed the same content while it was uncommitted and deliberately
posted no record. I re-ran everything from scratch rather than inheriting it; where I
reached the same conclusion I say so, and I note the two places I went further.
Gates — re-run independently, cache bypassed
The first
turboinvocation can replay a cache, which is not fresh execution, so everyscript gate ran under
TURBO_FORCE=trueand the logs confirmcache bypass, force executingfor each package.typecheckformat:checktest@memora/db11,console-runner7,@memora/web2), no Docker daemon reachablebuildGenerated .output/nitro.jsonpnpm auditpnpm install --frozen-lockfileThe
typecheckgate was independently proven to go red. There is no linter byexplicit decision, so this gate carries the weight one would: I did not take it on trust.
Mutating
resolveMongoUri's return typestring → numberbehind a restore trap producedrc=1,0 successful, 3 total,Failed: console-runner#typecheck,error TS2322in@memora/dband a cross-workspaceTS2345atconsole-runner/src/main.ts(51,34). Trapfired; tree clean.
CI has now executed for the first time and reported green — new evidence no earlier
pass could have had.
gh pr checks 2→Declared gates pass 31s; run39073679983completed / success onpull_request. That closes R52–R54 empiricallyrather than by inspection.
Real run — what a green suite cannot prove
pnpm dev, thenGET /→ 200, withlang="es", «Hola Mundo»,data-slot="card"/card-header/card-titleanddata-slot="button"(«Empezar»)in the server-rendered HTML. Fetched the referenced
/src/styles.css→ 200,21 721 bytes, carrying the resolved utilities
.bg-card,.text-card-foreground,.bg-primary,.text-primary-foreground,.rounded-xl,.min-h-screen,.shadow-sm,.max-w-mdand the neutral token values(
--card: oklch(1 0 0),--primary: oklch(0.205 0 0)). The styling chain is appliedend to end, not merely imported. Dev log: zero errors, zero warnings.
in the compiled CSS is Tailwind's own licence comment.
expect), four separate runs:↑↓ navigate • ⏎ select, and the arrow keysdemonstrably moved the
❯marker down the list.✖ No se pudo conectar.plus the driver's own message verbatim(
connect ECONNREFUSED ::1:27017, connect ECONNREFUSED 127.0.0.1:27017) plus¿Está Mongo levantado? Prueba con \pnpm db:up`.`; menu returned, no stack trace.Vas a BORRAR todos los datos de la base «memora». ¿Seguro? (y/N)— naming the database, defaulting to no — and Enter resolved toNo→Operación cancelada: no se ha borrado nada.TODO, nothing touched.MONGODB_URIunset with no.envload → the explicit configuration error and noECONNREFUSEDfollowed; my script watched for one and would have failed the run.Menu stayed usable.
Ctrl+C→ exit 0, and grepping the captured output forat …(,ExitPromptErrorandError:gives zero hits (R44).git status --porcelain -uallempty after a fullbuild+test+ adevsession.
.claude/hooks/lib/lemony.sh --version→0.10.0;node_modules/.bin/lemonypresent, mode 755.Docker-dependent steps could not be executed — stated plainly.
docker --versionanswers
27.3.1in under a second, butdocker info,docker compose psandpnpm db:upeach hang and had to be SIGKILLed after 10 s / 10 s / 25 s (no GNUtimeouthere; I bounded each call with my own watchdog). So R24–R27 rest on readingthe scripts plus the Implementer's recorded runs, not on my own execution. What the
reading does establish: all three
db:*scripts are baredocker composeinvocationswith no wrapper, no retry loop, no
|| trueand no redirection, so Docker's stderr andexit code propagate unchanged by construction (R27),
db:downhas no-vso the volumesurvives by construction (R25), and
db:resetisdown -v && up -d --waitso a failedteardown stops the sequence rather than racing a half-reset (R26).
The rendered pixels are still not confirmed by an agent. No browser automation is
available to me, so my front-end evidence is HTTP-level. The human performed the visual
check at the checkpoint with the dev server on
http://localhost:3000/; that is wherethat evidence lives.
Spec compliance — 59 requirements, walked point by point
Covered: 58/59 · Partial: 1 · Failing: 0 · Verdict: compliant.
Per-requirement implementation + test evidence is in the ledger's
criteriaarray, oneentry per
R<n>. The only non-PASS row:console-runner/src/main.ts:116— correct, and confirmed liveNo unspecified additions and no design divergence beyond what
design.md's own decisionlog already records and the human signed (the separate
vitest.config.ts, droppingexactOptionalPropertyTypes, hand-authoringapps/webinstead of shipping CLI output,the two extra
.prettierignoreentries). On that last one I reached the same judgementas the earlier pass independently:
harness.config.schema.jsonanddocs/playbooks/README.mdboth exist, are installer-dropped artifacts regenerated bylemony repair/update, and so fall inside R11's general clause and squarely insideits stated rationale — "a harness vendor update can never fail the format gate". Compliant,
not drift.
Mutation probes — hand path, declared risk
data-lossSeven files probed, thirteen mutants, each behind an
EXITrestore trap. Treeverified clean after every probe; no
.bakstranded.clean-database.ts—if (!confirmed)guard removedclean-database.ts— guard inverted toif (confirmed)main.ts:116— destructive confirmdefault: false→truemain.ts:119—cleanDatabase(target, confirmed)→(target, true)check-connection.ts—pnpm db:uphint droppedseed-data.ts— message claims success instead ofTODOclient.ts— timeout 5 000 → 50 000 msclient.ts—await db.command({ping:1})deletedclient.ts—await db.dropDatabase()deletedconfig.ts—?.trim()droppedconfig.ts— return typestring→number(typecheck probe)home-page.tsx— greeting → "Hello World"home-page.tsx— shadcn<Button>→ bare<button>Eleven of thirteen killed. Both survivors land in
console-runner/src/main.ts— theone logic-bearing file with no spec. The
R50guard that makes a declined confirmationtouch nothing is genuinely protected; the prompt layer above it is not.
Findings
1 · Advisory, headline — the destructive confirm is untested, and it is worse than one mutant shows
console-runner/src/main.ts:116readsdefault: false, // Enter cancels (R48).and thatis correct — I watched the
(y/N)prompt render and Enter cancel, with nothingdropped. But nothing automated holds it there, and I found a second, worse survivor
the earlier pass did not:
main.ts:116default: false→default: true— Enter stops meaning cancel andstarts meaning delete the database. Suite stays 7/7 green.
main.ts:119cleanDatabase(target, confirmed)→cleanDatabase(target, true)— theconfirmation becomes pure theatre: the human types
n, and the database is droppedanyway. Suite stays 7/7 green.
This is the only destructive operation in the delivery, in a group that declared
[risk: data-loss], and its entire protection is a one-off manual observation that doesnot regress.
I did not reject on it, deliberately. The implementation meets R48, and the gap sits
inside
design.md's human-approved decision that the prompt layer is not tested("testing it would mean driving a TTY"). Rejecting would overrule a decision the human
signed at the spec gate. Cheapest closure if they want it closed, no TTY needed:
extract a
buildCleanConfirm(database)factory and assertdefault === falseand thatthe message names the database (~10 lines); a second ~10 lines extracting the choice
handler would cover the dispatch and close finding 5 too.
2 · Security, medium / hardening — the credential-less Mongo publishes on all interfaces
docker-compose.yml:20is- '27017:27017', which binds0.0.0.0. On any shared oruntrusted network, every host on the LAN gets unauthenticated full read/write on every
database — including the
dropDatabasethis delivery ships. The header comment warnsagainst copying the file to a reachable environment, but the default binding already
makes the dev machine reachable.
'127.0.0.1:27017:27017'closes it and still satisfiesR22's port publication and R28's
mongodb://localhost:27017/memora. R22's letter is met,so this is a recommendation, not a block.
3 · Security, low–medium / hardening — CI's token is write-scoped and its actions float (NEW)
.github/workflows/ci.ymldeclares nopermissions:block, and this repository's defaultis
default_workflow_permissions: "write"withcan_approve_pull_request_reviews: true—so the job's
GITHUB_TOKENcan write to the repository. Its three actions are pinnedto mutable major tags (
actions/checkout@v7,pnpm/action-setup@v6,actions/setup-node@v7), so a compromised release of any of them would run with thatwrite-scoped token on every same-repo PR, which is exactly the harness flow. One line
fixes it:
R52–R54 say nothing about token scope, so this is not a spec violation — a recommendation.
4 · Advisory — Ctrl+D at a prompt exits 13, and it is undocumented
Reproduced independently: stdin EOF at the menu leaves
Warning: Detected unsettled top-level await at console-runner/src/main.ts:146andELIFECYCLE Command failed with exit code 13. R44 specifies Ctrl+C, which workscorrectly (exit 0, no stack trace), so this is unspecified rather than failing, and it is
non-destructive — acceptable to ship for a local maintenance tool. But it is absent from
progress.md, which R58/R59 make the durable real-run record. Recorded here so it is nolonger undocumented.
5 · Low / hardening and informational
main.ts:71— the menu dispatch is anif-chain with no terminalelse, so anunrecognised choice would spin the
for(;;)loop silently instead of failing loudly.Unreachable today (closed typed union); hardening only.
apps/web/components.json:15— the shadcn aliasesutils(#/lib/utils) andhooks(#/hooks) point at paths that do not exist:apps/web/src/libandapps/web/src/hooksare both absent, and the package's#/*map resolves to./src/*.The next
shadcn addwill generate an import that does not resolve. Since this file'sonly purpose is future generation, the stale aliases are its whole failure mode.
toEqualinstead oftoStrictEqualin seven places (client.spec.ts:39/51/73,clean-database.spec.ts:23/31/44,check-connection.spec.ts:17), so an unexpectedundefined-valued property would pass.cn@0.5.0— the shadcn components takecnfrom a third-party npm package ratherthan a local
src/lib/utils.ts. Short package name (typosquat shape), carries a caret,and its lockfile entry declares
hasBin: true. Mitigations are in place: pnpm 10 blocksinstall scripts and
pnpm-workspace.yamlre-enables them for onlyesbuildandlightningcss, socnruns no postinstall, and the lockfile pins an integrity hash.Worth pinning exactly, as the rest of the toolchain is.
progress.md's "pinned exactly (no carets)" claim is inaccurate for twoapps/webdependencies —cn: ^0.5.0andradix-ui: ^1.8.1. Everything in thetabulated list is indeed caret-free.
home-page.spec.tsx:10—expect(getByRole(...)).toBeDefined()is redundant(
getByRolealready throws). Cosmetic: I probed the test and both the greeting and theshadcn
Buttonmarker are genuinely load-bearing.Checked and clean — recorded so the absence is evidence, not silence
packages/db/src/client.ts:1, andpackages/db/package.jsonis the only manifestdeclaring
mongodb.apps/webdeclares no@memora/db(D1).the resolved value, so a
MONGODB_URIcarrying credentials is not echoed..envisuntracked (
git check-ignore -v .env→.gitignore:17);.env.exampleholds aplaceholder only.
packages/db. I probed the plausible one: removingtypes: ["node"]frompackages/db/tsconfig.jsonmakestscfail (TS2591onprocess.envin the spec,TS2740onMongoClientOptions), so it earns its place.Every
apps/webdependency traces to a real import, the runtime or a gate.closeClient's empty catch is compliant, not a silent failure: it carries an explicitcomment stating the intent, which is the rule. Every other error path is loud, with the
underlying message kept verbatim.
db:*scripts and therunnerscript arestatic strings; nothing in the change builds a command or a path from input.
docs/architecture.mdis absent, so the architecture-shape check does not apply —and nothing here suggests creating one.
Reviewed-tree: c194b832753a90de30d66b217adefd04fae7ab33
Diff-fingerprint: 1192498ee9e6180a0f845c3f8387daca1807484b