Skip to content

Releases: riolabs-ai/alignsynch

v1.3.0

Choose a tag to compare

@jadenblack jadenblack released this 03 Nov 11:47
f3b7658

[1.3.0] - 2026-11-03

Added

  • feat(templates) — the catalogue the page carries — 27 types, seven realms, priced from the fixture, filterable (#464)
  • feat(demo) — pnpm demo:verify — a versioned dataset, a versioned expectation, one diff (#460)
  • feat(contact) — no email on any public page, one no-captcha form on /help (supersedes #448) (#452)
  • feat(v1) — the staff–manager template demo renders a real report (#447)
  • feat(pricing) — three tiers, Basic recommended, relationship alignment copy, real billing rows (#444)
  • feat(support) — split the help centre from account support (#445)
  • feat(marketing) — the AlignSynch home leads with the practice, the Gap is the proof (#431)
  • feat(flow) — acceptance is the completion hinge, and Steps are derived on the transition (#427) (#430)
  • feat(flow) — the create form posts to /assessment/new, refusals come back as a band, and the chosen Setting is written (#427) (#429)
  • feat(flow) — /answer is a gated sheet, blind by construction (#427) (#428)
  • feat(v1) — gate the prototype group behind a session or the demo unlock (#426)
  • feat(shell) — the console rail opens on Dashboard and lists My Relationships · Library (#425)
  • feat(v1) — the demo seed carries two rows per catalogue type (#421)

Fixed

  • fix(how-it-works) — the login redirect answers with no auth environment (#467)
  • fix(brand) — the chrome draws the official lockup whole, and never squashed (#470)
  • fix(shell) — the rail is a drawer below 768, icons to 1023, labels from 1024 (#465)
  • fix(auth) — a valid session survives a render that cannot write its cookie (#453)
  • fix(shell) — the rail expands from lg, not xl — labels are back at laptop widths (#449)
  • fix(copy) — the relationships list carries a label for every invite state (#435)
  • fix(auth) — step 1 of sign-up collects the email only; the names move to step 2 (#422)

Maintenance

  • docs(gate) — the 2026-10-29 → 2026-11-03 comparison states the per-step numbers, not a ratio (#482)
  • docs(gate) — a measured baseline — 97.4 % yield / 144 s on 2026-11-02, and how to re-derive it (#480)
  • perf(db) — pin TLS, timeouts and pool bounds; make a cold start visible (#440) (#479)
  • docs(readme) — the share card leads, the pricing capture stays for the UI docs (#477)
  • docs(auth) — the gated console routes say why no auth env is a 500, by design (#475)
  • Home polish · the six defects the hero screenshot review found (copy and spacing) (#471)
  • Share card · ship the owner's supplied PNG byte-identical, retire the drawn card (#472)
  • docs(templates) — re-capture the catalogue on the rail v4 shell — and prove the v2 branch deletes no sibling (#473)
  • test(brand) — E37 — the AlignSynch brand never names the template, with a guard that proves it can fail (#466)
  • Share card · the brand's own lockup, one sentence, the Gap drawn (#469)
  • docs(readme) — open on the pricing page, retire the stale captures, keep five flows (#468)
  • Home v2 · the AlignSynch practice page, finished, gated and screenshotted (#463)
  • docs(readme) — say what AlignSynch is, and show the six finished screens (#462)
  • chore(dx) — pnpm check:fast — a fast inner loop, and the cohort rhythm written down (#450)
  • Pricing · readable CTA, centred signup band, Title Case chrome (#451)
  • Footer · the news signup on every marketing page (Neon stores, Resend sends) + the brand-immutability guard (#446)
  • copy · relationships, not assessments — and the auth surfaces get the brand, a way home, and a password meter (#436)
  • chore(gitignore) — never commit a .hermes/ directory that lands in a workspace (#432)

Known limits

  • Production is not this tag, and the entry says which build it was written against. On 2026-11-03, alignsynch.com/api/version answers 94070089318162818dac03db4a42e63c993f80da (perf(db), #479) with version 1.2.0 — the number baked into the bundle at build time, which is why the live badge still reads 1.2.0. The v1.3.0 tag sits on the release commit above that build: it carries this entry, the version in package.json, the release and deployment docs, and the parity hashes the version string moves — no application code — so deploying it rebuilds the same app with a new badge. Any later commit moves production again, and node scripts/deploy-check.mjs --expect "$(git rev-parse v1.3.0^{commit}")" is what answers that question; this paragraph can only date the answer.
  • The three write surfaces are wired, and this is the first tag that can say so. Create (POST /assessment/new), answer (POST /assessment/instances/[instanceId]/answers) and acceptance (POST /assessment/instances/[instanceId]/accepts) each write to Postgres: create copies a template into a relationship, a session and the initiating seat in one transaction; an answer sheet records one party's whole sheet; the second acceptance completes the session, opens the report and derives the Steps. Refusals are proved too — 403 for a browser that is not a party, 409 once the submitting party has accepted, 409 for an opinion kind the session's mode does not ask — and so is the race (two concurrent accepts derive the Steps once). All of it against the demo database; no run in this repository has driven the flow against production's rows, because pnpm demo:verify refuses production by design.
  • The report stays locked until both parties accept. Before the second acceptance it renders the locked page and nothing of the other party's answers: the blind rule is the query the page is given, not a check the render makes afterwards. After completion it prints both parties' opinions and the Gap between them, and it is read-only — no control changes a relationship, records an acceptance or edits an answer.
  • Neither write screen has a nav destination. Create is reachable from a template's own CTA (components/assessment-flow/template-card.tsx renders createRelationshipPath), and the answer sheet from the accept screen's answer-first band — lib/flow/paths.ts::answerSheetPath, passed into AcceptSession as answerHref by accept/page.tsx and rendered as the <Link> in components/assessment-flow/accept-session.tsx, which the acceptance hinge shipped (#427, #430) — so the sheet is reached from /assessment/instances/<id>/accept while the viewer's own sheet is still incomplete, and never from the navigation: components/layout/nav-menus.tsx draws rows for /assessment/instances and /assessment/templates only, so no row exists for either write route. This release's registry called both preview at the cut, a status that had no rendered effect for exactly that reason; #485 corrected it to live once both write paths had shipped (#428, #429). (Corrected after publication — this bullet first said lib/flow/paths.ts::answerPath, a symbol the tree does not carry, and that nothing links to the sheet. Both were false at this tag.)
  • Six surfaces are declared and not wired: chat, notifications, the relationship product's profile and settings, the shop, and the admin console. Each answers with the product's own pending panel and gains no nav destination. The admin console's two reads exist, but the shell cannot grant the capability — lib/nav.ts reads no role — so the registry names the missing operator role rather than calling a working read shipped.
  • The public contact form keeps a message before it mails it. /help posts to /api/contact, which inserts into contact_message (migrations 0020 and 0021) and only then calls Resend; mail_outcome records sent, unset or failed, so a provider outage delays the notification instead of losing the message. There is no operator inbox in the app — the table is read in SQL. The throttle counts a salted SHA-256 of the client address and never the address itself.
  • /v1 is gated, not retired. Every prototype route answers `307 → /log...
Read more

v1.2.0

Choose a tag to compare

@jadenblack jadenblack released this 02 Nov 10:05
dd88f00

[1.2.0] - 2026-11-02

Added

  • feat(v1) — the demo seed carries parties, chat, notices and every subscription state (#415) (#418)
  • feat(v1) — template catalogue, template landing, and the relationship report (#409) (#414)
  • feat(assessment) — relationship list and detail as server-rendered DB surfaces (#412)
  • feat(shell) — the surface registry, PendingSurface and nav greying (#409) (#410)
  • feat(v1) — the template page becomes a conversion landing (#404) (#405)
  • feat(v1) — admin console — counts that open their lists, the registry, templates, seats and stated limits (#402)
  • feat(v1) — print the two Opinions behind every Gap, per Aspect (#398)
  • feat(v1) — acceptance first — both sides side by side, reviewable before accepting (#400)
  • feat(v1) — profile and settings for all four personas (#384) (#397)
  • feat(v1) — the relationships list becomes a My Quizzes variation — stage tabs, search, cards, honest metrics (#384) (#396)
  • feat(v1) — template library and shop — role-gated actions, per-relationship subscription, initiator-only billing (#393)
  • feat(v1) — chat and notifications — relationship threads, unread state, blind-safe before scoring (#392)
  • feat(v1) — relationships list, detail, Aspects CRUD, clone, library and invite state (#384) (#390)
  • feat(v1) — seed Basic and Advanced modes, Soft and Full settings, and derive flag counts (#384) (#389)
  • feat(v1) — persona-scoped sidebar, dashboard overview and per-section stubs (#384) (#388)
  • feat(v1) — relationship catalogue — 29 source rows + kept co-founders, grouped by realm, dating gated (#385) (#387)
  • feat(v1) — review list states who each screen is for, per the #384 persona matrix (#386)
  • feat(db) — seed durable platform admins from ADMIN_* env, idempotently (#383)
  • feat(v1) — contain /v1 inside /v1 and add a persisted review list (#374)
  • feat(auth) — grant admin at sign-in from the ADMIN_EMAILS allowlist (#382)
  • feat(shell) — pin control collapses the expanded sidebar; sign-out lands on marketing (#381)
  • feat(v1) — the onboarding panel becomes a stepped wizard (no assistant) (#378)
  • feat(v1) — persona bar becomes a notice banner with environment context (#377)
  • feat(v1) — answer sheet — inline errors, top summary, pinned submit on mobile (#373)
  • feat(v1) — report verdict, relationship types + demo, and the session timeline (three sets, one branch) (#370)
  • feat(ui) — a component template ancestor is a checked header, not a convention (#336) (#345)
  • feat(brand) — the book is the mark, and the icon set is generated from it (#363)
  • feat(coach) — a coach is a role on the relationship, with a hard read-only boundary (#358)
  • feat(db) — a relationship holds sessions — the split, the backfill and the instance rename (#340) (#352)
  • feat(v1) — the template editor — a variation of the quiz editor, store-backed (#343)
  • feat(marketing) — the public top menu, the shell footer and header identity (#335)
  • feat(auth) — name Google-only accounts on the password form (#281) (#333)
  • feat(auth) — a Google button beside the password form (#281) (#330)
  • feat(deploy) — codify the preview rule and add a freshness check that never guesses (#329)

Fixed

  • fix(auth) — /login and the 404 draw the brand's marks, not the quiz product's (#417)
  • fix(auth) — the sign-up screen draws the brand's marks, not the quiz product's (#413)
  • fix(v1) — the acceptance status line says what the blind rule actually hides (#403)
  • fix(v1) — one review control, in the footer, deep-linking to its own review row (#399)
  • fix(shell) — remove the sidebar pin — the rail is always expanded (#394)
  • fix(auth) — measure the flow cookie's age and the verifier's fingerprint at the finish (#351 follow-up) (#362)
  • fix(auth) — capture the Google finish failure before fixing it (#351 follow-up) (#359)
  • fix(auth) — exchange the Neon verifier at our own callback, so Google sign-in ends signed in (#351) (#357)
  • fix(404) — render the brand's heading and drop the empty suggestion band (#351) (#355)
  • fix(auth) — land the post-sign-in destination per brand (#351) (#354)
  • fix(auth) — start the Google handshake on the Neon origin, not the proxy (#350)
  • fix(demo) — the Admin button lands on the console, not the gate proof (#334)

Maintenance

  • R1-E: create, answer and accept as in-progress UI (#409) (#416)
  • DRAFT — V1 create entry, metadata CRUD by Setting, and the Steps primitive (one per Aspect, rewordable, closed status) — for discussion, do not merge (#406)
  • test(v1) — a deterministic demo seeder over every catalogue type, and the test factories that pin the shape (#407)
  • auth — password reset, and a set-password path for Google-only accounts (#395)
  • docs — the UI/UX audit — every surface scored against its template ancestor (#364)
  • docs(deploying) — §1 quotes the widened ignoreCommand and names its one exception (#361)
  • chore(deploy) — one branch builds besides production, and it is named in the file (#360)
  • docs(deploy) — §1 states the production-only rule, not the [preview] opt-in (#353)
  • deploy(vercel) — build production only — previews are local (#348)
  • refactor(css) — one token layer — the second stylesheet's chart and sidebar sets fold into app/globals.css (#347)
  • refactor(marketing) — the landing page's eleven boxes, two CTAs and three chips (#346)
  • refactor(console) — the gap table, the failure panels and the title bands compose the primitives (#344)
  • docs(prototype) — correct the one claim in the wiring plan the board does not support (#342)
  • docs(prototype) — the wiring plan — one screen exists, four cohorts never did (#341)
  • docs(quiz) — the capability map — every quiz surface, what it is made of, what full-stack costs (#338)
  • docs(ui) — the quiz-surface map — every ancestor, its AlignSynch variation, and the mobile mechanics (#337)
  • docs(ui) — the divergence table — every bespoke surface, one verdict per file (#332)
  • docs(deploy) — record that preview creation, not just the build, is disabled upstream (#331)

Known limits

  • Five read surfaces are live: your relationships (/assessment/instances), a relationship (/assessment/instances/[instanceId]), the template catalogue (/assessment/templates), a template (/assessment/templates/[templateId]) and the relationship report (/assessment/instances/[instanceId]/report). They are server-rendered from Postgres and gated at the session: a signed-out request is redirected to /login (the report answers 404 for a relationship id that is ...
Read more

v1.1.0-rc1

v1.1.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@jadenblack jadenblack released this 31 Oct 17:42
b8fdf53

[1.1.0-rc1] - 2026-10-31

Added

  • feat(nav) — the console's destinations reach the sidebar, the operator's stay behind the role (#327)
  • feat(console) — /assessment/templates — built-in versus authored, per account (#326)
  • feat(console) — /dashboard counts the viewer's own rows and links each number to its list (#325)
  • feat(console) — the operator's relationship registry, behind the first requireAdmin surface (#324)
  • feat(console) — the Gap across completed relationships, nameless and complete-only (#323)
  • feat(db) — the three columns the console needs, all nullable and unfilled (#322)
  • feat(billing) — the plan cards start a real checkout (#289) (#315)
  • feat(billing) — the test-mode hosted adapter, its webhook, and .env.example (#289) (#310)
  • feat(invite) — re-invite revokes and replaces the token, behind a 24h cooldown and a cap (#275) (#303)
  • feat(billing) — a provider-free port, an offline adapter, and the plan gate (#289)
  • feat(legal) — /terms and /privacy, version 1 draft, wired on both brands (#270) (#296)
  • feat(assessment) — the report's three gap groups, a verdict band, and one stage sentence (#274) (#301)
  • feat(assessment) — the answer input is a five-segment radio group (#273) (#297)
  • feat(invite) — the initiator is told their invitation expired (#266) (#283)
  • feat(shell) — show the app version, linked to its release tag (#269) (#285)
  • feat(assessment) — four stages, derived — 4-6 documented as undefined (#261) (#276)
  • feat(assessment) — the Soft/Full Setting is a lens over the Gaps (#259) (#264)
  • feat(assessment) — the other party hears when the second answer lands (#258) (#262)
  • feat(invite) — the invitation link has a copy control that never fails silently (#257) (#260)
  • feat(assessment) — a person can author their own template (#255) (#256)
  • feat(assessment) — the list marks an unlock you have not read (#252) (#254)
  • feat(brand) — every route's share preview is the brand's own 1200x630 card (#187) (#251)
  • feat(assessment) — creating or claiming an instance binds the caller's account (#213) (#248)
  • feat(brand) — the palette has one home, enforced, and each brand has its own tab icon (#187) (#246)
  • feat(assessment) — the report draws the glossary's eight Gap kinds (#219) (#243)
  • feat(assessment) — a signed-in party can find the instances they are in (#213) (#238)
  • feat(brand) — the affiliate and profile surfaces read the brand record (#187 stage 3) (#236)
  • feat(demo) — /demo is a PIN gate, and /login draws the role buttons behind a signed unlock (#218) (#235)
  • feat(assessment) — an instance records its mode, and asks the sheet it defines (#213) (#234)
  • feat(gate) — a client component cannot reach the database, and the gate knows (#228) (#233)
  • feat(brand) — the home, category and creator-tip bands read the brand record (#187 stage 2) (#217)
  • feat(search) — the /search body is the brand's words, not the quiz product's (#156 follow-up) (#201)
  • feat(media) — the profile cover is drawn from the handle, not one shared PNG (#130) (#206)
  • feat(demo-auth) — a PIN-gated panel that signs in without sending a password (#183 part 2) (#208)
  • feat(shell) — the footer speaks the brand's vocabulary, and "Quizes" is spelled right (#188) (#195)
  • feat(brand) — the chrome, the assessment flow and the 404 read the brand record (#187 stage 1) (#200)
  • feat(demo) — a reset that is one restore, a nightly reseed, and the docs (#185) (#198)
  • feat(flags) — an admin reaches a surface the flag hides (#184) (#199)
  • feat(demo-auth) — one role, a 404-not-403 gate, and three seeded demo accounts (#183 part 1) (#189)
  • feat(parity) — a hash manifest and a summary instead of 1.4 MB of HTML (#171) (#182)
  • feat(shell) — the rest of the chrome is the brand's, not the quiz product's (#156) (#186)
  • feat(media) — one resolver, three tiers, and a fault-tolerant fallback (#155, phase 1) (#180)
  • feat(bundles) — a template or a demo dataset as one versioned file, exported and imported (#147) (#179)
  • feat(flags) — a surface on or off per template without a code change (#175) (#181)
  • feat(shell) — navigation is brand- and capability-aware, not quiz-only (#156) (#177)
  • feat(registry) — every mocked surface catalogued as a template resource (#173) (#178)
  • feat(assessment) — the two-party flow — create, invite, answer blind, unlock the Gap (#146) (#174)
  • feat(tokens) — tighter product surface in the Tailwind root (#160) (#170)
  • feat(identity) — real sessions behind login, register, settings and profile (#164) (#172)
  • feat(marketing) — a public landing page in its own chrome, no sidebar (#159) (#169)
  • feat(media) — avatars are initials on a seed-derived gradient, nine duplicate files deleted (#152) (#168)
  • feat(db) — six content tables, the DB-backed assessment screen, and the db scripts (#145) (#166)
  • feat(editorial) — news, creator tips and support read article records (#165) (#167)
  • feat(theme) — light default, AlignSynch tokens on white (#157) (#162)
  • feat(media) — avatars are initials on a seed-derived gradient (#152, part 1) (#161)

Fixed

  • fix(shell) — the public pages stop carrying the app shell, and the sidebar is fixed (#317) (#320)
  • fix(release) — cut and publish a pre-release, and order versions by semver (#319)
  • fix(support) — the FAQ answers in each product's words, not the quiz product's (#321)
  • fix(support) — one category taxonomy per product, and the select reads it (#309) (#316)
  • fix(shell) — the four surfaces that advertise /affiliate follow the flag (#291 follow-up) (#313)
  • fix(news) — the accessibility article stops selling a tab and three features, and the creator profile gets a subject that exists (#314)
  • fix(support) — the help centre is per product and documents only what ships (#309) (#312)
  • fix(brand) — gate the quiz product's routes off the alignsynch build (#300) (#306)
  • fix(news) — the championship stops selling a tab and a plan, the monetization article drops invented creators (#311)
  • fix(news) — the analytics article stops selling a plan tier and a tab that do not exist (#308)
  • fix(copy) — sign-up asks nothing about quizzes, the 404 states a true fact, /affiliate is gated (#291) (#307)
  • fix(news) — the AI quiz-creation article stops selling a suite we do not ship (#304)
  • fix(support) — the contact form is disconnected, and ...
Read more

v1.0.0

Choose a tag to compare

@jadenblack jadenblack released this 30 Oct 17:20
9e6bc85

[1.0.0] - 2026-10-30

Added

  • feat(brand) — the document description is a Brand field (#151) (#153)
  • feat(home) — the AlignSynch build leads with the two questions (#143) (#150)
  • feat(brand) — palette and mark sampled from the AlignSynch logo (#136) (#142)
  • feat(media) — category tiles generated from the slug; delete the 23 duplicates (#130) (#137)
  • feat(assessment) — render the answered Avery/Rowan instance at /assessment/[slug] (#134)
  • feat(data) — assessment templates for three Relationship Types and four instances (#131) (#133)
  • feat(content) — one record type, two templates — a quiz and an assessment (#128) (#129)
  • feat(brand) — a second brand record, and one build flag that selects it (#127)
  • feat(brand) — every QuizHub literal reads the brand record (#126)
  • feat(brand) — data/brand.ts — the record the reskin reads (#125)
  • feat(tournaments) — tournament copy comes from PageCopy, and the domain stays out (#58) (#89)
  • feat(pages) — marketing copy out of JSX into PageCopy (#56) (#94)
  • feat(battle) — modes and daily-challenge rewards are records, and the copy moves to PageCopy (#57) (#92)
  • feat(copy) — shell, auth and 404 copy comes from PageCopy (#54) (#96)
  • feat(copy) — categories and explore copy come from PageCopy fixtures (WU-8, #55) (#88)
  • feat(taxonomy) — labels come from the schema, and data:check E20 enforces it (#50) (#73)
  • feat(leaderboard) — one people fixture instead of six islands of their own records (#48) (#77)
  • feat(quiz) — a record's detail page renders its own leaderboard and reviews (WU-2 follow-up, #75) (#83)
  • feat — fixture generator (npm run gen) (#71)
  • feat(home) — PageCopy fixture + E23 copy ratchet, home copy out of JSX (#53) (#79)
  • feat(quiz) — the quiz surface reads the fixture, not a per-page mock (WU-2, #51) (#76)
  • feat — typed media registry (#65)
  • feat(data) — author the two Science overlays + E14/E15/E16/W6 promotion checks (B-01) (#39)
  • feat(data) — port the 42-record migrated quiz collection into data/ (B-01 prerequisite) (#26)
  • feat(content) — zQuizPromotion — per-slot campaign overlay merged in selectQuizCard (B-01) (#21)

Fixed

  • fix(play) — /quiz//play plays the quiz the URL names (#132) (#135)
  • fix(data) — published quizzes carry questions, a date and a reward window (#124)
  • fix(profile) — /profile/ resolves the handle from data/players.ts (#111) (#123)
  • fix(copy) — QuizHub everywhere the copy renders, and no stray space after it (#122)
  • fix(routes) — unknown ids 404 on /categories, /news and /tournaments (#112) (#116)
  • fix(promotions) — anchor the campaign window to the fixture clock (#110) (#121)
  • fix(metadata) — real document title on every route (#113) (#115)
  • fix(shell) — mobile sidebar is CSS-closed below xl, drawer is its own state (#109) (#119)
  • fix(ci) — fetch origin/main so the lane classifier actually runs in CI (#114)
  • fix(data-check) — one code, one rule — E17 is the media registry, the slot guard is E28 (#103) (#105)
  • fix(images) — the five next/image size bugs, and a gate for the rule (#99)
  • fix(p3) — gen emits quizzes only, and data:check says why (E17/E26) (#100)
  • fix(chat) — format fixture times against one clock, not the wall clock (#23)
  • fix(content) — point the 11 baselined asset refs at files that exist (#28)
  • fix(qa) — the pre-existing 404s and the Next 16 sync params (closes #20) (#25)
  • fix(seo) — generate real metadata for /categories/[slug] (D14) (#17)

Maintenance

  • docs — add the AlignSynch glossary v2 as a reference PDF (#149)
  • docs(glossary) — the glossary page is generated from the schema comments (#138) (#141)
  • chore(issues) — three issue templates — feature, bug, new template type (#139) (#140)
  • docs(lanes) — CI's win is the check's wall time, not contention (#120)
  • docs(gate) — CI classifies now — record the measured lanes (#118)
  • docs(qa) — P4 dogfood pass — every route, defects 1-5 with evidence (#108)
  • docs(p3) — exit record with reproducible evidence (#107)
  • docs(data-model) — tournaments are PageCopy-only and out of scope (#58) (#106)
  • test(vitest) — adopt Vitest and the first app-side units, wired into the one gate (#8) (#98)
  • docs(p1) — refresh ENV-SPEC §5 evidence and record what B-01 actually landed (#43) (#97)
  • docs(p2) — the inventory says WU-7, WU-8 and WU-9 landed (#54/#55/#56) (#102)
  • docs(p2) — the inventory says WU-10 landed, not that it is next (#57) (#101)
  • chore(git) — ignore .worktrees/ (#93)
  • docs(readme) — setup, prerequisites, the gate, the four layers and current phase (#7) (#95)
  • docs(p1) — keep images.unoptimized and record why (#6) (#91)
  • docs — lib/quizhub is vendored and ignored, not generated (#90)
  • build(pnpm) — pin the package manager to 12.16.1 in package.json (#4) (#87)
  • docs(orchestration) — the orchestrator's behavioural contract (#86)
  • docs(p2) — the ranked list records WU-1, WU-2 and WU-4 as landed (#85)
  • docs(p2) — record WU-5 as landed and E20's DUP tier at 0 (#84)
  • ci(gate) — lanes — depth follows the diff, next build capped at 2 slots (#82)
  • P2 WU-4 · invented metrics → computed analytics (#49) (#80)
  • refactor(search) — derive the search index, bind chat to its fixture (WU-3, #52) (#72)
  • docs(p2) — record WU-12's deletion in the inventory, not its dead paths (#74)
  • docs(agents) — rejoin the CI sentence the #33 resolution split (#69)
  • P3: pass the slot campaign into the card projections (shelves + detail-page prize) (#41)
  • chore(components) — delete 14 components no route imports (#47) (#66)
  • ci — one gate script, one caller in CI, one pre-push hook (ORD 0) (#33)
  • docs — P2 literal-string and media inventory (#59)
  • docs(mimo) — MiMo harness guide + reproducible probe suite (#38)
  • ci — trigger on merge_group so the merge queue can report the required check (#44)
  • docs — data model design page (ORD 2) (#45)
  • chore(deps) — pin the 13 "latest" specs to their locked versions (#14)
  • docs(ops) — voice memo → issue → card loop, and where Xiaomi stops ...
Read more