Stand the backend up, and drive the primary journey on it - #615
Conversation
Nine of the twelve promotion conditions are judged on what a browser shows, and all nine were UNVERIFIED for one reason: every product route rendered "Convex backend not configured" (defect D1). This provisions an isolated Convex dev deployment, drives J1, J2 and J4 end to end against it, and commits both the captures and the scripts that regenerate them. Two things were actually broken behind that door, and neither names itself: - @erquhart/convex-oss-stats imports @convex-dev/crons and declares it in neither dependencies nor peerDependencies. With package-lock.json gitignored, a fresh install can land a tree without it and the very first `convex dev` push dies on "Could not resolve @convex-dev/crons/convex.config". Declared directly. - A missing OPTIONAL model key failed the ENTIRE deploy. Convex analyses every backend module on every push; coordinatorAgent.ts builds DEFAULT_MODEL (kimi-k2.6, OpenRouter) at module scope because a Convex function must be a module-level export; and buildLanguageModel threw at construction for an unconfigured provider. So `convex dev` failed with "InvalidModules: Failed to analyze domains/agents/digestAgent.js" unless you had an OpenRouter account -- for a provider /redesign/chat never calls. The error now lives on doGenerate/doStream instead, so an unconfigured provider fails the call that needs the key rather than the deploy that does not. The same shape is fixed for the google branch, and modelResolver.test.ts gates it: construct DEFAULT_MODEL with the key deleted, assert construction succeeds and the call still rejects. New producers, each writing a committed artifact: - scripts/capture-live-journey.mjs -- J1 (ask, stream, sealed packet), J2 (the permanent link replays instead of re-running, proven by getLatestOwnedRun().runId being unchanged), J4 (cancel, honest terminal state, keep working), the server-side validation error path, and the same journey at 375. It also reads the run row and its stream events back out of Convex, so "it streamed" and "it persisted" are separate claims. - scripts/audit-web-quality.mjs -- Lighthouse 13.4.1 + @axe-core/cli 4.13.0 against the production build under vite preview. - scripts/review-web-interface-guidelines.mjs -- DOM measurements for the Web Interface Guidelines review written up in promotion/evidence/wig-review/REVIEW.md. A review, not a score; the two measure different things and are committed separately. Scorecard: 1/12 -> 7/12, and UNVERIFIED is gone from the table. Conditions 1, 3, 4, 5, 6 and 9 move on committed evidence. Conditions 2, 7, 8, 10 and 11 FAIL on measured numbers, which is the point -- three new defects were found by running the thing: D5 (a rejected prompt shows no reason on screen), D6 (LCP 10.8 s plus four guideline deviations), D7 (the same question returned 3, 2, 1, 0, 1 and 0 grounded sources across six runs). Setup is written down in docs/START_HERE.md "Before Step 1" and docs/codebase/CONCERNS.md C7b, including both traps above, so the next cold reader does not rediscover them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
| GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
|---|---|---|---|---|---|
| 36087749 | Triggered | Generic Password | a4e9cd1 | scripts/capture-live-journey.mjs | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secret safely. Learn here the best practices.
- Revoke and rotate this secret.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
PR size advisoryThis PR adds 19309 lines of substantive change. CONTRIBUTING.md defines a soft limit of ~400 LOC. If the PR is genuinely cohesive (e.g. an architecture map, a generated migration, a deletion of a dead module), no action is needed. Otherwise consider:
This is advisory — it does not block the merge. |
|
Superseded by #616, which carries the same work on a conventionally-named branch with a conventional title, rebased onto main so the expired MCP publish token is no longer in the tree. |
Nine of the twelve promotion conditions are judged on what a browser shows, and all nine were UNVERIFIED for one reason: every product route rendered "Convex backend not configured" (defect D1). This provisions an isolated Convex dev deployment, drives J1, J2 and J4 end to end against it, and commits both the captures and the scripts that regenerate them.
Two things were actually broken behind that door
Neither names itself, and both stop a cold clone dead.
@erquhart/convex-oss-statsimports@convex-dev/cronsand declares it nowhere — not independencies, not inpeerDependencies. Withpackage-lock.jsongitignored, a fresh install can land a tree without it and the very firstconvex devpush dies onCould not resolve "@convex-dev/crons/convex.config". Now a direct dependency.A missing OPTIONAL model key failed the ENTIRE deploy. Convex analyses every backend module on every push;
coordinatorAgent.tsbuildsDEFAULT_MODEL(kimi-k2.6, OpenRouter) at module scope because a Convex function must be a module-level export; andbuildLanguageModelthrew at construction for an unconfigured provider. Soconvex devfailed withInvalidModules: Failed to analyze domains/agents/digestAgent.jsunless you had an OpenRouter account — for a provider/redesign/chatnever calls. The error now lives ondoGenerate/doStream, so an unconfigured provider fails the call that needs the key rather than the deploy that does not. Gated by a newmodelResolver.test.tscase that deletes the key, constructs the model, and asserts both halves.What now runs, and what proves it
node scripts/capture-live-journey.mjs --port 4902→ exit 0, 10/10 checks. It asserts, it does not narrate:data-empty="true"on a live backend;data-chat-run-id;completewith 30 orderedredesignChatStreamEventsrows read back out of Convex — so "it streamed" and "it persisted" are separate claims;/redesign/chat/r/<hash>opened cold replays rather than re-runs, proven bygetLatestOwnedRun().runIdbeing unchanged;startChatat the trust boundary;Plus
scripts/audit-web-quality.mjs(Lighthouse 13.4.1 + axe-core 4.13.0 on the production build) andscripts/review-web-interface-guidelines.mjswith the written review atpromotion/evidence/wig-review/REVIEW.md. That review is a review, not a Lighthouse score — the two measure different things and are committed separately.Scorecard: 1/12 → 7/12, and UNVERIFIED is gone from the table
Conditions 1, 3, 4, 5, 6 and 9 move on committed evidence. Conditions 2, 7, 8, 10 and 11 FAIL on measured numbers, which is the point — running the thing found three new defects:
h1, no skip link, sub-44px touch targets including the submit button, 14.5px composer font).Setup is written down in
docs/START_HERE.md"Before Step 1" anddocs/codebase/CONCERNS.mdC7b, including both traps, so the next cold reader does not rediscover them.Not touched: the known
api→nevertypecheck cascade (D2).🤖 Generated with Claude Code