Repository navigation
2026 strategy, batch 2b: the Trust Center and pricing value, every word keyed, plus the meals and CFO review fixes - #429
Merged
Conversation
/security becomes the Trust Center. The badges the page used to carry — an annual audit, a healthcare-compliance claim, an uptime SLA, a bug bounty, a choice of three hosting regions, hardware-module key management — were things nothing in this repository could back, so they are gone, along with the compliance-badge block and the residency chooser that framed them. In their place, lib/marketing/trust-ledger.ts holds one row per claim and says which of four things it is: verified in the product (enforced in code AND pinned by a named test in this repo), in place as a process, inherited from a provider, or planned. components/marketing/trust-ledger.tsx renders the four status pills, their help text, and — for a verified row — the test files a reader could go and check. Every row gets id="ledger-<key>" so the page can link to a single claim. A new #ai-trust section states how the assistant is allowed to act, in six statements that are true of the shipped product: the Settings dial and that any area can be turned down to Recommend; the always-asks list; the step timeline and partly-finished reporting; quiet hours and the family trust ledger; what model-call telemetry does and does not record; and that family data never trains a model. The always-asks list is rendered from HIGH_STAKES_AI_DOMAINS through trust-copy, and the role table from ROLE_DEFAULTS, so neither can drift from lib/trust/engine.ts. The architecture section keeps only the layers we or our providers actually run, and the incident timeline is labelled a policy. /ai gets the same treatment in miniature: the scripted demo carries the sample badge the homepage ledger uses, the model-agnostic chip and the phrase in the page description are gone, and a link block sends a reader to /security#ai-trust rather than restating the trust rules where they could go stale. /features gains Kitchen Mode and Switch to Bubaly cards — the tile mock is composed from DEFAULT_TILES and the import list from lib/migrate/competitors, so neither can name something the product does not ship — and /mobile and /faq gain the matching entries. The copy says "no new hardware to buy" and never claims certified hardware, a PIN lock, voice control or burn-in protection, none of which components/display has. Route, sitemap and nav are untouched: this renames a page, not a URL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…nks to tests/marketing-trust-ledger.test.ts is the honesty guard. It asserts that every ledger row carries one of the four statuses; that a 'verified' row cites at least one test path that exists on disk and that no row cites a dangling reference; that the five roadmap rows can never be 'verified' without an external https evidence URL; that no row mentions healthcare compliance; and that each of the retired claims is absent from the page AND from the resolved en-US value of every security.* and trustCenter.* key the page renders — the values are what a visitor reads, so checking only the markup would miss them. It also proves the row it badges most strongly. For every entry in HIGH_STAKES_AI_DOMAINS it calls evaluateAction with an AI actor acting for a parent and asserts require_approval, so "money, health and documents always ask a parent" stays a fact about the engine rather than a sentence on a page. The remaining files pin the work this section shipped and nothing else: the Kitchen Mode answer joining the mobile-notifications section from the catalogue, /features#kitchen-mode and /features#switching resolving to real anchors, the copy naming no hardware Bubaly does not ship and no rival's price, the sample badge on the /ai demo with its link to /security#ai-trust, and /security keeping its path, its sitemap entry and an honest AEO description. The route contract loses its exception for a demo route that no longer exists and gains an assertion that none has come back, so every public marketing page now has to carry the AEO contract with no way to opt out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
/pricing now leads with what the price buys before it shows the price. - lib/marketing/value.ts holds the arithmetic and the tier copy in one place: perDayCents rounds UP (yearly over 365, monthly over 30) so the per-day line can never claim a cheaper day than the family pays, and realHandledCounts returns null — never a zero — below HANDLED_PUBLIC_MIN. - components/marketing/pricing-value-block.tsx renders the tier x row matrix as three stacked cards (columns only from md up, no table and no sideways scroller) and three number cards that are never blended: the REAL cross-family counts, the badged illustrative sample with its estimate note, and the family's own numbers. No cross-family time-saved aggregate is published. - The plan cards gain the per-day line under the monthly price on paid tiers only, the outcome-first column, and cancel-or-downgrade under Family+. Tier positioning, the highlight rail (now the six hero outcomes plus Kitchen Mode) and the switching band all moved to catalogue keys; the server page passes the handled stats, the sample numbers, up to two published case studies and the compact switching band down as props. - The in-app upgrade modal reads the same registry and the same rounding, and its remaining interpolated English became keys. Tests: tests/marketing-value.test.ts, plus the value-block guards added to tests/marketing-claims-contract.test.ts and tests/mobile-pricing-toggle-touch-target.test.ts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
The rail is built from HERO_OUTCOMES, whose copy is catalogue keys. Carrying a second English label beside them would be a copy that can drift, not the 'label plus labelKey' the data-array rule is asking for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
Restores the D1 work (plan moments in the 12-week forecast, coverage summary, the affordability scenario panel and the CFO surface links) onto the current base. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…nd stop answering "yes" to what the forecast never weighed Three ways the CFO surface stated more than the data supported. Counts next to the word "bills" were occurrence counts. The forecast expands one monthly bill into three payments inside a 12-week horizon, so a household with three bills read "4 of 5 bills" on the Covered tile and "4 bills are covered … 1 still need a hand" below it, and one autopay rent read "3 covered by autopay" on the money timeline. CoverageSummary now carries distinct-bill counters (coveredBills / paidBills / openBills / totalBills) beside the payment counters, and every string that says "bills" reads those. A bill with any occurrence still to pay by hand is open, however many of its other occurrences are covered. A recurring bill marked paid dropped out of the forecast entirely. A monthly rent paid this month took February's and March's rent with it: $0 due, an unchanged lowest balance, and — because nothing was left open — the explicit all-clear "Every one of the 1 bills in the next 12 weeks is covered … Nothing to do by hand." Only a non-recurring bill now short-circuits on 'paid'; a recurring one credits the paid occurrence and still expands the rest of the horizon. A commitment landing outside the horizon came back as verdict 'ok', so the affordability panel answered a $50,000 boat dated nine months out with a green "Yes" chip. That case is now its own verdict, 'not_assessed', rendered as a neutral "Not in this horizon" chip, and the supporting line says the forecast does not reach that date rather than implying a check happened. Tests pin all three: payment counts vs bill counts, a paid monthly rent still contributing its February and March occurrences to totalOutflow and lowestBalance, and the beyond-horizon scenario never returning 'ok'. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
Carries the S-03 loop (meal week context, allergy substitutions, retailer handoff and the bought flow) onto this worktree branch so the review fixes land on top of it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
The apply script re-sorts every key on write, which turned a two-string patch into an 800-line reorder of six catalogues and a merge conflict for every other section touching them. Restored to the file's existing order with the one updated value and the one new key edited in place. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…t clears line by line Three things the meal → pantry → grocery loop got wrong, each of which reached a family's real list or real pantry. `butter` is a whole-word match, so a dairy allergy rewrote every spread whose name merely ends in it: peanut butter, apple butter, cocoa butter and butter lettuce went onto the list as "peanut olive oil", "apple olive oil", "cocoa olive oil" and "olive oil lettuce", each with a reason saying peanut butter contains butter. The dairy rule now exempts a nut, seed or fruit butter — and a butter lettuce — while still swapping the butter a family means when they write it. That also un-breaks a household allergic to BOTH peanuts and dairy, whose safe spread (sunflower seed butter) was read as dairy and dropped. Rewriting only the matched span left the allergen standing in the modifier: "whole wheat bread" under a gluten allergy became "whole wheat gluten-free bread" — wheat bread that is also gluten-free, written to a coeliac household's list. The rewrite now checks what it left behind and, when that names the allergen, the replacement stands alone. `recordShoppingTrip` looped an additive pantry delta over every checked line and cleared the list only if every line succeeded. On a partial failure the succeeded deltas were already applied and nothing was cleared, so the second tap the modal invites added them again: one milk bought, two milk owned. The unit of work is now the line — each is put away and taken off the list together — so a retry finds only what never landed. The one window that cannot close inside a single write (put away, delete refused) is named in `clearFailed`, blocks the charge, and is said out loud instead of showing a clean success. Three comments that promised what the code did not are corrected: the trip's "a retry does the same thing again", the meals module's "the swaps are the names now ON the list" (untrue for a pantry swap, which writes nothing), and the `exempt` doc's implied handling of the inverse spelling. Tests: the dairy-only butter case, the peanut+dairy spread, the wheat modifier, and a two-item trip whose second line fails, run twice, asserting the first item's pantry quantity reflects one purchase and not two. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…app can produce Merges worktree-wf_9fc0af7c-543-4 onto the integration base. The branch's pricing-content.tsx and pricing/page.tsx predate main's i18n sweep of those files, so neither is taken wholesale: the current keyed files stay as the skeleton and the branch's structure is re-applied onto them. What lands: lib/marketing/value.ts (per-day ceil arithmetic, the REAL-card floor, the tier copy registry), components/marketing/pricing-value-block.tsx (the tier matrix and the three-source panel — real counts, the badged sample, the family's own numbers — never blended), the value block and up to two case-study cards above the plan cards, per-day lines under the paid prices with the billed-annually sub-line kept, outcome-first goal and positioning lines from the registry, the highlight rail rebuilt from the six hero outcomes' own keys plus Kitchen Mode, the compact switching band handed in from the server page in place of the Smart Imports callout, cancel-anytime under Family+, and the in-app upgrade modal reading the same registry and arithmetic. Fifty-one new keys land in all seven catalogues. Decisions taken while resolving rather than merging: the AEO section name stays keyed as on main; the highlight badge labels, the feature-matrix column labels and the positioning callout labels keep main's pricingContent.* keys, with only the positioning line coming from the registry; the Kitchen Mode tile keeps main's pricingContent.kitchenMode and turnAnyTabletOrSmart keys rather than borrowing the homepage band's headline; the plan-card names use the registry's tier label keys so the trial name is no longer an English literal. The value test's card locators are repointed at the <PlanCard boundaries, since the keyed cards carry no name literal to search for. The demo-seed clause is out of scope: demo mode was removed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…e gives it The branch's copy of tests/marketing-claims-contract.test.ts called the English catalogue `en`; main's calls it `catalogue`. Git merged the new describe block cleanly but left it referring to a name that does not exist in this file, which tsc and the test itself both caught. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
… keyed Merges worktree-wf_9fc0af7c-543-3 onto the batch base. The section's work (the /security Trust Center rewrite with its evidence ledger, the /ai honesty edits, the Kitchen Mode card, /mobile section and FAQ entry) is re-applied onto the pages as main's i18n sweep left them: every t() key the base already had stays, and the branch's intent is ported hunk by hunk. Decided rather than merged: - The security page's module-level data kept an English label beside every catalogue key. Those labels are the literals that turned the marketing-pages gate red. The data now holds keys only, the shape the other marketing pages use, and the honesty test's key finder reads quoted keys under the security. and trustCenter. prefixes instead of labelKey:. - The FAQ's Kitchen Mode entry is two catalogue keys inside FAQ_SECTIONS, which on the base already holds keys, rather than the branch's render-time special case; the nav test asserts that shape. - The claims contract keeps both corpora: the base's key-following one and the branch's prefix-scanning one, each with its own assertion. - Eleven orphaned security.* keys carrying the retired boasts (SOC 2 Type II, HIPAA, Audited annually, 99.99%, HSM, certificate pinning, column-level encryption, public audits, Bank-Level) are deleted from all seven catalogues. Nothing renders them and the prefix corpus rightly refuses them. The other orphaned security.* keys stay, as the section spec allows. - en-US keeps its casing for security.privacyByDesign and security.transparentAccountable; the six translations the branch added for them are kept, since the base had none. - The AEO section name is a new key, security.trustCenterAeoName, in all seven catalogues. - /features metadata takes the branch's keyed featuresPage.metaTitle; /ai keeps the base's keyed title and takes the branch's keyed description.
… allergen, a trip clears line by line
Merges worktree-wf_80ffc3db-358-8. The section itself had already reached
main through a sibling branch, and every section file on main was
byte-identical to the branch's own parent except the groceries service, which
had since moved its meal-plan reads onto settleAll. So each conflict was the
pre-fix text on one side and the reviewer's fix on the other: every hunk took
the fix, and the settleAll import and call stay as main has them.
What the fixes change. The dairy rule exempts a nut, seed or fruit butter and
a butter lettuce while still swapping the plain butter a family means when
they write it. A rewrite whose leftover modifier itself names the allergen
("whole wheat bread" under a gluten allergy) falls back to the bare
replacement instead of writing "whole wheat gluten-free bread" to the list.
recordShoppingTrip puts each bought line away and deletes it in the same
iteration, so a trip that fails half way leaves the pantry and the list
agreeing and a retry adds only what never landed; a line put away whose
delete was refused is named in clearFailed, and the action withholds the
purchase charge while anything is still on the list. The bought modal says
both failure kinds out loud and re-reads the list without closing.
Catalogues: the two strings this fix needs had not landed with the section.
couldNotPutTheseIn still said the list was unchanged, which the per-line clear
makes untrue, and theseAreInYourPantry was absent. Both come in from the
branch in all seven catalogues, in sorted place; nothing else in the
catalogues moved.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…bill's later months, refuse what the forecast never weighed The Family CFO section itself already sits on this base; this merge lands only its review-fix commit on top of the base's own variants of the files. Three honesty defects on the CFO surface are closed. Every string that says "bills" now reads the new distinct-bill counters on CoverageSummary (coveredBills / paidBills / openBills / totalBills) rather than the payment counters, so one monthly autopay rent no longer reads as three covered bills. A recurring bill marked paid now credits only the paid occurrence and still expands the rest of the horizon, so next month's rent stays in the projection and the all-clear cannot fire on it. A commitment dated beyond the 12-week horizon now gets its own verdict, not_assessed, with a neutral chip and a line saying the forecast does not reach that date, instead of the green "Yes". Conflict resolutions were all one-directional: the base's side of each conflicted file was kept (its settleAll batch in timeline-load.ts and the page's requireAal2 gate stay as they are) and the review commit's hunks were re-applied on top of it, which they did without drift. The catalogues gain affordabilityScenario.verdictNotAssessed in all seven languages, and the section's own affordabilityScenario.nothingInTheNext12Weeks copy is reworded in all seven so it no longer implies a check happened. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
… it is keyed (W4) The Trust Center used to say what a trust page is expected to say — bank-level security, SOC 2, uptime — none of which a row in this repository can prove. It now says only what one can: the ledger the family can read, the exports they can take, the deletions that actually run, the model calls that are logged, and the decisions that wait for a person. lib/marketing/trust-ledger.ts is the one place those claims are enumerated, components/marketing/trust-ledger.tsx renders them, and tests/marketing-claims-contract.test.ts pins the forbidden vocabulary in both of its corpora. The /ai, /features, /mobile and /faq pages and the reference showcases lose the same overclaims. This section was held out of #424 for one reason: the branch predates main's i18n sweep of these pages and carried 217 English literals on the gated marketing-pages surface. Landed here hunk by hunk onto the keyed pages, with every new literal — sections, ledger rows, page metadata, section names — lifted into all seven catalogues. Its adversarial reviewer re-ran the gate, tsc, lint and 26 test files on an export of the sha and found nothing to refute. Merged from worktree-wf_62bfdf60-bdb-2 (cda78a9), the branch the agent's own report named. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
… word keyed (W3) The pricing page said what each plan cost. It now says what the price buys, in numbers the app can produce: a per-day framing under the monthly price, the outcomes each tier hands back, and a value block whose three sources stay visibly apart — the real cross-family aggregate (omitted below the public floor, never rounded up to a number), the illustrative sample computed by the app's own brief composer and badged as such, and the published case studies. The highlight rail is rebuilt from the homepage's own heroOutcomes.* keys so the two never drift; the upgrade modal reads the same registry. Held out of #424 because the branch's pricing-content.tsx predated main's i18n sweep of that file; landed here onto the keyed file with 51 new keys in all seven catalogues. The section's demo-seed clause is out of scope — demo mode was removed in #414 — and no replacement was invented. The reviewer verified 55 marketing/i18n test files on an export of the sha. Merged from worktree-wf_62bfdf60-bdb-1 (93d1940), the branch the agent's own report named. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
… allergen, a trip clears line by line Section S-03 landed in #424; its reviewer's four fixes did not. A nut butter is not dairy: the allergen rules no longer classify by the word "butter". A proposed swap must never keep the allergen it was meant to remove. And a bought line is put away and cleared TOGETHER, line by line, so a shopping trip that fails half way leaves the pantry and the list agreeing about what came home. The tool result surfaces the substitutions it made instead of implying the list was written as asked. The reviewer proved the intent survived the merge rather than inferring it: the diff between the fix stack and the landed sha is exactly the base's settleAll import and nothing else. Merged from worktree-wf_62bfdf60-bdb-3 (c08f23e), the branch the agent's own report named. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…bill's later months, refuse what the forecast never weighed (M14) The Family CFO section landed in #424; its reviewer's three fixes did not. The bill count is now the count of distinct bills, with covered, paid and open kept apart so every "bills" string on the page and the timeline module reads the number it names. A recurring bill marked paid this month stays in the forecast's later months — paying March does not pay April. And the affordability scenario refuses to answer for a purchase dated outside the window the forecast actually weighed, instead of answering "yes" about a month it never looked at. Merged from worktree-wf_62bfdf60-bdb-4 (a845974), the branch the agent's own report named. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
…hes are superseded 2026MarketDom.md exists so an agent with no history can pick a section and work alongside whoever is here. Its §5 still credited only #421 and #424 and its §7 still listed S-19, S-20 and dd9-13 as in progress; an agent reading it today would have re-built the Trust Center. §5 now says per phase what #428 landed and what batch 2b lands; §7 names the fifteen worktree branches that must not be merged and why, the five sections that are genuinely unclaimed, and the second lesson this batch cost: measure how much of a branch's own delta already lives on main before merging it, because a parallel implementation of a landed section looks exactly like a fix stack until you do. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
NewWorldVenture
marked this pull request as ready for review
September 9, 2026 10:43
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The four sections #428 named as "coming in the follow-up". Each was landed
onto the integration base in its own worktree, then adversarially reviewed by
a second agent that exported the sha and re-ran the gate,
tsc, lint and thetests itself rather than trusting the report. All four came back approved with
no blockers; the branches merged here are the ones each report named.
S-19 · W4 — the Trust Center says what it can prove
The one public page whose subject is honesty was claiming what no row in this
repository can back — bank-level security, SOC 2, uptime figures. It now
enumerates only what a row proves (
lib/marketing/trust-ledger.ts): the ledgera family can read, the exports they can take, the deletions that run, the model
calls that are logged, the decisions that wait for a person. The same overclaims
leave /ai, /features, /mobile, /faq and the reference showcases;
tests/marketing-claims-contract.test.tspins the forbidden vocabulary in bothits corpora.
This is the section held out of #424 because its branch predated main's i18n
sweep and carried 217 English literals on the gated
marketing-pagessurface. It was re-applied hunk by hunk onto the keyed pages — no page keeps a
literal where the base had a key — with every new string (sections, ledger
rows, page metadata, section names) in all seven catalogues.
S-20 · W3 — what the price buys, in numbers the app can produce
A per-day framing under the monthly price, the outcomes each tier hands back,
and a value block whose three number sources stay visibly apart: the real
cross-family aggregate (omitted below the public floor, never rounded up), the
illustrative sample computed by the app's own brief composer and badged as
such, and the published case studies. The highlight rail is rebuilt from the
homepage's own
heroOutcomes.*keys so the two cannot drift; the upgrade modalreads the same registry. Held out of #424 for the same reason (90 literals);
landed onto the keyed
pricing-content.tsxwith 51 new keys. The section'sdemo-seed clause is out of scope — demo mode was removed in #414 — and nothing
was invented to replace it.
M10 — the meals-loop review fixes
A nut butter is not dairy (the allergen rules no longer classify by the word
"butter"); a proposed swap never keeps the allergen it was meant to remove; a
bought line is put away and cleared together, line by line, so a trip that
fails half way leaves the pantry and the list agreeing. The reviewer proved
the intent survived the merge rather than inferring it: the diff between the
fix stack and the landed sha is exactly the base's
settleAllimport.M14 — the Family CFO review fixes
Distinct bills are counted, with covered, paid and open kept apart so every
"bills" string reads the number it names; a recurring bill paid this month
stays in the forecast's later months; and the affordability scenario refuses
to answer for a purchase dated outside the window the forecast actually
weighed, instead of saying "yes" about a month it never looked at.
The strategy file
2026MarketDom.md§5 now says per phase what #428 landed and what this PRlands; §7 names the fifteen worktree branches that must not be merged and why
(≥97% already on main, or a parallel implementation of a section that
landed), the five sections genuinely unclaimed — S-06 (M9), S-04 (M12), W6,
W7, and a 304-key translation pass — and the lesson this batch cost: measure
how much of a branch's own delta already lives on main before merging it.
Checks
On the committed code tree at
b1520d6(the doc commit on top touches only2026MarketDom.md, which no test reads): i18n gate clean on all five surfaces,tscclean, eslint clean, full suite 989 files / 9,274 tests green.Each section's reviewer independently re-ran the gate,
tscand 15–55 testfiles on an export of its sha. No file under
supabase/migrations; noshared-sidebar file; all four merges applied without a single non-catalogue
conflict.
🤖 Generated with Claude Code
https://claude.ai/code/session_01KP9rt5rVQ9jDMpZp2xBy3K
Generated by Claude Code