Release notes

Each line is a single product change, written for you first—if the change had a short note in our source history, you’ll see that wording here. Newest first.

The line under each title is the human summary of what you might notice; the short code links to the exact change in source control.

This build: Web 0.1.1012 · API 0.1.195 · Cloud n/a · AI n/a · Matching 0.1.0.

Last updated: August 20, 2026 at 2:49 AM

  1. Treat missing label_mapped as unmapped in sentiment pick (W0.70.c) · ba54b47

    pick_best_reflection_candidate defaulted a missing label_mapped key to True (mapped) and then indexed sent["class_index"] unconditionally, raising an uncaught KeyError instead of the documented per-row degrade when a blank/skipped candidate produces an empty sentiment row. Neither existing caller currently passes blank input, so this was a landmine, not a live incident. Default now treats a missing key as unmapped and reads class_index via .get() with an explicit None check. Closes W0.70/W0.70.c (reopened after in…

  2. Offload blocking Mongo calls in learning routes (W0.70.a) · 56a1662

    fetch_learning_wave_status ran a synchronous pymongo find directly inside an async route handler with no offload, and run_outbox_publisher_once's per-document loop did the same for its sync find/update_one calls alongside an awaited async Redis call — both stall the single uvicorn worker's event loop (including its own /health check) for the duration of a slow/loaded Mongo call, the same class of bug already fixed elsewhere in this service at W0.37.d. Wrapped both in run_blocking, matching the established pattern;…

  3. Close quota-bypass race and unbounded profile list (W0.69) · e091474

    request-conversation ran a non-atomic quota pre-check, committed the connection to conversation_requested, and only then ran the atomic daily-chat-start CAS — a losing CAS left the connection transitioned with no rollback, silently bypassing the paywall gate. The atomic CAS now runs strictly before the connection mutation, so a losing CAS rejects the request before anything is touched. GET /api/admin/profiles used a helper that returns undefined ("no cap") when limit is omitted or explicitly 0, and the shipped adm…

  4. Regress blind-reveal chat cancel to anonymous_chat_active (W0.68.a) · 2e26a24

    cancelRequest.ts inferred the chat-cancel rollback target from conversationConsent.agreedAt, which is only ever set by the explicit requestChat path — a blind-reveal chat_requested (entered via pressReveal from anonymous_chat_active) always regressed to conversation_active instead, permanently stranding the pair since recordVibeCheck and submitIcebreakerStep both require stage === anonymous_chat_active exactly. chatConsent.requestedBy (non-null only for explicit requestChat, and never overwritten through pressReve…

  5. Refresh README/atlas after W0.67.b (W0.67.c/d) · eeb31de

    Documents chatService.sendMessage.mediaRetryAfterSuccess.test.ts in tests/services/README.md and the sendMessage.ts duplicate-check reorder in the system atlas, closing the class-I/K staleness the new test file triggered, and closes W0.67 (all four sub-todos done).

  6. Reorder chat media-send duplicate check ahead of media lookup (W0.67.b) · 4eac6ac

    sendMessage's mediaId branch looked up the pending media row (throwing if absent) before checking whether a message for that mediaId was already sent. On a successful first call the media row is deleted inside the same transaction, so a client retry after a network timeout/reconnect-resend found no media row and threw a 400 even though the message had already persisted — the duplicate check was unreachable for exactly the retry-after-success scenario it exists for. The duplicate check now runs first, right after g…

  7. Close W0.67.a — duplicate of already-fixed W0.41 · 4c8d599

    Byte-identical finding (same file, same trigger scenario, same two-part fix) to W0.41, fixed via commit 9e2ec9fa2 one day before this round-5 hunt's own audit date. registerDeviceToken already releases the token from any other owner before upserting, and a logout-time DELETE /api/device/token route already exists. Cited verify tests re-run clean. Verification-only; no production code changed.

  8. Refresh system atlas api section after W0.66.c/d (W0.66.e) · eb9407b

    Documents assertSafeMongoMapKey.ts (the shared map-key guard W0.66.c/d introduced), closing the class-K staleness the new file triggered, and closes W0.66 (all five sub-todos done).

  9. Sanitize state/analytics map keys before dotted $set (W0.66.c/d) · a795f53

    StateService.saveAppState and AnalyticsService.saveAnalytics both interpolated a raw client-supplied key directly into a dotted $set path with no character/format restriction, unlike the identical- purpose journey-write path (which already sanitizes every map key via assertSafeProfileJourneyMapKey). A '.'-containing key silently creates nested subdocument structure instead of a flat field, or causes a Mongo path-conflict error. Extracted the guard into a new shared lib/db/assertSafeMongoMapKey.ts (assertSafeProfil…

  10. Defensively cap answer length at the write layer (W0.66.b) · 4756dfe

    SaveProfileAnswerRequest.answer's maxLength:2000 (W0.40.c) already guards the HTTP route via Zod validation, but ProfileJourneyWrites. saveQuestionAnswer has two non-HTTP callers (E2E/sim-user journey seeding) that bypass that boundary entirely. Added PROFILE_ANSWER_MAX_CHARS mirroring the OpenAPI SSOT value and a length check that throws before any write when exceeded, so an unbounded string can never reach the profile document from any caller. New tests prove exactly-2000 is accepted and 2001 is rejected before …

  11. Close W0.66.a — duplicate of already-fixed W0.40.a · 9dc86e5

    Byte-identical finding (same route, same non-atomic pre-check, same exploit shape) to W0.40.a, fixed via commit 65ecdf29d. saveQuestionAnswer/ saveConnectionRating already build their findOneAndUpdate filter with an atomic $expr/$size map-size guard evaluated at write time, not the stale pre-check snapshot this finding assumed was the only gate. Cited verify tests re-run clean. Verification-only; no production code changed.

  12. Add READMEs for skill-install-output dirs (W0.121.i-l) · a7063c0

    .ai/, .ai/hooks/, .claude/, .claude/hooks/ were committed without READMEs, tripping the wave-consistency-scan's class-I check. Filed via wave-compliance-bugs.py file-finding (no owning feature story — routine integrity findings route to the reserved cap:COMPLIANCE story) and drained immediately since they're mechanical, no product decision needed.

  13. Add installed skills (first commit of install output) + update to current · 009b3ee

    .ai/ and .claude/ were installed on disk but never committed here. Adding them now at current kit versions (wave-bug-hunt, wave-next, wave-plan-lib 1.37.1, wave-runner all upgraded during this same pass) rather than committing a stale snapshot. wave-plan-lib brings the new deterministic skill-freshness mechanism (kit_root tracking + wave-freshness.py + wave-skills-freshness.py SessionStart hook) and W1.8's CONTINUE-marker markdown-wrap recovery in wave-runner-continue.py.

  14. Refresh system atlas api section after W0.65.c (W0.65.d) · 98707c1

    Documents matchRecalculationGuard.ts (the shared cron overlap lock W0.65.c introduced), closing the class-K staleness the new files triggered, and closes W0.65 (all four sub-todos done).

  15. Coordinate external cron route with in-process recalc lock (W0.65.c) · 8357e9e

    W0.42.a already guarded the in-process match-recalculation cron job against overlapping itself, but that guard was a closure-local boolean inside scheduled-tasks.ts, invisible to POST /api/cron/recalculate-all- matches — an external caller holding CRON_SECRET could trigger a second concurrent full sweep while the daily job was already running, racing writes to matches. New lib/cron/matchRecalculationGuard.ts lifts the lock to a shared module used by both the cron tick handler and the HTTP route, which now returns …

  16. Close W0.65.b — duplicate of already-fixed W0.38 · 8e21d7b

    Byte-identical finding (same file, lines, exploit, four rate limiters named) to W0.38, fixed 2026-08-17 (commit bf1f146d1), one day before this round-5 hunt's own audit date. getIdentifier() already calls resolveClientIp(), not a raw XFF re-parse, with an inline comment citing the prior fix. Cited verify tests re-run clean. Verification-only; no production code changed.

  17. Close W0.65.a — already substantially fixed by W0.61.e (2026-08-19) · 4aef2e2

    Same internal.* bridge token, same bug-hunt-round SRC-BUG-INTERNAL- TOKEN-UNREVOCABLE finding, same cross-repo wire-format constraint already investigated and escalated once this session (user authorized a backend-only per-authUid revocation lever over an exp/nonce wire change). Confirmed the revocation mechanism is live, wired into both auth middleware paths, and already tested — closing this finding's actual stated impact (permanent unrevocable access) without re-litigating the same already-decided tradeoff. Ver…

  18. Refresh system atlas ml-service section after W0.64.e (W0.64.g) · c8fd3dd

    Documents the threadpool offload, math.isfinite validation, and payload size bounds (W0.64.c/d/e); removes the now-resolved "fake async job queue" flagged lead. Closes the class-K staleness the new test file triggered, and closes W0.64 (all seven sub-todos done).

  19. Add max_length/max_items payload bounds (W0.64.e) · 7db0806

    No field across /v1/entropy, /v1/fit, /v1/nlp/affect, /v1/generate had any size ceiling. Combined with no auth (W0.64.b) and a single blocking worker (W0.64.c) — both now fixed — an unauthenticated caller could force a long-running or memory-heavy computation with nothing in front of it, a straightforward resource-exhaustion path. Added maxItems/maxLength to every request field in the contract (array sizes scaled to realistic batch counts; string lengths capped, with NlpAffectTextInput.content matching the existin…

  20. Reject NaN rating/clamp bounds instead of silently nulling (W0.64.d) · f6f64b3

    entropy.py's clamp_min/clamp_max and trait_fit.py's per-rating range check were both written as a plain > / < comparison, which is False for NaN under IEEE-754 semantics — a NaN value sailed through unrejected and propagated via np.clip(np.mean(...)) into a silently null weight/theta instead of a validation error. Both now check math.isfinite() first, matching the same fix shape already established in the sibling matching service. New tests prove a NaN clampMin/clampMax/rating now raises instead of nulling; verifi…

  21. Offload blocking compute + make /v1/jobs genuinely async (W0.64.c) · b5b4a8b

    Every /v1/* route ran its inference/compute inline on the event-loop thread inside an async def handler — one slow /v1/generate or /v1/nlp/affect call blocked the entire single-worker process, including its own health/ready checks, for the call's whole duration. All four synchronous compute routes now offload via starlette.concurrency.run_in_threadpool instead of calling the domain function directly. /v1/jobs advertised a submit-then-poll async contract but executed the job synchronously inline before ever returni…

  22. Refresh system atlas ml-service section after W0.64.a/b (W0.64.f) · ee085f6

    Documents the modelId allowlist (W0.64.a) and the now-universal X-Internal-Secret requirement (W0.64.b), closing the class-K staleness the new test files triggered.

  23. Close RCE via unvalidated modelId + wire missing auth (W0.64.a/b) · ec3b223

    Two CRITICAL findings that compound: POST /v1/generate loaded any caller-supplied modelId via AutoTokenizer/AutoModelForCausalLM with trust_remote_code=True (arbitrary code execution from any HF repo id), and verify_internal_secret existed but was never attached to any router, so every inference/consumer route was reachable by anyone with network access — making the RCE remotely exploitable by anyone, not just a compromised internal caller. W0.64.a: LocalQwenGenerator.load() now rejects any model_id outside resolv…

  24. Refresh system atlas api section after W0.63.e (W0.63.g) · 04deac6

    Documents resolveProvenSessionAuthUid.ts (the session-proof guard W0.63.e introduced) in the API section's services list, closing the class-K staleness the new lib/auth file triggered.

  25. Require session-proof bearer for e2e ensure-discovery-peers (W0.63.e) · 43bf87f

    POST /api/internal/e2e/ensure-discovery-peers accepted an arbitrary caller-supplied viewerAuthUid, gated only by INTERNAL_API_SECRET — which proves the caller holds the shared secret, not that they control the identity they're asking to materialize discovery-peer writes for. Closes with the narrower invariant the earlier bug-hunt finding called for: bind viewerAuthUid to a real, currently-authenticated session via proof, not a synthetic-prefix guard (wrong fit here, since every real caller passes its own live, non…

  26. Refresh system atlas api section after W0.63.d (W0.63.f) · 30f5cff

    Documents pushAddonGrantIfPaymentVerified (the atomic add-on-grant guard W0.63.d introduced) in the API section's services list, closing the class-K staleness the new mongo-integration test file triggered.

  27. Close check-then-act race in paid add-on grants (W0.63.d) · 3498f3d

    [redacted] read the verified-payment count and the already-granted count on separate queries, then pushed the grant on a completely separate write — two concurrent calls for one verified Stripe payment (webhook retry vs original delivery, or webhook vs manual reconciliation) could both pass the check and both grant, doubling a paid unit. Folds the count guard into the grant write itself via a single atomic findOneAndUpdate ($expr/$size/$filter over the current addonGrants, matching the W0.40.a atomic-CAS shape). M…

  28. Refresh system atlas api section after W0.63.c · 4d49e3e

  29. Exclude phantom-zero depthScore for zero-answer users (W0.63.c) · ad98d27

    calculateAnswerDepth returns a bare 0 for zero answers -- a sentinel indistinguishable from "answered everything with the shallowest possible depth". calculateEmotionalDepthAlignment only special-cased the both-sides-zero case; when only ONE side had zero answers, the phantom 0 drove depthScore toward its worst-case penalty for a user who simply hasn't answered any journey questions yet, distorting emotionalDepth match scores for every new user. depthScore is now excluded (weight redistributed by weightedAverage) …

  30. Refresh READMEs/atlas after W0.61.e closure · 638db02

  31. Per-authUid internal bearer token revocation, close W0.61 (W0.61.e) · 645a87c

    The internal.<authUid>.<emailB64>.<sig> bridge bearer token is a pure deterministic function of (authUid, email, INTERNAL_API_SECRET) with no iat/exp/nonce -- it cannot expire, and the only way to kill one leaked token was rotating INTERNAL_API_SECRET for every user at once. A real fix (embedding iat/exp in the signed payload) would break the sibling app-infra-operator repo's Fleet Python minter without coordinated changes there, confirmed via that file's own doc comments -- explicitly out of this repo's boundary.…

  32. Confirm W0.61.e's block is genuinely cross-repo, not just cross-app · be596f2

    Re-verified the internal.<authUid>.<emailB64>.<sig> bridge token's own doc comments in both src/apps/api and src/apps/web: both independently state the wire format must stay byte-compatible with the sibling app-infra-operator repo's fleet_internal_bearer.py Python minter, which doesn't exist anywhere in this repo. Adding iat/exp claims to the signed payload -- the fix this finding calls for -- would silently break that sibling repo's minter/verifier without coordinated changes there, which is out of this repo's bo…

  33. Normalize Stripe refund/dispute events, close W0.58 (W0.58.c) · b55cfed

    No case existed for charge.refunded or charge.dispute.* anywhere in the billing tree -- both fell into normalizeEvent's default: return [], so a refunded/disputed charge never revoked the paid-tier access it paid for, for the entire stored renewsAt window (confirmed via exhaustive grep, zero refund/dispute references anywhere in services/billing). Added charge.refunded, charge.dispute.created, and charge.dispute.closed (only when status==="lost") cases. Unlike every other event, a charge/ dispute object carries no…

  34. Refresh system atlas api section after W0.57 closure · ab1447f

  35. Drop 2 confirmed-orphaned indexes, close W0.57 (W0.57.c) · d373d4f

    biometricChallenges_userId_verified_expiresAt and profiles_platformRole_1 add write overhead with zero read benefit -- independently re-confirmed by tracing every real query against each collection (biometric challenge reads always key on the unique challengeId; no query anywhere filters by platformRole). Added a new idempotent dropManagedIndexIfPresent helper. Deviated from the finding's blanket "drop all three": did NOT drop biometricSessions_userId_expiresAt -- AdminService.ts's profile-clear cascade does a gen…

  36. Add missing messages indexes for mediaId/receiverId reads (W0.57.b) · 620520b

    messages had no index with mediaId as a prefix and none including receiverId at all -- the chat-media authorization lookup on every photo/video byte-read forced Mongo's $or optimizer into a full collection scan, and markMessagesRead's hot unread-count query could only use a conversationId-prefixed index, filtering receiverId/readAt in memory on every call. Added a non-unique mediaId index (most messages have no mediaId; a non-sparse unique index would reject the second such document) and a conversationId+receiverI…

  37. Unique index + dedup on mobile app waitlist collection (W0.57.a) · e54e229

    mobile_app_waitlist had no index at all, unlike its sibling rate-limit collection two functions below which already documents this exact gap class (AT-20.9). The upsert's own doc comment claims "idempotent per email + platform" but had no DB-level backstop -- two concurrent submissions could both observe no matching row and both insert. Added the unique (emailNormalized, platform) index and an E11000-catch-and-retry on the upsert, mirroring bumpRateLimit's identical existing pattern.

  38. Load match item weights once per batch, close W0.56 (W0.56.c) · eb5742e

    calculateProductMatch loaded item weights internally on every single pairwise invocation -- N independent full matchItemStats scans (plus N Redis reads) for a batch of N peers, for data identical across the whole batch. CalculateProductMatchOptions gained an optional itemWeights field (falls back to loading its own when omitted, so existing single-pair callers are unaffected); BulkMatchProcessor and updateMatchesForProfileChange now load once before their fan-out and pass the same lookup to every call.

  39. Bound concurrent fan-out in match calculation (W0.56.b) · 2c259ec

    BulkMatchProcessor and updateMatchesForProfileChange both ran their peer-calculation fan-outs via fully unbounded Promise.allSettled, firing every peer's pairwise calculation (and its own Mongo/Redis reads) in the same tick against a Mongo pool of only maxPoolSize:10. Added a small local worker-pool helper (mapWithConcurrencyLimit) instead of a new p-limit dependency -- keeps exactly N calls in flight with no chunk-boundary idling, and preserves Promise.allSettled's per-item isolation/ordering contract as a drop-i…

  40. Replace blocking Redis KEYS with SCAN in match weight loader (W0.56.a) · 4261c6c

    loadMatchItemWeights() called redis.keys('match:item:*:weight'), a blocking O(keyspace) full-scan on a single-threaded server, once per pairwise match calculation tenant-wide -- real Redis latency degradation under a match-calculation fan-out, not hypothetical. Now uses scanIterator() (node-redis v6's cursor-based SCAN wrapper), accumulating matched keys across non-blocking iterations.

  41. Refresh system atlas api section after W0.55 closure · 2d12020

  42. Platform-settings patch no longer clobbers concurrent field writes (W0.55.c) · c8fc29a

    patchGlobalSettings unconditionally $set all 8 fields on every call, so two concurrent admin PATCHes changing DIFFERENT fields (both reading the same pre-race snapshot) would have whichever write landed second silently revert the other's field to its pre-change value, even though that request's own HTTP response already reported success. $set now only includes fields actually present in the partial argument; getGlobalRow()'s existing per-field undefined-fallback already handles a partially populated document safel…

  43. Feature-flag cache no longer clobbered by a slow stale read (W0.55.a) · b261c4d

    isEnabled/getFlag's cache-miss path did an async findOne then unconditionally cached whatever it read, with no check the cache wasn't already updated more recently by a concurrent upsertFlag (an emergency kill-switch). A read that started just before the write but resolved after it would overwrite the cache with the stale pre-write value stamped as fresh, serving the disabled feature as enabled for a fresh 30s window. Added a monotonic per-key write sequence counter -- a read snapshots it before the Mongo fetch an…

  44. Refresh system atlas api section after W0.54 closure · 3564b83

  45. Exclude synthetic profiles from entropy calibration, close W0.54 (W0.54.c) · 06ab5e0

    gatherEntropyItemsFromMongo ran an unfiltered profiles scan, so sim/lab synthetic cohort rows' answers and connection ratings fed into the same production entropy/IRT calibration statistics as real users' -- persisted straight into matchItemStats, the SSOT live match-calculation reads, for every real user's match score. Synthetic answers are generated from a small, repeated set of archetype templates, so any cohort-seeding run would measurably skew item weighting. Now skips any doc whose authUid matches isSimSynth…

  46. Wire anchor-reuse answers into complementary lab profile generation (W0.54.b) · 6c21d0c

    buildComplementarySyntheticSeed computed the anchor's answers only to pick the questionAnswerStrategy label, never attached them to the returned seed (no anchorAnswers field existed on the seed type), so the anchor-reuse branch in SyntheticQuestionAnswerBuilder.buildAnswers could never fire -- every "complementary" lab profile was fresh-generated, not aligned to the anchor. Compounding: isStoredAnswerObject()'s typeof-object check would still reject a real stored answer, which is a JSON string per the wire contrac…

  47. Synthetic reflection answers carry matchingDimension (W0.54.a) · af521fb

    All 5 SyntheticQuestionAnswerBuilder builder functions read question.matchingDimension to pick answer text/level but never included it in the returned StoredQuestionAnswer, unlike real client-written answers. axisForStoredAnswer()/profileMatchingSignals.ts read rec.matchingDimension directly with no bank fallback, so every synthetic answer resolved to axis===null and was silently dropped from pairwise reflection-axis alignment and solo-signal computation on every axis, always.

  48. Refresh system atlas api section after W0.51.e/f · 6f59abd

  49. Cascade-clear question answers on delete, close W0.51 (W0.51.f) · d5d3216

    deleteQuestion never touched profiles.questionAnswers[id] on any profile. A legacy answer with no embedded matchingDimension tag survived the delete and, if the same id was later reused for an unrelated question, would get folded into the new question's axis/item-stat calibration under a different, possibly mismatched axis. deleteQuestion now cascade-clears the answer key from every profile that has one (best-effort, logged not thrown, after the question row itself is confirmed deleted).

  50. Per-row validation for answers-import profile batch (W0.51.e) · d2409d9

    parseQuestionAnswersImportBody threw synchronously on the first invalid profiles[i].questionAnswers row, aborting the entire restore-all batch even though legacy plain-object-valued rows are a documented, expected shape. Each row now validates independently and a bad row is skipped into a new profileParseErrors array (merged into QuestionAnswersImportService's profileErrors/profilesSkipped), matching bulkUpsertQuestions's existing per-index error accumulation.

  51. Refresh system atlas api/matching sections after W0.51.a-d · b72a00c

  52. Question-bank active-count parity, 404 for missing journey-length report (W0.51.c/d) · 358c584

    buildQuestionBankStats treated a missing `active` field as active, inflating GET /api/admin/questions/stats's activeQuestions relative to what getActiveQuestions()/serializeQuestionDocument actually show users. The journey-length-recommendation route had no special-casing for JourneyLengthReportNotFoundError and returned 500 for a routine "no such report" typo, tripping 5xx-based alerting.

  53. Reachable low_polarization threshold, live trait-slug resolution (W0.51.a/b) · a4dbf2b

    low_polarization was unreachable dead code (floor 0.2 vs threshold <0.15), silently defeating journey-length-recommendation's retirement signal. _trait_index only recognized legacy numeric matchingDimension, not the live string slugs the schema actually stores, so trait_idx was always 0 for real questions. Relabeled the module's docstring as a structural/coverage heuristic rather than a real psychometric measure (it never reads profiles.questionAnswers) and filed the larger response-distribution-based scoring gap …

  54. Refresh system atlas API section after W0.50 · 27cb624

    New test file under src/apps/api triggered finding class K (atlas staleness). Documents the atomic gate-and-mutate pattern now shared by both OTP checks.

  55. Close W0.50 — email-OTP attempts-lockout race + request double-count · 1d7b8f8

    Two independent findings against emailOtpService.ts: - verifyEmailOtpChallenge's max-attempts lockout was a check-then-act race: findPendingChallenge's attempts<MAX read and the mismatch-path updateOne's $inc were two separate operations, with no attempts filter on the increment itself. N concurrent wrong-code guesses for the same challenge could all pass the same stale read before any single increment landed, defeating the 5-attempt lockout against a 4-digit code space. Added the same attempts<MAX bound directly …

  56. Close W0.49 — require MONGODB_URI unconditionally · 50d78c2

    env.ts's schema carved out an exception letting boot skip MONGODB_URI when BINDINGS_ENABLED=true, on the premise that CNCF service-binding files supply it instead -- but the actual Mongo client (lib/db/connection/index.ts, imported by every route at process startup) always reads process.env.MONGODB_URI directly with a hard throw if unset, with zero BINDINGS_ENABLED awareness. Nothing in this repo resolves a URI from binding files; serviceBindings.ts's resolvers are dead code with zero callers. A BINDINGS_ENABLED=t…

  57. Refresh system atlas API section after W0.48 · 110da39

    New test files under src/apps/api triggered finding class K (atlas staleness). Documents the JWT algorithm pins, clock tolerance, and issuer normalization.

  58. Three findings, all against the installed jose library: · 4788e5e

    - zitadel-validator.ts: issuer trailing-slash normalization was applied for JWKS discovery but not for the strict iss claim comparison passed to jwtVerify -- a ZITADEL_ISSUER trailing-slash mismatch against the real iss claim made key fetching look healthy while every token verification failed with a generic 401. Extracted a single exported normalizeZitadelIssuer() used everywhere. - Neither the ZITADEL nor native-shell-compat jwtVerify call set clockTolerance (jose's default is exactly 0s), so any positive clock …

  59. Refresh system atlas matching section after W0.47 · a363c84

    New test files under src/apps/matching triggered finding class K (atlas staleness). Documents the phantom-zero axis fix and the Mongo-read weight floor.

  60. Close W0.47 — phantom-zero axis score + unclamped Mongo item weight · 49d74c2

    score_pairing_breakdown's per-axis loop correctly treated "no shared items" as None (no data), but treated "shared items exist, all with signal_weight <= 0" as a real 0.0 (worst possible) instead of the same "no data" None -- indistinguishable from a genuine zero match once fed into production egress (matchPercentage/connectionRing). Two independent fixes, matching the two exposure points the finding named: - calibration_calibrator.py: replaced the `... if weight_total else 0.0` fallback with an explicit early con…

  61. Refresh system atlas API section after W0.45.c · 81fb462

    Adding data-atlas-module markers means every new file under a declared module subtree needs the section re-verified in the same change as the code that added it -- this session's own new convention (W0.125). Documents the shared deleteIfPresent GridFS cleanup now reused across all three profile-delete paths.

  62. Close W0.45.c + W0.45 — clean up GridFS blobs on generic admin document delete · d75bc39

    DELETE /api/admin/collections/profiles/:documentId had no code path back to ProfilePictureService at all -- the third and final reachable route (after W0.45.a's direct replace-picture failure and W0.45.b's bulk clearAllProfiles) that could leak full/preview GridFS blobs permanently. Took the special-case option over removing "profiles" from the delete allowlist, preserving the existing admin capability: only for collectionName === "profiles", findOne's the document's profilePicture before the deleteOne (unqueryabl…

  63. Close W0.45.b — clean up GridFS blobs on bulk admin profile delete · b85f894

    clearAllProfiles (DELETE /api/admin/profiles) did a raw deleteMany on profiles with zero storage cleanup, completely bypassing ProfilePictureService -- every deleted profile that had a picture leaked its full/preview GridFS blobs permanently. The self-service DELETE /api/profile path was already correct by contrast. Exported deleteIfPresent from ProfilePictureService.ts (was private) and reused it directly instead of duplicating its swallow-and-log GridFS-cleanup logic. clearAllProfiles now projects profilePicture…

  64. Close W0.45.a — clean up orphaned GridFS blob on failed profile-picture upload · 5a83469

    replaceProfilePicture uploaded the full and preview GridFS variants sequentially with no surrounding try/catch -- if full committed and preview then threw, the already-written full blob was never cleaned up (every other failure path in this file correctly calls deleteIfPresent). Every failed second-half-of-upload permanently orphaned a full-resolution photo blob with no reconciliation job anywhere in the repo to catch it. Wrapped both uploads in a try/catch; on failure, best-effort deletes whatever succeeded befor…

  65. Close W0.44 — explicit timeout on the learning-wave-run-once fetch · 4cb72f9

    postMatchingLearningWaveRunOnce() had no timeout at all, so a legitimately slow-but-successful wave run past undici's silent ~5-minute default would time out and clear the cron's learningCycleInFlight guard while the Python route was still executing (FastAPI does not cancel synchronous work on client disconnect) -- letting the next 15-minute cron tick fire a fresh run-once call mid-flight, compounding W0.37.c's already-tracked wave-index race via a timeout mismatch. Added an explicit AbortSignal.timeout(...) just …

  66. Close W0.125 — add data-atlas-module coverage markers to system atlas · ba2e04a

    plan/system-atlas.html had real, researched content (990 lines, from a separate PR-based dev track) but zero data-atlas-module markers, so the wave-consistency-scan's finding class K couldn't check it for staleness or coverage at all. Added markers to all 9 module/foundation sections, verified against the real repo tree so every top-level tracked directory is covered. Doing this surfaced a genuine staleness finding against src/apps/api (one file added there this session via W0.39.b) -- re-verified that section's c…

  67. Close W0.39.b — verify chat media bytes against declared content type · a54832d

    Chat photo/voice uploads were only validated against the client-declared multipart Content-Type header (allowlist check) -- the bytes themselves were never checked. A malformed file trusted as genuine media risked native client-side image/audio decoder exploitation, or using chat as a disguised arbitrary-file-drop channel. Added the file-type package (magic-byte detection) and verifyChatMediaFileSignature(buffer, declaredType, normalizedMime) in chatMediaUploadPolicy.ts, called from uploadMedia.ts before anything …

  68. Close W0.37 — wave-index atomic-claim gap, documented owner+trigger · 15ea0a5

    Same resolution shape this wave already applies to identical-shape issues (W0.2.a, W0.2.b, W0.32.a): in-memory/single-process state that's only a real race under multi-worker/multi-replica deployment, which this repo has no evidence of running. Re-confirmed the matching service's Dockerfile still runs a single uvicorn worker with no --workers flag or replica config. A rushed TTL/staleness-based wave-index reservation against this codebase's single most sensitive production pipeline, with no current exploit path, i…

  69. Close W0.35.b — credit remaining subscription value on same-tier renewal · 19fa5a0

    activateSubscription unconditionally reset startedAt/renewsAt from "now" on every call; proration (crediting the still-active term's remaining value against the new term's price) only ran for the special-cased Seeker->Visionary upgrade branch. A same-tier renewal/extension or a Visionary re-activation (both allowed -- the tier-rank check only blocks downgrades) silently discarded any remaining paid time with no credit. Generalized computeSeekerToVisionaryUpgradeProration (hardcoded to seeker/visionary) into comput…

  70. Close W0.33 — spin astrological discovery filter out to W0.123 · 3f05244

    W0.33.b's sameIntentOnly fix already landed 2026-08-17; the astrological sub-item stays unresolved but is now a properly scoped standalone story (W0.123) instead of an inline "deferred" note, per explicit maintainer direction not to decide the build-vs-remove product call unilaterally.

  71. Close W0.32.b — make ZITADEL_AUDIENCE required, close confused-deputy gap · 0e8da07

    Audience validation was silently skipped whenever ZITADEL_AUDIENCE was unset (optional in the env schema) — any validly-signed token from any client registered against the same ZITADEL issuer/project could authenticate against this backend. Live merge-env content isn't verifiable from this repo (control-plane territory), but the actual gap is closable at the code layer: ZITADEL_AUDIENCE is now a required env var (z.string().min(1)), so the process fails to boot without it in any real deployment instead of degradin…

  72. Close W0.32.a — rate-limiter multi-replica gap, documented owner+trigger · 5657106

    Same evidence re-check as W0.2.a (no replicas/deploy: config anywhere in docker-compose.yml, no plan doc scaling this backend's container, deploy topology is control-plane/merge-env territory out of this repo's scope): this repo has no evidence of the multi-replica deployment the rate limiter's own top comment flags as a known simplification. Deferred with a documented owner+trigger rather than building a speculative Redis-backed store.

  73. Close W0.28 — full react-hooks/set-state-in-effect + exhaustive-deps/immutability/preserve-manual-memoization/incompatible-library cleanup · 4adcc79

    W0.28.d: 38 findings across 30 files (28 exhaustive-deps, 5 preserve-manual- memoization, 3 immutability, 1 incompatible-library, 1 no-unused-vars). Investigated each as a possible real defect per the story's own warning rather than bulk-disabling: - Real fixes: wrapped unmemoized initializers in useMemo (2 filter-chip components), hoisted optional-chain reads so React Compiler's dependency inference could track the narrower path instead of widening to the whole object (biometric/hooks.ts + 3 sibling discovery-but…

  74. Close W0.6 acceptance gate after W0.6.f · f136e2d

    Verify re-run clean (0 class-I findings) now that the 31 newly-merged folders have READMEs.

  75. Close W0.28.b + W0.6.f — set-state-in-effect cleanup, README backlog refresh · 0e3a6c0

    W0.28.b: react-hooks/set-state-in-effect 144 -> 0 across ~104 files. Extracted useResetOnAccountSwap() to centralize the ~75-site SRC-BUG-*-SWAP convention; applied React's render-time-derivation pattern (and split sync-reset-from-async where needed) for the rest; a handful of genuine external-system sites (SSE seeding, portal/hydration flags, Embla subscription, storage/DOM reads) got narrow justified disables matching existing codebase precedent. Found and filed (not silently fixed) a real bug in ConnectionsPage…

  76. Sync local changes · 5397161

  77. Sync local changes · dc2db3f

  78. Refresh 2 READMEs missed in the prior W0.28.a batch · 8704517

  79. Refresh READMEs left stale by the W0.28.a commit · fd56966

  80. Close W0.28.a — clear react-hooks/refs (72 sites, 59 files) · f358cf9

    eslint-plugin-react-hooks@7.x's react-hooks/refs rule forbids reading or writing ref.current during the render phase. 58/59 files matched the dominant "keep a ref synced to the latest render value" idiom and were fixed identically: moved the assignment into a dependency-less useEffect so it re-syncs after every render, preserving exact behavior. Four sites needed real judgment instead of the mechanical pattern: - LoginOtpFields.tsx: a ref-touching callback passed into react-hook-form's handleSubmit() during render…

  81. Refresh READMEs left stale by the W0.26 commit · 5f88de6

  82. Close W0.26 — slot-aware orb height cap for narrow+short phones · 5a1d9f0

    The originally-reported 360x640 overlap (W0.26.f) no longer reproduces on its own, but live browser measurement found the same class of bug worse on an even smaller real device the finding never tested: iPhone SE (320x568) overlapped the landing hero orb into the CTA by 23px. getLandingHeroBrandOrbSizePx now caps against a new LANDING_HERO_NARROW_SHORT_RESERVED_CHROME_PX (420px, empirically calibrated against both measured viewports) instead of the raw viewport height, scoped to the same narrow+short breakpoint (<…

  83. Close W0.24 — API test suite already self-contained via W0.15 · 05d0dfb

    Seeded and immediately closed: W0.15 (already-closed story) independently implemented exactly this story's option (a) — a mongodb-memory-server globalSetup for the main vitest project. Fresh no-flags `npm test` confirms the suite is genuinely self-contained now: 559 files, 1695 tests, 0 failures, no external Mongo required.

  84. Close W0.14 — full web atomic offline suite green (1169/1169) · 1272cf8

    Explicit i18n authorization given in-conversation, unblocking W0.14.g/h/i. Re-verified rather than assumed: all three were already resolved by earlier work (commit d33874b3's discovery/paywall i18n localization pass covered g's hardcoded-copy fix and i's untranslated de/fr/es/ar strings; W0.15.i's dead-code deletion removed h's fix target entirely). No new code changes needed for any of the three — just running each verify command confirmed green and reconciling the plan to match reality. Story acceptance gate: np…

  85. Refresh tests/atomic/infra README after W0.14.k · 24d1074

  86. Close W0.14.k — stale owner-regen-command assertion · 33721fc

    productReadmeContractSsot.test.ts asserted the literal substring "npm run generate:api" in src/README.md, but the README's contract-first workflow section was intentionally rewritten to document the real owner command (pnpm --filter @ifeoma-tc/openapi-client-generator generate), mentioning generate:api only as a partial web alias. Updated the test to match current reality instead of reverting accurate docs to satisfy a stale assertion. W0.14.g/h/i remain open — untranslated-copy fixes gated on this repo's standing…

  87. Close W0.12 — delete dead backgroundStyles.ts duplicate (W0.12.k) · 4b87eca

    Explicit user approval obtained in-conversation after a full side-by-side comparison: design-[redacted].ts was a drifted, zero-importer duplicate of the live, tokenized lib/utils/backgroundStyles.ts (hardcoded colors vs. design-system tokens, missing the WebGL shader-stop helpers the discovery universe actually uses, a variant API nothing ever called). Traced to the repo's initial commit, pre-dating the design-system consolidation — uncleaned scaffolding, not a parallel approach worth keeping. Also cleaned the two…

  88. Refresh READMEs left stale by the W0.12.q commit · 0ff62bd

  89. Close W0.12.q — re-fix merge-reintroduced tsc regression · 4d14c31

    A merge combined two independent branches' fixes to the same files without deduping: one added a useTranslations import / storageUnavailableLabel prop, the other (W0.12.m, already closed) had separately fixed the same files. Result: 21 tsc errors (duplicate identifiers, missing imports) across 9 files, none touched by this session until now. Removed the redundant duplicate import in 5 discovery/paywall button files, removed the duplicate optional storageUnavailableLabel prop from both Glass* disclosure components …

  90. Repair W0.15 grammar corruption + refresh W0.12-touched READMEs · dd84732

    A prior Edit inserting W0.14.k into plan/waves/WAVE-0.html swallowed the newline before the following W0.15 story line, merging them onto one physical line. The wave-consistency-scan line parser reads story declarations one per line, so this made W0.15's own story line invisible to it — surfaced as two class-D grammar-integrity findings ("W0.11 needs unknown ID: W0.15" and "W0.15.a is a sub-todo of W0.15, which has no story line"), a hard-stop condition per the wave-next skill. Fixed by restoring the missing newli…

  91. Close W0.12.a-e — discovery SSE, chat translate, connections contract · 4aad062

    - W0.12.a: add request.prefsHydrated to the discovery SSE effect's own dependency array (guard clause already checked it, deps array didn't). - W0.12.b: reachable + secured POST /api/chat/translate — exact-path proxy exclusion (not the whole "chat" segment, which has many live Fastify routes), session check, and a new per-IP rate limiter. - W0.12.c: useConnections' `connections` field is now `Connection[] | undefined` (undefined while pending/erroring/disabled), matching useConversations' sibling contract instead …

  92. Extend scorecard-label-parity fixture (W0.10.l) · 2228201

    The CL-001 cross-repo parity gate's 8 golden cases (only just wired to actually run, per W0.10.k) left 3 branches of the shared outcome-label algorithm uncovered: the message-count depth-component clamp, a breakup_reason outside {icebreaker,chat} correctly yielding null, and a depth score near the 0.45 threshold (existing cases sat at 1.0/0.1667, far enough that a moderate threshold regression wouldn't be caught). Extends src/config/scorecard-label-parity.json (the cross-repo SSOT) with 3 new binary-exact cases; b…

  93. Refresh README staleness from W0.9 commit (finding class I) · bb53fca

    plan/waves/README.md and src/apps/api/src/routes/profile/README.md were flagged stale purely because the W0.9 commit touched sibling files in the same folders. Content still accurate for both; left a note in plan/waves/README.md for future iterations to bundle wave-plan-only touches into the same commit as substantive changes to avoid this churn.

  94. Normalize profile-route 412 error shape (W0.9) · 8779c6e

    registerProfileReadRoutes.ts and registerProfileSecureRoutes.ts sent inconsistent 412 bodies ({error} only, or {error, code} without message) while their sibling registerProfileUpdateRoutes.ts already normalized to {error, message, code?} under AT-6.1. Applies the same shape to the remaining 4 sites across both files so all "profile missing profileId/ authUid" 412 responses are consistent repo-wide.

  95. Fix findings from W0.6 close (evidence pointer, README staleness) · 99d8f6c

    W0.6.c's completion note lacked a concrete evidence pointer (finding class G); added one with a verifiable command. plan/waves/README.md was flagged stale purely because the prior commit touched WAVE-0.html in the same folder — content is still accurate, added a verified-current note.

  96. Close W0.6 — repo-wide README compliance backlog drained · b7aa380

    All sub-todos (W0.6.a-e) verified and checked: 824 folders got a new or refreshed README.md via 34 parallel batch agents, plus a handful of gitignored-tracked-content and timestamp-stale edge cases fixed by hand. wave-consistency-scan now reports "consistent" with zero findings across all classes (A-J).

  97. W0.6.a-d stragglers — gitignored-dir READMEs + 2 stale refreshes · 0fd3a60

    Force-added README.md for 4 folders that carry legacy tracked files but are otherwise gitignored (generated/ output dirs), which the scan flags as needing a README same as any other tracked-content folder. Also refreshed 2 READMEs (docs/plans/, e2e app-shell-navigation helpers) whose content was already accurate but had gone stale by the scan's git-history timestamp heuristic — added a verified-current note rather than padding with no-op changes.

  98. W0.6.a-d — repo-wide README coverage backlog drain · 825357f

    Writes/refreshes README.md across every git-tracked folder flagged by wave-consistency-scan's finding class I (780 folders missing/stale as of 2026-08-16, per CLAUDE.md's "every folder needs a README" rule). Covers src/apps/web (569 folders), src/apps/api (161), src/apps/matching (23), and remaining scattered folders (docs/, plan/, score/, scripts/, src/apps/ml-service/, src/config/, src/packages/, src/scripts/, tools/) — new READMEs where none existed, refreshed content where the existing README had drifted from …

  99. Close W0.40/W0.43 acceptance gates, evidence W0.5's parent claim · de708d3

    Both W0.40 and W0.43 had all sub-todos checked but their own story-level verify never re-ran (finding class B). Re-ran each story's verify command (both pass clean) and closed the parent boxes with a completion note. Also strengthened W0.5's parent completion note with a concrete evidence pointer (grep counts proving 19/19 subs checked) per finding class G — the claim was already true, it just lacked a verifiable citation.

  100. System atlas: relation diagrams, live wave-topics, and navigation (#33) · 1f49135

    * Add relation diagrams and navigation to the system atlas Adds five Mermaid diagrams (system topology, auth/identity resolution chain, learning-wave pipeline, background-jobs process boundary, billing dual-store disconnect) with a CDN fallback so they render standalone outside the Artifact viewer. Adds a live filter, scroll-spy nav, collapsible tables, and reading-progress/back-to-top controls so the page stays navigable at this density. * Add a Wave topics section documenting live wave-state access Surfaces the …

  101. File 8 auth/cron bug-audit findings under W0.121 · d1e29ba

    Recovered from an abandoned stash (pre-existing unlanded TODO(bug-audit) comments on live auth/cron/passkey/profile-picture code) that was about to be deleted as cleanup. Files each as a COMPLIANCE sub-todo instead of merging inline TODOs, per this repo's "every found bug goes into the wave plan" policy.

  102. Finish repo-path fixups from vendoring, commit runtime config data · 43f428f

    Vendoring moved ml-service from horizontal-services/machine-learning into src/apps/ml-service; update docs/READMEs and a script test to reference the new in-repo paths instead of the old sibling-repo layout, and commit the config data files (learning policy, intent weights, UI bands, match schema, contracts drift manifest) the service reads at runtime — previously untracked despite the repo's .gitignore already allow-listing them.

  103. Add TrueConnection system atlas for bug-hunting (#31) · 15974d4

    Repo-wide inventory of web/API/matching/ml-service routes, services, config, and infra, plus a consolidated list of self-flagged weak points, to help target specific system elements for bug hunting. Claude-Session: https://claude.ai/code/session_01B4Atyvgd8uAoJqZE4FbW2x

  104. Add bug-hunt round 9 findings to WAVE-0 (W0.66-W0.71) · 2a5b77f

    Fifth multi-agent sweep, explicitly backend-focused: six agents covering config/constants/types/generated, the remaining lib/ modules (connection-statements/matches/orbVisuals/journey-banks), the Node-side ML adapter layer, services/match internals, Zod-schema content and error-response-shape consistency, and a final targeted services/ gap-check on the two least-scrutinized directories by prior-round citation density. 15 verified findings. Most notable: NEXTAUTH_SECRET (the core auth-signing secret for compat JWTs…

  105. Add TrueConnection system atlas for bug-hunting · b2be4a5

    Repo-wide inventory of web/API/matching/ml-service routes, services, config, and infra, plus a consolidated list of self-flagged weak points, to help target specific system elements for bug hunting. Claude-Session: https://claude.ai/code/session_01B4Atyvgd8uAoJqZE4FbW2x

  106. Add bug-hunt round 8 findings to WAVE-0 (W0.60-W0.65) · 0bbc1ee

    Fourth multi-agent sweep, explicitly frontend-focused: six agents covering profile/onboarding/ratings, journey UI + design-system accessibility, discovery UI (3D universe/filters/pagination), paywall UI/pricing display, landing/public/i18n/RTL, and auth-client UI + routing + provider composition. 22 verified findings. Most notable: the shared BaseModal primitive behind 35+ modals has no focus trap or restoration at all, directly contradicting this repo's own stated accessibility rule; /dev/* operator-tooling pages…

  107. Add bug-hunt round 7 findings to WAVE-0 (W0.54-W0.59) · c04a693

    Third multi-agent sweep, this time explicitly end-to-end: six agents each traced one full user journey across every layer it touches (client -> BFF -> backend -> matching/ml-service -> Mongo, and back), hunting for bugs that only exist because of the seam between layers rather than within a single file or service. 16 verified findings. Most notable: cross-provider sign-in on the same mailbox silently orphans a user's chat/connections (they key on raw authUid, which flips on account-linking, instead of the stable p…

  108. Close email-rebind trust gap in shared profile provisioning + admin self-registration bootstrap (W0.63.a/b) · 606f553

    Bug-hunt round 11: 15 parallel sub-agents swept every backend submodule plus the web BFF layer for correctness/security defects. W0.63.a (critical): ProfileProvisioning.getOrCreateProfile — the shared SSOT used by ~10 call sites (profile read/update/picture/journey routes, passkey registration, internal get-or-create-profile) — had no emailTrustedForLinking gate at all, unlike platformRbac.ts (W0.31.b) and the /api/users pre-check (W0.62.a). Any authenticated call carrying an attacker-controlled email claim matchi…

  109. Bug-hunt rounds 5-6: 44 findings added to WAVE-0 (#29) · 10cdf9e

    * Add bug-hunt round 5 findings to WAVE-0 (W0.38-W0.45) Multi-agent audit across every backend submodule (auth/session, profile/journey, chat/push, connections/discovery/matching, admin/billing/paywall, the Python matching service, the previously unaudited ml-service, plus a lighter web/contracts/config pass). 21 verified findings, most severe: RCE via trust_remote_code with a caller-controlled modelId on a fully unauthenticated ml-service API (W0.38.a/b), non-expiring/unrevocable internal bearer tokens for non-OI…

  110. Log bug-hunt round 6 findings (13-agent follow-up sweep) · f8393dc

    Ran a second wave of 13 parallel read-only agents targeting areas the round-5 sweep hadn't reached yet: Universe3D WebGL rendering internals, chat presence/connections-consent UI, onboarding, native-shell/mobile bridge, admin's non-Questions sections, design-system forms, the compatibility radar chart, backend ProfileService/DiscoveryQueryService, backend billing/entitlement edge cases, and matching-service core scoring math. Spot-verified the two highest-severity claims directly before writing them up: the native…

  111. Add bug-hunt round 6 findings to WAVE-0 (W0.46-W0.53) · 3152744

    Second multi-agent sweep into territory rounds 4-5 didn't reach: untouched api libs ([redacted]), api sim-[redacted], the matching-service's infrastructure/jobs/application/domain layers, a deeper ml-service pass, web chat/discovery/realtime hooks, web admin/PWA/native-shell/service-worker, the repo's own scripts/ tooling, and Docker/compose config. 23 verified findings. Most notable: two new live instances of this repo's own hard "no cross-repo filesystem reach" rule in scripts/ (verify.sh and check_clean_arch_to…

  112. Fix W0.43.b: field-allowlist admin bulk profile upload before insert · c588f3e

    AdminBulkUploadProfileItem is .passthrough(), and the bulk-upload handler spread the raw validated item straight into insertOne -- any extra JSON field a caller included survived unfiltered into the profiles document. Exported ProfileService's own audited PROFILE_UPDATABLE_FIELDS allowlist and reused it (single source of truth) plus questionAnswers/connectionRatings, the two journey-map fields this bulk-insert path is specifically meant to accept. normalizeBulkProfilePayload now filters the raw item through this a…

  113. Fix W0.40.a: close the reflection/connection-rating limit check-then-act race · 65ecdf2

    POST /api/profile/answer and POST /api/profile/connection-rating gated their paid journey limits with a check-then-act race: the route read a profile snapshot, the paywall assertion counted "used" from that in-memory snapshot, and only after the check passed did an atomic per-key $set write run. Two concurrent requests for two different keys both pass the same stale check and both commit (no natural write conflict, different sub-keys), letting a free-tier user exceed unlockedReflectionMax/unlockedConnectionMax. Fi…

  114. Fix W0.40.c: bound SaveProfileAnswerRequest.answer to 2000 chars · 7409d6c

    The only prior ceiling was Fastify's ~1MiB default body limit -- unlike comparable free-text fields in the same OpenAPI file (chat message body capped at 2000) and sibling profile fields bio/interests which do have explicit bounds. That unbounded text was read verbatim by the matching service's NLP/Qwen pipeline (W0.37.e closed the matching-service side of that gap; this closes the actual ingress point). Added maxLength: 2000 to the OpenAPI SSOT and ran the full contract pipeline; the route already validates again…

  115. Partially fix W0.37.c: make the wave-calibration outbox write idempotent · 3a5f3a3

    The WAVE_CALIBRATION_COMPLETE outbox write was a plain insert_one with no uniqueness constraint -- two overlapping wave-run triggers computing the same wave_index would each create a duplicate outbox row, and run_outbox_publisher_once would process both independently (duplicate downstream fan-out for one logical wave). aggregate_id is already deterministic per wave_index, so switch to an idempotent update_one(upsert=True) keyed on it -- the second commit for a wave index becomes a no-op instead of a duplicate row.…

  116. Fix W0.37.e: bound free text into the NLP/Qwen fact-bundle pipeline · ee93e8c

    GroundedFactEntry/GroundedFactBundle had no maxLength/maxItems -- a resource-exhaustion vector into the on-VM Qwen/NLP engine, since QwenGenerateRequest.maxNewTokens only bounds the model's output, not the input prompt built from facts. Added maxLength: 200/4000/200 for key/value/source and maxItems: 100 for facts in the OpenAPI SSOT, hand-mirrored into the generated contract_models.py, plus matching bounds directly in grounded_validate.py::validate_fact_bundle -- this repo's own second independent validation gate…

  117. Fix W0.37.d: offload blocking learning-wave/item-stats work off the event loop · fd9a4f4

    learning_wave_run_once() and recompute_match_item_stats() called fully synchronous, long-running Mongo work directly inside their async def route handlers with no run_blocking offload, unlike the established affect_recompute.py/internal_qwen.py pattern. The Dockerfile runs a single uvicorn worker, so this blocks every other request -- including the health check -- for the full duration of a wave run or a full-profile-collection item-stats scan. internal_learning.py's route now wraps the wave runner in run_blocking…

  118. Fix W0.37.b: mongo egress retry classifier missed real transient errors · b782dbb

    _is_transient() matched on exception class-name substrings ("Transient"/"Connection" in name), which the real pymongo exceptions that occur in production (AutoReconnect, NetworkTimeout, NotPrimaryError, ExecutionTimeout) don't satisfy -- confirmed empirically against the installed pymongo classes. The retry/backoff loop was dead code for real transient errors: a routine Mongo blip during a wave commit surfaced as an immediate hard failure, discarding the whole computed wave. Now checks isinstance(exc, (ConnectionF…

  119. Fix W0.37.a: reject Infinity, not just NaN, in scorecard wire parsing · 9afc42f

    not float(x) == float(x) rejects NaN (self-inequality) but Infinity equals itself in Python, so it silently passed as "finite". An Infinity mirt_at_entry reaches the learning gate's Pearson-correlation check, which returns nan on an infinite input; the gate's regression comparison treats nan as "not regressed", silently disabling half of the dual-measure safety gate for that wave. Switch to math.isfinite() for mirt_at_entry, completed_at, and duration_sec in scorecard_wire.py, plus the identical anti-pattern found…

  120. Add bug-hunt round 5 findings to WAVE-0 (W0.38-W0.45) · 3a4fdf9

    Multi-agent audit across every backend submodule (auth/session, profile/journey, chat/push, connections/discovery/matching, admin/billing/paywall, the Python matching service, the previously unaudited ml-service, plus a lighter web/contracts/config pass). 21 verified findings, most severe: RCE via trust_remote_code with a caller-controlled modelId on a fully unauthenticated ml-service API (W0.38.a/b), non-expiring/unrevocable internal bearer tokens for non-OIDC logins (W0.39.a), and cross-user native push notifica…

  121. Fix W0.60: clamp unbounded skip on GET /api/admin/match-index · 3a90289

    skip had a floor (Math.max(0, ...)) but no ceiling -- the only unbounded .skip( call in src/apps/api/src, forcing an expensive full index-order Mongo traversal proportional to skip for what should be a small page. Clamp it to 10_000, matching adminUserReportsQuery.ts's existing cap for the same shape of admin-list pagination. Full suite: 558 files / 1678 tests passing. Claude-Session: https://claude.ai/code/session_01Q9dMirG3UrE1SG3VRvBuQz

  122. Log bug-hunt round 5 findings (15-agent, frontend-weighted) · d055629

    Ran 15 parallel read-only investigation agents across every submodule (web frontend weighted heaviest per explicit direction, plus api, matching, ml-service, and contracts) to find real correctness/security/ race-condition bugs beyond the 4 prior bug-hunt rounds already logged in this file. Spot-verified the three highest-severity claims directly before writing them up (report/block requests sent with no auth header due to route misclassification; missing viewerPressedReveal wiring stalling mutual chat reveal; uns…

  123. Fix W0.46: reap dead SSE discovery/events connections on an idle timeout · 6493893

    GET /api/discovery/events had no dead-peer/timeout reaping — cleanup (unsubscribe listeners, clear heartbeat interval) ran only from the socket's "close" event, which requires the kernel to notice the TCP connection died. A silently-dead connection (mobile NAT drop, backgrounded app killed without a clean FIN) leaked its listener closures and heartbeat handle for as long as Linux's TCP retransmission takes to give up (15-30+ minutes), with no cap on concurrent leaked entries. Set an explicit 75s idle timeout (3x t…

  124. Fix W0.62.e: internal bearer token parser inconsistency + dot-guard · 2227907

    The Fastify backend's internal-bearer-token verifier accepted parts.length < 4 (silently ignoring anything past the 4th segment) while the Next.js BFF-side verifier required exactly 4 — now both agree. Neither buildInternalAccessToken mint function (API-side or web-side) enforced that authUid is dot-free, even though the token format splits on "." and the web verifier's own doc comment already documented that requirement; both now throw if authUid contains a dot, matching the guard that already existed only in ens…

  125. Fix W0.62.d: bound Qwen generate's unbounded systemInstruction field · d90a01c

    POST /api/internal/qwen/generate's systemInstruction was completely free-form and unbounded, occupying the highest-trust position in the prompt with no size cap — a compromised internal caller (this route's only gate is the shared secret) could inflate prompt size/cost arbitrarily. Both real callers already hardcode fixed short strings, so add maxLength: 500 to the OpenAPI SSOT and the generated Pydantic model (no local codegen script exists for this contract in this repo, so hand-updated to match); FastAPI now re…

  126. Fix W0.62.b: chat read-watermark regression race · b7ad947

    markMessagesRead's prior-watermark findOne used to run before withMongoTransaction started, so it never participated in the transaction's write-conflict retry — a concurrent mark-read call could commit a further-advanced watermark in between this call's stale read and its write, silently regressing the stored value. Move the prior read inside the transaction (passed the session) so a write conflict forces a retry that re-reads prior fresh; watermarkKey was already max(furthestUnread, prior), so this closes the reg…

  127. Fix W0.62.c/f: synthetic-profile bootstrap batch isolation + billing renewal EOM overflow · b503f08

    W0.62.c: SyntheticProfileLifecycleService.bootstrapProfiles no longer aborts the whole batch on the first invalid seed or failed match recalc — both loops now accumulate per-item errors and return partial results, matching every sibling bulk admin route's existing pattern. Admin bootstrap/generate routes surface the new errors[] field; OpenAPI SSOT updated and contract pipeline re-run. W0.62.f: services/billing/EntitlementService.ts's applyCheckoutCompleted used raw setMonth arithmetic for its synthesized renewsAt…

  128. Fix W0.62.a (critical): unverified-email account takeover via self-registration · d922c75

    POST /api/users creates a Zitadel human user with isEmailVerified: true hard-coded, with zero actual mailbox-ownership proof, then passed that self-asserted email straight into ensureProfile — letting ProfileService.getOrCreateProfile silently rebind any EXISTING profile already keyed on that email (created via Google/Zitadel-OIDC/passkey/ magic-link, none of which mint a Zitadel "human" user, so Zitadel's own directory has no conflicting record to reject the attempt) onto the attacker's new authUid. Full account …

  129. Fix W0.58.a and W0.58.b: handle invoice.paid and past_due Stripe events · 24dff91

    W0.58.a: invoice.paid events normalized fine but applyNormalizedEvent's if-chain had no case for them, so they silently no-oped — worse, the idempotency ledger already burned the event's slot before the no-op, so a future fix could never reprocess historical deliveries. Adds an explicit, documented no-op branch (the normalized event carries no period/line-item data to reconcile against, and subscription.updated already fires for the renewal case). W0.58.b: subscription.updated with status:"past_due" matched neithe…

  130. Fix W0.59: swallow duplicate-key race on two idempotent viewer-ack upserts · d52ac2b

    recordViewerIcebreakerCompleteCelebrationSeen and recordViewerPeerDismissal both do an upsert() against a collection with a unique index on exactly their filter, but neither caught the E11000 a concurrent double-tap/ client-retry/two-tabs race produces — the loser fell through to a generic 500. For acknowledge-unavailable-peer specifically this was worse than a spurious error: by the time the race hits this write, endConnection, the matches cleanup, and the chat-session delete had already succeeded for both racing…

  131. Fix W0.43.a: replace fragile substring error matching in paywall routes · 4e4af9d

    POST /api/paywall/subscriptions and POST /api/paywall/purchases caught error instanceof Error && error.message.includes("required") and echoed the raw message at 400 — the exact fragile-substring-matching anti- pattern lib/http/README_TYPED_ERROR_ROUTING.md documents as the reason ServiceValidationError/ServiceConflictError exist. Any future throw whose message happened to contain "required" would have been silently downgraded from 500 to 400 with its raw message shown to the caller. All 5 validation-failure throw…

  132. Fix W0.42.b: bound /api/health/ready's Mongo ping to a fixed timeout · ead120c

    healthCheck()'s admin().ping() had no operation-level timeout — serverSelectionTimeoutMS only bounds finding/connecting to a server, not an already-connected server that stops responding (long stall, mid- election, GC pause). A hung-but-connected primary could make the readiness probe hang indefinitely instead of failing fast, defeating the purpose of a readiness check. healthCheck() now races the ping against a 3000ms timeout, returning false the moment the deadline passes — a scoped, health-check-local fix rathe…

  133. Fix W0.35.d: thread Stripe's real period-end through subscription.updated · 9471e8b

    applySubscriptionUpdated discarded the real Stripe billing-period end (already correctly computed by stripeWireHelpers.ts::subscriptionRenewsAt and carried on the normalized event) by delegating to applyCheckoutCompleted, which always synthesized renewsAt as "now + termMonths" regardless of what was passed. Since subscription.updated fires for many non-renewal reasons while a subscription stays active (payment-method change, coupon application, metadata edits), the mirrored renewsAt drifted later than reality on e…

  134. Fix W0.36.a and W0.36.b: cap admin bulk-import/bootstrap payload sizes · 500ead8

    W0.36.a: POST /api/admin/questions/answers-import had no cap on body.questions.length/body.profiles.length, unlike every sibling bulk endpoint (questions/bulk, connection-statements/bulk, profile bulk-upload all cap at 1000). Adds the same 1000-item cap, enforced in parseQuestionAnswersImportBody before any per-item parsing or Mongo work, for both the bare-array and {questions, profiles} body shapes. W0.36.b: POST /api/admin/synthetic-profiles/bootstrap only checked profiles.length === 0, no upper bound, unlike it…

  135. Fix W0.40.b: bound POST /api/ratings' rating value to the documented 1-10 scale · ad04d0b

    SaveRatingRequest.rating had no minimum/maximum in the OpenAPI contract even though the schema already documented "Rating value on the 1-10 scale" and the sibling connectionRatings field already defends the same range at read time — an out-of-range value like -999999 was stored and returned verbatim by GET /api/ratings. Adds minimum: 1 / maximum: 10 to both Rating.rating and SaveRatingRequest.rating in the OpenAPI SSOT, regenerated per the contract edit order (API/web zod schemas, web API types/openapi.json). The …

  136. Fix W0.39.a: strip EXIF/GPS metadata from chat photo uploads · bd8d323

    Chat photo uploads were written to storage byte-for-byte with no re-encode, unlike profile pictures which always go through a sharp re-encode pipeline that strips EXIF. A photo taken with location services on and sent as a chat message preserved its GPS EXIF tag through to the recipient byte-for-byte — a deanonymization/stalking vector on a dating app where matches are frequently strangers meeting for the first time. New lib/chat/chatPhotoMetadataStrip.ts decodes a type:"photo" upload via sharp, applies .rotate() …

  137. Close W0.31.c web-side unverified-email account-linking gap · 7c7434f

    resolveZitadelProfileEmail now only returns an email ZITADEL asserted as email_verified: true, from both the userinfo and id_token branches. This closes the NextAuth-side entry point of SRC-BUG-UNVERIFIED-EMAIL-PROFILE-REBIND (nOAuth-class account takeover): a self-controlled ZITADEL account with an unverified/spoofed email claim could otherwise have its profile lookup key match another user's verified profile, letting one authUid inherit another's data via ensureProfile/resolvePlatformRoleFromMongo. The Fastify-s…

  138. Fix W0.42.a: add overlap guard to match-recalc and retention-purge cron jobs · 3b94929

    MATCH_RECALC_CRON and CHAT_MESSAGE_RETENTION_PURGE_CRON had no overlap guard — node-cron fires the next tick regardless of whether the previous invocation finished, so a slow run (match recalc growing with profile count, retention purge slowing under storage latency) could overlap with the next tick, doubling Mongo/storage load and, for match recalc, racing writes to matches. Applies the same in-flight-boolean pattern already used by the learning cycle job in this same file to both jobs. Claude-Session: https://cl…

  139. Fix W0.35.a and W0.34: subscription renewal EOM overflow, icebreaker race · 5541c21

    W0.35.a: computeSubscriptionRenewsAt used raw setUTCMonth arithmetic with no end-of-month clamping — a subscription started 2026-01-31 with a 1-month term renewed at 2026-03-03 instead of 2026-02-28, granting bonus paid-tier days on every renewal started on the 29th-31st of a month. Now clamps the target day to the real last day of the target month before setting year/month/day atomically. W0.34: submitIcebreakerStep's CAS filter was {connectionId, stage: "conversation_active"} only, which doesn't change across a …

  140. Close unverified-email account-takeover on the Zitadel bearer/compat-JWT path · b9a48bc

    ProfileService.getOrCreateProfile and platformRbac both rebind an existing profile's authUid to whatever caller presents a matching emailNormalized, with no check that the IdP actually verified that email. The OIDC callback routes already had a named fix for this exact CVE class (isEmailTrustedForAccountLinking, nOAuth / CVE-2026-53516 / CVE-2026-64665 / GHSA-6g38-8j4p-j3pr) but it was only wired into the two /api/oidc/callback/* routes' ensureProfile call, not the per-request Zitadel bearer-token path (middleware…

  141. Fix W0.35.c: TOCTOU double-charge race on profile picture reveal · d991cae

    recordProfilePictureReveal previously did a plain read (hasProfilePictureRevealGrant) followed by a separate atomic usage increment (recordUsageConsumption) with no join against pictureRevealGrants.profileIds — two concurrent reveal requests for the same profile could both pass the read and both increment usage.dailyPictureReveals, charging one photo reveal as two quota units. Folds the "already granted" and "increment usage" checks into a single atomic findOneAndUpdate (usage.dailyPictureReveals: {$lt: limit} AND…

  142. Fix W0.61.a-d: NoSQL injection, picture-reveal reset, Qwen timeout/injection · 2730a93

    - W0.61.a: reject non-string userId on POST /api/internal/recalculate-matches before it reaches Mongo filters (mirrors the AT-20.10 guard). - W0.61.b: EntitlementService.loadNormalizedDocument's stale-reset write-back now also persists pictureRevealGrants, so a cross-day picture reveal actually clears yesterday's revealed-profile list instead of growing it forever. - W0.61.c: add a 30s AbortSignal timeout to all three Node -> matching-service Qwen fetch calls in groundedQwenMlClient.ts. - W0.61.d: frame the Qwen f…

  143. Close W0.33.b (sameIntentOnly half) — wire dead discovery filter flag · 0e6ffec

    sameIntentOnly/astrological discovery query flags were parsed and paywall-entitlement-gated by GET /api/discovery/profiles but never passed into DiscoveryQueryService.getDiscoveryProfiles — paying users got charged the entitlement check with zero effect. lib/matching/matchIntentScopeAlignment.ts's passesStrictDiscoveryMatchIntentScopeFilter already existed, fully implemented, just never called anywhere. Wired it in: getDiscoveryProfiles now resolves the viewer's own stored discoveryMatchIntentScopeId when sameInte…

  144. Close W0.33.a — blocked-peer intent-change leaked via discovery SSE/push · dfb5d18

    emitDiscoveryPeerIntentUpdated fanned out a peer's intent-scope change to every viewer with a materialized match against them, with zero block check — unlike every other discovery/connections/chat read path in this codebase. A blocked peer's activity still reached the blocking viewer's open SSE tab and could trigger a Web Push notification naming the blocked person. matches.userId (the viewer side of a row) is an authUid, so assertViewerPeerNotBlocked's authUid+authUid signature doesn't fit directly here — only th…

  145. Close W0.41 — device push token cross-account leak on shared devices · 9e2ec9f

    POST /api/device/token upserted on (userId, platform) only, with no check that the token wasn't already owned by a different userId — unlike the sibling PushSubscriptionService (Web Push), which does an ownership-scoped upsert for exactly this class of bug. On a shared/family device, APNs/FCM hands the same native token to whichever user is currently logged in; the old owner's stale row stayed live, so their next push notification (chat message, new match, connection request) was delivered to what is now a differe…

  146. Close W0.52 — admin email leaked via createdBy on public bank reads · 96b5a98

    GET /api/connection-statements and GET /api/questions (any authenticated regular user) both echoed createdBy — the admin's real Zitadel login email recorded at bulk-upsert/create time — via serializers shared verbatim with admin-only surfaces, and the OpenAPI contract documented it as a real public response field. ConnectionStatementService.serializeConnectionStatementDocument now omits createdBy outright: there's no admin-facing read endpoint for that bank at all (the bulk-upsert route only ever returns counts), …

  147. Close W0.38 — X-Forwarded-For rate-limit bypass · bf1f146

    Every unauthenticated per-IP rate limiter re-parsed the raw, client-controlled X-Forwarded-For header and took its leftmost entry, in preference to request.ip (already correctly proxy-aware via Fastify's trustProxy: true + @fastify/proxy-addr). A client sending its own X-Forwarded-For value picked a fresh, empty rate-limit bucket on every request, defeating the email-enumeration guard and every other unauthenticated per-IP limiter (pre-auth passkey routes, registration, diagnostics ingest). New lib/http/resolveCli…

  148. Close W0.30 — paywall purchase/subscription endpoints minted paid entitlements for free · ad6f8db

    POST /api/paywall/purchases and /subscriptions granted real tier upgrades and add-on entitlements to any authenticated user with zero payment verification (SRC-BUG-BILLING-DUAL-ENTITLEMENT-STORES). Meanwhile a real completed Stripe payment updated billingSubscriptions but never reached userEntitlements, the store every tier/usage check actually reads — so paying customers' upgrades had no effect either. Maintainer chose "collapse to one store": billingSubscriptions becomes the gate every write into userEntitlement…

  149. Unlock journey answer caps for the dev-bypass mock user only · d0ccb38

    EntitlementService's free-tier drip limit on reflection/connection answers was blocking DEV_AUTH_BYPASS local testing from ever reaching Universe, with no way to complete the journey short of standing up real billing. Gate the unlock on the same SSOT the rest of the codebase already uses for dev-bypass (env + self-locking Mongo/filesystem checks, never exposed via any route or admin toggle) and additionally scope it to the literal dev-user-123 mock authUid, so it can never affect a real user's entitlements even if…

  150. Close W0.53 — E2E-seed routes had no second gate beyond the internal secret · 6014e41

    `/api/internal/e2e/*` (seed-conversation-request, seed-peer-profile-deleted, ensure-discovery-peers, ensure-simulation-worker) were reachable given only a leaked `INTERNAL_API_SECRET`, with two of them destructive against arbitrary real profile/connection data. Investigated devBypassGate.ts's two-signal pattern as a template, but a blanket NODE_ENV!=production gate would break this repo's real E2E-against-stage workflow (env.ts has no distinct staging value, and internal_api_seed.ts confirms Playwright hits these …

  151. Fix W0.31: unverified-email account takeover in platformRbac.ts · d5e3ff2

    resolvePlatformRoleForAuthUid rebound an existing profile's authUid to any caller presenting a matching but IdP-unverified email claim, on essentially every authenticated request (internal bearer, native-shell JWT, and plain ZITADEL JWT alike, via middleware/auth.ts's withPlatformRole). The exact CVE-class fix for this bug (nOAuth / CVE-2026-53516 / CVE-2026-64665) already existed in this codebase as isEmailTrustedForAccountLinking, but was wired only into the two OIDC callback routes, not this independent, always…

  152. Add bug-hunt round 8 findings (5 stories, 11 sub-items) to WAVE-0 · bf0e089

    Six more parallel adversarial bug-hunt agents (WebAuthn/passkey ceremony, Node-side backend match calculation, database index/schema correctness, Stripe webhook event normalization, connection state-machine edge transitions, pagination cursor tamper-resistance) surfaced 10 distinct new defects; the WebAuthn agent returned a clean result (no live defect in challenge entropy, replay protection, RP ID/origin checks, credential scoping, or signature-counter anti-clone enforcement) and one Stripe finding turned out to …

  153. Add bug-hunt round 7 findings (5 stories, 15 sub-items) to WAVE-0 · 9240312

    Six more parallel adversarial bug-hunt agents (admin question-bank/ psychometric audit, discovery mutation endpoints, analytics/state/ export endpoints, E2E-seed/migration/misc public endpoints, admin match-diagnostics math + synthetic profile generation, i18n backend + platform-settings/feature-flag resolution) surfaced 15 distinct defects. Every finding was independently re-verified against current code before being added; one reported finding (picture-reveal race reachable via a new route) was correctly identif…

  154. Add bug-hunt round 6 findings (6 stories, 11 sub-items) to WAVE-0 · 3041f80

    Six more parallel adversarial bug-hunt agents (NextAuth internal CRUD routes, SSE/realtime connection lifecycle, storage/GridFS orphan cleanup, Python matching core scoring algorithm, Zitadel JWT/JWKS internals, secrets/logging/config hygiene) surfaced 11 distinct defects. Every finding was independently re-verified against current code before being added. Notable: two admin delete paths (clearAllProfiles, the generic collection-delete route) bypass the dedicated picture-cleanup service entirely, permanently orpha…

  155. Add bug-hunt round 5 findings (7 stories, 13 sub-items) to WAVE-0 · da3d47e

    Six more parallel adversarial bug-hunt agents (profile/journey, media/file handling, push/device, cross-cutting middleware, background jobs/health, Node<->Python integration) surfaced 12 distinct defects (two agents independently converged on the same X-Forwarded-For rate-limit bypass, and two independently found the same unbounded profile-answer field — merged into single items rather than duplicated). Every finding was independently re-verified against current code before being added. Headline: W0.38 is a rate-l…

  156. Replace leftover contract-management generate-all instructions with the in-repo pnpm filter command. · a347947

  157. Add in-repo OpenAPI client generator package · ebdeed5

    Enroll @ifeoma-tc/openapi-client-generator in the pnpm workspace so product Axios, types, and Zod regen runs inside this repo instead of contract-management.

  158. Pin web OpenAPI generate scripts to the owner SSOT · c05c010

    Stop honoring OPENAPI_SPEC_PATH and WEB_CLIENT_GENERATED_DIR so product client regen always writes from packages/contracts into src/apps/web.

  159. Replace the hand-mirrored matching client schemas with a generator from the owner matching spec, and materialize that file in API pretest. · 7b6150f

  160. Vendor the ML engine into src/apps/ml-service · 0f2c2e2

    Copy the stateless compute engine from app-infra-services so True Connection owns the runtime in-repo and compose can start it behind the full profile.

  161. Add bug-hunt round 4 findings (7 stories, 17 sub-items) to WAVE-0 · 0285872

    Six parallel adversarial bug-hunt agents (auth/session, discovery/ matching, connections/chat, billing/paywall, admin authorization, Python matching service) surfaced 17 concrete backend defects, each independently verified against the current code (several reproduced directly: JS Date month-overflow, IEEE754 Infinity self-equality defeating a NaN-only finiteness check, pymongo exception class names against the transient-retry classifier) before being added. Headline: W0.31 is a critical, currently-live account-ta…

  162. Don't overwrite a caller-supplied MONGODB_URI just because it lacks credentials · fbc3f2d

    docker-entrypoint-mongodb.sh treated "no @ in MONGODB_URI" as "incomplete, reconstruct it with credentials" -- but this repo's own root docker-compose.yml runs Mongo without --auth (see the matching service, which connects the same way with no credentials and works fine), so a caller-supplied credential-less URI is valid and complete, not a signal to invent bogus appuser/apppassword credentials. Verified empirically: a no-auth mongod rejects any client that supplies credentials at all ("Authentication failed"), so…

  163. Write standalone-full-stack runbook, update plan 26 with actual status · 65d9136

    Documents the new app/full docker-compose profiles (docs/runbooks/standalone-full-stack.md, linked from docs/runbooks/README.md) and updates plan 26's work list / open questions to reflect what actually shipped this pass (ml-service vendoring + the app profile) versus what's still deferred (mongo/redis vendoring -- reconsidered, not needed; Zitadel -- deferred as its own follow-up; contract codegen -- needs a second generator, not done).

  164. Resync package-lock.json with package.json (eslint ^9.39.5 drift) · 32ab2d9

    package-lock.json still pinned eslint@10.5.0 after a prior package.json bump to ^9.39.5, which `npm ci` rejects outright (EUSAGE, lockfile out of range) -- surfaced by actually running `npm ci` in the web Dockerfile's deps stage for the first time via the new containerized `app` compose profile. package.json itself is unchanged; this is a straight `npm install --package-lock-only` resync.

  165. Vendor real ml-service, containerize api+web for self-sufficient docker compose · 7f8dbc9

    Adds two opt-in docker-compose profiles so the product runs fully self-sufficiently with nothing outside this git root: - `app`: containerizes api + web themselves (they previously had to run via `npm run dev` on the host). Uses the existing but previously-unwired "dev" build stage in each Dockerfile. Identity stays DEV_AUTH_BYPASS=true -- no real ZITADEL yet. - `full`: real ml-service (NLP/entropy/Qwen compute), vendored wholesale from the sibling app-infra-services repo per docs/plans/26-standalone-runtime-vendo…

  166. Fix stale Stripe API version SSOT, record real full-suite baseline in WAVE-6 · 522b0cd

    Running the full src/apps/api Vitest suite for the first time in this session's environment (after pnpm install --frozen-lockfile, no node_modules had been installed) surfaced one real failure: STRIPE_API_VERSION in stripeWireHelpers.ts still pinned "2026-06-24.dahlia" while src/pnpm-lock.yaml now resolves stripe@22.5.0 ("2026-07-29.dahlia") — a plain drift of the documentation/test-SSOT literal behind the lockfile, not the drifted-node_modules mistake the comment's own W0.14.j history warns against (confirmed aga…

  167. Add WAVE-6 backend-only API use-case audit, flag paywall bypass, fix hardcoded paths · f74e09d

    WAVE-6 audits every product capability (WAVE-5) against product.openapi.yaml and matching.openapi.yaml to confirm which use-cases are completable through the backend API alone, ignoring the web frontend. Six parallel domain audits (auth/identity, onboarding/profile/journey, discovery/matching+ML, connections/chat/push, admin/platform ops, billing/cross-cutting) verified real route/service implementations and test files, surfacing real gaps: peer legal names ship unconditionally on discovery responses at every disc…

  168. Sync local changes · 3147159

  169. Commit Next.js-generated agent rule files · 8b82120

    next dev auto-writes src/apps/web/{AGENTS,CLAUDE}.md on every run; committing them (as Next.js itself recommends) keeps the working tree clean instead of leaving them perpetually untracked.

  170. Clarify former infra services live in sibling app-infra-services repo · 4a4b0e2

    Adds a note under Infrastructure dependencies so readers checking out this repo under a shared parent directory alongside its infra siblings know where the former (pre-split) infra services actually live -- app-infra-services, over HTTP, per the repo boundary rule in CLAUDE.md -- rather than assuming they were vendored back into this repo.

  171. Mark branch deprecated (superseded, closed without merge) · dff4277

  172. Mark branch deprecated (merged via PR #23) · 66ec403

  173. Mark branch deprecated — superseded, merged into main · 4b0f40c

  174. Mark branch deprecated — superseded, merged into main · a41a296

  175. Mark branch deprecated — superseded, merged into main · 1c22625

  176. Mark branch deprecated — superseded, merged via PR #17 · 7785d61

  177. Mark branch deprecated — superseded, merged via PR #18 · b0bc5c8

  178. Mark branch deprecated — superseded, merged via PR #15 · 9784f53

  179. Mark branch deprecated — superseded, merged via PR #19 · 8e49795

  180. Mark branch deprecated — superseded, merged via PR #14 · 604b25c

  181. Mark branch deprecated — superseded, merged via PR #20 · f8403d9

  182. Mark branch deprecated — superseded, merged via PR #13 · ea3e1c6

  183. Apply follow-up fixes not carried by the parallel branch consolidation · 36c288c

    The claude/merge-workstreams-cujdxo branch this repo used for the multi- branch consolidation was already merged into main (PR #24) by a parallel effort while this branch was independently reconciling the same set of outstanding claude/* branches. Restarted this branch from the latest main per the merged-branch protocol and carried forward only the content still missing from main after that merge, rather than replaying the already-merged history: - claude/i18n-localize-discovery-paywall-copy never landed anywhere:…

  184. Deduplicate bad-merge artifacts, resync stale locale bundle · 45d1291

    main was broken: several independent branches merged in quick succession each added the same fix independently, and the merges concatenated instead of deduplicating, leaving: - storageUnavailableLabel declared twice in the same object-type literal (GlassDisclosureSection, GlassStepDisclosure) — tsc duplicate-identifier. - parsePaywallLimitError imported three times in useConnectionManagerWorkflow.ts. - readEnrichedDiscoveryDisplayScore imported twice in DiscoveryUniverseAiRecommendationTeaser.tsx and useDiscoveryP…

  185. Land the duplicate-mock removal from the previous merge commit · 05537b1

    The Edit-tool fix removing the duplicated 'const stableAuthUser' / vi.mock('@/features/auth/useAuth') block (surfaced by actually running the suite, not by any conflict marker — see the previous commit's message) was made on disk but never staged before that commit landed. It sat as an uncommitted working-tree change through the clean web-regression-hunt-round-3 merge, which didn't touch this file. Landing it now, verified still needed: the duplicate is exactly what the previous commit's message already described …

  186. Localize discovery/paywall copy, close remaining i18n suite failures · d33874b

    `main`'s independent bug-fix work (button presets, discovery score SSOT reads, tsc errors) left every hardcoded string in these components untouched, so the same 4 i18n test files that were failing before that work landed are still failing on main today: designSystemLocalizedUiInvariant, localizedUiTextScanner, messageKeysReferencedInSource, messagesNonEnMustDifferFromEn. Localizes the discovery paywall surfaces (super-like, photo reveal, reshuffle, supermatch card, AI recommendation teaser, refine-profile CTA) an…

  187. Resync api lockfile, fix EntitlementService typecheck, add api typecheck to the closeout gate · 62b2743

    Closes W0.12.p. src/apps/api never had a reproducible `npm ci`: package.json allows firebase-admin ^14.2.0 freely, and its transitive google-auth-library / google-gax deps had drifted past what the committed lockfile pinned. Resyncing with `npm install --prefix src/apps/api` touches only gcp-metadata/gaxios under those two parents (26 version lines) - confirmed by inspecting the diff, not a wholesale bump. `rm -rf node_modules && npm ci` now exits 0. That surfaced the 8 EntitlementService.ts errors prior stories h…

  188. Resolve useUserProfilesTabState's 4 findings (246 -> 242) · e9a1c0f

    - Identity-swap effect (4 SRC-BUG ids, one reset) documented with a block eslint-disable/eslint-enable, same pattern as the last several files. - Missing-dependency warning on the clearMutation-reset effect: widened [sessionAuthUid, clearMutation.reset] to [sessionAuthUid, clearMutation] per the rule's own suggestion — the body only calls .reset(), so this is a dependency-list correction, not a behavior change. - profiles derived as `!isError && data ? data.profiles : []` created a fresh [] literal on every render…

  189. Drain the MED/LOW residue tier — scan clean at every severity · 88a5925

    Sub g only cleared the HIGH tier (the one the gate checks). Two classes of work to take the remaining 458 hits across 81 files to zero: Dead code deleted outright, each confirmed zero-consumer first: - src/interface/ — the Python path facade for pipeline runners, trimmed to backend/web/openapi paths by the prior commit, now removed entirely; its remaining callers are control-plane runners, not this repo. - importlinter.ini + importlinter-fleet.ini — Python import-linter configs whose own targets don't exist in thi…

  190. Resolve useOnboardingPage's 4 findings (250 -> 246) · f71fb55

    Same three patterns as the last several files, applied to the onboarding welcome form's view-model hook: - viewerAuthUidRef mirrored during render -> moved into a layout effect, since the TOCTOU guards throughout this hook (photo upload, geolocation detect, submit) all read it from callbacks, never during render. - SRC-BUG-ONBOARDING-FORM-SWAP's identity-change reset and the load-then-sync-from-profile effect are both legitimate multi-setState resets, documented with block eslint-disable/eslint-enable pairs rather…

  191. Clear the web atomic suite's 23 pre-existing failures · fc42659

    Root-caused and fixed each of the 23 failures tracked as WAVE-0 W0.14, plus a follow-on i18n gap the fix work surfaced. Categories: Missing/stale test mocks (no product bug): - usePushNotificationsEnable.test.tsx (7): the hook now calls useAuth(), which the test never mocked, so every render threw "useAuthContext must be used within AuthProvider". Added the mock. - appVersionHealthRoute.test.ts (4): GET /api/health gained IP rate limiting and now requires a real NextRequest; the bare GET() call threw in requestIp(…

  192. Fix useChatMode's ref-in-render-argument pattern (258 -> 250) · eb3c188

    useChatMode called createLoadChatSession({...}) / createSaveChatSession({...}) directly as useCallback's first argument. Two problems that turned out to be the same root cause: (1) the factory call is evaluated eagerly every render regardless of useCallback's deps, since it's the argument expression, not something useCallback controls; (2) the factory closes over sessionIdentityRef, so evaluating it during render counted as reading the ref during render even though the returned closure only reads .current when act…

  193. Close W0.19 — web build is green · 2c5c056

    Claude-Session: https://claude.ai/code/session_01HLWzkTgxvQgb3BfP6m3LN2

  194. Clear all 13 pre-existing tsc errors, web build now exits 0 · d6afb45

    Closes W0.19. Worked from the tsc --noEmit list (the build stops at the first error, so fixing one at a time would mean one full build per fix). Three clusters: (a) Two undefined names, simple missing imports — the symbols exist and are exported: - useConnectionManagerWorkflow.ts: parsePaywallLimitError (already imported the same way by useConnectionWorkflowErrorHandler.ts and useDiscoveryPageContent.ts). - DiscoveryPageContent.tsx: DiscoveryPageListChrome, a sibling component in the same directory (its own README…

  195. Finish react-hooks/static-components (259 -> 258) · 604ee6b

    MatchIntentScopePickerBody assigned scopeFocusQuadrantIcon(option.id)'s result to a capitalized local (Icon) inside ScopeGridCell and rendered it as a tag. Every branch of that function returned a stable module-scope icon reference (Heart/UsersRound/Briefcase/HandHeart), never created anything, but the shape still reads as "component defined during render" to the rule. Replaced the if-chain with a module-scope lookup table indexed during render instead of called, which the rule accepts. Caught a real gap while fix…

  196. Wave-plan state dashboard + gate wiring + drop sibling-repo script deps (#14) · db1a714

    * Add read-only wave-plan state dashboard plan/waves/WAVE-*.html is the task-tracking SSOT, but there was no way to see drain state across the five waves without reading 107KB of HTML by hand. scripts/wave-state-dashboard.py parses the wave files and reports: - per-wave progress (stories, sub-todos, percent complete) - stories ready to pick up, with their next open sub-todo - stories blocked by an unfinished dependency (needs:) - stories parked behind a manual decision gate (verify:manual) Serves an HTML view on 1…

  197. Drain four react-hooks concentrations (282 -> 259) · a2bb0f9

    File-by-file pass over the W0.16 backlog. Four files, 23 findings, each judged individually rather than batch-disabled. Real fixes, where the rule was pointing at something worth changing: - UserProfilesTableSection defined SortHeader inside its render body, so React saw a fresh component type every pass and remounted the whole header subtree instead of updating it. Hoisted to module scope with sortKey/sortDirection/onSort threaded as props. This was the genuine defect of the four. - useMatchManagementTabState had…

  198. Align STRIPE_API_VERSION with the lockfile-pinned SDK (W0.14.j) · 88ad878

    STRIPE_API_VERSION was "2026-07-29.dahlia" while the lockfile pins stripe@22.3.1, which bakes in "2026-06-24.dahlia". Since stripeWireHelpers.test.ts asserts the constant equals the installed SDK's own API_VERSION, it failed on every faithful install; it passed when introduced only because that node_modules had drifted ahead of the lockfile. Reverts the constant to 2026-06-24.dahlia to match the pinned SDK, and updates the header docstring and @see URL to match. This is behaviour-neutral: runtime pinning is Stripe…

  199. Resolve script deps from this repo only, not a sibling checkout · ba879a0

    verify-product-contract-ssot.mjs anchored its createRequire at ../app-infra-operator/contract-management/tools/package.json, so the product OpenAPI SSOT gate could only run on a machine that also had the operator repo checked out beside this one. Without it the gate died with a misleading "YAML parse failed: Cannot find module 'yaml'" — the first step of verify-product-gates.sh, so the whole maintainer bundle was unrunnable. This contradicted the repo boundary in CLAUDE.md ("never cross-repo-import or symlink into…

  200. Record measured W0.16 progress (493 -> 282) · 651baa3

    Updates every W0.16 check with counts taken from an actual eslint run rather than estimates, and adds W0.16.e for the two real defects the "cosmetic" rules turned up. Done: W0.16.c (no-unused-vars 82 -> 0, plus the 11 auto-fixable findings and every remaining non-react-hooks rule) and W0.16.e (the two missing imports, the blob-URL <img> tags, the dev-page literal labels). Open: W0.16.a is 183 -> 77 with the 106 WebGL findings resolved; W0.16.b is untouched at 144 and is now the largest category; W0.16.d holds the …

  201. Resolve the 106 WebGL react-hooks/refs findings · 86423d5

    Third W0.16 pass. 388 -> 282; react-hooks/refs 183 -> 77. These two files held 106 of the 183, and they needed opposite treatments. useUniverseWebGLCanvasRuntimeRefs mirrored 22 props into refs with render-phase `xRef.current = prop` writes. That is exactly what the rule targets, and the file already demonstrated the correct form — three of its refs were assigned inside useLayoutEffect. The 22 now share one pre-paint effect, making the file internally consistent. Verified safe before moving them: nothing reads the…

  202. Two missing imports, and clear every non-react-hooks lint rule · 675069f

    Second W0.16 pass. 400 -> 388, and every rule outside react-hooks/* is now at zero. Two of these were real defects, not style. react/jsx-no-undef and @typescript-eslint's TS2304 were pointing at the same thing from different angles: - DiscoveryPageContent renders <DiscoveryPageListChrome {...vm} /> but never imported it, though the component file sits right next to it. Rendering the discovery list view would have thrown a ReferenceError. - useConnectionManagerWorkflow calls parsePaywallLimitError in its paywallPur…

  203. Clear all 82 no-unused-vars lint findings (W0.16.c) · 6598515

    First pass on the W0.16 lint backlog, taking the mechanical category end to end: @typescript-eslint/no-unused-vars 82 -> 0, plus the 11 auto-fixable findings (6 stale eslint-disable directives, 5 prefer-const). Total 493 -> 400. 66 were unused import specifiers, removed with a script that only touches named-import braces and drops the whole statement when nothing is left bound. Three default imports and the remaining bindings were handled by hand: - QuestionPhaseBase, PrivateMode, MatchManagementIndexCard, useBloc…

  204. Record the 19 web fixes under W0.17 and file W0.19 for the red web build · 775ed98

    W0.17 moves from 23 failures to 4: W0.17.a closes the 19 non-i18n ones (two genuine product bugs in source, seventeen stale doubles/assertions against correct source — detail in the sub). W0.17.b splits out the remaining i18n cluster and marks it blocked by design: CLAUDE.md's standing policy is to never start i18n work unprompted, so it stays open until someone asks, and nobody has yet triaged whether those four are stale baselines or real untranslated copy. W0.19 is new and was surfaced by running the gate CLAUD…

  205. Clear the 19 non-i18n atomic suite failures · 11c6884

    Takes the web atomic suite from 23 failed / 3446 passed to 4 failed / 3465 passed. The remaining 4 are the i18n cluster, untouched under CLAUDE.md's standing i18n policy (they need an explicit in-conversation ask). Tracked as W0.17. Two genuine product bugs, fixed in source: - ConversationMatchCard.tsx: connection-only inbox rows entered the profile-for-sheet resolver. Only `candidateProfiles` was gated on `originalDiscoveryProfile`, but `useDiscoveryProfileForSheet` enables its query on `candidate != null || trim…

  206. Repair inconsistent lockfile so npm ci works (W0.14.a) · dae6382

    npm ci could not install src/apps/api at all: node_modules/mongodb declares gcp-metadata@^7.0.1 while the lockfile hoisted gcp-metadata at 8.1.2 with no nested ^7.x copy, so npm exited EUSAGE. Repaired with npm install --package-lock-only rather than deleting and regenerating the lockfile, to avoid re-resolving every range to newest-satisfying and churning the whole dependency set. The result is minimal: 718 -> 700 packages, exactly one version change (hoisted gcp-metadata 8.1.2 -> 7.0.1, now satisfying mongodb), …

  207. Drain the control-plane residue backlog — gate bundle green · ad1bfb2

    The residue scan's 23 HIGH hits were all prose, and all of it claimed this repo hosts control-plane tooling it has never had. Each hit got the same treatment the code did: re-point the sentence at the repo that owns the thing, or delete the claim when it describes a layout that no longer exists. - docs/TEST_ISOLATION.md billed itself as SSOT for cross-module pytest boundaries across Fleet, Pipeline, Operator and Tenant — a product repo acting as SSOT for tests it does not host. Rewritten to cover this repo's own s…

  208. Clear all 13 typecheck errors · 2a62ae8

    Two were live runtime bugs, not just type noise: - postPaywallAddonPurchase / postPaywallSubscriptionPurchase passed the body as a flat object, but the generated axios client reads it from `paywallAddonPurchaseRequest` / `paywallSubscriptionPurchaseRequest` (the convention every other call site follows). Both calls were therefore POSTing an undefined body — no add-on or subscription purchase could have succeeded. Bodies are now nested. - GetDiscoveryProfilesRequest had lost its `realtimePoll` property while its do…

  209. Gate wave-plan structure in verify-maintainer-gates.sh · c48158b

    Adds a --check mode to wave-state-dashboard.py and chains it into the maintainer gate bundle. It verifies only structural coherence of the wave plan, never whether an item is done, so it stays a mechanical gate with no product-decision surface: - every WAVE-*.html has a parseable <section id="wave"> … <pre> block - no non-blank line inside <pre> is silently dropped by the item grammar - story/sub-todo ids are unique, match their wave's prefix, and sub-todos extend their parent story id - every item carries a verif…

  210. Add web typecheck and build to verify-maintainer-gates.sh · 5d164ed

    Closes the systemic gap behind W0.12.m: the maintainer closeout bundle ran neither tsc nor next build, which is how 13 src/ type errors and a buttonPreset id that never existed in the preset union reached main with every gate green. - `run_web typecheck` runs first: fastest path to failure, and type errors are the class this bundle actually let through. - `run_web build` runs last: slowest, and only adds bundler/route-collection coverage on top of typecheck. - next build aborts page-data collection without an abso…

  211. Green the 14 failing atomic test files · a73fa2e

    Three real product/source defects, the rest stale tests and untranslated UI. Product fixes: - ConversationMatchCard passed peerProfileId/peerAuthUid unconditionally, so connection-only inbox rows (no discovery origin) still entered useDiscoveryProfileForSheet and fired a discovery query for a peer with no discovery row. Both ids are now gated on the candidate, as the SSOT test asked. - Discovery supermatch selection, its reveal card, and the AI teaser sorted and displayed raw `.matchPercentage`, bypassing readEnri…

  212. Boot an in-process mongod so the suite runs standalone · 02921b5

    The api suite was failing 122 tests across 37 files. Not 37 bugs: route and middleware tests boot the real Fastify app, platform-role resolution hits Mongo, and middleware/auth.ts:227 turns an unreachable datastore into a 503 — so assertions degraded to "expected 200/404, got 503" with 228 503s and ECONNREFUSED against a closed 127.0.0.1:27017. Two changes, both needed: - tests/globalSetup.mongo.ts boots mongodb-memory-server once per run and provides its URI via Vitest provide/inject. It was already an apps/api d…

  213. Take the value, not the path — drop the remaining outside reads · 832f5ef

    The previous pass replaced hardcoded sibling paths with env vars pointing at the same outside trees. That is not a fix: this repo still read another repository's files, the coupling just moved into configuration. CLAUDE.md now says so explicitly — secrets and config arrive as values, never as a directory to rummage through, and the one exception is the tenant merge-env file the caller hands us. Removed accordingly: - E2E_TENANT_PACKAGES_DIR, along with the whole tenant-id branch it served. resolveTenantEnvPathSync…

  214. Unbreak eslint and the documented dev entrypoint · fc39bad

    W0.15.a — eslint crashed on every file with "Error while loading rule 'react/display-name': contextOrFilename.getFilename is not a function". ESLint 10 removed context.getFilename() in favour of context.filename, and eslint-plugin-react@7.37.5 still calls the old API, so the lint gate did not run for anyone. Bumping the plugin is not available: 7.37.5 is the latest published release and its peer range tops out at ^9.7. It is also not a direct dependency here — it arrives via eslint-config-next, whose own peer is e…

  215. Track the red web and api test suites as W0.14 and W0.15 · 9d12d36

    Both suites were run for the first time after a clean pnpm install. Neither is green, so record the failures as work rather than leaving them undiscovered. W0.14 — web atomic suite: 23 failures across 14 files, grouped by cluster so each sub-todo is independently runnable. Largest is 7 failures in usePushNotificationsEnable, all thrown from the hook's first render. Also records that the suite's exit code is masked when the command pipes through `tail`, which is how the red run was initially misread as passing. W0.…

  216. Remove every remaining cross-repo filesystem reach · 30113dc

    Follows eda6a20, which recorded the rule and fixed the two contract-layer reaches. This removes the rest, so nothing in this repo resolves, reads, executes, requires, watches, or resolves node_modules from a sibling checkout. - dev-watch-sync.mjs no longer watches an OpenAPI sources/ tree in a sibling checkout or execSyncs that repo's bundle-openapi.mjs; the bundled spec in src/packages/contracts is the whole contract watch surface. - tests/atomic/helpers/infraSiblingPaths.ts is gone, split into mergedTenantEnv.ts…

  217. Add W0.14 for untracked web suite failures and broken npm ci · 848a4aa

    Wave-plan gap audit: the web offline suite has 12 failing test files / 21 failing tests, and none of the 12 filenames appeared anywhere in plan/waves/. This is the same blind spot W0.13 closed for src/apps/api, never done for src/apps/web -- verify-maintainer-gates.sh runs neither app's suite, and each story's targeted verify command only matches its own files, so a green per-item verify never implied a green suite. All 12 confirmed present at 98f0c55 via a clean git worktree run, so they pre-date the 2026-08-17 b…

  218. Fix all 13 web type errors at root cause; npm run build is green again · 2f66573

    Closes W0.12.m. tsc goes from 13 src errors to 0 and `npm run build` exits 0. Two of the three diagnoses filed earlier were wrong and were corrected by checking the code rather than assuming: - Button presets were NOT a rename. `git log --all -S "pill-brand-solid"` shows that id never existed in button-brand.ts at any point, so this code never typechecked. Re-pointed each at the registry's documented intent: filter-chip active state to pill-brand-glass-segment (whose idle partner documents that exact pairing), thr…

  219. Drain the 24 HIGH control-plane residue hits · c5f0e6c

    verify-product-gates.sh failed at its last step with 24 active HIGH hits from scan_control_plane_residue.py. Audited all 24 individually rather than moving the gate's threshold. Exactly one was real product-source residue: e2e_base_url.ts's resolver error message pointed readers at fleet-management/tests/ run_e2e_registration_*.py, a path inside a sibling repo, which the product-only boundary rule forbids. Rewritten to state the contract — control-plane deploy runners set E2E_BASE_URL once merge-env resolves — wit…

  220. Retire the phantom loop kit (W1.8 decided: retire) · d032c5e

    Maintainer decision on the W1.8.a gate: retire rather than build. The .cursor loop kit — loop-project.env, scripts/loop-lock.sh, loop-locks/, LOOP-KIT-PORT.md — was referenced by hub docs from 2026-07-04 but never existed in any commit, branch, or sibling repo. No design was ever recorded and nothing in this repo's automation depended on the lock running, so building it would have meant inventing semantics nobody specified. Deleted the two placeholder docs, which emptied .cursor/ entirely — the last residue of the…

  221. Make verify-maintainer-gates pass without a sibling checkout · 23affc1

    The bundle previously died on its first step because verify-product-contract-ssot.mjs resolved `yaml` through app-infra-operator (fixed in the previous commit). With that gone it ran to completion and surfaced three real, repo-local failures: - scan_control_plane_residue.py --fail-on HIGH: 24 hits. One was code — an error string in e2e_base_url.ts naming fleet-management/tests/run_e2e_registration_*.py; reworded to describe the env contract instead. The other 23 were prose in docs/plans/** design narratives, which…

  222. Repair two tests left red by 6e45081 · 035011a

    Both were introduced by the previous commit and are unrelated to each other; the offline suite went from 12 failing files to 14. prefsOptimisticRollback: useUserPreferences now calls useTranslations() and fires a sonner toast from the mutation's onError. This test renders the hook with no NextIntlClientProvider above it, so the render threw before reaching any rollback assertion. Mocks next-intl and sonner, the same way the sibling useUserPreferencesOptimisticRollback test already does. orb-brand: 6e45081 delibera…

  223. Unbreak the contract gate and the stale runbook link · 4fa8d17

    W0.15.d — verify-product-contract-ssot.mjs anchored createRequire at ../app-infra-operator/contract-management/tools/package.json purely to resolve `yaml`, so verify-product-gates.sh died with "Cannot find module 'yaml'" in any checkout without that sibling repo installed alongside, which is every fresh clone. It also cross-repo-imported a sibling, which this repo's own boundary rule forbids. It now resolves `yaml` from this workspace (src/apps/web/node_modules first, where yaml@^2.9.0 is a declared dependency), u…

  224. Record the auth, lockfile and cross-repo work in WAVE-0/WAVE-4 · d086b75

    The last three commits changed code without touching plan/waves/, which is this repo's task-tracking SSOT per CLAUDE.md (KANBAN.md is frozen). Backfills them and, more importantly, records what is still open so it is not carried only in a session transcript. WAVE-0 — closed stories: - W0.14 (a-c): follow-up defects in W0.2.c/W0.2.d's own fixes, found re-reviewing 3ce5bc4 alongside the dev-bypass lock work. dev-bypass-status diverging from the middleware's predicate; optional-auth swallowing PlatformRoleResolutionE…

  225. Forbid cross-repo filesystem reach; drop two sibling-repo calls · eda6a20

    Records the rule in CLAUDE.md: nothing in this repo — scripts, maintainer gates, dev tooling, tests, CI helpers — may resolve, read, execute, require, watch, or resolve node_modules from a sibling checkout. The only permitted coupling to the control plane is a decoupled definition: an HTTP API call, the OpenAPI/contract SSOT, or a contract artifact vendored here. The previous wording only bound "product code", which left the gates and tooling exempt. Two live violations removed: - verify-product-contract-ssot.mjs …

  226. Delete the orphaned p124 path rewriter · 6b20560

    scripts/p124-path-replace.py was a one-shot migration tool whose replacement table still mapped app-pipeline -> infra-cicd-pipeline, a tree this repo no longer has. Nothing invoked it: no gate script, no CI, no other script — its only references were the scripts/README.md row (removed here) and the WAVE-1 row tracking the decision. scripts/p124-rg-active-gate.py stays. Despite the shared prefix it is a live guard that blocks stale pre-layout app-* path tokens from reappearing in the active tree, and it is wired in…

  227. Repair api lockfile drift and remove all cross-repo code paths · 45ebc8c

    Lockfile drift (root cause of `npm ci` EUSAGE, and of the one real API test failure): mongodb@7.5.0 declares an optional peer `gcp-metadata ^7.0.1`. firebase-admin pulls google-auth-library@10.9.1, which pins `gcp-metadata 8.1.2`, and npm hoisted that to the shared `node_modules/gcp-metadata` — violating mongodb's peer range. `npm install` tolerates the conflict; `npm ci` refuses it, so clean installs could not work at all. Regenerating nests gcp-metadata correctly under google-auth-library and google-gax, and dro…

  228. Restore loading-halo colour, expose choice-chip state, de-duplicate brand hex · 496c2ec

    Fixes W0.12.f-j. The colour change in W0.12.i turned out not to be the brand decision it was first filed as: `git show 6e45081` shows both loading components previously rendered the literal rgba(139, 92, 246, ...), so #8B5CF6 was the shipped colour and the token migration replaced it with brand violet inside a 93-file commit whose message mentions only "refresh orb tokens". That is a regression, so this restores prior behaviour rather than escalating. - LoadingSpinner / LoadingScreenView now call getLoadingSpinner…

  229. Record the dead-path removal under W1.14 · de082de

    Add W1.14.f for the shipped dead in-repo path cleanup, and W1.14.g for the one item left undecided: p124-path-replace.py still maps app-pipeline -> infra-cicd-pipeline, a tree this repo no longer has. Claude-Session: https://claude.ai/code/session_01CXaBryN3TbrWRGLDV2cCxv

  230. A11y(question-card): announce selected choice chips via aria-pressed · 2be2c2f

    Reflection choice chips signalled selection with colour, border/shadow and an aria-hidden Check glyph only, so screen-reader users could not tell which options were selected and heard no state change on toggle. Both chip grids (the optionsPrimary grid and the legacy "Show examples" grid) now set aria-pressed, matching the toggle-chip pattern already used by RatingCard and the discovery filter chips. Kept aria-pressed for the single-selection mode rather than promoting the grid to role="radiogroup"/role="radio": a …

  231. Remove dead in-repo paths left behind by the boundary cleanup · aef0ce0

    Follow-up to the cross-repo removal. These paths are repo-relative rather than sibling escapes, but none of the directories exist in this product-only repo, so every code path through them was unreachable. - src/interface/__init__.py: delete ml_service_path, ios_path, android_path and schemas_generated_path. They resolved machine-learning/, src/40_ios, src/50_android and contract-management/ respectively — none present, so each could only raise. README table updated to match. - e2e_base_url.ts: delete findProductR…

  232. The capability matrix becomes an implementation wave. · 8617df3

    All 184 capability rows across its 21 tables are now sub-todos in plan/waves/WAVE-5.html, carried over verbatim with their status, code anchor, notes and KANBAN id — verified row-for-row, 184 in and 184 out, none dropped. The wave is framed on the premise that these capabilities already exist: the great majority were recorded as Shipped, so the default unit of work is confirming the anchor is really there and really matches the claim, not building anything. A sub-todo only becomes implementation work when the anch…

  233. Track repo-boundary isolation work as W1.14 · 4364264

    The cross-repo path removal was not recorded in any wave. Add it as W1.14 with the shipped sub-todos checked and the open follow-ups left explicit: the test suites were never run (no installable node_modules in the authoring container), there is no regression guard for path escapes, and the remaining prose mentions of app-infra-* still need a call. Wire W1.14 into W1.13's needs list so the wave exit demo cannot close without it. Claude-Session: https://claude.ai/code/session_01CXaBryN3TbrWRGLDV2cCxv

  234. Drop remaining cross-repo pointers from e2e helpers and tests · 6a90a47

    Second pass over the out-of-repo path escapes, covering the e2e layer and the tests that asserted on sibling-checkout behaviour. - e2e_base_url.ts: remove findInfraOperatorRoot and the sibling tenant-management roots; tenant env now resolves from in-repo paths plus the caller-supplied E2E_MERGED_ENV_PATH / E2E_TENANT_ENV_PATH. Neutralize the error hint that told operators to reach into the sibling checkout. - zitadel_mfa_admin_pat_http.ts: map container-absolute /zitadel-secrets/ paths via ZITADEL_ADMIN_PAT_PATH i…

  235. Remove cross-repo path resolution from product code · ee74243

    This git root is product-only, but several scripts, helpers and the Python source facade resolved filesystem paths into the sibling app-infra-operator / app-infra-services checkouts. That made a standalone clone unable to run its own gates (verify-product-contract-ssot died on a sibling node_modules). Remove every out-of-repo path escape: - verify-product-contract-ssot.mjs: resolve `yaml` from in-repo node_modules instead of app-infra-operator/contract-management/tools. - generate-api-zod-schemas.mjs: drop the sib…

  236. Remove all cross-repo filesystem pointers · 1c45f54

    This git root is product-only. Nothing in it may resolve a path outside its own root — the sibling app-infra-operator checkout is reachable over HTTP and tenant merge-env only. Removed (pure cross-repo delegators / facades): - run.py — subprocess wrapper into conformance-management/run.py - src/interface/ — SourcePublicInterface path facade for pipeline runners, plus the atomic test that only guarded it - tests reading a sibling checkout: dryVerificationMatrixManifest, traefik-admin-path-rule Stripped sibling-path…

  237. Track landing orb + meteor work and the issues it surfaced · 9ab6c95

    Nothing from this session's landing/orb work was in the wave plan. Adds the stories, splitting them by whether they need a decision. WAVE-0 (actionable now): - W0.14 — landing hero orb + shared meteor system. Sub-todos a-e record the fixed defects with their evidence: the inverted-Y trajectory that made half of all meteors leave the viewport, the unit-string trail bug that stacked every particle at the spawn point, the two-thirds-of-width orb sizing, the compositor tile seams traced to the orb layers' translateZ(0…

  238. Track token/SSOT defects missed by the first sweep pass as W0.12.i-k · 94c32ca

    A second triage pass over the same tree found that the remaining rgba()/hex literals dismissed as non-findings on the first pass included three real defects, one of which was introduced by the token migration itself: - W0.12.i — `getLoadingSpinnerRadialGlowStyle` (loading-surface-brand.ts) is the purpose-built helper for LoadingScreenView/LoadingSpinner and emits the identical gradient shape from #8B5CF6. Both components were migrated to `getRadialGlowBackdropCss` (#A78BFA) from the orb module instead, silently ch…

  239. Fill the width in landscape, remove orb tile-seam artifacts · b6ffd44

    Orb sizing: getLandingHeroBrandOrbSizePx now takes two thirds of the viewport WIDTH in every orientation, not the shorter axis, so landscape fills the same share of the screen as portrait. It is capped to the viewport height so the sphere is never cut off by the top/bottom edge, and floored at LANDING_HERO_BRAND_ORB_MIN_PX. The Hero no longer caps the orb to its layout slot; the orb is absolutely positioned, so a diameter larger than the slot moves the sphere behind the headline and CTA rather than pushing them ou…

  240. Align dev-bypass status with its own gate, fail closed on optional-auth role errors, make forced sign-out survive a failed logout · 5ffc0d7

    Three defects found reviewing 3ce5bc4 alongside the dev-bypass lock work. - devBypassGate/middleware/internal routes: GET /api/internal/dev-bypass-status answered bare `!isDevBypassLocked()` while middleware/auth.ts additionally required `isDev && env.DEV_AUTH_BYPASS`. That endpoint exists precisely so the web NextAuth provider never trusts its own NODE_ENV/DEV_AUTH_BYPASS check alone, yet the authority it defers to skipped the API's equivalent checks — an API with bypass switched off in its env still answered `al…

  241. Size the hero orb to two thirds of the screen · ad5e0c0

    getLandingHeroBrandOrbSizePx now returns two thirds of the shorter viewport axis instead of the old 140/160/200/240 breakpoint ladder. The orb is a circle, so the shorter axis is the one that constrains it: width on a portrait phone, height on a landscape desktop. Applying that ratio alone pushed the CTA out of the 100dvh fold (measured at 540x960 and 1440x900), so Hero caps the diameter to the slot the orb actually gets between the headline and the CTA, and clamps back up to LANDING_HERO_BRAND_ORB_MIN_PX so a cra…

  242. Close W0.10.b with the combined-measure resolution · 38b4fc1

    Records why the filed one-line fix (method='ranked') was not the right call for this gate's binary-label input, and what replaced it.

  243. Measure L8b residual correlation both ways instead of picking one · cb88eaa

    W0.10.b was filed as a docstring/implementation mismatch: the gate's docs say "Spearman" and its trace prints rho, but statistics.correlation was called with the default method="linear" (Pearson). The obvious fix is to pass method="ranked". Research into this gate's actual input says that would have been the wrong call. The residual is y - sim_transfer_expected(mirt) where y is a *binary* outcome label, so residuals collapse toward two clusters. Rank correlation degrades badly under exactly that shape: when one cl…

  244. Retire stale references to deleted files, close W0.10.h/i · 87b9bc9

    Every reference named in W0.10.h pointed at a file removed in 9a53fdf80. Rewrote each to describe current behaviour in place rather than restoring deleted docs, which is the default the todo called for. Two of the claims were wrong beyond the dead link. README.md's layer table said src/application/ holds the wave runner, recompute jobs and outbox poll -- that package contains only __init__.py; the real homes are src/jobs/, src/mmr/learning/ and src/routes/. And main.py's docstring said "the scaffold ships health +…

  245. Keep connection-rating precision, tighten the sync outbox guard · bcd603c

    W0.10.d -- filed as an int()-vs-round() inconsistency at the bank-score conversion in profile_cohort. Tracing it showed the conversion never sees a fraction: parse_stored_connection_rating truncates with int() first, so the reported 7.9-becomes-7 could not happen there. The truncation itself is the defect, and it is worse than the filed symptom. That function documents itself as mirroring the backend's parseStoredConnectionRating, whose parseRating helper keeps the raw number and range-checks that value. Truncatin…

  246. Keep blocking ML-engine calls off the event loop · 1820e09

    W0.10.f -- six internal routes are async def with fully synchronous bodies: blocking pymongo queries plus blocking httpx calls to the ML engine, the latter with timeouts up to 300s. Running on the event-loop thread, one slow or hung engine response stalls every other coroutine in the worker, /api/health included, so orchestration reads the pod as dead and cycles it. Two of them were worse than the reported case. The Qwen /generate and /match-narrative handlers called run_grounded_generate/run_match_narrative with …

  247. Restore STRIPE_API_VERSION to the pinned SDK's version · 870421f

    Commit 6e45081 bumped the STRIPE_API_VERSION documentation SSOT (and the accompanying docstring/@see link) to 2026-07-29.dahlia, but the pinned stripe SDK is still 22.3.1, whose baked-in Stripe.API_VERSION is 2026-06-24.dahlia. That drift broke the guard test, which deliberately asserts the constant against the installed SDK rather than a literal. Restore the constant and docs to 2026-06-24.dahlia so they match the SDK actually installed. Bumping this string is only correct alongside an SDK upgrade. Claude-Session…

  248. Constant-time internal-secret compare, unwedge the ingress cursor · 363bfee

    W0.10.e -- verify_internal_secret compared x-internal-secret to the tenant secret with a plain !=, which short-circuits on the first differing byte. That dependency guards every /api/internal/* learning, match, NLP and Qwen route, so response timing leaked the expected secret prefix by prefix. Now compared with hmac.compare_digest. Both sides are utf-8 encoded before the comparison: compare_digest raises TypeError on a str holding non-ASCII, and the header value is caller controlled. Header bytes above 0x7F arrive…

  249. Make shared shooting stars actually visible · 0b84aba

    The landing ShootingStars overlay now renders through the shared meteor system in components/background, which surfaced two defects in that system that had gone unnoticed while it only ran behind the in-app cosmic background. - calculateEndPosition negated sin to "correct" for CSS Y growing downward, but generateShootingStar authors its per-edge angle ranges in screen space already. The double correction sent every top-edge spawn (y = -5, 45deg-135deg) further up and every bottom-edge spawn (y = 105, 225deg-315deg…

  250. Close W0.10.a and file W0.10.j-l from the matching bug-hunt · c45018a

    Checks off W0.10.a (standard_errors dropped on the first egress record) and records the two blockers found while trying to run its verify command -- the matching suite could not execute at all from a clean clone, and the CL-001 cross-repo parity gate had never run because the two repos read the fixture from two different paths. Both are fixed in 63b3324 and filed as W0.10.j and W0.10.k for traceability. Files W0.10.l for the follow-up that fix exposed: now that the parity gate actually executes, its 8 golden cases…

  251. Stop dropping standard_errors, restore untracked pytest fixture, repair CL-001 gate · 63b3324

    Three related fixes, grouped because the last two are what made the first one verifiable. 1. attach_shared_surfaces() silently dropped standard_errors (W0.10.a) Attaching per-wave item surfaces to the first egress record rebuilt that record by listing its fields by hand, and the list omitted standard_errors. Every prod wave commit therefore discarded the computed standard-errors field for exactly one cohort member -- the first by sorted authUid -- degrading CAT/backend precision data for that user with no error an…

  252. Add read-only wave-plan state dashboard · 7fdcc3e

    plan/waves/WAVE-*.html is the task-tracking SSOT, but there was no way to see drain state across the five waves without reading 107KB of HTML by hand. scripts/wave-state-dashboard.py parses the wave files and reports: - per-wave progress (stories, sub-todos, percent complete) - stories ready to pick up, with their next open sub-todo - stories blocked by an unfinished dependency (needs:) - stories parked behind a manual decision gate (verify:manual) Serves an HTML view on 127.0.0.1:8799/dashboard plus /state.json, …

  253. Close W0.5.g and the W0.5 story · 5c0899e

    Wire-up of the preference-save error toast was already implemented and covered by a regression test; only the wave-plan checkbox was outstanding. Verified `npx vitest run useUserPreferences` (5 tests / 3 files, PASS) and confirmed the toast copy resolves in all five locales (en/de/fr/es/ar). The item's text called for a new i18n key, but the shipped fix reuses pre-existing, already-translated copy that was simply never wired to this hook — no new keys or locale/parity edits were needed. The 4 failing tests under t…

  254. Drop duplicate matching parity fixture exception · 81ace4f

    The blanket *.json rule already had an exception for src/apps/matching/tests/parity/fixtures/*.json further down the whitelist block. Commit 7450dbb added a second identical line, so the same pattern appeared twice. Remove the duplicate and keep the pre-existing one. Claude-Session: https://claude.ai/code/session_01CXaBryN3TbrWRGLDV2cCxv

  255. Track design-system a11y gaps found by the colour-token sweep as W0.12.f-h · 48c13cb

    The `getRadialGlowBackdropCss` token migration is already complete: a scoped sweep of `design-system/components/**` confirms `LoadingScreenView`, `LoadingSpinner` and `QuestionCardChoiceOptions` are the only call sites matching the single-stop `radial-gradient(circle, rgba(...), transparent 70%)` glow-backdrop shape, and all three are migrated. The remaining rgba()/hex literals in that tree (celestial renderers with per-object data-driven colours, Tailwind arbitrary box-shadow classes, skeleton shimmer, SearchBar …

  256. Fix remaining WAVE-0 bug-hunt items: admin rate limits, billing webhook idempotency, discovery privacy, and OpenAPI DELETEs. · 6e45081

    Also require mutual chat consent for full media disclosure, delete the unused ML client, and refresh orb tokens plus drifted tests.

  257. Allowlist checkout/portal redirect URLs · 98f0c55

    successUrl/cancelUrl/returnUrl for Stripe checkout and billing-portal sessions were only checked for presence, never validated against an allowed origin, before flowing unmodified into the provider -- an attacker-controlled URL could ride a real, trusted Stripe redirect to an attacker domain post-payment (open-redirect phishing setup). Now validated against CORS_ORIGINS (the app's existing trusted-origin SSOT) before calling the provider. Closes W0.5.p.

  258. Filter before paginating list queries · 1bb3629

    listConnections()/listConversations() applied Mongo-level skip/limit before filtering out blocked/dismissed/duplicate-peer rows, so a page whose raw window contained several such rows could return fewer than `limit` results even though enough legitimate rows existed further down the sorted collection -- infinite-scroll clients would treat that short page as "end of list" and hide real connections/ conversations. Now fetches the full viewer-scoped set, filters, then paginates in-memory, matching the pattern Discove…

  259. Key conversation mute state per viewer, not shared · eaa388b

    ConversationDocument.muted was a single boolean on the per-pair conversation row, so one side muting/unmuting a thread silently flipped the other side's state too. Replaced with mutedBy: authUid[]; muteConversation() now $addToSet/$pull only the caller's own id, and listConversations() derives each viewer's muted from membership in that array. Wire shape on GET /api/chat/conversations is unchanged. Closes W0.5.m.

  260. Stop hardcoded ios fallback misclassifying Android shells · 3fca3dd

    enableNativePushRegistration now falls back to detectPlatform()'s bridge-global inspection instead of a hardcoded "ios" default when the native bridge omits platform, matching the downstream fallback already used in features/device/api.ts. Closes W0.5.e.

  261. De-duplicate connection-stage messaging gate into a shared SSOT · a560d6f

    wave W0.5.d [SRC:chatConnectionTransportState.ts:39,messagingLifecycleGate.ts:29] — web's chatConnectionTransportState.ts used an explicit connection-stage allow-list while the API's messagingLifecycleGate.ts inferred "allowed" implicitly (anything not in its blocking set). They agreed for all 9 current ConnectionStage values, but a new stage added server-side without a matching client entry would silently misclassify as inaccessible on the client even though the API allows it. New src/config/connection-stage-mess…

  262. De-duplicate CORE_VALUE_IDS into a shared JSON SSOT · 7ab9c55

    wave W0.5.c [SRC:backfill-domain-ids.ts:57] — the 28-id core-value literal was hand-typed in three places: src/apps/api/scripts/backfill-domain-ids.ts, src/apps/web/src/lib/data/domain/coreValues.ts's CORE_VALUE_IDS, and tests/scripts/backfillDomainIdsLegacyMapping.ssot.test.ts. The backfill script hard-fails on any mismatch rather than silently drifting, but a real divergence would still have broken production data migration. New src/config/core-value-ids.json, following the existing pricing-catalog.json/email-ot…

  263. Fix stale biometric-challenge race comment (already fixed) · 4fe0b04

    wave W0.5.b [SRC:biometricChallengeShared.ts:10] — investigated the flagged verify-then-update race (two concurrent challenge submits both minting a session) and found it was already closed on 2026-07-12 by SRC-BUG-BIO-CHALLENGE-ATOMIC, a month before the 2026-08-10 UC-19 sweep that re-flagged the stale TODO comment describing the pre-fix behavior. markBiometricChallengeVerified's atomic findOneAndUpdate({challengeId, verified:false}, {$set:{verified:true}}) is the real mutual-exclusion point and already gates min…

  264. Add same-process overlap guard to the learning-cycle cron · 4451097

    wave W0.5.a [SRC:scheduled-tasks.ts:131] — node-cron does not wait for the previous invocation before firing the next tick, so a learning cycle that outlives LEARNING_CYCLE_CRON's interval would overlap with the next one, running concurrently against ml-service regardless of its own idempotency. Added a module-level in-flight flag around the learning-cycle callback: an overlapping tick logs a warn and returns immediately instead of starting a second concurrent run; cleared in a .finally() so it resets even if the …

  265. Whitelist matching parity fixture JSON files · 7450dbb

    The blanket *.json ignore had no exception for src/apps/matching/tests/parity/fixtures/, so any new fixture added there (e.g. golden_wave_post_bootstrap_output.json) would silently fail to `git add` unless force-added, risking a clean checkout that can't run the parity suite. The existing three fixtures turned out to already be tracked (committed in 12b64b441), but the gap remains for future fixtures.

  266. Add post-bootstrap golden-cohort parity fixture · 12b64b4

    wave W0.4.b (closes W0.4) [REQ:REQ-D-07] — the golden-cohort parity suite only ever exercised the bootstrap wave-0 branch (a fresh cohort's first wave, seeded from structural labels); it never proved correctness for the post-bootstrap branch, where real learningScorecardEvents are ingested and drive theta/matching updates through the actual outcome-fit model-training path. - golden_cohort.py: new run_golden_wave_post_bootstrap() — commits wave 0 (bootstrap) on a fresh mongomock db, seeds a deterministic 45-pair le…

  267. Stop hardcoding the stage host in root score.yaml · 70f0ec1

    wave W0.4.a [REQ:REQ-D-01] — score/api.score.yaml and score/web.score.yaml already used the neutral ${PUBLIC_DNS_HOST} placeholder for public-dns.host (control-plane render data), but the older root score.yaml (still the app-catalog score_path default until per-workload paths ship) hardcoded host: stage.trueconnection.app. Repointed it at the same placeholder, matching the per-workload descriptors' established convention, and dropped the now-stale "Catalog enrollment default (stage)" comment.

  268. De-duplicate email-OTP policy constants into a shared JSON SSOT · 2e8c922

    wave W0.2.f (closes W0.2 — all 6 auth/session bug-audit findings triaged) — src/apps/web/src/lib/auth/nextauth/email_otp.ts hardcoded the same 5 EMAIL_OTP_* values (max attempts, per-email/per-IP rate limits, TTL) that live authoritatively in src/apps/api/src/lib/auth/emailOtpService.ts, with no shared import — a manual-sync footgun if the two ever drifted. - New src/config/email-otp-policy.json, following the existing pricing-catalog.json SSOT pattern (see src/config/README.md): both apps now import the identical…

  269. Return the minted biometric session token from passkey login · 37f23e4

    wave W0.2.e — [redacted].ts discarded the biometricSessionToken/expiresAt that verifyEmailBoundPasskeyAssertionChallenge already mints on every passkey login, so the biometricSessions row was write-only dead data. - AuthPasskeyVerifyResponse (product.openapi.yaml) gained biometricSessionToken/expiresAt (required, same shape as the sibling BiometricSessionResponse used by /api/biometric/verify) — contract regenerated (zod schemas, openapi-typescript, openapi-generator axios client). - registerAuthPasskeyRoutes.ts n…

  270. Close optional-auth recognizer gap and force sign-out on dead refresh · 3ce5bc4

    wave W0.2 — auth/session hardening bug-audit batch (4 of 6 triaged). - middleware/auth.ts: optionalAuthenticateRequest only tried the ZITADEL JWKS check, silently treating a valid internal HMAC bearer or native-shell compat JWT as anonymous even though the same token authenticates fine on a required-auth route. Now tries the same token-format recognizer chain as authenticateRequest (internal bearer -> native-shell compat -> ZITADEL), excluding only the dev-only trusted-header path and dev-bypass (neither applies t…

  271. Align paywall visual design with the app design system [REQ-00-R08] · d3de963

    wave W0.1 — boost sheets, limit walls, and subscription dialogs used ad-hoc `border-border/60 bg-background/40` boxes and legacy Button variant props instead of the shared design system, plus a raw <select> and a hand-rolled loading scrim. - PaywallDialog, PaywallSubscriptionTermDialog, PaywallSubscriptionManagementCard: ad-hoc card wrapper -> GlassCard; variant="secondary"/"ghost" -> buttonPreset "pill-brand-glass-dialog" / "pill-neutral-ghost-inline". - SubscriptionMenu: raw <select> -> design-system Radix Selec…

  272. Full offline parity for local dev: no reachable Zitadel, Stripe, or ml-engine required for any feature, including paid checkout and NLP-affect scoring. · bce9db2

    Full offline parity for local dev: no reachable Zitadel, Stripe, or ml-engine required for any feature, including paid checkout and NLP-affect scoring. - Fix env-schema papercuts: ZITADEL_EXTERNALDOMAIN (unused, was crashing boot) made optional; ZITADEL_AUDIENCE folded into the centralized zod schema. - Real-Zitadel-only routes (registration, Google/Zitadel account linking) now fail fast with a clean 501 ZITADEL_DISABLED_IN_DEV_BYPASS while DEV_AUTH_BYPASS=true, instead of a raw PAT-file/DNS error. - New DevFakeBi…

  273. Close dev-bypass sign-in race that let requests fire with no session yet · de8ba94

    AuthProviderInner's `loading` flag dropped to false the instant the dev-bypass auto-sign-in effect fired (synchronously, via signInAttempted.current), while the actual signIn("dev-bypass", ...) network round-trip was still pending — so gated consumers like useProfile()'s `enabled: !authLoading` unblocked and called the API before any session cookie existed, producing intermittent "Authentication required" / "No session token" 401s on routes like /you. Track the sign-in call's own in-flight state (devBypassSigningI…

  274. Repair dev-bypass end-to-end + gate it behind a two-lock bootstrap check · 16b95e3

    Dev auth bypass was broken end-to-end: the web BFF proxy requires a real NextAuth session for every /api/* call, but NEXT_PUBLIC_DEV_AUTH_BYPASS only fabricated a fake client-side AuthUser object and never called signIn(), so no session cookie was ever minted and every protected route 401'd before reaching the (already-working) Fastify backend bypass. Fix: AuthProviderInner now auto-triggers a real signIn("dev-bypass", { redirect: false }) against the existing NextAuth CredentialsProvider on mount when unauthentic…

  275. Remove dead packages (fastify auth plugins, radix themes, orphaned node-cron/yaml) · c6902a7

    api: @fastify/cookie, @fastify/session, @fastify/static, jwks-rsa, and oauth4webapi have zero remaining call sites — their only consumer, registerUploadsStatic.ts, was deliberately deleted in a prior commit; identity/session auth already lives with NextAuth/Zitadel per the product identity model, so these aren't a gap to fill in. web: @radix-ui/themes has zero references (the design-system package is the real component SSOT); node-cron + @types/node-cron were superseded when scheduled-tasks.ts was refactored to ca…

  276. Actually include the matching hot-reload changes · 300e684

    The previous commit's message described bind-mounting src/apps/matching/src and adding --reload, but docker-compose.yml itself never got staged — a multi-path `git add` aborted silently when one of its paths (already git rm'd) didn't match any files on disk, leaving this file behind. Same class of gotcha noted earlier this session; caught it this time by checking `git status` after the commit instead of trusting the add succeeded.

  277. Hot-reload for matching; delete dead-code duplicate health.py · 3d0d546

    The matching container had no source volume mount and no --reload flag — editing code would silently do nothing until a manual `docker compose build`. Fixed: bind-mount src/apps/matching/src over the image's baked-in copy, run uvicorn with --reload --reload-dir /app/src. api/web were never affected — they aren't containerized, they run via `npm run dev` on the host with their own native watch/HMR (tsx watch, next dev). Verified this isn't cosmetic — actually edited a live file, watched uvicorn's StatReload detect …

  278. Wire up the matching service; fix its broken test deps · 7a16595

    Researched "the AI mathematical part" end to end before touching anything. Finding: it's not missing from the app — src/apps/matching is a complete, already-wired, already-tested ~17k-line Python service (MIRT scoring, Fisher information for adaptive testing, trait estimation, entropy item-weighting, learning-wave orchestration). Verified non-stub by reading the actual math (mmr/cat/fisher_info.py's closed-form Gaussian-kernel derivative) and confirming the HTTP routes call real mmr/ code, not placeholders. The on…

  279. Silence 2 real startup warnings, document expected boot noise · 9391269

    Ran a full from-scratch bug hunt (docker compose down -v, up, inspect every container's logs line by line) as a follow-up to the first verification pass. Two genuinely fixable warnings found and fixed: - Mongo: "Soft rlimits for open file descriptors too low (1024, recommends 64000)" — Docker's container default. Fixed with an explicit nofile ulimit on the mongo service; confirmed `ulimit -n` reports 64000 post-fix. - Redis: background-save-under-memory-pressure risk this container was never going to hit anyway (i…

  280. Deliberately narrow scope: just the two data stores product code reads via MONGODB_URI/REDIS_URL (Mongo required, Redis optional/lazy). · f10ce5d

    Deliberately narrow scope: just the two data stores product code reads via MONGODB_URI/REDIS_URL (Mongo required, Redis optional/lazy). Not a full-stack compose — Traefik/Zitadel/product-container orchestration stays owned by the sibling app-infra-operator repo, out of this product-only repo's boundary. Mongo runs as a single-node replica set (rs0) — required for transactions (withMongoTransaction.ts) and change streams (change-streams.ts), which the existing `npm run dev:standalone` in-memory-Mongo path doesn't s…

  281. Retire .github/ — no GitHub Actions, git hooks only · 23dcf49

    Standing policy is git hooks for enforcement, never GitHub Actions. The remaining 5 workflows were already self-contained and workflow_dispatch-only (confirmed no sibling-repo checkouts, no automatic triggers) — nothing forced removal on scope grounds, but the policy argues against keeping them anyway. - Deleted .github/ entirely (workflows, README, PR template, E2E_MERGED_ENV setup doc). - Migrated the still-useful parts of .github/docs/E2E_MERGED_ENV.md (local E2E_MERGED_ENV_PATH usage, match-scoring stage confi…

  282. This repo was originally built for the Cursor IDE agent (.cursor/ as the agent hub: always-on rules, on-demand skills, a KB). · 125afb8

    This repo was originally built for the Cursor IDE agent (.cursor/ as the agent hub: always-on rules, on-demand skills, a KB). It's now driven by Claude Code, which doesn't read .cursor/ at all. Three parallel research agents read every one of the 26 rule files, 15 skill folders, and 55 KB articles in full and categorized each one before anything was deleted. - New root CLAUDE.md: repo bindings, identity model (authUid/profileId), API/contract discipline, backend layering, web conventions, layer-trace discipline, s…

  283. Install wave-plan MCP server, close scan integrity gaps · 514850b

    Registered the wave-plan MCP server (wave-plan-lib) locally via a gitignored .mcp.json — same treatment as the existing .cursor/mcp.json, since the registration path is machine-specific. Smoke-tested the MCP server directly over stdio JSON-RPC (initialize/tools-list/wave_next_work) and confirmed it agrees with the CLI scanner. Ran wave-consistency-scan.py end to end and resolved every actionable finding it raised on this plan: - Added a wave-exit-demo story (class J) to each of WAVE-0..4, so every wave now self-cl…

  284. Fix remaining live references to the retired KANBAN.md SSOT · 50f1501

    Per user instruction: research the whole repo for anything kanban-related, convert application-feature-related content to wave, delete the rest. Confirmed there is no kanban-branded application feature anywhere in src/apps/{api,web,matching} — every hit was agent/process documentation still pointing at the pre-2026-08-16 "KANBAN.md is the live task SSOT" convention. Wave functionality/skill itself untouched (confirmed via wave-consistency-scan.py: still 96 items, still consistent). Fixed ~23 files' worth of stale …

  285. Remove KANBAN-specific scripts, keep general-purpose ones · 6c1e43b

    Per explicit user instruction. Deleted 9 scripts whose entire purpose was keeping KANBAN.md in sync or driving KANBAN-lane claiming — both retired 2026-08-16 when task tracking moved to plan/waves/: - kanban_docs_sync.py, sync-kanban-from-docs.sh, test_kanban_docs_sync.py, verify-docs-plans-kanban.sh, verify-kanban-format.sh — the docs/plans/ <-> KANBAN.md sync engine and its KANBAN.md structural-contract checker. - workflow-register.sh, workflow_register.py, workflow_drain.py, workflow_kanban.py — the swarm lane-…

  286. Rename away from legacy naming for two load-bearing items · 1e9ffa4

    Per explicit user instruction: for the two *legacy*-named items that turned out to be live functionality (not dead code), the resolution is "delete [the legacy name], but make sure there's a wave story and requirements first" — i.e. eliminate the legacy branding while preserving the behavior, with the still-open substantive question tracked in the wave plan rather than resolved by guessing. Wave plan updated first (WAVE-1.html), then the renames executed in this same change. journey/legacy-journey-redirect-body.ts…

  287. Remove legacy-visualization discovery component · 44776f5

    Per explicit user instruction. Traced the full usage chain before deleting (this is real app code, not just docs): only features/discovery/index.ts's barrel re-exported StarField2D/StarField3D/NetworkVisualization, and nothing else in src/ actually imported them from that barrel — confirmed via repo- wide grep. The 3 remaining hits were non-dependencies: a test using "StarField2D" as an arbitrary fixture label string (unrelated to the component), and JSDoc {@link} references. Removed: - [redacted]-visualization/ (…

  288. Delete archive/ and src/apps/api/docs/legacy-central/ · 77b4297

    Per explicit user instruction to remove all legacy-named/archive material. - Deleted archive/ (repo root, 428K, 19 files) — pure cold storage, confirmed nothing outside it depended on the contents existing (only on it being excluded from a few scan scripts). Cleaned up the now-dead references: README.md's tree diagram entry, nextjs-coherence-mongo- allowlist.txt's comment pointer, and the "archive/" skip-dir entries in p124-rg-active-gate.py and scan_control_plane_residue.py (unreachable once the directory doesn't…

  289. Resolve src/docs duplicate, correct 2 stale archive/README.md claims · d96eb5e

    Per user decision on the flagged duplicate: src/docs/ARCHITECTURE-AUDIT-CONTINUATION- 2026-05-30.md is byte-identical to archive/legacy-src-docs/'s copy. Confirmed which is canonical by diffing the sibling README.md files: src/docs/README.md has no archive banner and describes itself as active, while archive/legacy-src-docs/README.md explicitly says "Archived 2026-07-04" and points back to itself — src/docs/ is unambiguously the live copy, legacy-src-docs/ is the correctly-labeled historical snapshot. Deleted only…

  290. Third sweep — migrate source-code TODOs, clean dead/duplicate files · 029a3db

    Third pass per user request: check all plans/docs/files again for remaining open work and legacy files. Two parallel research sweeps (open work outside docs/plans/, and a legacy/deprecated-file inventory) found: Migrated into the wave plan (11 new items, none previously covered): - W0.5 (6 subs): directly-actionable source-code TODOs found in this sweep — cron overlap guard (scheduled-tasks.ts), biometric challenge race condition (biometricChallengeShared.ts), CORE_VALUE_IDS DRY duplication (backfill-domain-ids.ts…

  291. Resolve the two ambiguous cross-repo plan docs · 42e16d8

    Per user decision on the two flagged-ambiguous items from the plan-doc sweep: - fleet_operator_decoupling_fcb6413b.plan.md's 5 pending FOS-07-tail items migrated into WAVE-4 (W4.6, cross-repo coordination watch-list) — same treatment as the other sibling-repo items already there, since one of these once had a KANBAN row purged without completion evidence and the work is still real, just not this repo's to do. - tenant_api_server.plan.md deleted outright with no migration — stale pre-repo-split doc describing sibli…

  292. Migrate 3 open items found in a second plan-doc sweep · b9227b3

    Full sweep of docs/plans/*.md, docs/paywall/plans/, and .cursor/plans/*.plan.md for open task items missed by the KANBAN.md-only migration. Most of docs/plans/ turned out to be architecture narrative whose task IDs were already fully accounted for in KANBAN.md/plan/waves — only 3 genuine gaps found: - W0.4: REQ-D-01 + REQ-D-07 from docs/plans/23-matching-app-ownership.requirements.md — two rows explicitly marked "Open" with real verify commands, never mirrored into KANBAN.md's TC-MATCH-APP group despite that group…

  293. Migrate open KANBAN.md work to the wave-plan workflow · 018055a

    Installs the wave-plan task-tracking format (plan/waves/WAVE-*.html, drained by the global wave-next/wave-bug-hunt skills) and migrates every open item out of KANBAN.md, which is now a frozen historical record. Migration: - Inventoried KANBAN.md in full: 34 open items (4 Todo, 7 Blocked, 23 Backlog) behind 42 unique KANBAN IDs (some pairs cross-reference each other, e.g. BLOCKED-NEXT-03 <-> WF-TRACE-LIVE-E2E-FULL-WORKFLOW). - All 42 IDs migrated into 5 waves (60 wave items total), ordered so every wave except the …

  294. Remove leaked credential, dedupe FEATURE_MATRIX, drop orphaned parity script · 3221cbf

    Production-delivery cleanup following the sibling-repo/SaaS removal in 04f9aa0c9 and the shared/tools/ removal in 2fbedf3b5. Researched and resolved the two items flagged there: Credential exposure: - Delete scripts/suspend-host.sh + suspend-host.sudoers.example. The script has carried a real, decodable sudo password (SUDO_PASSWORD_B64) since its first commit (bd1bcd54e, 2026-05-13); it was removed once (14f001dac, 2026-07-09) but resurrected with the secret intact by yesterday's reconciliation merge (9356c3df5) —…

  295. Remove leaked credential, dedupe FEATURE_MATRIX, drop orphaned sibling script · 2fbedf3

    Production-delivery cleanup following the sibling-repo/SaaS removal in 04f9aa0c9. Researched and resolved the two items flagged there: Credential exposure: - Delete scripts/suspend-host.sh + suspend-host.sudoers.example. The script has carried a real, decodable sudo password (SUDO_PASSWORD_B64) since its first commit (bd1bcd54e, 2026-05-13); it was removed once (14f001dac, 2026-07-09) but resurrected with the secret intact by yesterday's reconciliation merge (9356c3df5) — confirmed present on origin/main. It's a p…

  296. Remove sibling-repo and third-party-SaaS reach from CI/scripts · 04f9aa0

    Makes this repo self-sufficient: no script or workflow here checks out a sibling git repo (app-infra-services/-operator/-host) or calls a third-party SaaS API (Stripe, cosign/sigstore, container registries) anymore. Removed: - 19 scripts/ scripts: sibling-repo path resolvers (ci-infra-paths.sh, ci_infra_paths.py, ci-checkout-infra-layout.sh), sibling-scoped checks (check_control_plane_web_imports.sh, check_importlinter_control_plane.sh, check_module_web_codegen_drift.sh, verify-ml-stateless-smoke.sh, verify-ci-con…

  297. Restore stashed bug-audit findings from feat/journey-bank-seed-stage-deploy · a8aa385

    Uncommitted work-in-progress that was stashed before the branch reconciliation: TODO annotations + KANBAN backlog rows from a 2026-08-09 bug-audit pass (cron replica lock, OAuth callback dedup in-memory state, optional-auth chain divergence, dead session on token-refresh failure, discarded passkey session token, duplicated OTP constants). Dropped the GridFS-cleanup-leak finding — the merged main already fixes that differently (deleteIfPresent now swallows its own failures instead of the caller re-throwing).

  298. Lazy-resolve Mongo collections in module-scoped services (UC-22/AT-22.1) · f474f0b

    Full-implementation validation surfaced 2 unhandled `MongoNetworkError: ECONNREFUSED` rejections in the API suite (all tests passed, but the errors exit non-zero). Root cause: `PlatformSettingsService` resolved its collection eagerly in the constructor, and three route modules instantiate it at module scope — so importing the connections route fired a Mongo connection at import time whose rejection nobody awaited. In production the same shape is a latent availability bug: the eager pattern caches a rejected promis…

  299. Fix(admin)+chore(web): confirm-guard the profile full-wipe, delete dead chatQueryKeys (UC-21/AT-21.2,21.6) · 395d0c4

    Closes the last two open UC-21 items (user delegated both decisions). AT-21.2 [P2]: an unscoped DELETE /api/admin/profiles (no profileIds) does deleteMany({}) -- even the "keep me" variant deletes every other profile -- gated only by a <=450 cap, unlike the sibling POST /api/admin/questions/clear which requires confirm:true. Closer reading changed the prior "deferred" call: the web UI ALREADY gates clear-all behind a confirmation dialog, so the accidental-UI-wipe path was already mitigated and the residual risk is…

  300. Fix(prefs)+refactor(web): atomic admin prefs write + centralize staleTime (UC-21/AT-21.3,21.7) · d489e74

    AT-21.3 [P3]: the admin max-visible-profiles override was a read-modify-write on the whole preferences blob (getPreferences -> spread-merge -> full-blob savePreferences), which clobbered a concurrent user preferences save (also a full-blob replace) — an admin-set value could vanish on the user's next unrelated change and vice versa. Added PreferencesService.setMaxVisibleProfiles, an atomic single-field $set: { "preferences.maxVisibleProfiles": ... } upsert, and pointed the route at it. The two writers now touch di…

  301. Client-cache consistency — prefs rollback + profile-edit invalidation (UC-21/AT-21.4,21.5) · 315701d

    AT-21.4 [P2]: useUserPreferences optimistic write had no rollback. persistUserPreferences wrote the cache directly then fired the mutation, whose onError only logged — no snapshot, no rollback, no reconcile. With staleTime 60s, no refetchOnWindowFocus, and no invalidation, a rejected app-shell settings toggle (offline/5xx) left the optimistic value stuck in cache, so the UI showed a setting as applied that the server never accepted, silently reverting only on reload. Rebuilt as the standard optimistic lifecycle: o…

  302. Atomic upsert for setConnectionStage + open UC-21 (AT-21.1) · a9ddce5

    Two fresh consistency sweeps ran over the admin API and the web client's React-Query layer — the two largest surfaces no use-case had visited. Both produced clean bills of health worth recording: admin authorization is fully guarded (61/61 route preHandlers, no bypass path) and admin write-path validation is complete; the connection/chat client mutation layer correctly invalidates everywhere. AT-21.1 [P2]: AdminService.setConnectionStage was a read-then-write get-or-create (findOne -> insertOne on miss / updateOne…

  303. Route all inline 11000 checks through isDuplicateKeyError (UC-20 DRY) · 3ad976e

    Completes the DRY extraction started with lib/db/duplicateKeyError.ts. Migrated the last inline `err.code === 11000` sites to the shared predicate: the four services/profile/profileProvisioning.ts sites, SimulationAgentService, lib/profile/bindAuthUidToEmailProfile.ts (negated form -> !isDuplicateKeyError), lib/learning/appendLearningScorecardEvent.ts, and routes/admin/adminQuestions.ts. Each dropped its now-unused `import { MongoServerError } from "mongodb"`. Every duplicate-key decision in src/apps/api/src now h…

  304. Unify the mutual-reveal bar to one definition (UC-20 DRY follow-up) · e316a5f

    requireProfileMediaAccess (the full-photo gate) hardcoded its own `row.stage === "chat_active"` check for the `full` variant — a second copy of the "full disclosure" business rule that already lives in resolveDiscoveryTier (via isPeerFullDisclosureAllowed) and gates the secure-profile wire in peerSecureProfileAuthorization. Delegated it to isPeerFullDisclosureAllowed so the secure-profile read and the full-photo read share a single source of truth: if the product ever moves the reveal bar, both follow automaticall…

  305. Close final UC-20 cluster — culture logging, Qwen single-flight, WebAuthn counter (AT-20.12..14) · 666373d

    The last three UC-20 findings. Two corrected a naive fix the sweep suggested, once the actual call sites were read. AT-20.12 [LOW-MED] culture-identity silent data loss: culturalIdentityForProfileApi dropped a present-but-malformed stored blob to null on every branch with NO log, so a user's culture selections could vanish from their profile and every discovery card with zero operator signal. The sweep proposed "throw like the gender/orbVisuals siblings" — reading the call sites disproved that: this runs inside th…

  306. Waitlist atomicity, passkey injection guard, push E11000 retry (UC-20/AT-20.9..11) · cb8c6bd

    The MEDIUM-LOW consistency cluster — three "the pattern already exists elsewhere, apply it here" fixes plus the DRY extraction they all wanted. Shared: new lib/db/duplicateKeyError.ts. The err.code === 11000 check had accreted independent copies (DeviceService, connection/mongoWriteRace, emailOtpService, profileProvisioning...), and AT-20.9/20.11 were about to add two more. Extracted isDuplicateKeyError + isOnlyDuplicateKeyWriteError, migrated the three sites the AT-20.5 TODO named, used them in the new sites. Sco…

  307. Guard batch/HTTP recalc with the per-user lease (UC-20/AT-20.8) · dc50827

    [MEDIUM-DATA-INTEGRITY] recalculateMatchesForUser (nightly runFullMatchRecalculation batch + POST /api/internal/recalculate-matches) ran calculateAndStoreMatches + updateMatchForProfileChange with NO lease, while the debounced matchRecalculationScheduler wraps the identical two-op sequence in tryAcquireMatchRecalculationLease. So a scheduler run and a recalculateMatchesForUser run for the same user could execute concurrently; both call removeStaleOutboundMatchesForViewer -- a deleteMany from a getAllProfiles() sna…

  308. Record remaining UC-20 sweep findings (AT-20.8..20.14) for follow-up · b9d4041

    The two internal-consistency sweeps surfaced more than the seven fixes shipped this round. Records the rest -- all verified real, none P0/P1 -- with severity, location, and why each is lower priority than what shipped, so they're tracked rather than lost: match-recalc lease gap, waitlist rate-limit atomicity, passkey body validation, push-subscription E11000 retry, culture-identity silent-null, Qwen single-flight, and two low items (native-push try/catch, WebAuthn counter guard). Claude-Session: https://claude.ai/…

  309. Read entropy connection ratings through the canonical parser (UC-20/AT-20.7) · c738093

    gatherEntropyItemsFromMongo read questionAnswers through the UC-3-hardened parseStoredProfileQuestionAnswer (logs on rejection) but read connectionRatings, fifteen lines later in the same loop, through a private parseConnectionRatingRecord that: accepted only the object shape (silently dropping bare-number and JSON-string ratings, both supported elsewhere); applied no 1-10 range validation (admitting out-of-range values); and logged nothing on rejection. Entropy/IRT item calibration was computed from a silently tr…

  310. Fail closed on missing/unparseable session+challenge expiry (UC-20/AT-20.6) · aaba103

    [P1-SECURITY] Two biometric expiry checks failed OPEN. validateBiometricSession did `if (expiresAt) { ...check... } return true`, so a missing expiresAt skipped the check and returned valid, and an unparseable string produced Invalid Date whose `now > invalid` is false -- also valid. assertBiometricChallengeNotExpired had the mirror `if (!expiresAt) return`. expiresAt is typed required on both docs, so these fire only on corrupt/legacy/partial data -- and turned such a row into a never-expiring credential. Neither…

  311. Make email-OTP rate-limit reset atomic (UC-20/AT-20.5) · 5b7dff5

    [P0-SECURITY] assertOtpRateLimitScope did findOne then a separate reset updateOne on the "no window / expired" branch -- a check-then-write race. A concurrent burst (the boundary POST /api/auth/email-otp/request has no other limiter) all read "no window", all set count:1, all pass, bypassing the per-email (3) and per-IP (10) caps for the whole burst. Each admitted request sends a non-idempotent outbound OTP email, so this was both a rate-limit bypass and an email-flooding / cost vector. Surfaced by the internal-co…

  312. Compare-and-set stage transitions + fix missing consent guard (UC-20/AT-20.3+20.4) · 4ecf004

    AT-20.3 [P0-DATA-INTEGRITY] Five connection transitions (respondChat accept/ reject, requestChat, respondConversation accept/reject) validated a stage precondition against a read, then wrote filtered on connectionId alone -- a TOCTOU window. Concrete failure: user A ends a connection (endConnection: stage -> rejected, consents cleared) while user B's accept-chat is mid-flight; B already passed its chat_requested check against the pre-end read, so its unguarded write sets chat_active and writes chatConsent rebuilt …

  313. Require mutual reveal for peer secure-profile reads (UC-20/AT-20.2) · aee187e

    [P0-SECURITY] GET /api/profile/secure?otherUserId= returned any user's private profile to any authenticated caller. The peer branch authenticated the CALLER (JWT + a biometric session belonging to the caller) and then returned whatever profile the caller named -- no connection lookup, no stage check, nothing about the relationship between the two accounts. secureProfileWire emits real email, birthYear, bio, values, thinkingStyle, emotionalDepth, communicationStyle, questionAnswers and connectionRatings. Reachabili…

  314. One implementation for shared-secret comparison (UC-20/AT-20.1) · 31c9779

    First fix from the internal-consistency sweep: take a defensive pattern the codebase already uses somewhere, treat that site as the oracle, and find where else it structurally applies but was not used. lib/auth/verifyInternalBearerToken.ts already compares HMAC signatures with timingSafeEqual and a comment justifying it -- the codebase knows the right answer. But two sibling secret checks used plain ===/!==: routes/system/cron.ts (x-cron-secret) and lib/auth/verifyInternalRouteSecret.ts (x-internal-secret, used by…

  315. Close fail-open OAuth email account-linking + refresh-token race (UC-19) · 8bb6d11

    Sweep of the auth/session/proxy/storage surface no prior use-case had visited. Two P0-class defects found, both in previously-unswept code. AT-19.1 [P0-SECURITY] OAuth email trusted as an account-linking key with no verification check. GET /api/oidc/callback/{google,zitadel} passed the IdP's raw email into ensureProfile -> getOrCreateProfile, which looks a profile up by emailNormalized and unconditionally $set-s authUid on a match -- a full handover of an existing profile (chats, matches, photos) to the newly auth…

  316. Correct profile-maturity legacy scoring ceiling, close UC-18 · 4ed84ae

    calculateProfileMaturity's fallback branch (used whenever a caller passes a bare Profile without server-computed matchingSignalDimensions, e.g. NetworkVisualization.tsx) summed raw points from 4 categories and treated the sum as an out-of-100 percentage, without accounting for 2 skipped categories (connection intent 20pts, other patterns 15pts, honestly documented via pre-existing TODOs) or a previously-unflagged cap on thinking-patterns (12 reachable, not 15, since real users have no persisted questionStyle field…

  317. Judge and close 4 remaining backlog items (UC-16/UC-17) · 06bb1d8

    Per explicit instruction to judge each remaining item and make the best call rather than leave them open indefinitely: 1. AT-2.1 (conv_ thread-id namespacing, UC-16): investigated and retired rather than finished. Traced the live producer and found the scheme's own premise was false -- connections.connectionId was never prefixed either, both already use the identical bare pair-key format, so there was no misalignment to fix. Finishing it for real would have meant switching every chat read/write path plus a live da…

  318. Resolve COMP-DESC-VOCAB with real execution, fix broken validator path (UC-15) · 287c533

    Cloned app-infra-operator locally and directly executed its real score_validate.py against test fixtures for all 4 candidate vocabulary types instead of continuing to trust or distrust a KANBAN checkbox. Definitive, per-type result: - secret-materialize, http-service: fully wired (discriminated-union entry + generated Pydantic params model) -- proved by running the actual validator. - tls-cert: passes only the shallow type-string check; no discriminator mapping or generated params model -- would likely fail deeper…

  319. Correct stale repo attribution + flag unverified status on COMP-DESC-VOCAB · 1a763af

    The Backlog row pointed at app-infra-services, which predates the 2026-07-04 repo split -- confirmed via direct directory listings that app-infra-services' current KANBAN, GAP-ANALYSIS, and file tree have zero trace of this item or resource-types.openapi.yaml. The actual owner today is app-infra-operator. app-infra-operator's own KANBAN shows COMP-DESC-VOCAB checked off, but only as part of a bulk "archived from Todo hygiene 2026-08-08" sweep with no anchor, verify command, or evidence link -- unlike most other ar…

  320. Close Turbopack-vs-webpack drift audit (UC-14), fix 3 stale docs found along the way · f937a88

    Researched Next.js 16 Turbopack defaults and empirically verified `next build` (not just `next dev`) already defaults to Turbopack, and succeeds cleanly despite this repo's custom webpack() config in next.config.ts -- Turbopack silently ignores it rather than erroring. Confirmed local dev, the Docker production build, and (the only place CI would build at all) build-once.yml's image build all already agree on Turbopack; the sole webpack path is the deliberate, already-documented dev:docker fallback. No bundler-dri…

  321. Don't let one corrupted peer profile crash a whole discovery page (UC-13) · cd05752

    assembleDiscoveryProfilesForMatchPage called mapProfileToDiscoveryProfile with no try/catch, even though that mapper deliberately throws on any malformed peer field (bad dates, invalid discoveryMatchIntentScopeId, etc.) and the surrounding loop already has a careful skip-and-log pattern for three other row-level failure modes. One legacy/corrupted peer profile could abort the whole .forEach and drop every other already-resolved peer in the page -- same failure shape as the UC-11/UC-12 fan-out bugs, here on a mappi…

  322. The 3-repo-split layout fix (72c5adf) landed after this doc's last edit, so its "token alone won't fix it" warning was already resolved and no longer accurate. · 56b9101

    The 3-repo-split layout fix (72c5adf) landed after this doc's last edit, so its "token alone won't fix it" warning was already resolved and no longer accurate. Updated to reflect that the code side is done and the only remaining blocker is an org admin adding three repository secrets. Added a KANBAN Blocked row so this doesn't fall off the tracker (it isn't something an agent/CI run can self-serve).

  323. Fill in final verification numbers for UC-12/AT-12.1 · 1418dd6

  324. Fix confirmed regression in ProfilePictureService GridFS cleanup (UC-12) · 582321a

    Applying the specific lesson from UC-11 (unguarded best-effort cleanup inside a fan-out can discard a primary operation's success) as a targeted codebase-wide search found a real, unfixed instance -- with zero prior test coverage -- in ProfilePictureService. Two bugs, same root cause: 1. deleteIfPresent (best-effort GridFS blob cleanup, run AFTER the profile document already stopped referencing the old blobs) re-threw on any delete failure. clearProfilePicture had no try/catch around it at all -- a transient GridF…

  325. Update Ideation Process section to reflect UC-10/UC-11 outcomes · 53c699e

    Marked the native-push ideation item DONE (now points at UC-10/UC-11), added AT-6.2b's remaining 3-token decision as an explicit open item, and added the codebase-wide "unguarded cleanup inside fan-out" pattern audit (applying the specific lesson from UC-11's confirmed bug) as a mid-term item -- a background review scoped to this exact question across all of apps/api/src is in progress; its outcome will be recorded once it lands rather than duplicating the search here.

  326. Fix confirmed regression + race condition found by adversarial review (UC-11) · a8cc5e7

    An adversarial review of the AT-2.2/AT-2.3 code (written this session, not yet through the same scrutiny as the rest of the codebase) found and reproduced two real bugs: 1. CONFIRMED, reproduced: NativePushNotifier.dispatchOne awaited removeDevice() with no try/catch inside a Promise.all fan-out. A transient Mongo error during that best-effort cleanup step rejects the whole Promise.all, discarding every other device's already-resolved outcome, and propagates all the way up through notifyUserAcrossChannels into Dis…

  327. Resolve AT-6.2b "progress" legacy-label conflict with first-party evidence · 8161be5

    User asked for more data before deciding AT-6.2b (the 4-token category classification conflict found while consolidating the legacy core-value label tables). Investigated further rather than guessing: - Git history is a dead end -- both consuming files were introduced in the same squashed commit, no earlier revisions to recover original intent from. - [redacted]-questions.json's active qext_cv_023 seed question has a first-party extractionRules mapping of option id "progress" -> category "growth_learning" (via val…

  328. Record live E2E verification of AT-2.3 native push wiring · 464d0d2

    Booted the real API server (npm run dev:standalone -- real Fastify process, real in-memory mongod, no mocks) and exercised the actual HTTP surface: confirmed clean boot with the new ApnsPushProvider/FcmPushProvider fail-soft logging, confirmed a valid platform registers and persists for real in Mongo, and confirmed an invalid platform now gets a real 400 from a live request -- not just from the existing unit/mocked test suite.

  329. Implement native push dispatch via APNs + FCM (AT-2.3) · 6a6d6a7

    The `devices` collection was written by POST /api/device/token but never read -- all push delivery went through WebPushNotifier (VAPID) only, so native-shell users who registered a device token had nothing use it. Researched current third-party pitfalls before coding: node-apn (the obvious APNs library) has had no release since 2022, deliberately avoided in favor of @parse/node-apn, the actively-maintained Parse Platform community fork, which owns HTTP/2 session management and provider-token (JWT) caching (APNs to…

  330. Generic, database-configurable schema-migration status auditor (AT-2.2) · a2c449c

    No production/stage database is attached to this environment. Rather than leave "has migration X already run against real data" as a permanent blocked TODO, this adds a reusable auditing framework an operator can point at ANY MongoDB endpoint (same MONGO_URL/MONGO_DB convention as backfill-domain-ids.ts) to get a real, evidence-based answer in one command. SchemaMigrationAuditor<TDetails> is a generic abstract base class orchestrating collectDetails -> deriveStatus -> summarize into a uniform report. It doesn't as…

  331. Consolidate duplicated legacy core-value label mapping (AT-6.2) · 2508c6b

    apps/web's categoryResolution.ts and apps/api's backfill-domain-ids.ts each hand-maintained an independent copy of the pre-PR-3 English-label -> id mapping for core values/categories. Consolidating them into a shared SSOT (src/config/legacy-core-value-label-mapping.json, following the established src/config/*.json convention) surfaced a real, confirmed drift bug: 4 tokens ("peace", "exploration", "discovery", "progress") resolved to DIFFERENT categories depending on which of the two tables handled them. That 4-tok…

  332. Fix stale AT-6.1e status (deletion already happened, doc still said TODO) · 87b9d0f

    bindAuthUidToEmailProfile.ts (web) was deleted in the later "Remove 16 verified-dead code items" batch (4ec9cce), but this doc section still said "awaiting user approval to delete" / AT-6.1e TODO. Verified the file no longer exists on disk and the removal commit is in git log. Updated to DONE with the actual verification trail instead of leaving stale status text.

  333. Close UC-9, record final bare-catch sweep results, fix self-inflicted doc bug · 53b91a6

    Marks UC-9 DONE with the complete tally across all 4 triaged scopes: 12 bucket-1 fixes, 108 confirmed safe, 1 flagged for human judgment (Zitadel token format). Also fixes a real bug this session introduced earlier: an Edit call meant to insert the UC-9 section accidentally deleted the "## How this document is meant to be used" header line, leaving its bullet list orphaned under UC-9 instead. Caught while writing this update and restored -- documented here per the session's "note lessons learned" convention rather…

  334. Log 5 more silent-fallback catch blocks (UC-9 continued, lib scope) · d31ef0d

    Completes the UC-9 bare-catch sweep's lib/** (non-auth) scope, the largest of the four partitioned audits (36 sites: lib excl. auth, design-system, i18n). 5 confirmed true silent fallbacks fixed with a warn-level log before the existing fallback, no behavior change: - lib/dev/fetchBackendAsPlatformAdmin.ts: same INTERNAL_API_SECRET misconfiguration failure shape already fixed at app/api/auth/token/route.ts in an earlier round, missed on this sibling path. - lib/mail/mail_delivery_trace.ts: a genuine backend failur…

  335. Continuation of the UC-9 bare-catch sweep after the earlier scope-correction found ~100 untriaged web-side sites. · c0f3919

    Continuation of the UC-9 bare-catch sweep after the earlier scope-correction found ~100 untriaged web-side sites. Three properly-scoped background audits (lib/auth, features, app routes) classified all sites in these three directories; these 4 were confirmed true silent fallbacks and fixed with a warn-level log before the existing fallback, no behavior change: - lib/auth/getSessionJwtFromRequest.ts: a malformed NEXTAUTH_URL silently defaults the secure-cookie flag, which can make every authenticated request fail w…

  336. Record UC-9 bare-catch sweep, correcting a scope mistake honestly · bcac0c2

    Documents the 5 silent-fallback catch fixes just committed, and is explicit about a real mistake: the background agent was dispatched against a grep result that claimed web/src had zero bare-catch hits. A fresh re-run found 120+ in web/src alone -- the same directory-scan-truncation failure mode already documented earlier in this session. Flags the ~115 untriaged web sites as genuinely not done rather than letting the doc imply full coverage.

  337. Log 5 silent-fallback catch blocks found in bare-catch anti-pattern sweep · 90d9f61

    Part of this session's ongoing sweep for silent-fallback patterns (R1/R2 in the architecture hardening plan). Each of these caught a real, unexpected failure and silently fell back to a default/empty value with zero operator trail. Added a warn-level log call before the existing fallback in each case, preserving the exact same return value/control flow -- only adds observability, matches the AT-3.1-3.4 precedent: - buildServerChatTranscriptPlainText.ts: malformed icebreaker-transcript JSON in a stored chat message…

  338. The existing unit test for the AT-6.1d PROFILE_UPDATABLE_FIELDS allowlist mocks the Mongo collection. · 6b52c88

    The existing unit test for the AT-6.1d PROFILE_UPDATABLE_FIELDS allowlist mocks the Mongo collection. Since this is the highest-risk change in the AT-6.1 series (the single write chokepoint for the profiles collection), add real MongoMemoryServer-backed integration coverage matching the existing *.mongo.integration.test.ts pattern: an allowlisted field actually persists and round-trips, a rejected field leaves the existing row provably unchanged (verified in the database, not just "the call threw"), and email norm…

  339. Update INDEX.md progress line to 40 of ~50 atomic tasks resolved · 2908238

    Reflects AT-6.1f closing (duplicate validateSyntheticProfileSeed consolidation) and the profileWireToValidatedSeed dead-code finding.

  340. Marks the short-term items this session actually closed (UC-5/UC-8 dead-code passes, AT-6.1 profiles schema gap, AT-5.11 parity test) as DONE instead of leaving them as stale open… · 8e42350

    Marks the short-term items this session actually closed (UC-5/UC-8 dead-code passes, AT-6.1 profiles schema gap, AT-5.11 parity test) as DONE instead of leaving them as stale open items. Adds a new short-term note on the sim-user actor-vs-cohort architectural seam surfaced while investigating AT-6.1f/profileWireToValidatedSeed (cohort = permissive/Mongo-direct, actor = meant to behave like a real HTTP client but has quietly started reading Mongo directly too via loadValidatedSeedFromMongo -- worth an explicit desi…

  341. Flag profileWireToValidatedSeed as non-functional against real data · e9a4465

    Investigation into why this function has zero callers (per user's "keep it, add a task to finish/wire it up" decision on the AT-6.1f dead-code finding) found it isn't just unused -- it will always throw against a real GET /api/profile response. That endpoint's wire shape deliberately omits values, thinkingPatterns, connectionIntent, and otherPatterns (confirmed by reading selfProfilePublicWireFromStored), which this function requires as non-empty. simulation-worker/src/loadValidatedSeedFromMongo.ts's own doc comme…

  342. Close out AT-6.1f, flag new dead-code candidate for approval · 0a2c449

    Marks AT-6.1f DONE with the full investigation trail and verification counts. Flags a new dead-code finding surfaced during that investigation: profileWireToValidatedSeed's outer function (services/sim-user/actor/) has zero production callers and zero test coverage -- awaiting user approval to delete or turn into a real task, not deleted yet.

  343. Consolidate duplicate validateSyntheticProfileSeed implementations · 84806d4

    syntheticProfileLifecycleSeedValidation.ts (cohort) and profileWireToValidatedSeed.ts (actor) each defined their own validateSyntheticProfileSeed with the same field set and validation intent -- a documented, acknowledged duplication (actor's own doc comment said "inlined for actor HTTP path") with no automated check keeping them in sync (AT-6.1c precedent: this is exactly the R5 duplication anti-pattern). Traced every real call site of both functions before consolidating. The two differed in three ways: check ord…

  344. Marks AT-6.1d (profiles field allowlist) and the AT-7.2 divisor follow-up DONE with full write-ups (design rationale, verification counts). · a9d7793

    Marks AT-6.1d (profiles field allowlist) and the AT-7.2 divisor follow-up DONE with full write-ups (design rationale, verification counts). Adds the validators.ts dead-code item to the UC-8 section (found while fixing doc references for the registry.ts deletion, user-approved separately). Fixes a stale "see commit for exact counts" placeholder in the AT-7.6 section with the real historical commit's numbers. INDEX.md progress line updated to 39 of ~50 atomic tasks resolved.

  345. Add field allowlist to ProfileService.updateProfile · dc29a7d

    updateProfile() previously did a pass-through $set into the profiles collection with zero field-name gating: any caller (including any future one) could write arbitrary top-level fields straight to Mongo. Adds PROFILE_UPDATABLE_FIELDS, a 22-field allowlist sourced by reading all 3 real callers directly, and a new ProfileUpdateFieldNotAllowedError thrown before any Mongo call when an update contains a field outside it. Scoped deliberately to field *names* only, not full value-schema validation -- each of the 3 call…

  346. Correct answerDepthToAxisScore divisor (was capping at ~66.7) · 6cbabe5

    answerDepthToAxisScore divided by a hardcoded 3, but the actual maximum achievable depth from singleAnswerDepthScore is ANSWER_DEPTH_MAX_PER_ANSWER (2.0: +1 free-text, +0.5 extra notes, +0.5 selected options). A maximally "deep" answer therefore capped at (2/3)*100 ~= 66.7, never reaching the 0-100 range the function's own doc comment claims. User-confirmed as a genuine off-by-one scaling bug, not intentional headroom. Fix raises solo-profile signal-strength scores for answers already at max depth -- a deliberate …

  347. Remove dead validators.ts, fix README_INDEX to match reality · 8aa8199

    validators.ts had zero external callers (verified via grep across src/ and tests/); the middleware/validators subsystem it documented was already superseded by direct-import Zod schema usage generated from OpenAPI. README_INDEX.md rewritten to describe the actual pattern feature modules use today (import generated Zod schemas, call .parse()/.safeParse() directly), listing real consumers found via grep. User-approved deletion (dead-code sweep, architecture hardening plan UC-8).

  348. Document Zitadel registration placeholder lastName instead of a bare TODO · 696234a

    UserRegistrationService.ts hardcoded lastName: "User" with a TODO complaining about the hardcoding but no explanation of why. Verified the actual constraint: POST /api/users only ever collects email/password (no name field exists anywhere in the registration form or wire contract), but Zitadel's human-user schema requires a non-empty lastName. Confirmed this placeholder never reaches the app's own data — AuthService.ensureProfile creates the profiles document from authUid/email only, never from Zitadel's firstName…

  349. Record AT-7.2 completion — all UC-7 hardcoded-parameter tasks now done · 1f7c092

    docs/plans/23-architecture-hardening-plan.md: AT-7.2 marked DONE with full write-up; new follow-up task tracks the answerDepthToAxisScore /3 divisor decision found mid-fix. docs/plans/INDEX.md: progress line updated (36/~50 atomic tasks resolved), UC-7 (hardcoded-parameter centralization) now fully implemented (AT-7.1 through AT-7.6, all done).

  350. Source dimensionScoring.ts answer-depth constants from the SSOT (AT-7.2) · 5847999

    The web-side legacy/testbench dimensionScoring.ts (feeds positionProfilesInPersonalizedUniverse.ts, not the live discovery universe path) independently hardcoded the same four answer-depth magic numbers as the api-side implementations. Now reads them from the new src/config/answer-depth-scoring.json SSOT (synced copy in apps/web/config/) instead, matching the api-side fix. Verified: npx tsc --noEmit clean, full web suite 867/867 files / 2768/2768 tests, zero regressions — same numeric output for the same input. Ne…

  351. Consolidate duplicated answer-depth scoring formula in apps/api (AT-7.2) · c5fea8f

    productMatchDimensionScoring.ts's calculateAnswerDepth (production emotional-depth dimension) and profileMatchingSignals.ts's singleAnswerDepth (solo profile-completeness signal) implemented the identical per-answer depth formula independently. Extracted a shared singleAnswerDepthScore into a new lib/matching/answerDepthScoring.ts, sourcing its four magic numbers from the new answer-depth-scoring.json SSOT, and switched both call sites to use it. MatchCalculator.ts's lab-only variant operates on a structurally dif…

  352. Add answer-depth-scoring.json SSOT (AT-7.2) · 5606df9

    New src/config/answer-depth-scoring.json holds the four magic numbers behind the "answer depth" match-scoring formula (free-text length threshold, extra-notes length threshold, and their point values), previously hardcoded independently in four places across apps/api and apps/web. Follows the codebase's established src/config/*.json + parity-test convention (connection-ring-thresholds.json, personality-quadrant-parity.json) rather than a new ad hoc approach. Added the file to .gitignore's allowlist and sync-produc…

  353. Record AT-7.4/AT-7.5 completion in architecture hardening plan · 06a2936

    Only AT-7.2 (the 4x-duplicated production match-scoring formula) remains open in UC-7 — deliberately deferred, needs more care since it touches live match percentages rather than a mechanical extraction.

  354. Share diagnostics field-length MAX_LENGTHS between route and service (AT-7.4) · 7090fea

    registerDiagnosticsRoutes.ts's Zod schema and ClientDiagnosticsService.ts's MAX_LENGTHS object independently typed the same 7 field-length bounds for the same unauthenticated POST /api/diagnostics/client-logs endpoint — byte-for-byte identical, but with no shared constant tying them together. Exported MAX_LENGTHS from ClientDiagnosticsService.ts and derived every Zod .max() call in the route from it, so the two are now structurally the same reference instead of just numerically in sync today. Fixed a real test bre…

  355. Extract duplicated backendBaseUrl() into lib/env.ts (AT-7.5) · 513f55b

    internal_backend_fetch.ts and passkey_backend_proxy.ts each defined an identical backendBaseUrl() function, including the same hardcoded "http://localhost:3001" dev fallback. Extracted to a new resolveBackendBaseUrl() export in lib/env.ts. Kept as a plain function reading process.env fresh on every call rather than a property on that file's eager `env` object — env's properties are captured once at module load, which would make a base-URL resolver stale across tests that mutate process.env per case. Verified: npx …

  356. Record AT-7.1 completion in architecture hardening plan · cd38cb8

  357. Centralize residency maxLength and add SSOT parity test (AT-7.1) · 49708b3

    ProfileResidencyTextField.tsx independently hardcoded the literal 200 twice (.slice(0, 200) and maxLength={200}) instead of deriving it from product.openapi.yaml's UpdateProfileRequest.residency.maxLength (the real SSOT, already correctly generated into zod-schemas.ts on the API side). Confirmed openapi-typescript erases maxLength from the generated TS types entirely, so importing the bound directly isn't possible. Exported a single named RESIDENCY_MAX_LENGTH constant and used it in both places, then added a parit…

  358. Record AT-6.1c completion and new AT-6.1f follow-up · cec8344

    docs/plans/23-architecture-hardening-plan.md: AT-6.1c marked DONE, documenting the second duplicate validateSyntheticProfileSeed function found while fixing it. New AT-6.1f tracks the consolidation decision for the two duplicate functions. docs/plans/INDEX.md: progress line updated (32/~49 atomic tasks resolved, updated test counts).

  359. Route synthetic-profile orbVisuals through the canonical write gate (AT-6.1c) · 0b2d67a

    syntheticProfileLifecycleSeedValidation.ts's orbVisuals check independently re-implemented a weaker version of prepareOrbVisualsForProfileUpdate (the AT-4.5 write gate wired into POST /api/profile): non-empty color/texture and finite size, but no hex-format normalization and no exact-key allowlist. While fixing it, found a second, independent duplicate not covered by the original write-site audit: profileWireToValidatedSeed.ts exports its own validateSyntheticProfileSeed — same name, nearly identical body, its own…

  360. Update INDEX.md progress line for AT-6.1b · f9d5063

  361. Record AT-6.1b completion in architecture hardening plan · 846c599

  362. Validate questionAnswers map in admin Q&A bulk import (AT-6.1b) · 9d10f94

    QuestionAnswersImportService.importFromBody's parser (questionImportWire.ts) checked only that profiles[i].questionAnswers was non-null before merging it straight into a Mongo $set — any JSON shape for its keys/values (numbers, nested objects, arrays) landed in the profiles collection verbatim. Added QuestionAnswersMapSchema = z.record(z.string(), z.string()), matching the real wire contract SaveProfileAnswerRequest already enforces for the single-answer path (POST /api/profile/answer, answer: z.string()) that thi…

  363. Record UC-8 dead-code sweep round 2 completion · b4ba032

    docs/plans/23-architecture-hardening-plan.md: UC-8 marked DONE with the full deletion list, the debugSettingsApiPaths.ts false-positive catch-and-revert, and the new validators.ts dead-code flag recorded for a future approval round. docs/plans/INDEX.md: progress line updated to reflect the 21 deleted items and both apps' full green suite counts (api 264/264, web 864/864).

  364. Remove 16 verified-dead code items from apps/web (UC-8 round 2) · 4ec9cce

    User-approved deletion after a fresh grep re-check (src/ and tests/) immediately before each removal, matching the UC-5 verification bar. One false positive was caught by this re-check and restored before commit rather than deleted: debugSettingsApiPaths.ts is read via readFileSync by tests/atomic/security/admin-ui-push-test-api-path.test.ts (a string-content assertion, not an import, invisible to a plain "who imports this" grep) — left untouched. Whole files removed (zero callers anywhere): - lib/profile/bindAuth…

  365. Remove 5 verified-dead code items from apps/api (UC-8 round 2) · 3b529ad

    User-approved deletion after a fresh grep re-check (src/ and tests/) immediately before each removal, matching the UC-5 verification bar: - lib/http/connectionStatementsApiCodes.ts (whole file) — zero references anywhere. - lib/chat/chatMediaOrphanPolicy.ts (whole file) — a GC-policy constant for GAP-8.2.6-02 that was apparently never wired in (the sibling constant for the same GAP is used, this one wasn't). - lib/chat/mongoTransactionSupport.ts (whole file) — zero callers. - lib/learning/learningPolicyConstants.t…

  366. Record AT-6.1a/AT-7.3/AT-7.6 completion and UC-8 dead-code sweep round 2 · 3db7476

    docs/plans/23-architecture-hardening-plan.md: - AT-6.1a, AT-7.3, AT-7.6 marked DONE with fix + verification detail. - New UC-8 section: fresh dead-code sweep findings (~20 items across both apps, background agent a21a88f8e98e54f7b), recorded but NOT deleted per this session's updated dead-code policy — awaiting explicit user approval to delete or convert to finish-it tasks. docs/plans/INDEX.md: progress line updated (30/~47 atomic tasks resolved).

  367. Fix missing SELF_PEER_FORBIDDEN in web connectionTransitionDetailCodes (AT-7.6) · 2385a4d

    Found by a dead-code sweep's "mirror pair" check, then confirmed as a real bug rather than dead code: the web-side CONNECTION_TRANSITION_DETAIL_CODES was missing SELF_PEER_FORBIDDEN, present in the API-side source of truth. resolveConnectionTransitionUserMessage's DETAIL_TO_INTL_KEY map had no entry for it, so a real, tested backend error path (services/connectionService.selfPeerReject.test.ts, e2e connections-self-peer-rejected.spec.ts) silently fell back to a generic error message instead of a localized one. Add…

  368. Fix getMatchPriorityLevel re-hardcoding connection-ring SSOT (AT-7.3) · a8eb56d

    MatchCalculator.ts's getMatchPriorityLevel hardcoded 85/70/60 a second time — byte-identical to connection-ring-thresholds.json's RING1/2/3_MIN, which connectionRingBandConfig.ts already imports correctly as SSOT — plus an extra, unsourced 50 cutoff. This function runs on the real production match-persistence path (storeProductMatch.ts, BulkMatchProcessor.ts): every `matches` row written for a real user got a priorityLevel computed from a silently-drifting second copy of the threshold values. Imported the three sh…

  369. Zod-validate admin bulk-profile-upload input (AT-6.1a) · 2baa54b

    AdminService.bulkUploadProfiles was the least-constrained write path in the codebase: normalizeBulkProfilePayload spread raw admin-uploaded JSON straight into insertOne() with zero field-shape check, gated only by an array-length cap. The dead AdminBulkUploadProfilesRequest Zod schema was never wired into the route. Verified (via research agent) that POST /api/admin/profiles is a real admin-facing feature (the Super Admin "System Data" tab's bulk-JSON import UI), distinct from the synthetic/lab profile generator p…

  370. Record AT-4.3 completion and split two audits into 10 new atomic tasks · ee128a5

    docs/plans/23-architecture-hardening-plan.md: - AT-4.3 entry rewritten to reflect the full 26-handler rewrite (supersedes the earlier date-only slice), with the accounts/link unvalidated-insertOne finding called out explicitly. - AT-6.1 (profiles collection write-site audit, background agent a27ff8ab3c471545b) recorded with its full 13-write-site findings and split into AT-6.1a-e: admin bulk-upload's unvalidated insertOne (highest severity), admin question-answers bulk import, a weaker duplicate orbVisuals validat…

  371. Fully Zod-harden registerInternalNextAuthRoutes.ts (AT-4.3 complete) · e943d7f

    All 26 internal NextAuth adapter-persistence handlers now validate request.body against a per-handler Zod schema via validateBody(), replacing hand-rolled `request.body as {...}` casts and manual presence checks. Supersedes the earlier date-only slice. Most severe finding: accounts/link had zero validation of any kind before linkNextAuthAccount() ran a raw accounts.insertOne() — fixed with a LinkAccountBody schema verified field-for-field against both the store-layer AdapterAccountRecord type and the real caller (…

  372. Add max array-length bounds to admin bulk-import routes (AT-4.4) · 159f63c

    POST /api/admin/questions/bulk, /api/admin/connection-statements/bulk, and /api/admin/profiles cast their body array to unknown[] with no upper bound. Requires an already-compromised admin session to exploit, hence low priority, but still an unbounded trust-boundary input. Added a 1000-item cap to all three -- 10x simulation_population_size (100) from src/config/learning_policy.stage.json, generous enough for any real bulk-import/seed use case while ruling out a pathological payload. Added an HTTP-level test for a…

  373. Add missing loop-lock closeout docs referenced by CI gate and a test (AT-2.5) · 79695ee

    .cursor/LOOP-KIT-PORT.md and .cursor/loop-locks/README.md were referenced by .cursor/README.md/PROMPT.MD and required to exist by both a vitest test and scripts/check_product_isolation.sh's real MAINTAINER_CLOSEOUT_DOCS gate, but neither file existed anywhere in the repo. git log --all -S for both file names found exactly one same-day commit pair (1e059ab added the doc references, 3c9f080 added the test asserting they exist) with no earlier or later commit, branch, or sibling repo ever delivering the actual files …

  374. Validate date fields in registerInternalNextAuthRoutes.ts (AT-4.3 slice) · 03e1cd2

    new Date(body.expires) and 4 more identical call sites (emailVerified x2, expiresAt, now) passed unvalidated wire strings straight to the NextAuth adapter-store layer -- new Date() silently returns Invalid Date on garbage input instead of throwing, so a malformed value would have been persisted rather than rejected. Added parseRequiredDate/parseOptionalDate helpers; every new Date(body.X) call site in the file now 400s with a field-specific message before reaching the store layer if the string doesn't parse. The o…

  375. Add max-length/enum bounds to chat, profile, and report input schemas (AT-4.1/4.2) · 2127ba5

    SendMessageRequest.text, UpdateProfileRequest.bio/name/firstName/lastName/ interests[], and reportUser_Body.reason/details had no upper bound beyond Fastify's default ~1MB body limit; SendMessageRequest.messageType accepted any string despite being a documented 5-value closed set. Edited the SSOT (src/packages/contracts/product.openapi.yaml) first, then regenerated src/apps/web/src/generated/api-types.ts for real (its generator has no cross-repo dependency) and hand-mirrored the same bounds into the generated Zod …

  376. Remove verified-dead code (AT-5.1-5.10) and fix two pre-existing test/reality gaps · 82492cd

    Deleted 9 verified-dead exports/files identified by the architecture sweep: deprecated discovery-wire parser aliases, resolvePeerInboxRouteLabel, match-card's resolveMatchPercent barrel, the unused RuntimeConfigService, url-resolver's dead refreshConfig(), coreValueIcons' iconForCategoryColor, idGeneration's web-side generateConnectionId alias, stubUserBlocksCollectionInMongoMock, and the emailOtpProof.ts re-export shim (repointed its one real consumer and one test mock at emailOtpService.js directly). Updated the…

  377. Fix BOLA/IDOR, broken migration, silent-fallback logging, cross-repo SSOT inversion (#6) · eb2b06d

    * Fix BOLA/IDOR, broken migration, silent-fallback logging gaps, cross-repo SSOT inversion Security/data-integrity (P0): - resolveChatPeerOtherUserIdForViewer: fail closed instead of returning an unverified peer identifier when no connection exists (BOLA/IDOR fix); registerConnectionsQwenRoutes now catches the resulting 404 correctly. - Disable the broken conversationThreadId migration: it prefixed conversationId with conv_, but no live read/write path ever adopted that scheme, so running it would have silently fo…

  378. Stop all workflows from running automatically (#5) · 8d3f989

    All GitHub Actions workflows now trigger on workflow_dispatch only — no more automatic push/pull_request/schedule runs.

  379. Stop all workflows from running automatically · a7030d5

    Every workflow under .github/workflows/ now triggers on workflow_dispatch only. Removed push/pull_request triggers from ci.yml, build-once.yml, operator-ui-e2e.yml, schema-contract.yml, service-worker-bundle.yml, and universe-fragment-shader.yml; removed the weekly schedule trigger from fleet-tenant-automated-health.yml. The three web-client-e2e-*.yml workflows were already workflow_dispatch-only. Every affected workflow has been failing on every push/PR at the cross-repo checkout step since 2026-06-29 (missing IN…

  380. Point Turbopack root at the pnpm workspace, not apps/web itself · d12d873

    next.config.ts pinned turbopack.root to __dirname (src/apps/web). That's narrower than the actual pnpm workspace root (src/, per pnpm-workspace.yaml), and apps/web's tsconfig.json extends the sibling workspace package @ifeoma-tc/tsconfig (src/packages/tsconfig) through a node_modules symlink. With root scoped to apps/web, Turbopack refused to follow that symlink and `next dev` failed every request with "tsconfig.json: extends ... doesn't resolve correctly" — found while running the app locally end-to-end (includin…

  381. Migrate CI workflows and infra-sibling path resolution to the 3-repo split · 72c5adf

    app-infra-services split into app-infra-operator (operator/fleet/tenant/ conformance/contract-management) and app-infra-host (runtime-host/vm-manager) on 2026-07-04, with cicd-pipeline renamed conformance-management and api-management renamed contract-management along the way. Every checkout step, shell/Python/Node path-resolution helper, npm script, and production code path in this repo that referenced the old single-repo monorepo layout was silently pointing at directories that no longer exist. - Add app-infra-o…

  382. Flag that app-infra-services was split 2026-07-04 — token alone won't go green · 2dc9455

    Cloned app-infra-services directly to check the layout the CI checkout expects. scripts/ci-checkout-infra-layout.sh's REQUIRED_MODULES (cicd-pipeline, fleet-management, operator-management, tenant-management, api-management, machine-learning) do not exist at that repo's root anymore: control plane moved to a new sibling repo app-infra-operator, host/runtime moved to app-infra-host, and machine-learning moved under horizontal-services/machine-learning. Both sibling repos are real and actively pushed to (as recently…

  383. Rename cross-repo checkout secret to match sibling repo's convention · c8921a9

    app-infra-services already checks out app-trueconnection with the same shape (token: ${{ secrets.TC_APP_CHECKOUT_TOKEN || github.token }}, in build-once.yml). Renamed INFRA_CHECKOUT_TOKEN -> INFRA_APP_CHECKOUT_TOKEN to match that org convention (<repo-being-checked-out>_APP_CHECKOUT_TOKEN) instead of inventing a new naming style. Also documented in docs/ci/infra-checkout-token.md: - TC_APP_CHECKOUT_TOKEN's value couldn't be confirmed (app-infra-services' own build-once.yml fails earlier, at a "Require product CI b…

  384. Backend-driven client-server logging + dependency fixes (#1) · b277720

    Backend-driven client-log ingestion (severity-gated, admin toggle) plus fixes for pre-existing undeclared apps/web dependencies and a test-fixture bug. See PR #1 for full details.

  385. Decouple local dev boot from downstream infra services · 49fd488

    - DEV_AUTH_BYPASS now actually removes the ZITADEL dependency in dev on both apps/api (env.ts) and apps/web (buildZitadelProvider), instead of still requiring well-formed ZITADEL_* values to boot. - Added apps/api/scripts/dev-standalone.mjs: in-memory MongoDB + dev-safe env in one command (npm run dev:standalone / pnpm dev:api:standalone) — no Docker, no ZITADEL, no sibling app-infra-services checkout. Verified end-to-end. - Fixed dead apps/api/scripts/lin/start.sh (referenced tooling/containers that no longer exi…

  386. SSOT for ifeoma-tc prod ship · 36735a5

    Auto-prepared by operator-deploy-source-ship for lifecycle tenant-prod-app-ship.

  387. Point non-product skills at owning-repo SSOTs; keep product skills local. · ae0591f

    Replace misplaced operator/fleet/control-api skill trees with alias stubs and retain product-* skills as the product SSOT for the skills migration.

  388. Update ai-workflow-skills paths after kit restructure (installers/harness) · 5a13087

  389. Update references after ai-workflow-installer -> ai-workflow-skills rename · 0badb0e

  390. Add agent context, verify scripts, and kanban evidence. · cd53932

  391. Implement journey-bank seed, matching scaffold, and binding modules. · 78b5be4

  392. Expand product OpenAPI contracts for journey and matching surfaces. · d8a9f91

  393. Extend Score descriptors for secret-materialize and matching workload. · 49da93b

  394. Add agent rules, skills references, and run-canvas tooling. · 6695b5d

    Agent overlay bindings for repo boundaries, API contract norms, and maintainer skills.

  395. Restore verify.sh and record journey-bank seed evidence. · c1d8eb1

    Restores maintainer verify entrypoint and KANBAN evidence for journey-bank ensure + E2E work.

  396. Extend descriptors for secret-materialize and matching workload. · 295b8c2

    Aligns Score YAML fragments, verify scripts, and CI checks with composable registration vocabulary.

  397. Add matching-service scaffold and Score descriptor. · 46b37d5

    FastAPI health/internal route stubs for future strangler; live path remains ml-service until API wiring ships.

  398. Add service binding modules for API and web clients. · 3c257a6

    Wires composable app descriptor env keys with focused binding tests and import allowlist updates.

  399. Hint users to check spam folder for sign-in codes. · f0a0dc5

    Shows localized spam/junk folder copy on OTP verify and magic-link email-sent steps.

  400. Add journey bank seed-and-answer Playwright spec. · 47647ec

    Ensures banks via internal ops route, answers reflection and connection in UI, and asserts profile wire persistence without ensure-discovery-peers pre-answers.

  401. Add idempotent journey-bank ensure deploy gate. · 8ee3ef2

    POST /api/internal/ops/ensure-journey-banks skips when active banks meet journey minimums; otherwise upserts packaged seeds. Includes operator scripts, Dockerfile seed COPY, and tests.

  402. Add pricing model research, simulator, and phase-0 plan. · 46d7501

  403. Use brand globe for favicon and PWA maskable icons · 3bf9273

    Replace sparkle mark with concentric AppBrandHeroOrb-style globe so browser tabs and install icons match the Android launcher.

  404. Note Traefik strips Next Vary on assetlinks route · aa2ac26

    Document tc-dal-strip-vary empty Vary removal for Google DAL.

  405. Exclude /.well-known from Next security headers · c233242

    Keep Digital Asset Links and AASA on route-only headers so Google DAL is not served page CSP/frame policies that correlated with intermittent ERROR_CODE_MALFORMED_CONTENT.

  406. Clarify assetlinks route skips page security headers · d215a4d

    Point at next.config exclusion of /.well-known for Google DAL fetcher.

  407. Compact assetlinks JSON and minimal Content-Type · ca88733

    Google DAL echoes our current fingerprints (colon-stripped in errors) yet still returns MALFORMED_CONTENT — align body/headers with Play snippets.

  408. Note pretty-print purpose on buildAndroidAssetLinksJson · 14307c8

    Document why assetlinks JSON is indented (Google DAL body-cache bust).

  409. Colon fingerprints are live but statements:list still reports the old colon-free malformed payload — change body bytes so caches miss. · 6e7856e

  410. Track assetlinks.json route; set no-store Cache-Control · e3aea96

    *.json gitignore hid the App Router folder named assetlinks.json/. Un-ignore the route and send Cache-Control no-store so Google DAL can refresh after the colon-fingerprint fix.

  411. Google Digital Asset Links rejects colon-free fingerprints as malformed. · c000fab

    Normalize env input to AA:BB:… in buildAndroidAssetLinksJson output.

  412. Checkpoint before checking out main · 4768c2f

  413. Sync agent bindings and tc-bindings KB. · c12c78d

  414. KANBAN Phase 0 closeout, plans, and requirement coverage. · 43f671d

  415. Update verify scripts, workflows, and maintainer gates. · 2bec60e

  416. Paywall, connection workflow, and atomic coverage. · 71b861c

  417. Paywall integration, discovery filters, and shell workflow updates. · 88ab84f

  418. Regen OpenAPI axios clients and models. · 6e7e02d

  419. Expand rbac, rate-limit, and route regression coverage. · 8aaf837

  420. Harden chat, connections, mongo transactions, and admin routes. · a93eee3

  421. Phase 0 paywall entitlements, purchases, and enforcement. · 5c5f341

  422. Update composable application manifest and score docs. · 394b15f

  423. Unify learning policy paths and pricing catalog SSOT. · afe09d7

  424. Split matching service ownership and HTTP clients. · fe734dd

  425. Add paywall and matching OpenAPI surfaces. · c858032

  426. Sync top-level SSOT for product-only repository scope. · 8427856

    Refresh AGENTS, KANBAN, PROMPT, and feature matrix pointers after moving control-plane ownership to sibling repos and tightening CI requirements.

  427. Align tests and admin UI with sibling infra layout. · 6375300

    Update infra path helpers, atomic invariants, e2e helpers, release notes, and admin debug settings for control-plane integration via env and HTTP only.

  428. Move cursor plans and trim infra analysis drafts. · 27410e3

    Archive superseded cursor plan files and drop fleet/operator/pipeline analysis drafts that now live in sibling infra repositories.

  429. Consolidate plans for product-only repo boundary. · 51b0e89

    Retire control-plane and VMM hosting plan drafts from the product tree; update structural overview, gap checklist, and execution roadmap for HTTP/env sibling integration.

  430. Trim agent overlay to product-only bindings. · bc9aba6

    Remove infra-operator KB, skills, and plans from the product overlay; refresh navigation indexes, tc-bindings, and product-stage skills for sibling-repo HTTP/env integration.

  431. Drop control-plane workflows and product CI layout scripts. · fd67c04

    Remove build-once, fleet health, and operator UI workflows plus infra-path helpers from the product repo; tighten verify and isolation guards for sibling-repo integration only.

  432. Remove product control-plane Python bridge. · 581f8c6

    Delete src/interface and shared import-tier tooling so the product repo no longer hosts Fleet-facing Python; drop UI and tests that assumed in-repo control-plane codegen and fleet debug hints.

  433. Remove obsolete workflow-register scripts and suspend-host helpers. · 14f001d

    Drop in-repo agent workflow lock CLIs superseded by ai-workflow-installer; trim package.json scripts and update kanban sync tooling accordingly.

  434. Add paywall planning docs and KANBAN TC-PAY implement group. · 959b98f

    Introduce pricing SSOT, requirements, phase-0 plan, interactive model, and board rows wired to ai-workflow-installer req_coverage harness.

  435. Add run-canvas CLI source kept in product repo. · 82717b0

    Portable run-canvas skill installs from ai-workflow-installer but requires this repo-local tools/run_canvas.py and tests for canvas generation workflows.

  436. Update plan docs, PROMPT, and scripts/verify.sh to use the sibling installer harness instead of removed in-repo ideation tooling. · abd86d7

  437. Stop tracking portable installer-managed skills and rules in git. · 16c3508

    Portable packages reinstall from ai-workflow-installer; add gitignore lockfiles, TC platform anti-patterns overlay, and update agent docs/KB paths accordingly.

  438. Sync package-lock typescript dev flag after install. · f16b00c

  439. Add application.yaml identity manifest for True Connection. · 42b9f61

  440. Normalize dev compose npm install for bind-mounted packages. · 7ba255d

    Clear stale node_modules volume seeds and install via scratch dir when package.json uses file:../../packages paths that break arborist in /app.

  441. Migrate clean-arch consumer pointers to app-code-compliance · 102675e

    Update KB, bindings, and architecture audit docs to use scanner-clean-arch or POST /api/v1/scans instead of retired dependency_graph_analyser paths.

  442. Document optional code-compliance scan API for clean-arch audits. · c781f61

    Point dependency-graph-analyser KB at POST /api/v1/scans and consumer-migration docs.

  443. curl, build-info, and e2e:health-gate PASS on stage (0.1.1009 / 0.1.193). · d40c2eb

  444. RESEARCH-SLOT4-BOARD-STATE-85 — §0b triage PASS · 04bcf09

    Todo idle; plan drift clean; product gates PASS; infra codegen drift remains Blocked; sync Backlog pulse note to OPS-STAGE-85.

  445. curl, build-info, and e2e:health-gate PASS on stage (0.1.1009 / 0.1.193). · 923c330

  446. Add RESEARCH-SLOT4-BOARD-STATE-84 audit log row · e4dc8e1

  447. RESEARCH-SLOT4-BOARD-STATE-84 — §0b triage PASS · cacfb2c

    Todo idle; plan drift clean; product gates PASS; infra codegen drift remains Blocked; sync Backlog pulse note to OPS-STAGE-84.

  448. curl, build-info, and e2e:health-gate PASS on stage (0.1.1009 / 0.1.193). · 1077d4a

  449. Add RESEARCH-SLOT4-BOARD-STATE-83 audit log row · 02fa13b

  450. RESEARCH-SLOT4-BOARD-STATE-83 — §0b triage PASS · eb363e8

    Todo idle; plan drift clean; product gates PASS; infra codegen drift remains Blocked; sync Backlog pulse note to OPS-STAGE-83.

  451. curl, build-info, and e2e:health-gate PASS on stage (0.1.1009 / 0.1.193). · fbcf750

  452. Add RESEARCH-SLOT4-BOARD-STATE-82 audit log row · 166a941

  453. RESEARCH-SLOT4-BOARD-STATE-82 — §0b triage PASS · 2ff391f

    Todo idle; plan drift clean; product gates PASS; infra codegen drift remains Blocked; sync Backlog pulse note to OPS-STAGE-82.

  454. curl, build-info, and e2e:health-gate PASS on stage (0.1.1009 / 0.1.193). · 1aeaf6e

  455. RESEARCH-SLOT4-BOARD-STATE-81 — §0b triage PASS · 4e686ba

    Todo idle; plan drift clean; product gates PASS; infra codegen drift remains Blocked in app-infra-operator.

  456. curl, build-info, and e2e:health-gate PASS on stage; Let's Encrypt TLS OK. · 93e40b8

  457. RESEARCH-SLOT4-BOARD-STATE-80 — §0b triage PASS · 26a6fd4

    Todo idle; plan drift clean; product gates PASS; infra codegen drift remains Blocked in app-infra-operator.

  458. OPS-STAGE-CONTINUITY-PULSE-80 — stage TLS restored · 396cefd

    Document P0 pulse: Traefik default cert regression fixed via infra-refresh-traefik-tls; curl and e2e:health-gate PASS on stage.

  459. WF-TRACE matching-signal parser boundaries at read sites · eb50187

    Replace DiscoveryProfile and inline unknown casts with SSOT helpers (readCompleteMatchingSignalDimensionsOrNull, coerceDiscoveryProfileScoreDeriveInput, universePlacementProfileFromPartial) across discovery, chat, profile maturity, and analytics.

  460. Route discovery profilePicture through shared wire mapper. · 74ada31

    Map profilePicture in discoveryProfileWireToClient via mapProfilePictureFromWire; drop adapter cast; fix truncated RESEARCH-SLOT4 kanban verify gate.

  461. DRY profile card normalizer through wire field mappers. · 0b8b69e

    Route profileDataNormalizer and profileEnrichment extension fields through profileWireFieldMappers; close WF-TRACE group with strict tests under tests/atomic/profile.

  462. Tighten Rating OpenAPI schema and strict wire parsers. · e2284ed

    Replace loose additionalProperties Rating with required fields matching GET/POST /api/ratings responses; regenerate types and validate at parseRatingsFromWire boundary.

  463. WF-TRACE gates for analytics, ratings, and journey bank failures · 39f64b8

    Stop silent empty states when ratings or journey bank APIs fail; add pure gate SSOTs, wire parsers, and atomic/gray-box test coverage wired into verify-product-gates.

  464. Update KANBAN, README, FEATURE_MATRIX, cursor skills/KB, and archive drafts so platform orchestration references the split operator repo. · 37bd078

  465. Rewrite structural overview and fix cross-repo plan links. · d4dfd1a

    Point control-plane references at app-infra-operator, correct module GitHub paths in plan 18, and add repository.yaml descriptor stub.

  466. Saga registration only; no operator HTTP from product · 09a7b92

    Remove cross-repo filesystem pointers and run.py delegation. Product SourcePublicInterface and OpenAPI resolution are owner-local only; CI and tests use APP_INFRA_* env fail-closed. Score README documents registration bundle; product runtime uses tenant merge-env (ML, Mongo, Redis) only.

  467. Link mobile backlog rows to sibling KANBAN.md · 5a79211

    Device verification work is tracked in app-trueconnection-ios/android repos.

  468. Extract iOS and Android shells to sibling repos · ee1dc2a

    Move src/40_ios and src/50_android into app-trueconnection-ios and app-trueconnection-android; scope product PWA gates to web-only and resolve mobile paths via SourcePublicInterface sibling checkout.

  469. Regenerate OpenAPI client types after contract updates · 17433be

    Refresh generated TypeScript API bindings from owner product.openapi.yaml.

  470. Sync product feature matrices and README path SSOT · 3c9f080

    Update src FEATURE_MATRIX for PWA shell and boundary gates; sweep module README indexes to composable paths and extend path-invariant atomic tests.

  471. Close PWA-SHELL sprint and Plan 17 wave 0 plateau · 1e059ab

    Record loop 77 evidence, secret-store consumer plateau, loop-kanban skill, and agent overlay bindings after Todo implement rows reached skip-list only.

  472. Wire product gates, PWA shell checks, and workflow atomic SSOT tests · daca9f0

    Chain verify-maintainer-gates and control-plane boundary jobs in GitHub Actions with atomic tests that lock CI workflow wiring against regression.

  473. Add WebView shell with FCM, App Links, and contract tests · d399e0a

    Introduce Gradle module, NativeBridge handler, deep-link routing, and JVM tests aligned with plan 22 Android work packages.

  474. Route admin ML refresh through the cohort adapter, verify native-shell compat JWT for handoff, harden simulation worker bootstrap, and fix api Dockerfile for composable tsconfig l… · a3aac51

    Route admin ML refresh through the cohort adapter, verify native-shell compat JWT for handoff, harden simulation worker bootstrap, and fix api Dockerfile for composable tsconfig layout.

  475. Ship WebView store shell with OAuth, bridge, and session handoff · bf31580

    Replace auth placeholder with native sign-in, universal links, push bridge, NativeBridge contract tests, and verification docs for device checklist work.

  476. PWA shell readiness — maskable icons, well-known, native handoff · c13d73e

    Ship store-shell assets (AASA, asset links, maskable icons), native-shell session handoff BFF, push runtime branching, and PWA regression gates for stage deploy.

  477. Add workload descriptors and secret-store consumer SSOT · da97e73

    Introduce Score YAML for api/web/ml-service with validation gate and document future secret-materialize vocabulary behind COMP-DESC-VOCAB infra coord.

  478. Ship Plan 17 wave 0 product boundary CI gates · 25d5748

    Add dependency-cruiser, import-linter, tenant import tiers, pnpm workspace, Next.js coherence, and maintainer gate bundles so product code cannot drift into control-plane imports without failing verify-architecture-guards.

  479. Migrate composable and PWA plans to numbered 18–22 · fad4b63

    Renumber and expand implementation inventories so agents have stable plan IDs for composable infra, descriptors, and PWA/WebView work; refresh INDEX cross-links.

  480. Composable infrastructure deps and plans index · 6c73c36

    Document composable app descriptor architecture and infra dependency graph; link new plans from docs hub and root README.

  481. Route OpenAPI parity to owner module verify scripts · 38b6f7f

    Replace stale api-management hub paths in schema-contract and VMM drift checks with federation owner codegen entrypoints per ARCH-ALIGN-TC-CI-CHECKOUT.

  482. Add PWA and native webview readiness gap analysis. · d8a5d3d

    Document current install/prompt coverage, webview constraints, and follow-up work for mobile shells.

  483. Sweep src README tree to composable paths and owner OpenAPI SSOT. · b6f28e2

    Update apps, mobile, PWA, and interface hub docs; point API references at src/packages/contracts and workspace dev commands.

  484. Update root and docs hub READMEs for composable src/apps layout. · e333b0a

    Align entry-point navigation and cross-links with the current product tree under src/apps/*.

  485. Fix composable path drift and add SSOT guards after bug-hunt loop. · 594c913

    Sweep docs, GitHub templates, and FEATURE_MATRIX to src/apps/* paths; add atomic path guards and FEATURE_MATRIX check in check_product_isolation.sh; record loop triage in KANBAN audit log.

  486. Consolidate .gitignore: dedupe sections and protect tracked JSON. · a05a899

    Group deploy-env, vault, cache, and lib/ un-ignore rules; ensure src/packages/tsconfig/base.json stays tracked under the broad *.json ignore.

  487. Record BUGBOT-PATH audit log entries and remove stale src/.cursorignore. · fec0aa8

    Document composable-layout fixes in KANBAN; align seed script path comments.

  488. Update web test READMEs and path references for composable layout. · 9f5d7e8

    Align atomic readme invariants and E2E helpers with src/apps/web paths.

  489. Sweep web source docstrings, READMEs, and cross-refs to composable paths. · 272e9a7

    Update feature docs, auth bridges, matching SSOT comments, and dev docs-graph publicPath.

  490. Update web package READMEs and architecture audit docs for composable paths. · 1626e4e

    Align matching system agent rules and next16-baseline with src/apps/web.

  491. Fix API unit test imports and paths for composable repo layout. · 815d15a

    Align learning and question-import tests with productRepoPaths conventions.

  492. Replace legacy 10_backend and 30_ml-service references in comments and operator indexes. · 01a8417

  493. Update iOS and Android bridge docs to reference src/apps paths. · 87ea6a9

    Keep mobile verification runbooks aligned with the composable web and API packages.

  494. Sweep API operator docs and simulation-worker paths to composable layout. · 73f3910

    Cross-link web paths via ../../web; mark legacy-central docs as archived historical references.

  495. Update product plans and root READMEs for composable src/apps layout. · 99aac41

    Refresh TEST_ISOLATION and plan verify commands to use src/apps/api and src/apps/web.

  496. Align agent KB, skills, and rules with composable src/apps layout. · f90e658

    Point operators at owner OpenAPI SSOT and modern web/api paths instead of legacy module names.

  497. Fix schema-contract workflow concurrency and add owner SSOT verify steps. · c3a121e

    Update E2E workflow paths for src/apps/web and add control-plane layout verify script.

  498. Add BUGBOT regression guards for path SSOT and OpenAPI ownership. · 1727065

    Cover cursor agent docs, GitHub workflows, KB runbooks, feature READMEs, and codegen script paths.

  499. Consolidate API test paths via productRepoPaths and add architecture guards. · 7668048

    Fix wrong repo roots in contract tests; add composable-path invariants for operator docs and READMEs.

  500. Rename admin.debug fleet i18n shard key to admin.debug.fleet. · f28bfc2

    Keep fleet debug labels consistent across all five locales and the translations export.

  501. Align config threshold sync and E2E env resolution with composable paths. · 57e3617

    e2e_base_url resolves sibling tenant-management; match gate SSOT imports src/config correctly.

  502. Fix ML threshold parity scripts to resolve machine-learning via ci_infra_paths. · b8bcb5b

    Wire score-band and connection-ring parity into CI and guard against hardcoded src/30_ml-service paths.

  503. Fix release-notes repoRoot and script hints for composable layout. · e42f07a

    Resolve git root with four parent hops so verify:release-notes finds sibling infra; drop legacy loadEnMessagesBundle fallbacks.

  504. Add owner Zod codegen scripts and refresh product OpenAPI artifacts. · ead7e3b

    API pretest uses distribute-schemas-for-api; web codegen docs point at src/packages/contracts SSOT.

  505. Fix SourcePublicInterface to resolve composable src/apps paths only. · 8c9ad18

    Drop legacy 10_backend and 20_web-client fallbacks so Fleet and tooling hit the modern tree.

  506. Add @ifeoma-tc/tsconfig base.json and wire web and api packages. · 62229bc

    Un-ignore base.json so npm ci can resolve the shared extends target apps depend on.

  507. Fix offline CI path drift: owner OpenAPI tests and infra sibling SSOT. · 1893f5b

    Contract invariants read src/packages/contracts; test helpers resolve app-infra-services deterministically; dry matrix remaps legacy source/* paths; release-notes semver uses src/apps/*.

  508. OAS-FED-PR02 + Bugbot fixes: owner OpenAPI codegen and profile/worker hardening. · 1fb8cfa

    Wire web codegen to src/packages/contracts/product.openapi.yaml, sync product-openapi.json, fix stale 10_backend/cicd-pipeline test paths, guard authUid unique-index collisions, and align simulation-worker Mongo DB default with the API (application).

  509. Owner-local bundled spec and verify gate so product federation no longer depends on api-management hub copy alone; manifest pointer update remains infra OAS-FED-R02. · 2ec3e3d

  510. Record AUDIT-KANBAN-PLAN-SYNC pulse — plan↔kanban verification PASS. · 0c5f56f

    verify-docs-plans-kanban.sh: 32 Todo + 0 Backlog match plans; format and sync tests OK.

  511. Record TC-APPS-CODEGEN-DRIFT-PULSE — five module webs zero drift. · ccdbf3f

    check_module_web_codegen_drift.sh PASS across tenant, fleet, pipeline, contracts, operator.

  512. Control-plane imports, dockerfile context, product isolation, and web imports verified. · b748317

  513. Record RESEARCH-SLOT4-BOARD-STATE pulse — slot 3 PASS. · 7328cb3

    Post Plan 17 boundary deferrals: Todo 2 stub groups, Backlog 16 rows; group count < 4.

  514. shared/tools/check_shared_import_tiers.py not present; remains deferred per Plan 17 A2. · 7878a1b

  515. .dependency-cruiser.cjs not present; remains product-gated per Plan 17 wave 0. · af844e8

  516. importlinter.ini and CLI not present; remains product-gated per Plan 17 wave 0. · da424fd

  517. Re-confirm TC-BOUNDARY-WORKSPACE-PNPM deferral — root workspace absent. · 838bb84

    SSOT remains src/pnpm-workspace.yaml (apps/*); product-gated root workspace.

  518. check_kb_rule_links.py --scope all reports zero broken links. · 027785d

  519. On-demand validation after KANBAN audit-log dedupe closeout. · b25ca72

  520. Fix duplicate SIDECAR audit id; AUDIT-KANBAN-PLAN-SYNC PASS. · f91e265

    Remove stale deferred TC-BOUNDARY-SIDECAR-PIP-INSTALL row; verify-docs-plans-kanban.sh exit 0.

  521. Re-confirm TC-INFRA-PRODUCER-IMPL deferral — spike doc SSOT present. · 6c6274b

    Org repo app-infra-host implementation remains product-gated.

  522. Re-confirm TC-PLAN07-P8-K8S deferral — deploy/k8s still absent. · e54ac5c

    On-demand backlog pulse; K8s scaffold remains product-gated.

  523. RESEARCH-SLOT4-BOARD-STATE PASS (a9448424) · 1927a2a

    On-demand P2 board slot pulse — Todo groups=3 < 4; Backlog 16 deferred rows.

  524. All four CI boundary guard scripts exit 0 after sidecar pip-install closeout. · c6c0d44

  525. Fix codegen drift check for sibling app-infra-services layout. · 6c8ec9c

    Run git diff in APP_INFRA_ROOT for generated web paths; close TC-APPS-CODEGEN-DRIFT-PULSE with verify PASS.

  526. Audit log and backlog purge for Plan 17 A1 sidecar boundary work. · 635b639

  527. Remove wrong-project skills, superseded plan stub, and unwired kanban script wrapper; purge Todo and archive in KANBAN audit logs. · 171ea34

  528. Wire control-plane jobs to app-infra-services monorepo checkout. · afa2e79

    Add ci_infra_paths helpers, update workflows and scripts for IFEOMA-CLOUD360/app-infra-services layout, and fix python/ml requirement paths after module moves.

  529. Checkout machine-learning from app-infra-services monorepo. · b5ef6e7

    Replace missing IFEOMA-CLOUD360/machine-learning remote with app-infra-services checkout and symlink layout.

  530. Sync ios, android, interface, and tooling paths. · 384177b

    Update product README, feature matrix, native-shell docs, and parity tools for renamed module layout.

  531. Sync paths, tests, and release notes for apps/web. · 75bcba7

    Retarget scripts, e2e helpers, and docs from 20_web-client to guide-canonical apps/web paths.

  532. Sync paths and docs for monorepo layout. · 774cbef

    Update api-management references, ml-service client paths, and test/docs after module renames.

  533. Remove legacy 30_ml-service tree and agent rules. · 9a53fdf

    Drop pending-delete ml-service checkout, archived project todos, and source-level cursor rule stubs ahead of services/ migration.

  534. Update root README and feature matrix for new layout. · 1eb369b

    Refresh repo entrypoints and capability index after control-plane module renames.

  535. Retarget workflows and scripts to renamed infra layout. · c746c89

    Update GitHub Actions paths for apps/web and control-plane modules; add CI infra path helpers.

  536. Rewrite agent overlay paths for module renames. · d7efb5f

    Align rules, skills, memory KB, and plans with fleet-management, cicd-pipeline, and apps/web SSOT paths.

  537. Sync architecture plans with renamed module paths. · 5bcf940

    Update plan banners, INDEX, and cross-references to cicd-pipeline, fleet-management, and apps/web layout.

  538. Centralize stray todos into Backlog SSOT. · 0c3d8bb

    Move ML lab, web §6, native-shell, CI, and repo-cleanup items into KANBAN Backlog and point plan/index docs at the canonical rows.

  539. Add dev profiles and monorepo architecture decisions · 4f71f55

  540. Restructure source/ to guide-canonical apps/web + apps/api pnpm monorepo. · e8ff95e

    Move 10_backend and 20_web-client into source/apps/{api,web}, add pnpm-workspace.yaml, turbo.json, and packages/tsconfig; update CI paths, interface facade, and README.

  541. Rename control-plane modules and sync repo references. · 3a14878

    Move contracts, pipeline, fleet, operator, and tenant to infra-api-management, infra-cicd-pipeline, service-fleet-management, service-operator-management, and service-tenant-management; update paths across docs, CI, and consumers.

  542. TC-APPS-CODEGEN-DRIFT-PULSE PASS (060a6ed5) · 304dae9

  543. On-demand KB/rule markdown link integrity pulse — check_kb_rule_links.py exit 0. · 4ddd812

  544. On-demand architecture guard pulse — all three guard scripts exit 0. · bdddd2a

  545. On-demand plan↔KANBAN drift pulse — 32 Todo + 0 Backlog match plans; all verify gates PASS. · afdc91d

  546. OPS-STAGE-CONTINUITY-PULSE PASS — stage health + semver gate · 370f182

  547. Drop domain dict-access exclude allowlist for DomainConfig enforcement. · 7942c0a

    Remove legacy _EXCLUDE_VARS entry so domain.get/name patterns are flagged; rename vm_target_prep provision JSON loop var; pytest 10 passed; scanner still reports 8 pre-existing fleet result/report findings.

  548. Drop vm_data dict-access exclude allowlist for VmInfo enforcement. · 725dd36

    Remove legacy _EXCLUDE_VARS entry so vm_data.get patterns are flagged; update tests and KANBAN pulse rows after P2 epic closeout.

  549. Replace passive monitor /data polling with WS telemetry (slice 9). · 4ee753f

    Broker-fed agent_telemetry_canvas drives canvas state; agent_poller retains HTTP sample ingest only; close BACKLOG-MONITOR-WS group.

  550. Retire agent_poller from management action/verify paths (WS slice 9). · 0b8e87c

    Broker-fed agent_broker_status replaces HTTP poller in agent_handlers; bootstrap HTTP isolated in agent_http_status for pre-WS installs.

  551. Block setup/config agent delete when lifecycle disallows it (WS slice 8). · 3f679cd

    Setup save and config import stay declarative-only; removed agents must be in DELETE_ALLOWED_STATES per broker lifecycle snapshot.

  552. Close MONITOR-WS-UI-START-STOP kanban track index (slice 7). · e93b8f7

    Update BACKLOG-MONITOR-WS summary after start/stop WS workflow shipped.

  553. Add monitor WS Start/Stop workflow and UI controls (slice 7). · 656e549

    Wire broker START/STOP through workflow dispatch, guard offline sessions, and surface lifecycle-gated buttons in agent management.

  554. Expose broker lifecycle state in monitor agent UI (slice 7). · ccac28e

    Merge lifecycle_state and ws_connected into /api/agents/state; render lifecycle chip on agent cards; promote MONITOR-WS-UI-START-STOP as next WS epic task.

  555. Purge Todo group after verify PASS; add WS bootstrap and action-executor rows to pipeline FEATURE_MATRIX. · 8a94a7c

  556. Ship monitor WS bootstrap config in SSH provision slice 5. · f67ba4e

    Add manager_ws_url and agent_ws_token to client config so bootstrap install writes websocket endpoint/auth into server-agent.json; legacy SSH helpers log deprecation toward the WS command plane.

  557. Drop stale VmInfo allowlist entry from check_dict_access (slice 1). · 16e928d

    VmInfo dataclass exists; remove obsolete TODO and `vm` from _EXCLUDE_VARS, add bootstrap so the verify gate runs standalone, and document vm_data/domain follow-on in Backlog.

  558. On-demand module-web codegen drift pulse — five */web apps zero drift. · e7c9b0f

  559. OPS-STAGE-CONTINUITY-PULSE PASS (23aecb13) · cbc9d7e

    Stage /api/health 200 (web 0.1.1008); e2e:health-gate web/backend semver match repo.

  560. Add monitor WS action executor and telemetry publisher (slice 4). · cf57971

    Wire AgentActionExecutor into ws_client command handling so runtime agents return structured results for WS lifecycle commands and can emit probe/status telemetry snapshots on the control channel.

  561. Remove duplicate Done group blocks; shipped capability SSOT → feature matrices + Audit Logs. · 9da6542

  562. Close HOSTING-CONTRACTS-VMINFO-DATACLASS research pulse · 25ac22a

    Document VmInfo/DomainConfig gap — dataclasses exist but check_dict_access allowlist is stale; follow-on HOSTING-CONTRACTS-DICT-MIGRATE deferred to Backlog.

  563. On-demand plan↔KANBAN drift pulse — 32 Todo + 0 Backlog match plans; all verify gates PASS. · 170126e

  564. Expose CAGG-backed time-bucketed latency, loss, and jitter series for long-window analytics reads; close BACKLOG — Monitor Analytics Phase 2 group. · 469fc6a

  565. OPS-STAGE-CONTINUITY-PULSE PASS (99e6de62) · df0fb50

    Stage /api/health 200 (web 0.1.1008); e2e:health-gate web/backend semver match repo.

  566. Close BACKLOG — ML Scoring Phase 2 group · dccb54e

    Handoff verify PASS (131+39+4 pytest); archive seven tasks to Audit Logs and update product feature matrices for ml_wave cutover.

  567. On-demand KB/rule markdown link integrity pulse — check_kb_rule_links.py exit 0. · b4016bb

  568. On-demand plan↔KANBAN drift pulse — 32 Todo + 0 Backlog match plans; all verify gates PASS. · bfeb84f

  569. Add Timescale CAGG migrations for 5m and 1h buckets · e38e4b7

    Phase 2 continuous aggregates with real-time mode, refresh policies, and migration tests per timescale analytics plan.

  570. Verify PASS — backend skips matches writes under MATCH_SCORING_SOURCE=ml_wave (recalculateMatchesForUser no-op, persist guard, admin ML-wave repair path). · b8134c0

  571. AUDIT-ARCH-GUARDS-PULSE pulse PASS (agent 5777ca1d). · ac879e4

  572. Add batch Timescale ingest DB worker · 98a00ac

    Drain the passive-monitor ingest queue in background batches with exponential retry/backoff, retain the analytics pool after startup, and start the worker when MONITOR_ANALYTICS_DSN is set.

  573. Wire MATCH_SCORING_SOURCE through compose and merge-env templates · d04ec20

    Stage merge-env already sets ml_wave via mode_overrides; pass the flag into backend containers and document the stage default in deployment templates for Phase 2 ML scoring cutover.

  574. TC-APPS-CODEGEN-DRIFT-PULSE pulse PASS (agent 8fa5c39d). · 6756dc0

    Five module-web apps regen with zero api-types.ts drift; contract_models.py reverted.

  575. OPS stage continuity pulse evidence (2026-06-29) · 8e3339b

    Record PASS for OPS-STAGE-CONTINUITY-PULSE — stage health 0.1.1008 / backend 0.1.193.

  576. Add bounded ingest queue to passive monitor · de0b3d6

    Wire cursor-based agent sample polling into a thread-safe FIFO queue with oldest-eviction overflow so the DB worker can drain normalized SampleRows without blocking the canvas polling loop.

  577. Derive discovery connectionRing from matchPercentage · 9889899

    ML wave rows may omit stored connectionRing; discovery assembly now derives the band via calculateConnectionRing SSOT thresholds while preferring an explicit stored ring when present.

  578. On-demand plan↔KANBAN drift pulse — 32 Todo + 0 Backlog match plans; all verify gates PASS. · f370d34

  579. On-demand KB/rule link integrity pulse — check_kb_rule_links.py exit 0; purge Doing claim; refresh P4 critical-path pointer. · 482a3cc

  580. Split Fisher surfaces into matchItemSurfaces collection · 40d2512

    Wave egress no longer writes surface_maps into matchItemStats; entropy weights stay in matchItemStats for backend loaders. Closes ML-SCORING-ITEMSTATS-SCHEMA-SPLIT.

  581. Add agent sample cursor API for Timescale ingest · 3608981

    Promote MONITOR-ANALYTICS-EPIC ingest slice — ring buffer plus GET /api/agent/samples for server-side polling ahead of passive-monitor queue wiring.

  582. On-demand architecture guard pulse — control-plane imports, product isolation, and sidecar Dockerfile scope checks all exit 0. · 83a56d8

  583. OPS-STAGE-CONTINUITY-PULSE PASS (agent b2e8c3b3) · 73ddc56

  584. Wire monitor workflow handlers to AgentWsBroker dispatch. · d101eee

    HTTP workflow steps route through broker.send_command when the agent WS session is connected, with SSH legacy fallback offline; closes MONITOR-WS-HANDLER-ADAPTERS.

  585. Closeout AUDIT-PLAN on-demand lane — plan sync, banners, and format gates green. · 935d7be

  586. On-demand module-web codegen drift pulse — five */web apps zero drift; fleet contract_models.py reverted before commit (agent a93a7bc6). · ab85455

  587. Assert wave bulk egress emits all eligible peers by default and drop unused Top-K constant; close Phase 2 egress slice with 14 passing tests. · f6e18d5

  588. WS runtime client scaffold with reconnect backoff · 7b6de90

    Land ws_client.py and runtime tests (6 pytest PASS); close MONITOR-WS-RUNTIME-CLIENT in KANBAN.

  589. Phase 2 cohort prod answer parity + promote epic · 521f0eb

    Restore ml_scoring plan SSOT, extend extraNotes/freeText scoring parity with backend journey maps, and close ML-SCORING-COHORT-PROD-ANSWER-PARITY under new BACKLOG — ML Scoring Phase 2 Todo group.

  590. Sync OPS pulse pointers to agent d55b5989 · 51a97f7

  591. Add WS broker connection manager (slice 3) · 8bf16ce

    Ship AgentWsBroker with token auth, single-session registry, command correlation/timeouts, and UI state cache; close MONITOR-WS-BROKER.

  592. Stage continuity pulse PASS — web 0.1.1008 / API 0.1.193 · a162f9c

  593. On-demand architecture guard pulse — control-plane imports, product isolation, and sidecar Dockerfile scope checks all exit 0. · 3b17f3e

  594. Align WS protocol tests with shared module · 8c655b0

    Tests imported the removed agent/ path after slice-2 landed in monitor_server/shared/; verify gate now passes (9 pytest).

  595. Align WS protocol tests with shared module · 9d1af76

    Tests imported the removed agent/ path; point at shared/agent_ws_protocol.py and close MONITOR-WS-PROTOCOL-CONTRACTS with FEATURE_MATRIX + KANBAN evidence.

  596. Align WS protocol tests with shared module path · 2772407

    Tests import monitor_server.shared.agent_ws_protocol after slice 2 landed in shared/.

  597. Closeout AUDIT-PLAN on-demand lane — plan sync, banners, and format gates green. · 4f9ec9f

  598. Ship WS protocol contracts (WS plan slice 2) · 60bcec1

    Command/result/event envelopes and error taxonomy for agent WebSocket control plane; closes MONITOR-WS-PROTOCOL-CONTRACTS verify gate.

  599. Wire analytics DB startup in run_server · 2042cbf

    Initialize Timescale storage (pool, migrations, health) before passive monitor when MONITOR_ANALYTICS_DSN is set; no-op otherwise.

  600. Stage continuity pulse PASS (4e0dc343) · f85fcce

    Verify stage /api/health 200 and e2e:health-gate semver match (web 0.1.1008, backend 0.1.193).

  601. On-demand KB/rule link integrity pulse — check_kb_rule_links.py exit 0; purge Doing claim; refresh P4 critical-path pointer. · b04edf6

  602. On-demand KB/rule link integrity pulse — check_kb_rule_links.py exit 0; purge Doing claim; refresh P4 critical-path pointer. · 646d079

  603. Ship agent lifecycle state machine (WS plan slice 1). · bbdcebc

    Commit stalled MONITOR-WS-LIFECYCLE-MODEL implementation and tests after kanban PASS.

  604. Agent lifecycle state machine SSOT (WS plan slice 1) · c3efbdf

    Land lifecycle.py transition matrix and structure tests; purge stale OPS Doing claim and align KANBAN evidence (9 pytest).

  605. Purge stale OPS Doing claim after continuity pulse (9ae7a457) · 09c8801

  606. Promote Backlog row to Todo group BACKLOG — Pipeline build; document layout in Audit Logs; fix invalid Backlog verify gate; add FEATURE_MATRIX row. · b8af44f

  607. Close PIPELINE-BUILD inventory turn — purge stale Doing claim, enrich Audit Log. · dee7665

    Plan 14 pipeline/build baseline inventoried (4 catalog components, 81 pytest); verify gate passes with no PIPELINE-BUILD rows on board.

  608. All three architecture guard scripts exit 0 (agent 1c30c209). · f348b84

  609. Plan 14 baseline inventory for pipeline/build archived; Backlog row purged; verify gate PASS (no PIPELINE-BUILD refs on board). · b506e8f

  610. Closeout AUDIT-PLAN on-demand lane — plan sync, banners, and format gates green. · ebdd084

  611. Five module-web apps zero codegen drift; fleet contract_models.py reverted. · 613d78d

  612. All three architecture guard scripts exit 0: control-plane imports, product isolation, sidecar Dockerfile scope. · 1e006c4

  613. On-demand architecture guard pulse — control-plane imports, product isolation, and sidecar Dockerfile scope checks all exit 0. · 80d61ca

  614. OPS-STAGE-CONTINUITY-PULSE PASS (agent 9ae7a457) · 9def5fd

    Stage /api/health 200 (web 0.1.1008); e2e:health-gate web/backend semver match repo.

  615. OPS-STAGE-CONTINUITY-PULSE PASS (3dd5e280) · 71cac74

    Stage health 0.1.1008 / backend 0.1.193; e2e:health-gate OK.

  616. Remove orphan web-client mongodb.ts after Plan 17 boundary migration. · be5dd67

    getMongoClientPromise had zero importers; delete dead module and close WEB-MONGODB-ORPHAN-EXPORT (BACKLOG — Web hygiene).

  617. Add Timescale initial schema migration (Phase 1 slice 3) · 94d26c9

    Bundle monitor_sample_raw hypertable SQL under storage/sql with structure tests per timescale_analytics_rollout plan.

  618. Five module-web apps zero codegen drift; contract_models.py reverted before closeout. · 05b11ab

  619. check_kb_rule_links.py PASS — purge Doing claim; update Track Index and Audit Logs (agent 466c4e63). · eff3f6f

  620. Scaffold Timescale analytics storage package (Phase 1) · aa5b8b4

    Add monitor_server/storage with db, migrations, and metrics_repo modules plus structure tests per timescale_analytics_rollout plan slice 2.

  621. Closeout AUDIT-PLAN on-demand lane — plan sync, banners, and format gates green. · 918a58a

  622. Architecture guard scripts — control-plane imports, product isolation, sidecar Dockerfile scope — all exit 0. · 73fbbd0

  623. Closeout AUDIT-PLAN on-demand lane — plan sync, banners, and format gates green. · a287c4a

  624. OPS-STAGE-CONTINUITY-PULSE PASS (agent b294928b) · 236f077

    Stage /api/health 200 (web 0.1.1008); e2e:health-gate web/backend semver match repo.

  625. AUDIT-ARCH guard pulse — all boundary scripts exit 0 · fa78a06

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards.

  626. On-demand KB/rule link integrity pulse — check_kb_rule_links.py exit 0. · d1039c9

  627. Close BACKLOG — ML Scoring prerequisite wave (5cb54f33) · 955f4a5

    ML-SCORING-PREREQUISITE-LAB-HANDOFF verify-phase1-handoff.sh PASS (128+38+4 pytest); group purged; Phase 2 cutover unblocked.

  628. OPS stage continuity pulse PASS (981da1d9) · 6b04bf2

    P0 on-demand verify — /api/health 200 (0.1.1008); e2e:health-gate web/backend semver match.

  629. Close BACKLOG — Plan Hygiene group (ef2602a0) · 23ce397

    Purge Doing/Todo for ARCH-USE-INPROCESS-FLEET-FM-VERIFY; audit log retained.

  630. Reconcile stale in-process fleet rollback prose · 09f053e

    Remove never-implemented USE_INPROCESS_FLEET_FM references from Plan 04 rollback section and Plan 14 gap checklist; close BACKLOG — Plan Hygiene group.

  631. On-demand module-web codegen drift — five */web apps zero drift. · 3b6a534

  632. Purge AUDIT-ARCH Doing after guard pulse closeout · 03184c4

    All three boundary guard scripts passed; remove stale group claim.

  633. AUDIT-ARCH guard pulse — all boundary scripts exit 0 · c824408

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards.

  634. On-demand KB/rule link integrity pulse — check_kb_rule_links.py exit 0. · cc35abd

  635. Close OPS stage continuity pulse (agent 3b5cb5bb) · feaa416

    Stage health 200 + e2e:health-gate PASS — web 0.1.1008 / backend 0.1.193 match repo.

  636. Closeout AUDIT-PLAN on-demand lane — plan sync, banners, and format gates green. · e2d6ba8

  637. Close OPS stage continuity pulse (agent 6dd7851a) · 600b447

    Record P0 on-demand verify — stage health 200 and e2e:health-gate semver match.

  638. On-demand module-web codegen drift verify — five */web apps zero drift; fleet contract_models reverted pre-commit. · 5012893

  639. Record check_kb_rule_links.py PASS in Track Index and Audit Logs. · 97f1b9e

  640. AUDIT-ARCH guard pulse after codegen drift · 8f56ed9

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  641. TC-APPS codegen drift pulse after plan sync · 087d6df

    Re-run module web codegen drift check — five */web apps zero drift PASS.

  642. Re-run plan↔KANBAN sync and plan banner verify gates — all PASS. · d81a607

  643. OPS stage continuity pulse — health 200, semver OK · 51e0e56

    Re-run P0 stage health and e2e semver gate after KB-link pulse.

  644. Re-run check_kb_rule_links.py — all relative markdown links resolve. · 554e7c0

  645. AUDIT-ARCH guard pulse after codegen drift · 81c9d60

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  646. TC-APPS codegen drift pulse after plan sync · 1f96c5a

    Re-run module web codegen drift check — five */web apps zero drift PASS.

  647. Re-run plan↔KANBAN sync and plan banner verify gates — all PASS. · 4e2e04e

  648. OPS stage continuity pulse — health 200, semver OK · d1353f6

    Re-run P0 stage health and e2e semver gate after KB-link pulse.

  649. Re-run check_kb_rule_links.py — all relative markdown links resolve. · fe43f6b

  650. AUDIT-ARCH guard pulse after codegen drift · 146e8bc

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  651. TC-APPS codegen drift pulse after plan sync · d4daac3

    Re-run module web codegen drift check — five */web apps zero drift PASS.

  652. Re-run plan↔KANBAN sync and plan banner verify gates — all PASS. · 5beeee5

  653. OPS stage continuity pulse — health 200, semver OK · 7a098d5

    Re-run P0 stage health and e2e semver gate after KB-link pulse.

  654. Re-run check_kb_rule_links.py — all relative markdown links resolve. · a227610

  655. AUDIT-ARCH guard pulse after codegen drift · 269daba

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  656. TC-APPS codegen drift pulse after plan sync · f3822e2

    Re-run module web codegen drift check — five */web apps zero drift PASS.

  657. Re-run plan↔KANBAN sync and plan banner verify gates — all PASS. · d0a3567

  658. OPS stage continuity pulse — health 200, semver OK · c326103

    Re-run P0 stage health and e2e semver gate after KB-link pulse.

  659. Re-run check_kb_rule_links.py — all relative markdown links resolve. · c98bb47

  660. AUDIT-ARCH guard pulse after codegen drift · 61c4cc6

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  661. TC-APPS codegen drift pulse after plan sync · 3a415b1

    Re-run module web codegen drift check — five */web apps zero drift PASS.

  662. Re-run plan↔KANBAN sync and plan banner verify gates — all PASS. · ceb97ea

  663. OPS stage continuity pulse — health 200, semver OK · 655c773

    Re-run P0 stage health and e2e semver gate after KB-link hygiene pulse.

  664. Re-run check_kb_rule_links.py — all relative markdown links resolve. · dd6cdc9

  665. AUDIT-ARCH guard pulse after codegen drift · d302fdc

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  666. TC-APPS codegen drift pulse — zero drift PASS · 4144629

    Re-run module web codegen drift check on five */web apps after OPS/plan pulses.

  667. OPS stage continuity pulse — health 200, semver OK · eaa4965

    Re-run P0 stage health and e2e semver gate after plan/KB hygiene pulses.

  668. Re-ran plan↔KANBAN sync verify gates — all PASS; purged AUDIT-PLAN Doing/Todo. · b529bda

  669. AUDIT-ARCH guard pulse after codegen/KB pulses · 21c5c37

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  670. check_kb_rule_links.py PASS — all relative markdown links resolve. · e9c5904

  671. TC-APPS codegen drift pulse — zero drift PASS · 88b258d

    Re-run check_module_web_codegen_drift.sh across five module webs.

  672. Stage /api/health 200; e2e:health-gate confirms web 0.1.1008 and backend 0.1.193 match repo. · bc4d534

  673. Record agent 8ae3d08c on closeout-wave re-run. · 4ad50f0

  674. Re-run kanban_docs_sync, plan banners, and format verify — all PASS. · 5485402

  675. AUDIT-ARCH guard pulse after closeout wave · f3e2811

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  676. check_kb_rule_links.py PASS — all relative markdown links resolve. · 3276921

  677. TC-INFRA-PRODUCER-IMPL spike SSOT re-confirm pulse · 1314e45

    Re-confirm docs/plans/12-infra-host-agent-spike.md exists; org implementation stays Backlog-deferred.

  678. TC-PLAN07-P8-K8S deferral re-confirm pulse · 663d6ff

    Re-confirm deploy/k8s absent — Plan 07 P8 remains Backlog-deferred.

  679. Record agent 06db0dfc on hygiene-pulse re-run closeout row. · 3b8803f

  680. Re-run kanban_docs_sync, plan banners, and format verify — all PASS. · db7bd59

  681. AUDIT-ARCH guard pulse after KB link fixes · 82ab070

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  682. Repair KB/rules links after overlay migration · a7b6cce

    Update docstring-wave paths for TC-ARCH-DEBT moves, fix handbook and tenant-api relative links, drop anchor fragments that broke the link checker; REPO-KB-LINK-PULSE verify PASS.

  683. Stage /api/health 200; e2e:health-gate confirms web 0.1.1008 and backend 0.1.193 match repo. · 7b4ca5e

  684. TC-APPS codegen drift pulse — zero drift PASS · 272f648

    Re-run check_module_web_codegen_drift.sh across five module webs after overlay migration.

  685. Re-run kanban_docs_sync, plan banners, and format verify — all PASS. · e65c522

  686. AUDIT-ARCH guard pulse after overlay migration · 9cab4d3

    Re-run control-plane import, product isolation, and sidecar Dockerfile scope guards — all exit 0.

  687. Migrate agent overlay from project/ to .cursor/ · 3835348

    Repo bindings and config now live under .cursor/ (tc-bindings.mdc, agent-overlay.config.json); update plans, rules, skills, and docs so nothing points at the removed project/ tree.

  688. Remove project overlay docs per user directive · d37ec76

    Do not restore project/FEATURE_MATRIX.md, README.md, learnings.md, or templates/README.md — bindings live under .cursor/ per AGENTS.md.

  689. AUDIT-ARCH guard hygiene pulse 2026-06-29 · d7fb8d5

    Re-run boundary guard scripts (pipeline/tools + scripts paths); all exit 0. Archive pulse in Audit Logs; track set Idle.

  690. TC-APPS codegen drift pulse — verify PASS, kanban audit log · a714e00

  691. Purge stale AUDIT-PLAN Doing claims · 482bc90

  692. Purge stale Doing claims after plan sync closeout · e5151eb

  693. Remove arch guard shims; kanban plan sync · a83a017

    Archive REPO-ARCH-GUARD-SHIM-REVERT and AUDIT-KANBAN-PLAN-SYNC in Audit Logs; purge Doing. CI SSOT remains pipeline/tools/ (no repo-root shims).

  694. Plan↔KANBAN verify and banner gates PASS; purge Doing/Todo after AUDIT-PLAN drift pulse (agent 4087bd2a). · 979365a

  695. Remove arch guard script shims; kanban plan sync pulse · 7018ae7

  696. Remove scripts/ shim wrappers for architecture guards; CI SSOT remains pipeline/tools/. · 09288c9

    Remove scripts/ shim wrappers for architecture guards; CI SSOT remains pipeline/tools/. Plan↔KANBAN verify and banner audit gates PASS.

  697. AUDIT-ARCH guard hygiene pulse 2026-07-01 · 47c203e

    Re-run boundary guard scripts (pipeline/tools + scripts paths); all exit 0. Archive 2026-07-01 pulse in Audit Logs; track set Idle.

  698. Add repo-root architecture guard wrappers · 0c2fcb7

    Delegate check_control_plane_imports and check_sidecar_dockerfile_scope to pipeline/tools SSOT so KANBAN verify gates pass. AUDIT-ARCH-GUARDS-PULSE all scripts exit 0.

  699. Archive 2026-07-01 architecture guard pulse — all boundary scripts exit 0. · 6126517

  700. Close AUDIT-ARCH track; archive guard pulse with corrected script paths. · cfc366a

  701. AUDIT-ARCH guard hygiene pulse · b7319f1

    Re-run boundary guard scripts; all exit 0. Archive pulse in Audit Logs.

  702. Update REPO-KANBAN purge count to 3 tasks with agent 18836e92 evidence; add AUDIT-ARCH Track Index row and Doing table separator for format gate. · dbfb3ea

  703. Sync INDEX Last updated to 2026-07-01 and archive uncommitted doc closeout in Audit Logs after verify gates pass. · 6eab559

  704. INDEX snapshot and infra spike SSOT pulse · 2041400

    Land REPO-UNCOMMITTED-DOC-CLOSEOUT — INDEX footer sync for DOC-INDEX-KANBAN-SNAPSHOT and TC-INFRA-PRODUCER-IMPL pulses; audit log row under REPO-KANBAN.

  705. Sync INDEX snapshot after BACKLOG-INFRA-PRODUCER closeout · d5f6fd1

    Record TC-INFRA-PRODUCER-IMPL spike SSOT pulse in INDEX KANBAN snapshot line.

  706. Align INDEX KANBAN snapshot with AUDIT-PLAN group closeout and correct audit log agent attribution after BACKLOG-PLAN07-K8S re-confirm pulse. · b2d44f5

  707. Closeout BACKLOG-INFRA-PRODUCER spike SSOT pulse · a27b313

    Re-confirm TC-INFRA-PRODUCER-IMPL backlog row and Track Index entry; verify gate test -f docs/plans/12-infra-host-agent-spike.md PASS.

  708. Audit log + purge row; INDEX snapshot date aligned to 2026-07-01 re-confirm pulse. · 73621a8

  709. Re-confirm Plan 07 P8 K8s deferral · e19e084

    Verify gate test ! -d deploy/k8s PASS; INDEX snapshot dated 2026-07-01.

  710. Sync INDEX KANBAN snapshot after BACKLOG-PLAN07-K8S closeout · 69dbb8a

    Record TC-PLAN07-P8-K8S deferral re-confirm and BACKLOG-PLAN07-K8S closed in INDEX line ~37; audit_plan_banners PASS.

  711. Re-confirm TC-PLAN07-P8-K8S k8s deferral pulse · 4f1eeaf

    Verify gate test ! -d deploy/k8s PASS; sync Backlog evidence and Audit Logs.

  712. DOC-PLAN07-NPMRC-TABLE — shipped row + KANBAN snapshot; audit_plan_banners.sh PASS. · aca7f48

  713. Add TC-APPS-MODULE-WEB-NPMRC-CI to Plan 14 gap checklist · 50bdfa5

    DOC-PLAN14-CODEGEN-NPMRC-SYNC — status banner + Plan 07 table row; audit_plan_banners.sh PASS.

  714. Document module-web npm ci and legacy-peer-deps in web-apps.md · 3055822

    DOC-WEB-APPS-NPMRC-DOC — aligns consumer matrix with TC-APPS-MODULE-WEB-NPMRC-CI.

  715. Sync OPS Audit Logs row after incomplete pulse closeout · f8347e8

    REPO-KANBAN-OPS-AUDIT-STALE — agent fceaa6af on 2026-07-01 pulse; verify-kanban-format.sh PASS.

  716. P0 stage continuity pulse — health 200, semver gate PASS · 851745e

    OPS-STAGE-CONTINUITY-PULSE — web 0.1.1008 / backend 0.1.193 match repo (agent fceaa6af).

  717. Close pytest PYTHONPATH note in Plan 14 gap checklist · eac00c6

    DOC-PLAN14-PYTEST-NOTE-STALE — TC-ARCH-DEBT-PYTEST-SYSPATH closed 2026-06-30.

  718. Module-web .npmrc + npm ci for codegen drift gate · 474dffe

    TC-APPS-MODULE-WEB-NPMRC-CI — legacy-peer-deps on */web; sync tenant lockfile; check_module_web_codegen_drift.sh uses npm ci.

  719. Sync Plan 14 gap checklist with closed KANBAN groups · 4069e96

    DOC-PLAN14-GAP-STALE — TC-PLAN07, TC-ARCH-DEBT, compose UI, codegen CI; contracts matrix anchor fix.

  720. Sync Plan 07/INDEX after TC-APPS-CODEGEN-CI ship · 0dc9717

    DOC-PLAN07-CODEGEN-DOC-STALE — remove stale “Add codegen CI” prose; refresh INDEX snapshot.

  721. Add module-web generate:api drift gate (TC-APPS-CODEGEN-CI) · 9d15e38

    Wire check_module_web_codegen_drift.sh into ci.yml module-web-codegen job; Plan 07 row shipped; removed Backlog row.

  722. Sync Plan 07 status banner after TC-PLAN07-MIGRATE close · 3ec236c

    DOC-PLAN07-STATUS-BANNER-STALE — P1-P4 + compose UI closed; P8 Backlog only; add TC-APPS-CODEGEN-CI gap to Backlog (audit finding).

  723. Sync Plan 00 Plan 17 wave banner to waves 0-5 shipped · d922474

    DOC-PLAN00-WAVE-BANNER-STALE — catalog + rule text aligned; audit_plan_banners.sh PASS.

  724. Sync Plan 17 hexagonal facades status to Partial · 9081c2e

    DOC-PLAN17-HEXAGONAL-STATUS-STALE — Plan 09 + bridge delete shipped; audit_plan_banners.sh PASS.

  725. Sync Plan 17 bridge circularity status to shipped · f32cffe

    DOC-PLAN17-BRIDGE-STATUS-STALE — facet waves + bridge delete closed; audit_plan_banners.sh PASS.

  726. Purge stale OPS Doing/Todo after incomplete pulse closeout · 1f69f0d

    REPO-KANBAN-OPS-STALE-CLAIM — verify-kanban-format.sh PASS (agent 285c34f6).

  727. P0 stage continuity pulse — health 200, semver gate PASS · e9ee06e

    OPS-STAGE-CONTINUITY-PULSE — web 0.1.1008 / backend 0.1.193 match repo (agent fa638ee4).

  728. Re-confirm Plan 07 P8 K8s deferral gate. · 3b21f2d

    Standalone verify that deploy/k8s remains absent until product re-opens K8s manifests.

  729. Sync INDEX and plan 14/17 banners after Plan 17 wave 5 close · 19760e5

    DOC-PLAN-INDEX-STALE — remove stale platform Mongo and TC-VMM Todo references; audit_plan_banners.sh PASS.

  730. Prune duplicate Done evidence table to Audit Logs pointer · c427b30

    REPO-KANBAN-DONE-EVIDENCE-PRUNE — closeout evidence SSOT is Audit Logs; refresh Critical path P2/P4 triage.

  731. Centralize agent and audit tab status copy in messages.js · 409bd2c

    MONITOR-UI-AGENT-AUDIT-STATUS-COPY — extend SSOT invariant to guard agent management, api fallbacks, and audit log user-facing status strings.

  732. Purge closed Backlog rows; active-only table (14 rows) · 242b108

    REPO-KANBAN-BACKLOG-PURGE-CLOSED — closed row evidence retained in Audit Logs.

  733. Record continuity pulse — health 200 and semver gate PASS · 916c25f

    P0 on-demand OPS-STAGE-CONTINUITY-PULSE; stage web 0.1.1008 / backend 0.1.193 match repo package.json via e2e:health-gate.

  734. Sync INDEX KANBAN snapshot date after monitor UI closeout. · 07a49c4

  735. Centralize setup/WoL status copy in messages.js · abb6ca2

    Move residual inline setup and WoL status strings into messages.js SSOT and extend the UI messages invariant test so future copy stays centralized.

  736. Centralize monitor setup/WoL status copy in messages.js SSOT. · 6f2514c

    Move residual inline user-facing strings from setup and actions modules into messages.js; extend SSOT invariant test to guard against regressions.

  737. HTTP-delegate platform waitlist and e2e mongo-ping to backend · e3b17a1

    Plan 17 wave 5 — retire direct Mongo in web-client platform paths; Fastify internal routes own persistence and connectivity probes.

  738. Purge closed Todo stubs and sync INDEX after audit. · b14af51

    Todo rail is empty; closed group stubs removed. Add BUG-BOUNDARY-WEB-PLATFORM-MONGO for remaining web-client Mongo outside auth/rbac/mail wave.

  739. Close wave E group in Audit Logs + Track Index, fix duplicate audit-log id, and align Plan 00 catalog with INDEX 04b status. · 25d994a

  740. Defer VMM bridge/uplink inventory to producer TC-M9; close Plan 04b consumer path. · 6cdd9f4

    Document HTTP-only libvirt-network scope at the behavior boundary, add DGA install docs gate, and purge TC-VMM-CONTRACT from KANBAN Todo.

  741. Resolve hosting shared.utils in fleet unit bootstrap · 9995a7f

    Prepend hosting_runtime/src after pipeline/common on sys.path so VmmClient adapter imports do not shadow shared with common/shared.

  742. Wire golden image capture to VmmClient HTTP · ac7af90

    Replace removed PPI run_workflow("golden_image") with create_golden_image and wait_for_job so Fleet UI capture uses app-infra-vmm async jobs.

  743. Restore Done rows dropped during banner audit edit · d1af327

  744. Align plan 00-17 banners with KANBAN state · cd8f016

    INDEX catalog and plans 14/15 had stale Partial/Blocked refs after TC-D1, facet waves, and boundary container closures; add audit_plan_banners.sh gate.

  745. Align compose OPERATOR_API_SECRET with dev_env SSOT · 5073e1c

    Compose gateway and operator-web defaults now use dev-operator-secret matching bare-metal dev_env.py, closing BUG-GATEWAY-8770-SECRET-DRIFT. Records OPS-STAGE-CONTINUITY-PULSE evidence (stage health 200, semver OK).

  746. Remove obsolete bundled test fixture tenants · 222fae6

    Drop committed ephemeral state (service-isolation mirror hint, a/b/x/y registry stubs), the test-unit-delegation package, and empty compose scaffolds for ifeoma-dev/source-tenant. Unit tests use tmp_path or pytest.skip when manifests are absent; ifeoma-tc is unchanged.

  747. Fix plan verify drift for purged KANBAN groups. · db5afc3

    Recognize KANBAN-PURGE-*-GROUP audit entries so archived TC-ARCH/TC-INFRA plan tasks no longer report as MISSING after group closeout.

  748. Canonical semver verify gate via e2e:health-gate · a9512ad

    Replace loose `grep -q version` on /api/build-info with e2e-health-version-gate that asserts webClientVersion/backendVersion against package.json; close OPS-STAGE-SEMVER-RECONCILE with live stage evidence (web 0.1.1008 / API 0.1.193).

  749. Close DOC-PROFILE-IDENTITY-STALE and TC-BOUNDARY product Mongo group. · 0205aa3

    Update profile-identity.mdc to document web-client HTTP delegation for profile/auth/rbac/mail instead of stale Mongo-from-Next guidance.

  750. Route web-client rbac and mail trace through backend HTTP (Plan 17 wave 5). · a573ca2

    Retire direct Mongo from rbac/ and mail/ by delegating to Fastify internal routes, matching the PRODUCT-PROFILE-HTTP pattern.

  751. Shrink control-plane allowlist to gate threshold (TC-BOUNDARY-ALLOWLIST-ZERO). · 58ff044

    Route harbor/dns/smtp and infrastructure_control.service through lazy importlib bridges; consolidate allowlist to four prefixes; fix operator fleet boundary violations.

  752. Move local browser hosts sync to pipeline deployment.manager; remove runner and TUI trees plus dependent tests; shrink control_plane_import_allowlist. · 0dee342

  753. Remove operator/src/api extend_path bridge (TC-ARCH-OPERATOR-API-BRIDGE). · bd27ba2

    Bootstrap now wires src.api.* from fleet/src/api directly; gateway keeps explicit operator/src/client sidecar HTTP clients.

  754. Lazy-load deploy orchestration via pipeline_deployment_loader for bare-metal whitelist remediation; manifest preflight uses InfrastructureControlService directly. · d11d669

    Lazy-load deploy orchestration via pipeline_deployment_loader for bare-metal whitelist remediation; manifest preflight uses InfrastructureControlService directly. Container gateway continues delegating gather/gates to pipeline-api with allowPipelineRegather. Closes TC-BOUNDARY-OPERATOR-WORKFLOW-DEPLOYMENT-IMPORTS.

  755. Delegate operator gateway infrastructure routes to fleet-api in container mode. · aad96b2

    Container /v1/infrastructure/* now forwards to fleet-api HTTP executor routes; bare-metal keeps in-process handlers. Closes TC-BOUNDARY-OPERATOR-INFRA-HTTP.

  756. Fix fleet unit tests after TC-D1 wave C/D dispatch split (BUG-FLEET-UNIT-TC-D1-STALE-TESTS). · 7c1c1d5

    Behavior hosts now bind manager core tenant APIs and cross-delegate without recursion; stale tests target pipeline_fm_legacy and fleet_start_app_flow symbols.

  757. Fix fleet unit conftest paths import shadowing (BUG-FLEET-UNIT-CONTRACTS-IMPORT). · b9a1085

    Load shared/paths SSOT via importlib in pipeline/common shims so pipeline/common/paths.py no longer blocks paths.pipeline_paths during pytest collection.

  758. Rename FleetManager survivor to FleetDescriptorService (TC-FACET-WAVE-F). · d3ac2d0

    Plan 09 wave F completes the facet delete map: assembled MRO root is now FleetDescriptorService with a transitional FleetManager alias; HTTP facade subclasses the assembled core. Plan 09 marked Done.

  759. Callers now import deployment.dns_* and infrastructure_control.{dns,smtp} directly; shrink control-plane allowlist and add regression invariant for deleted packages. · 6c20a1d

  760. Inline PipelineFleetPart MRO without _pipeline composite (TC-FACET-WAVE-E-PREP-PIPELINE-MRO). · 0b8b947

    FleetManager now inherits ProvisioningOpsPart, DevRemoteSyncPart, BuildDeployOpsPart, and QualityOpsPart directly; BuildDeployOpsPart relocated to fleet/_build_deploy/ ahead of _pipeline/ deletion.

  761. Relocate DNS/SMTP Parts from fleet _dns/_smtp · 645043d

    DnsProviderPart and SmtpPart now live under operator infrastructure_control; operator_behavior_surface imports operator-owned modules so fleet _dns/_smtp packages can be deleted in facet wave E.

  762. Relocate DNS policy imports from fleet _dns package · 29aad39

    Pipeline deployment now imports DNS enforcement and ownership policy from deployment.* SSOT modules so fleet _dns can be deleted in facet wave E.

  763. Document runtime VMM touchpoints vs producer OpenAPI, add backlog rows for golden-image HTTP wiring and network host inventory gaps. · 2b411bb

  764. Add OpenAPI CI mirror and wire spec sync gate · a628022

    Mirror producer vmm.openapi.yaml for offline drift checks, resolve codegen paths via sibling checkout or mirror, and add GHA job vmm-spec-sync.

  765. Regen fleet contract models from producer OpenAPI SSOT · 9754e48

    Add consumer codegen/drift tooling, KANBAN TC-VMM-SPEC-SYNC-GATE, and enrollment doc notes for list_operations and spec validation.

  766. Close TC-D1-O1-LIVE after provision-vm-bootstrap returns VM IP on br0. · 4590ac6

    Fix tenant-api execute coercion for add_target dict payloads; document producer _remote_exists disk convert and br0 topology in enrollment runbook.

  767. Close BUG-TC-D1-O1-CLOUDINIT-SCP; note VM IP blocker. · 2f0bb47

    Producer fix verified: cloud-init ISO + virt-install pass; TC-D1-O1-LIVE next on hypervisor bridge DHCP/IP discovery.

  768. Add dev-local VM bootstrap target for TC-D1-O1 · a920460

    Configure ifeoma-tc dev workstation target (needs_vm_provision, vm_resources, .local domains, host_id) so gateway provision-vm-bootstrap reaches VMM REST create instead of domain validation 502; document VMM start and OpenAPI chain.

  769. Add TC-BOUNDARY-CONTAINER rows for HTTP-only sidecars · 780f118

    Track operator infra HTTP delegation, workflow deployment import debt, and close TC-BOUNDARY-OPERATOR-DOCKER-SCOPE-GUARD; link allowlist-zero to TC-FACET-WAVE-E.

  770. Container-safe infra bootstrap without fleet runner imports · a671c88

    Move private domain IP sync into operator infrastructure_control, scrub fleet/pipeline paths when OPERATOR_GATEWAY_CONTAINER=1, and skip fleet bootstrap in load_infra_orchestration_host for the sidecar image.

  771. Update TC-D1-O1-LIVE blocker status after sidecar fixes · 4aa86c4

    Sidecars 8765-8767 verified healthy; bootstrap returns 502 problem+json. Resolved BUG-TC-D1-O1-SIDECARS-DOWN; added BUG-TC-D1-O1-DEV-TARGET-VM-CONFIG.

  772. TenantApiSession coerces execute payloads for provisioning credentials, SSH hardening, and per-mode domains. · cce69a4

    TenantApiSession coerces execute payloads for provisioning credentials, SSH hardening, and per-mode domains. VM bootstrap drops legacy module- requirements gate and uses operator-owned domain_ip_sync (runner shim delegates). Infrastructure routes map AttributeError to problem+json responses.

  773. Correct sidecar import bootstrap and VMM health URL · 30fcb0f

    Fleet-api no longer calls setup_control_plane_import_paths (which bound operator gateway on :8766). Pipeline and tenant sidecars prepend shared/ before pipeline_paths shim. VMM health polling accepts bare :8780 roots.

  774. Restore npm run build in Dockerfile web stage · 9214264

  775. Clarify operator-gateway vs sidecar Dockerfile scope · 6585f7a

    Plan 03 and KANBAN BUG-OPERATOR-GATEWAY-PYTHONPATH now distinguish bare-metal import bootstrap from operator-only container image per multi-container model.

  776. Operator-only gateway container image (Plan 03) · 0893e6e

    Revert monolith COPY/PYTHONPATH from c8cbc635: image ships shared+operator only. Container bootstrap uses OPERATOR_GATEWAY_CONTAINER; bare-metal O1 still merges fleet common/runner via setup_control_plane_import_paths. Workflows in container delegate gather to pipeline-api (allowPipelineRegather). Job store uses Redis env without pipeline/common on disk. Scope guard covers operator/Dockerfile.

  777. Close BUG-OPERATOR-GATEWAY-PYTHONPATH, update TC-D1-O1-LIVE · 3941a46

    Record gateway bootstrap import fix evidence and narrow TC-D1-O1-LIVE blocker to tenant-api sidecar and module requirements (no import 500).

  778. Bootstrap gateway imports without manual PYTHONPATH · c8cbc63

    run_operator_server and cli use setup_control_plane_import_paths with shared on sys.path so fleet common/runner resolve at startup. Stop job_store_backend from prepending pipeline/common (it shadowed fleet/src/runner). Add regression tests for runner import after create_app.

  779. TC-D1-O1 gateway evidence and Plan 17 wave 4 banner. · e0fcda9

    Record gateway 8770 health pass with dev-operator-secret; backlog BUG-GATEWAY-8770-SECRET-DRIFT and BUG-TC-D1-O1-SIDECARS-DOWN for bootstrap blockers.

  780. Wave E delete gate still fails — pipeline DNS coupling and FM MRO blockers documented with verify gates; TC-D1-O1 blocker clarified (8770 alive, 401). · d0bdb63

  781. Close TC-BOUNDARY-PRODUCT-PROFILE-HTTP after auth HTTP wave. · 053aff0

  782. Sync Plan 00/17 after TC-BOUNDARY-PRODUCT-PROFILE-HTTP close. · 31dd893

  783. Close TC-BOUNDARY-PRODUCT-PROFILE-HTTP group. · 2632d73

    Verify gate PASS — no Mongo in web-client src/lib/auth; purge TC-BOUNDARY Todo.

  784. Delegate web-client auth to backend HTTP (Plan 17). · 9c49be1

    HttpNextAuthAdapter plus internal fetch for OTP, magic-link, and e2e paths; removes getMongoClientPromise from src/lib/auth/ (verify gate PASS).

  785. Backend internal NextAuth persistence routes. · b640d66

    Move adapter, email OTP, magic-link, and e2e lab stores to Fastify /api/internal/nextauth/* so web-client auth no longer touches Mongo.

  786. Update MRO doc after wave D tenant facet removal. · 0cb93e8

  787. Remove tenant facets from FM MRO (TC-FACET-WAVE-D). · 505ffe1

    Drain TenantStatePart through PlatformAdminPart from FleetManager MRO; delegate wave-D methods via tenant_behavior_surface dispatch mixin chained to operator_behavior_surface.

  788. Wave D — tenant facets off FleetManager MRO · 928d701

    Dispatch tenant/admin Part methods via TenantBehaviorDispatchMixin and cli/tenant_behavior_surface instead of composing bridge Parts on FleetManager; closes TC-FACET-WAVE-D verify gate.

  789. Sync Plan 00/04b after TC-D1-V1-LIVE close. · 1d4d303

  790. Producer ssh_port on port 2222 unblocks dev workstation VMM readiness; dedupe Done rows. · 3dd004b

  791. Close TC-D1-VMM-SSH-PORT and TC-D1-V1-LIVE after producer verify. · 7f631c9

    Producer app-infra-vmm 78c0dc6 ships hypervisor ssh_port=2222; ready and scoped VM list return 200 on the dev workstation.

  792. Sync Plan 04b banners after TC-D1-V1-LIVE close · 8dc943a

    VMM ssh_port producer fix unblocks workstation ready gate; O1 remains blocked on operator gateway 8770.

  793. Producer ssh_port on port 2222 unblocks /api/v1/ready; update enrollment runbook, learnings, and purge Doing claim after verify PASS. · dfb8e82

  794. Document TC-D1 VMM ssh_port closure and ready verify pass. · c395c37

    Producer app-infra-vmm 78c0dc6 ships hypervisor ssh_port; workstation ready probe returns 200.

  795. TC-D1 VMM ssh_port blocker and dedupe wave C Done row. · a2118d5

    Bind producer-repo TC-D1-VMM-SSH-PORT unblock path; sync plan 04b/14 and enrollment runbook.

  796. Sync Plan 09/INDEX after TC-FACET-WAVE-C close. · f0599e5

  797. Remove operator mutation facets from FM MRO (TC-FACET-WAVE-C). · d474dd9

    Drain InfraManagementPart through HarborManagementPart from FleetManager MRO; delegate wave-C methods via operator_behavior_surface dispatch mixin.

  798. JWT profile provisioning via backend HTTP (TC-BOUNDARY-PRODUCT-PROFILE-HTTP partial). · b570ffc

    Route NextAuth getOrCreateProfileForAuthUid through POST /api/internal/get-or-create-profile; six auth Mongo paths remain for adapter/OTP/e2e.

  799. Bind VMM dev hypervisor scope and enrollment runbook · 6d8d91d

    Document user decisions: dev workstation Model B enrollment, stage on 178.104.131.219 orthogonal to TC-D1 live gates, K8s re-ship on request.

  800. Colocate tenant API tests under tenant/tests (TC-BOUNDARY-TENANT-TESTS-COLOCATE). · 2c69791

    Move 12 pipeline/tests/test_tenant_* modules; add tenant/tests/conftest.py; update CI schema-contract paths and KANBAN backlog (TC-BOUNDARY-ALLOWLIST-ZERO).

  801. Remove pipeline bridge facets from FM MRO (TC-FACET-WAVE-B). · 40c8aba

    Drop InterfaceInfraOpsPart and InterfaceCliDelegatesPart from FleetManager MRO; route infra CLI to InfraManagementPart methods and delegate-only CLI ops through orchestration_surface.

  802. Dedupe bridge-delete audit log entry. · be54638

  803. Promote OPS pulse rows and TC-D1 loader PPI. · af91d8f

    Scan plans 00–17 for open items missing from Backlog; align TC-FACET-WAVE-B note after TC-BOUNDARY-FLEET-BRIDGE-DELETE shipped.

  804. Delete pipeline_orchestration_bridge (TC-BOUNDARY wave 3). · ad2053c

    Replace lazy bridge with direct deployment.orchestration imports; shrink control_plane import allowlist; steered deploy path unchanged (operator HTTP).

  805. Correct VMM Model B hypervisor live gate. · 4b64a71

    VMM producer is SSH-only (no libvirt socket in API container); TC-D1-V1-LIVE requires enrolled hypervisor with virsh/libvirt on the SSH target host.

  806. Defer K8s manifests and restore P8 to Backlog. · 9cde291

    User decision (2026): remove deploy/k8s/control-plane/ (422148f8 lineage); TC-PLAN07-P8-K8S back in Backlog with ship verify gate. Plan 07 Partial; Plan 10 Done without P8. TC-FACET-WAVE-B bound to MRO-only removal.

  807. Drop compose UI from Plan 14 open banner. · bde07ed

    TC-COMPOSE-UI-REAL shipped; gap checklist banner mirrors KANBAN Backlog only.

  808. Sync KANBAN Done/Backlog, plan INDEX/07 banners, and TC-D1 re-scope notes after compose module-web profile ships. · 51b5b65

  809. Wire control-plane-ui module web services (TC-COMPOSE-UI-REAL). · 0d85fe1

    Add shared module-web Dockerfile and compose services for operator/tenant/fleet/pipeline/contracts webs; extend control-plane-ui profile to pull sidecars and gateway deps so compose config validates standalone.

  810. Close TC-PLAN07-P8-K8S and sync plan banners. · 91331d3

    Dedupe audit log rows; align Plan 00/07/10/INDEX with P8 shipped and TC-COMPOSE-UI-REAL as sole Plan 07 backlog item.

  811. Add Plan 07 K8s control-plane Kustomize scaffold (TC-PLAN07-P8-K8S). · 563fbd0

    Ship deploy/k8s/control-plane manifests mirroring compose service names and Plan 16 ports; gitignore local secrets.yaml copies.

  812. Add K8s control-plane Kustomize scaffold (TC-PLAN07-P8-K8S). · 422148f

    Mirror compose service names (sidecars, gateway, module webs, redis, vmm gate) under deploy/k8s/control-plane/; close backlog row and sync plan/matrix status.

  813. Sync Plan 07 INDEX row with module homes shipped. · bd030d1

    Align catalog step 07 with KANBAN closeout — P1–P4 and TC-PLAN07-P2-MODULE-HOMES done; P8 K8s and compose UI remain Backlog.

  814. Close TC-PLAN07-P2-MODULE-HOMES and re-scope TC-D1 live gates. · 241d5f0

    Module web home pages already pass the placeholder verify gate; document ifeoma-tc remote SSH stage path vs VMM producer libvirt blockers.

  815. Close TC-APPS-CODEGEN-MODULE-WEBS group. · ed31ea4

    Verify gate passed for all four module web api-types.ts outputs.

  816. Regenerate tenant and fleet OpenAPI TypeScript types. · 00dd485

    Unblocks TC-APPS-CODEGEN-MODULE-WEBS after job-schemas bundle merge.

  817. Merge job-schemas into tenant and fleet bundles. · 2438f79

    Tenant and fleet OpenAPI bundles omitted shared ProblemDetail and JobLogEvent schemas, breaking openapi-typescript codegen for module webs.

  818. Dedupe TC-PLAN07 audit log and align closeout dates. · 3d828bc

  819. Remove retired vite-pages archive directory. · f7fc898

    Plan 10 P1–P4 migration is complete; drop the empty vite-pages folder and update Plan 07 open-item list.

  820. Dedupe Done rows and close TC-PLAN07 P3/P4 group. · 8ac716d

    Archive P3/P4 operator page migration, DOC-OPS-CLI-STALE, and compose URL docs with verify evidence; purge duplicate Done entries.

  821. Dedupe Done rows and close doc/compose backlog items. · 8b44ab0

    Record DOC-OPS-CLI-STALE, TC-ARCH-COMPOSE-MODULE-WEB-URLS, DOC-TEST-ISOLATION-SSOT in Done; promote TC-PLAN07-P2-MODULE-HOMES to Backlog.

  822. Sync Plan 07 P3/P4 closeout and dedupe KANBAN Done rows. · 1ff02eb

    Align INDEX/roadmap with shipped operator Next pages and E2E split; refresh operator CLI/README port SSOT.

  823. Refresh operator docs for Next.js 5180 shell (DOC-OPS-CLI-STALE). · 7979a1b

    Remove stale Vite :5173 and deleted src/cli references from CLI.md and README_INDEX.

  824. Audit plans 00–17 status banners and INDEX sync. · afba2a9

    Mark foundation plans 01–05, 11–13, 16 Done; partial state for 04/06/07/09/10/14/15/17; align KANBAN TC-PLAN07 P1–P4 evidence with plan checklists.

  825. Split Plan 07 E2E tests to module webs (TC-PLAN07-P4). · 86dfabe

    Move steered-deploy invariant under operator Next workflows; scaffold tenant/web Playwright e2e; retire vite-pages test stub.

  826. Replace react-router vite stubs with App Router pages, OperatorClientRoot shell, Next Link navigation, and SSR-safe session hydration; operator-web build passes. · 8d87b8d

  827. Fix operator-web port SSOT to 5180 (BUG-OPS-WEB-PORT-5173). · 3a11db2

    Probe, CORS dev defaults, control-plane start messages, and web-dev CLI help now target Next.js on 5180 instead of retired Vite 5173.

  828. Close verified TC-BOUNDARY backlog rows in KANBAN and Plan 17. · e1839ad

    Mark CI gates, shared paths, tenant HTTP-only, and pipeline-no-FM as shipped after verify gates passed without reimplementation.

  829. Migrate ContractsPage to contracts-web runs route (TC-PLAN07-P2-CONTRACTS-PAGE). · 7529771

    Move schema/compliance/boundary governance runs into contracts/web with operator-gateway BFF routes; retire operator vite stub and deep-link command center to /runs.

  830. Track build route excluded by root build/ gitignore · cc8ba56

    Allow pipeline/web/src/app/build/ through .gitignore so Plan 07 verify gate path is versioned.

  831. Migrate pipeline build page from operator vite (TC-PLAN07-P2-PIPELINE-PAGE) · e3f7d74

    Add pipeline/web build console with BFF proxy routes; steered deploy remains on operator workflows; remove legacy PipelinePage.tsx.

  832. Migrate fleet targets page from operator vite (TC-PLAN07-P2-FLEET-PAGE) · 9cc8124

    Move fleet infra/status UI into fleet/web with gateway BFF routes and deep-link operator command center to module URLs.

  833. Dedupe wave B IDs and close boundary glossary backlog row · 8ca8051

    Remove duplicate TC-BOUNDARY-FM-WAVE-B and TC-ARCH-DEBT-TENANT-TESTS-COLOCATE; archive TC-BOUNDARY-AGENT-GLOSSARY with verify PASS; TC-FACET-WAVE-B canonical for wave B.

  834. Sync Plan 10/14/17 with KANBAN TC-PLAN07 and boundary shipped state · 5f23558

    Add TC-PLAN07 task table, mark P1/P2 fleet shipped, retire TC-APPS page-migration IDs, refresh Plan 14 gap sections, and mark TC-BOUNDARY-CONTRACTS-HTTP and agent glossary shipped in Plan 17.

  835. Migrate tenant create and detail pages from operator vite · 92083c3

    Move TenantsPage and TenantDetailPage to tenant/web with BFF routes to tenant-api, remove operator vite stubs, and wire operator deep-links to tenant-web URLs.

  836. BACKLOG-DOCS group closeout audit log · a0d313f

    Record DOC-TENANT-API-MDC purge after tenant-api.mdc shipped.

  837. Add tenant-api.mdc agent rule (DOC-TENANT-API-MDC) · f2495ab

    Close tenant module documentation debt referenced by module.mdc with contract-first HTTP API guidance for tenant/src/server/ work.

  838. Require CONTRACTS_API_BASE_URL for reconcile contract checks (Plan 17). · 1f94fb2

    Remove in-process contracts/interface.py fallback from provisioning_contracts_checks; reconcile preflight now always uses contracts-api HTTP jobs.

  839. Agent hub link and rule index updates · f683318

    Refresh .cursor hub READMEs, rules index, and VMM integration KB links after plan renumbering and feature-matrix SSOT.

  840. Refresh release notes artifact and plan path test · 122797b

    Regenerate release-notes JSON and update dry verification manifest paths; fix deployment unit test sys.path for compose TLS helpers.

  841. Add README merge tool and index · a592122

    Add merge_readmes_to_all.py to build README_ALL.md and document it in the scripts hub for agent navigation.

  842. Hub and module README refresh · 8c8b948

    Align root and module README hubs with Plan 16 ports, boundary layout, and Next 16 baseline notes for product and control-plane navigation.

  843. Feature matrices, KANBAN purge, and group closeout prompt · 9da74e9

    Add platform and module feature matrices, trim KANBAN Done noise, refresh PROMPT closeout flow, and ignore matrix scratch artifacts.

  844. Pytest sys_path SSOT and import allowlist · bc56639

    Centralize test sys.path bootstrapping, tighten control-plane import gates, and align fleet purge tests and operator CLI docs with loaders.

  845. Extract tc-shared paths package (Plan 17 wave 1) · 5001b5c

    Publish shared path SSOT, shim pipeline constants, scope sidecar Dockerfiles, and wire CI boundary gates with editable shared install.

  846. Add module web scaffolds · 3265d38

    Add contracts-web and pipeline-web Next scaffolds and document web-app codegen destinations for Plan 07 multi-app control plane.

  847. Replace Vite shell with App Router, archive legacy pages under vite-pages, and update e2e and toolchain config for the Next baseline. · 7a90db2

  848. Remove deprecated manager/cli stubs · b2bbceb

    Drop unused manager and src/cli packages and refresh clean-arch audit so control-plane entrypoints reflect the gateway-only layout.

  849. Restore DIP and split FM legacy orchestration · 67ccbb9

    Reintroduce merge-env reporting at the ports boundary, delegate FM-era steps to pipeline_fm_legacy, and lock sidecar DIP invariants in tests.

  850. Rename deployment/src to cli_legacy · cf0fb69

    Move legacy CLI orchestrators under cli_legacy and update entrypoints, pytest layout, and test fixtures so imports keep working without src/.

  851. Renumber adjunct plans and add 12-17 · 5456711

    Renumber and relocate plan docs (08–17), add drafts and kanban sync tooling so plans hub and KANBAN extraction stay aligned.

  852. Purge AUDIT Done rows and dedupe audit log header. · fd09e79

    Mark plan↔kanban verify drift done in architecture-gap-checklist.

  853. Close AUDIT group and purge swarm hygiene Todo section. · e5f1920

    Archive evidence in Audit Logs; refresh critical path P0 to OPS continuity only.

  854. Add monitor __main__ shim for run.py entry. · 2b6aeaa

    Restores `python3 pipeline/run.py monitoring --help` after monitor package layout change.

  855. Add workflow lane registry and Done-table kanban sync. · cbcef14

    Register npm workflow locks for multi-agent pre-flight; teach plan↔kanban verify to accept purged tasks in Done.

  856. Refresh architecture plans and implementation inventories. · d46c30a

    Cross-link structural overview, gap checklists, and Plan 04–07 inventories after planning sessions.

  857. Add TC-ARCH-DEBT group from Plan 04 gap analysis. · 6aa777d

    Track eight post-foundation runtime-shape tasks and refresh P2 critical path after deep-architecture-analysis doc landed.

  858. Point agent and docs hub at structural overview entry. · d0c5ae9

    Surface structural-overview.md as the primary architecture map from AGENTS.md and docs/README.md.

  859. Add deep architecture analysis and link from plans hub. · 13f94ce

    Catalog operator/src inventory, Plan 04/07 shape gaps, and Wave 1–4 sequence; cross-link from roadmap, INDEX, and plans 04/07.

  860. Add structural overview and architecture inventory checklists. · 5eaf2e4

    Introduce repo map, gap checklist, FleetManager facet delete map, and operator/web Plan 07 migration checklist for strangler onboarding.

  861. Close TC-D1 offline group: sync live gates to Blocked and purge Todo. · 94fd1d7

    TC-D1-V1-LIVE and TC-D1-O1-LIVE now tracked only in Blocked; all offline hosting-deletion tasks evidenced in Done table.

  862. Purge completed TC-ARCH Todo group (REPO lifecycle) · 58e5199

    Remove 32 closed TC-ARCH rows from Todo; evidence retained in Done table.

  863. Scaffold Next.js 16 fleet-web admin app (Plan 07) · 904352e

    Add fleet/web on port 5182 with OpenAPI codegen hook and BFF health route proxying fleet-api, matching tenant-web conventions.

  864. Fleet unit suite green (1717 passed); purge completed P0 BUG-FIX Todo group. · e209130

  865. Align unit tests with TC-ARCH bridge and TC-D1 fail-closed · 512e172

    Update shim invariants for operator_behavior_bridge, reject hosting_api PPI delegation, and stub PTR DNS when dnspython is absent in CI.

  866. Load job store and tenant contracts via SSOT paths · 6549bec

    Avoid application/contracts and operator control_plane shadowing when fleet and pipeline sidecars import shared Redis job metadata or when migrate_mail_domain_contracts runs under FleetManager import chains.

  867. Tighten gitignore patterns and source module cursor rule · 86a26b5

    Exclude transient env/workflow paths and align source module rule with product isolation boundaries.

  868. Add control-plane boundary guards for imports and Dockerfiles · 480636f

    Wire check_control_plane_imports, sidecar scope, product isolation, web import bans, and tightened VMM consumer allowlist into CI workflows.

  869. Document Plan 06 host producer routes (provision, ship-ready, desired-state, agent report) and Plan 07 OpenAPI codegen mapping for control-plane web apps. · 2beac3d

  870. Extend VMM client for live producer contract and descriptor routes · 9cfb386

    Improve VmmClient config/models for tenant-target HTTP consumer chain and align fleet-api tenant descriptor route tests with HTTP-only tenant access.

  871. Fail-closed hosting PPI and route VM ops through VMM HTTP · c1bc7f1

    Remove in-process provisioning loader and HOSTING_API provider path now that operator/src/infrastructure/hosting is deleted from the tree.

  872. Steered tenant deployment accepts runtimeContext dict · b8b4f6c

    Add run_tenant_deployment spine that requires immutable runtimeContext from operator gather instead of FleetManager for gateway-steered deploy runs.

  873. Thin sidecar via import bridges and gateway HTTP provisioning · bba1131

    Lazy-load operator behavior and pipeline orchestration, steer fleet provision through OperatorGatewayClient, and fetch tenant descriptors over HTTP only.

  874. SQLite bootstrap, tenant-api image, and Plan 07 tenant-web scaffold · c2d8af8

    Seed tenant.db from bundled packages on empty volume, document admin surface and DNS/mail policy SSOT, and add Next.js tenant-web with BFF health route.

  875. Add sidecar Dockerfiles and unified compose stack · bb3647f

    Multi-stage images for fleet/pipeline/contracts/tenant with scoped COPY, unified docker-compose profiles, tenant_data volume SSOT, and sidecar health verify script plus Dockerfile scope CI guard.

  876. Persist job metadata in Redis when JOB_STORE_URL is set · 1e9137f

    Add shared job_store_config/redis helpers and wire operator, fleet, and pipeline job modules to sync external store while keeping in-process cache.

  877. Move job logging SSOT to pipeline/common · ecf42ed

    Centralize job_logging http/paths/sink/store under pipeline/common and re-export from operator via importlib so sidecars share one implementation.

  878. Expand API-steered plans, kanban progress, and infra inventory · 5a6f337

    Add Plan 07 multi-app control plane, infra mutation inventory, execution roadmap updates, and kanban evidence for TC-ARCH/TC-D1/TC-APPS/TC-INFRA lanes.

  879. Consolidate agent rules, skills, and navigation index · ec8c9f3

    Merge duplicate numbered rules into canonical hubs, add product-feature-matrix and docstring-wave index, and align skills with kanban-only agent ops.

  880. Remove legacy .agent tree and pipeline tenant symlink · 811dfdd

    Drop obsolete .agent docs/rules and the erroneous pipeline/tenant/tenants path alias so tenant state stays owned by tenant-api only.

  881. Add module README indexes and drop workflow references · 1f7cd34

    Refresh hub READMEs across contracts, fleet, operator, pipeline, tenant, and source trees. Add directory-level README stubs for navigation and align module docs with kanban-only agent operations.

  882. Retarget plans and tooling away from workflow engine · 51c77bd

    Update root and docs READMEs, architecture plans, and control-plane scripts for kanban-only agent ops. Point clean-arch audits at the external analyser and drop bundled workflow lock-compile from uv-compile-ci-python-deps.

  883. Retire orchestrator rules and retarget agent hub · a1a390a

    Remove workflow-engine rules, workflow-rules KB mirrors, and skills tied to npm workflow:*. Update remaining skills, memory KB, and core rules for kanban-only turns via PROMPT.MD and KANBAN.md.

  884. Kanban-only agent ops and board purge · 66cda35

    Add PROMPT.MD turn lifecycle, project overlay (config + learnings), and trim KANBAN.md to active Todo/Backlog. Update AGENTS.md to point at kanban-only paths instead of the workflow orchestrator.

  885. Remove bundled engine and provenance tooling · da2ebb1

    Drop root package.json, workflow deletion gate, and pipeline scripts that enforced engine adoption. Remove workflow.md and .gitignore entries for the installed .cursor/workflow bundle.

  886. Link plans INDEX from docs hub and AGENTS.md · bad9478

    TC-ARCH-VISION-DOC: point architecture navigation at docs/plans/INDEX.md.

  887. Tighten env, workflow runtime, and tenant path patterns · 63cab29

    Extend ignore rules for deploy env snapshots, workflow data, local DB scratch, and fix tenant/tenants nested definition env glob paths.

  888. Add kanban sync and verify gates for docs/plans tasks · fd621f8

    Port MATR4U-style plan↔KANBAN pipeline with TC-ARCH/TC-INFRA prefix support, structure audits, and template compliance checks.

  889. Introduce the three-layer architecture plan set with executable task tables, dependency chain, and Plan 06 for host/OS infra producer work. · ee27d95

  890. Align adopter .cursor context to .cursor/workflow layout · 236f9b7

    Update rules, skills, gitignore, docs, and audit paths after hub install at .cursor/workflow/; add domain skills from bundle deploy.

  891. Deletion-gate and preflight use .cursor/workflow layout · dc6e080

    Point pipeline tools at apps/hub engine path; gate checks orchestrator, validate, and project overlay under .cursor/workflow. Add restamp-provenance and optional postinstall for workflow bundle deps.

  892. Provenance uses apps/hub subtree HEAD not repo HEAD · 65e20e5

    Align deletion-gate with platform b3666c7 — kanban-only platform commits no longer false-fail when INSTALLED.md matches hub subtree.

  893. WF-ENGINE-1b runtime docs and npm aliases verified · b63240f

    Re-point docs/workflow.md to .cursor/workflow layout and env.agent drain deps.

  894. WF-ENGINE-1c bundle layout verified at .cursor/workflow · 6fd0fc1

  895. Re-point provenance paths to .cursor/workflow; monorepo git HEAD resolution. · e0a253a

  896. WF-ENGINE-1-INSTALL hub bundle to .cursor/workflow · 5a19620

    Replace vendored workflow/ fork with platform apps/hub install.sh overlay; preserve project overlay; merge workflow:* npm aliases from contract.

  897. Complete engine adoption preflight for ifeoma-tc · 3e47589

    WF-ENGINE-0b: run check-adoption + learn-from-project, pin social-discovery-app preset, add verify script and preflight reports.

  898. Default fork compare to engine provenance gate · 4d576a3

    WF-ENGINE-0-GATE: compare_workflow_engine_fork.py delegates to provenance by default; keep --byte-parity for optional drift diagnostics.

  899. Pin ai-workflow-engine provenance for adopter closure · 6657842

    Replace byte-parity drift with a provenance check and record engine path + commit in workflow/INSTALLED.md (WF-ENGINE-0).

  900. Multi-agent continue prompt and root PROMPT.MD · 361cb22

    Extend kanban-multi-agent-continue with atomic register flow; add root PROMPT.MD mirror; drop archived vm/README; minor gitignore and uv-ci KB.

  901. Add multi-agent kanban continue prompt · 34463c7

    Publish kanban-multi-agent-continue.md with pre-flight lane rules, Done vs Evidence lifecycle; link from kanban-turn-methodology.

  902. SSOT control panel toggle copy in messages.js · 5a29985

    Centralize Show/Hide Panel disclosure and aria labels so actions.js imports from messages.js; extend SSOT and a11y invariant tests.

  903. Centralize setup secret toggle copy in messages.js · f3ef346

    Extract Show/Hide Secrets disclosure labels, mask notes, and save-while-hidden error to messages SSOT; wire json_editor and setup requests; extend invariants.

  904. Extend messages SSOT with WoL preflight and template payload constants; wire actions and setup requests; tighten invariant test for Invalid WoL literals. · 82052f2

  905. Align UI invariants with messages SSOT and setup split · f2a7703

    Update audit-log and setup-subtab accessibility structure tests after messages.js centralization and setup/tabs+bindings extraction; wire WoL templates import in setup requests.

  906. Deduplicate Invalid JSON response copy across setup, agent, audit, and request_client modules. · 3340ef2

    Deduplicate Invalid JSON response copy across setup, agent, audit, and request_client modules. Add invariant test so literals stay in the SSOT module.

  907. Extract HTTP route composers from http_server · aa7a5e9

    Move handler bindings, API route maps, core GET dispatch, and POST body policy into route_composers/. Keep module-level handler aliases on http_server for test patch compatibility. Add structure tests; server_api suite remains green (68 tests).

  908. Break start_app orchestration import cycle · 2e54304

    Lift multi-target gates into deployment.orchestration.multi_target_gates so fleet_start_app_flow no longer imports manager.orchestration.pipeline. Centralize test gate patches via patch_run_multi_target_gates; document blast-radius lane rule in todo-lifecycle KB.

  909. Split setup tabs and bindings from index · de577e2

    Extract setup/tabs.js for sub-tab ARIA + persistence and setup/bindings.js for page-level listeners; setup/index.js is composition-only like monitor.js. Extend test_ui_setup_module_structure with split contracts.

  910. Extract monitor controller from composition entry · 1b9391a

    Move draw/fetch and user-driven refresh handlers into monitor/controller.js so monitor.js only wires DOM, bindings, and polling. Extend structure tests to assert composition-only entry and controller-owned orchestration.

  911. Drop dead fleet_zitadel_provision shim · 7697e55

    Remove unused orchestration module and pipeline.py F401 re-export; Zitadel OAuth provisioning SSOT is deployment.start_app.run_zitadel_provision_for_app. Align README and tenant-env-merge KB to the live entrypoint.

  912. Remove hardcoded vpn lab paths from desktop launchers · e2e0b74

    Add self-locating launch_vpn_cli.sh and install_desktop_entries.sh so desktop shortcuts resolve pipeline/monitor from the script tree instead of a fixed lab checkout path; lock behavior with invariant tests.

  913. Isolate pipeline API health test from fleet cwd sys.path · 9100a69

    scrub_control_plane_paths resolves empty/`.` sys.path entries against cwd so pytest running from fleet/ does not alias import src to fleet/src during Pipeline create_app smoke tests; align tenant_create audit doc to canonical provisioning_ssh_key_sync path.

  914. Retarget plan paths to pipeline/monitor tree · 39a49a4

    Replace legacy standalone vpn lab absolute paths in monitor plans with repo-relative pipeline/monitor paths and document completed domain mapping via monitor_server/file_ownership.md.

  915. Lock reconnect UI contracts in connection_state · a460499

    Add source-level contract tests for monitor reconnect messaging, hint threshold, waiting card copy, and clearReconnecting reset semantics.

  916. Retarget baseline keys to orchestration modules · ebb20bd

    Rename ratchet baseline entries from deleted manager/orchestration shim paths to deployment.orchestration canonical modules (same counts).

  917. Align orchestration references to canonical module paths · 18c23b3

    Replace stale manager/orchestration/_* shim paths in fleet docs, pipeline KB/rules, workflow plans, and orchestration README with deployment.orchestration, common.control_plane, and deploy_orchestration SSOT locations.

  918. Lift CI compliance module to orchestration · d7a1b64

    Move code compliance ratchet helpers from manager _ci_compliance shim to deployment.orchestration.ci_compliance; ci facade re-exports unchanged API. Completes manager orchestration underscore shim migration.

  919. Lift credentials PAT module to orchestration · 536feb6

    Move Zitadel PAT sync from manager _credentials_pat shim to deployment.orchestration.credentials_pat; credentials facade re-exports unchanged public API; update compliance boundary allowlist and fleet KB.

  920. Lift pipeline diagnostics and zitadel to orchestration · e8738be

    Move manager _pipeline_diagnostics and _pipeline_zitadel into deployment.orchestration fleet_* modules; pipeline.py and fleet status tests import canonical paths only.

  921. Delete zero-importer orchestration re-export shims · dbc8803

    Remove 11 thin manager.orchestration._* re-exports now that importers use deployment.orchestration and common.control_plane canonical paths; fix fleet invariant tests for canonical orchestration module paths.

  922. Prune pipeline-flow orchestration re-export shims · d4cea02

    Wire pipeline.py and credentials to fleet_reconcile, host_infra_overlay, and provisioning_ssh_deploy canonical modules. Fix host-foundation gate test monkeypatch to setattr on the imported infra_start_ops module.

  923. Prune control-plane orchestration re-export shims · ff1c10f

    Point credentials, deploy, and ACME helpers at common.control_plane and deployment.orchestration canonical modules; delete eight unused _* shims.

  924. Prune five manager orchestration re-export shims · 4baed03

    Point deploy/build/pipeline/diagnostics at canonical modules and delete orphan _* compatibility files (invocation_correlation, mail_runtime_alerts, pipeline_gates, pipeline_api_bridge, ha_deploy_plan).

  925. Patch remote_start_app_target in start_app contract stubs · 84469ce

    After canonical target resolution moved to deployment.orchestration.remote_start_app_target, unit tests must patch resolve_deployment_targets at the use site, not manager.deploy. Adds patch_resolve_deployment_targets_for_start_app SSOT helper shared by spawn/contract and infra-gate start_app tests.

  926. Lift provisioning_ssh_key_sync to orchestration · 768d2ab

    Canonical module under deployment.orchestration; manager path is a thin re-export. provisioning_ssh_deploy and credentials import the new path so the orchestration package has zero manager._* imports.

  927. Patch remote_start_app_target in start_app contract stubs · cb8fea4

    Monkeypatch resolve_deployment_targets on the canonical orchestration module so spawn-contract tests stay isolated after remote_start_app_target rehome.

  928. Migrate interface mixin imports to orchestration · 8e191c3

    Rehome interface_cli_delegates, interface_infra_ops, and interface_mixin_base under deployment.orchestration with manager re-export shims; update FleetManager assembly and fleet unit tests to canonical import paths.

  929. Migrate fleet_unit tests off manager shims · 6063c70

    Point reconcile and provisioning SSH deploy tests at deployment.orchestration canonical modules; lift provisioning_ssh_deploy under orchestration with thin manager re-export shim.

  930. Lift orchestration helpers to canonical package · 6b76be0

    Move remote_start_app_target, dev_tls_policy, stage_stack_consistency, deployment_runtime, tls_runtime, and zitadel_helpers under deployment.orchestration; keep manager._* paths as thin re-export shims. Update fleet_start_app_flow, fleet_reconcile, fleet consumers, and tests.

  931. Migrate unit tests off deployment manager shims · c5a1a89

    Point fleet tests at canonical deployment.context, deploy_orchestration, pipeline_api_bridge, and control_plane modules where thin shims only re-exported symbols. Patch fleet_reconcile and fleet_start_app_flow for monkeypatch targets; extend layout_roots for canonical resolve_tenant_path.

  932. Track pipeline/build requirements.lock in git · 0fbac1e

    Un-ignore the compiled lock under the generic build/ gitignore rule so CI module lock verification can find pipeline/build/requirements.lock.

  933. Lock agent payload allowlist and pip SSOT invariants · 37916c1

    Regression tests for PAYLOAD_ALLOWLIST leading with requirements.txt and agent requirements delegating to the root monitor manifest via -r.

  934. DRY agent requirements via root manifest · 48a85b0

    Remote agent pip installs delegate to pipeline/monitor/requirements.txt through -r ../../requirements.txt; sync the root manifest in PAYLOAD_ALLOWLIST so provision stays reproducible without duplicating playwright floors.

  935. Remove deprecated archaeology migration scripts · 540b25a

    Delete superseded rewrite_manager_to_operator and _rewrite_manager_orchestration_imports one-shots; migrate_manager_pkg_imports.py is the supported path. Zero CI/cron callers verified.

  936. Add app_infra module lock and manifest SSOT comments · 821bd3f

    Extend uv-compile-ci-python-deps.sh for operator app_infra pytest manifest. Document lockfile paths on monitor, agent deploy, and hosting_runtime manifests.

  937. Add monitor and hosting_runtime Python module locks · 247a456

    Complete the per-tree uv lock wave for remaining pipeline manifests so monitor Playwright scripts and hosting_runtime provisioning share the same reproducible install path as operator/fleet/deployment.

  938. Close REPO-DEPS-PYTHON-LOCK-PIPELINE-DEPLOYMENT wave · 93235b1

  939. Add pipeline/deployment uv module lockfile · 30a61be

    Complete per-module lock coverage for control-plane Python manifests; update python-uv-ci KB with four module lock table.

  940. Evidence for contracts deployment.manager SSOT group · fad8348

  941. Close REPO-CONTRACTS-DOC-DEPLOYMENT-MANAGER-SSOT group · 1a2f953

  942. Align plan status with deployment.manager SSOT · fef215a

    Refresh import-boundary and target-map rows after FOS-07 migration; drop stale manager.orchestration references from MODULE-API-PLAN-STATUS.

  943. Evidence for fleet/pipeline common lock group · f7a1a6d

  944. Close REPO-DEPS-PYTHON-LOCK-FLEET-PIPELINE group · a7caa37

  945. Add fleet and pipeline/common uv module lockfiles · 79d1902

    DRY compile_module helper in uv-compile-ci-python-deps.sh; extend python-uv-ci KB with per-module lock table.

  946. Close REPO-DEPS-PYTHON-LOCK-PIN group · eea5dd2

  947. Add operator uv lockfile pilot and compile hook · b206371

    Extend uv-compile-ci-python-deps.sh for operator/requirements.lock; document lock layers and refresh flow in python-uv-ci KB.

  948. Close OPS-AGENT-TMPDIR-HINT group · 9f7ead3

  949. Add agent TMPDIR runbook for sandbox ENOSPC · 5cd6ea8

    Document cursor-sandbox-cache vs root / headroom, TMPDIR redirect, and cache prune steps in LOCAL-DISK-CLEANUP; cross-link from hosting README.

  950. Close REPO-DEPS-AUDIT-2026-06 group · ced6744

  951. Bump node-cron and swagger-ui-react patch levels · 2e369bc

    npm update within semver ranges for web-client and backend lockfiles; operator/web and workflow already current.

  952. Close REPO-BOUNDARY-SCRIPT-DOC-SSOT group · 7d1f440

  953. Align boundary gate with deployment.manager SSOT · 17306a6

    Build orchestration import scan patterns from variables; ban legacy bare-prefix regressions via bracket-dot ripgrep. Refresh verification README for FOS-07 paths.

  954. Backlog for boundary doc SSOT and deps audit · 2c27604

  955. Close REPO-MIGRATION-TOOLS-REWRITE-TARGETS group · 8eda809

  956. Archaeology rewriters target deployment.manager · 3feec8f

    Use DEPLOYMENT_MANAGER / ORCHESTRATION constants so --allow-archaeology runs cannot reintroduce bare manager.* imports after FOS-07 migration.

  957. Evidence for source audit and migration tool hygiene · e153d91

  958. Guard deprecated manager migration scripts · 9a9612f

    Deprecate one-shot archaeology rewriters with exit 2 unless --allow-archaeology; point SSOT to migrate_manager_pkg_imports (deployment.manager.*).

  959. Add local disk cleanup policy for workstation headroom · 33b6772

    Document gitignored images/ cache reclaim, ≥10% root FS gate, and cross-links for lab hosts. Restore +x on check_operator_fleet_import_boundary.sh so verify gates run without bash prefix.

  960. Add workflow engine parity gate and sync workspace · f2b5b93

    Add compare_workflow_engine_fork.py (portable/full scopes, --json) as the gate for WF-APP-PRUNE-FORK-ENGINE. Update KANBAN evidence and minor doc path fixes; refresh ifeoma-tc tenant index/env/state from local ops.

  961. Align paths after monitor_server rename · 066221e

    Update README, file ownership map, logging contract, server_api test docs, and monitor plan links to use monitor_server instead of manager.

  962. Rename manager package to monitor_server · b70e83a

    Avoid namespace collision with deleted orchestration manager shim after FOS-07 deployment.manager migration; update agent payload paths, CLI entrypoints, and all monitor tests (200 unittest OK).

  963. Remove redundant workflow/.cursor deploy fork · dc261cb

    Bundle SSOT is workflow/cursor/ deployed to .cursor/ only; drop the duplicate workflow/.cursor mirror and narrow audit-kanban parity checks.

  964. Drop get_public_interface CLI aliases (FOS-07) · 0906f85

    Migrate fleet CLI handlers and unit tests to get_fleet_manager and get_fleet_manager_and_tenant; remove backward-compat public-interface aliases from _utils.py.

  965. Sync bundle cursor artifacts with deployed overlay · 4f371cf

    Align workflow/.cursor rules and skills with the application .cursor install so audit-kanban-migration bundleDriftCount is zero.

  966. Clear remaining package and test docstring drift · 239553f

    Align deployment package docstrings, MODULE-API-PLAN-STATUS, and infra CLI test comments with FleetManager / descriptor-only fleet-api SSOT.

  967. Clear remaining FOS-07 stale references in misc docs · 147ede2

    Mark rewrite_manager_to_operator.py as historical archaeology, refresh operator infra test README and workflow operator-control-plane KB mirror.

  968. Refresh plan paths to FOS-07 manager SSOT · 37224e8

    Point tenant-api and control-plane gather plans at pipeline/deployment/manager and fleet descriptor service.

  969. Refresh manager paths to pipeline/deployment/manager · c3daa5a

    Update vmm-consumer allowlist, control-api-kit, and platform-admin KB to FOS-07 SSOT; mirror workflow adopters topic KB copies.

  970. Align route catalogs to FOS-07 fleet-api SSOT · 806fabd

    Replace stale FleetPublicInterface and operator manager paths with descriptor_service / pipeline deployment bridge references.

  971. Remove FleetPublicInterface from pipeline/.cursor guides · b8cd98c

    Align agent KB, boundaries, and runner docs with FOS-07 FleetManager SSOT; fix fleet_manager module docstrings to cite deployment/manager paths.

  972. Scan deployment/manager in import gate scripts · cc5e812

    Post FOS-07 the operator/src/manager tree is only a pkgutil shim; VMM consumer and Operator↔Fleet boundary checks must scan the canonical pipeline/deployment/manager package.

  973. Retarget manager paths to deployment/manager · 6cf905b

    Post FOS-07 KB, rules, and PIPELINE_API_SERVER now cite deployment/manager/*, build/build_context, and pipeline_api_bridge SSOT.

  974. Retarget phase7 typecheck at deployment manager SSOT · 2287e7c

    After FOS-07 manager rehome, mypy targets live under deployment/ instead of deleted fleet/src/manager paths; drop fleet symlink workaround.

  975. Drop stale FleetPublicInterface references · 71dadb0

    Align README, fleet-api route table, and tenant runner docs with FOS-07 (FleetManager + CLI handlers; steered workflows on Operator gateway).

  976. Point clean-arch audit SSOT at bundled mcp tool · 92ede29

    Document workflow/mcp/clean-arch as the default auditor path and resolve relative audit.toolDir in hooks so agents work without an external checkout.

  977. Add requirements-dev.txt for httpx2 pytest bootstrap · 4a0873f

    Document CI-parity and minimal local install paths so tenant-api ASGI fixtures run without silent missing httpx2 failures.

  978. Add httpx2 to optional dev dependencies for pytest · 5cf988e

    Tenant fixture tests use common.asgi_test_client which requires httpx2 for Starlette TestClient; document pip install -e '.[dev]' in README.

  979. Resolve application root in golden image syntax check · 35a4b3a

    TestSyntaxCheck used _FLEET.parent.parent which pointed at the repo parent instead of application/. Use ROOT.parent so provisioning_config.py compiles.

  980. Rewrite MAINTENANCE and fix manager path links · ebaf98c

    Align fleet maintenance guide and cross-doc links with FOS-07 rehome to pipeline/deployment/manager and removal of FleetPublicInterface.

  981. Drop app_hosting_root alias from VM contract tests · 9ac877f

    Import orchestrator/provisioning modules after hosting_runtime bootstrap; use common.provisioning_contracts for serialization fixtures. Removes the legacy app_hosting_root sys.modules shim from load_app_provisioning_runtime.

  982. Align src READMEs with deployment manager rehome · 8bbbd61

    Point orchestration spine at pipeline/deployment/manager and fix fleet_manager layout links after FOS-07 manager path removal.

  983. Align README tree with hosting_runtime ownership · 6b35b49

    Update repository structure and workflow order so Fleet is not described as owning hosting source; hosting_runtime lives under pipeline/.

  984. Point module docs at hosting_runtime SSOT · 24b6362

    Align pipeline README and module.mdc with pipeline/provisioning/hosting_runtime as the hosting runtime owner; note operator hosting as TC-D1 legacy only.

  985. Resolve pipeline root for check_architecture imports · 3d8571a

    parents[4] pointed at pipeline/provisioning; common.runner_output lives under pipeline/. Use parents[5] so the arch CLI runs without PYTHONPATH hacks.

  986. Point hosting globs and indexes at hosting_runtime · 1181998

    Replace stale fleet_manager/hosting paths in fleet-swimlane, silent-fallback inventory, and agent todo-notes with pipeline/provisioning/hosting_runtime.

  987. Shared layer no longer imports provisioning · 162e39f

    Move ISSHOperations to shared/protocols and point shared DTO imports at common.provisioning_contracts so check_architecture rule #1 passes.

  988. Fix stale hosting paths in network and module audit docs · 53ed92d

    Point fleet network README at hosting_runtime + operator app_infra (TC-D1). Update MODULE_PURPOSE_AUDIT header to hosting_runtime/src SSOT.

  989. Point hosting docs at pipeline/provisioning/hosting_runtime · 1c2e5da

    TC-D1 moved VM/hosting prep from fleet_manager/hosting to hosting_runtime. Verify: rg fleet_manager/hosting README.md → 0.

  990. SSOT config_loader and vm_states under pipeline/common · dc60233

    Move config_loader, vm_states, linux_hostname, and network_bridge_utils from fleet/src/common to pipeline/common; add hosting_cli_pythonpath_entries so hosting_runtime/src precedes pipeline/provisioning stub; fix path_utils and hosting CLI entrypoints. Hosting batch 178 passed.

  991. Path_schema hosting_runtime root + arch check host_public gate · 3eaa3b2

    PathSchema auto-detect returns hosting_runtime (not src/) for TC-D1 layout. Architecture checker bans provisioning.host barrel imports in outer layers. Unit tests: test_path_schema_hosting_runtime (2 passed).

  992. Evidence for pipeline tools hosting_runtime path SSOT (257fae7a). · 4834eb6

  993. Outer-layer host_public imports and golden-image VMCreator paths · 5e8be18

    Migrate connection_module to host_public facade; use relative VMCreator imports in golden-image capture/cleanup; align ssh hardening test with importlib gate pattern. Hosting batch 174 passed.

  994. SSOT hosting_runtime scan paths in pipeline tools · 257fae7

    Add hosting_runtime_src_dir helpers; replace stale pipeline/hosting paths in compliance scanners; fleet_layout.hosting_dir delegates to pipeline_paths.

  995. Use host_public and hosting_runtime paths in test runners · c9da2be

    Lifecycle and e2e cleanup imported provisioning.host.* via stale fleet/hosting paths; switch to hosting_dir_from_pipeline_root and provisioning.host_public. Backlog hygiene: drop closed reference rows from KANBAN.

  996. Finish host_public facade and relative host imports · 136fb15

    Route outer layers through provisioning.host_public; replace remaining provisioning.host barrel imports inside host/vm with relative paths so pytest hosting batch (174) and VM contract tests (17) stay green.

  997. Align todo-lifecycle with KANBAN AgentId row contract · a17c892

    Document AgentId and Updated (UTC) columns for parallel agent claims.

  998. Add host_public facade for outer-layer host imports · fe5c899

    Orchestrator, pipeline, and tests import provisioning.host_public instead of provisioning.host.* absolute paths to avoid the heavy host package barrel; hosting batch 174 passed, VM contract tests 17 passed.

  999. Sync module indexes and rules to KANBAN SSOT · 9084fdb

    Retired OPEN_TODOS paths in module shards and operator iteration-loop refs; workflow validate.mjs ok.

  1000. Replace absolute provisioning.host imports with relative paths · 4f35529

    Avoid circular barrel loads when hosting_runtime submodules import siblings; hosting batch 174 passed, VM contract tests 17 passed.

  1001. Provisioning test bootstrap and post-FOS-07 docs · 7a46093

    Purge pipeline/provisioning namespace shadow, bind fleet common.* for hosting_runtime imports, and lazy-load orchestrator barrels so VM contract pytest stays green; refresh FPI audit and deployment manager README for load_fleet_orchestration SSOT.

  1002. Close REPO-WIP-HYGIENE group and log hosting import backlog · c7aded1

    Record bootstrap/orchestrator test evidence; add REPO-HOSTING-ABSOLUTE-IMPORTS backlog row for remaining provisioning.host absolute import cleanup.

  1003. Hosting test bootstrap and orchestrator import hygiene · 31c5dc0

    Provisioning-runtime test bootstrap binds fleet common modules; lazy orchestrator/workflow inits and relative host imports fix VM contract tests; FPI audit doc archived post-FOS-07; browser-hosts doc → FleetManager.

  1004. TC-D1 test bootstrap uses hosting_runtime alias · 31ea3b9

    load_app_provisioning_runtime registers hosting_runtime + legacy app_hosting_root shim for VM contract tests. Fix operator_browser_hosts docstring to reference FleetManager after manager rehome.

  1005. Close ARCH VMM audit and generated-index triage groups · 4152998

    Record invariant-based VMM regression proof and revert timestamp-only generated index churn; board Todo/Doing cleared for backlog promotion.

  1006. Stage gate curl-only mode and sidecar preflight · d2715b2

    Document operator runtime-verify and fail fast when TENANT_API_BASE_URL is unset; --curl-only supports semver probes without tenant-api sidecar.

  1007. Add FleetPublicInterface audit and VMM operator index · 60c7e3b

    Phase E1 inventory cross-links INFRA_CONTROL_FACET_AUDIT (B0 HTTP facets). Operator README_INDEX documents VMM HTTP integration paths. Fleet clean-arch config scopes audit to src/api/vmm only after vm_management moved to IC.

  1008. Add FleetPublicInterface audit and cross-link B0 facets · 4ce0538

    Phase E1 FPI inventory doc complements INFRA_CONTROL_FACET_AUDIT; remove untracked hosting lab conftest and record hosting batch verify (174 passed).

  1009. Close REPO-DOCS and discovery triage evidence rows · eab48e7

    Document 60647d52; add Todo for untracked operator audit doc and hosting debug conftest hygiene.

  1010. Remove deprecated discoveryProfileFromWire shim · 60647d5

    Parser tests live in discoveryFromApiWire.test.ts; api.ts imports the canonical module per discoveryWireApiMisuseInvariant. Drops the legacy re-export barrel and its duplicate atomic test file.

  1011. Close REPO-SOURCE release-notes verify row · 73b1c1b

    verify: release-notes matches web 0.1.1008; no bundle churn to commit.

  1012. Refresh release-notes bundle for 0.1.1008 · 1da0ae8

    Regenerate release-notes.generated.json from git log so web/api/cloud/AI semvers match package.json and build-info HEAD before the next stage deploy.

  1013. Dedupe REPO-OPERATOR evidence log rows · a76b2bd

    Consolidate closed operator/pipeline WIP evidence after verify passes.

  1014. Add infrastructure_control.behavior module presence tests; document .venv-ci pytest entrypoint for httpx2-backed fleet_unit suite. · 47dba06

  1015. Adds delete_extraneous to RemoteRunContext/build_rsync_cmd so compose/config sync can be additive without --delete. · 4e06a4a

    Adds delete_extraneous to RemoteRunContext/build_rsync_cmd so compose/config sync can be additive without --delete. Documents VMM_API_TOKEN in tenant misc secrets template and tightens gateway bootstrap test to assert src.api bridge without widening the whole fleet src namespace.

  1016. Align z_infrastructure fleet_unit with pipeline common SSOT · 2b352f1

    Updates infra tests after TC-D1 contracts extract: wizard filters assert provisioning.contracts import path, Traefik TLS tests re-export common.tests, and conftest re-binds fleet paths after gateway bootstrap.

  1017. Track VMM client, fleet descriptor, and pipeline common SSOT · 4ff5112

    origin/main referenced these modules from tracked call sites but the files were never committed — fresh clones and CI would fail on import. Adds the fleet VMM HTTP consumer, descriptor service, provisioning_contracts SSOT, and related common helpers with re-export shims and the VMM consumer gate.

  1018. Evidence log for REPO-KANBAN-ROOT and fleet runner slice · 2c7be56

    Close REPO-FLEET-WIP runner + contract_models rows; fix duplicate evidence headers.

  1019. Refresh task board columns after root track commit · e3f17d5

    Evidence log for closed REPO-KANBAN-ROOT group; restore Todo/Doing layout.

  1020. VMM-safe DHCP SSH probe and disposable VM cleanup order · 1c4dec4

    detect_dhcp_interface uses pipeline/common build_ssh_cmd and conn_info instead of HostManagementInterface; run disposable VM cleanup after tenant_path is materialized with tenant_path and target_id.

  1021. Add root task board markdown as SSOT · 609f570

    Consolidates open work after module todo file retirement. Workflow validate ok.

  1022. Ignore contracts/tools package-lock after global un-ignore · 51b3e3f

    Place the contracts-orchestrator lock ignore after !**/package-lock.json so the empty meta-package lockfile stays out of git status.

  1023. Meta package has no npm install step; ignore stray lockfile noise. · 1636b65

  1024. Gitignore OpenAPI generator markdown under generated/api/docs · 14f78f2

    SSOT for web API types remains api-types.ts; ignore openapi-generator markdown noise so hygiene commits stay clean.

  1025. Retire module 00_PROJECT-TODOS files; add docs/workflow · 2905066

    Consolidate open work into root KANBAN (orchestrator-owned); remove 17 scattered OPEN_TODOS / 00_PROJECT-TODOS / source/TODOS files; add docs/workflow.md and workflow template/learnings updates. Archive pointer remains in source/00_PROJECT-TODOS-DONE.md.

  1026. Propagate correlation and idempotency on sidecar clients · f4c1860

    SidecarClient reads correlationId/idempotencyKey from JSON bodies into X-Request-Id and Idempotency-Key headers (operator + pipeline clients).

  1027. Tenant summary/mode/services facades and workflow phases · 5761e81

    Contract-first gateway routes proxy to tenant-api; TenantClient methods; JobRecord.workflowPhases on 202 responses; pipeline-only import bootstrap in tenant_deployment_gather (no fleet sys.path in gateway process).

  1028. Add VMM Ring A consumer adapter checklist · 3499616

    Documents HTTP-only integration pattern, boot order, and governance gates alongside vmm-integration.mdc.

  1029. Add VmmClient consumer adapter and common SSOT modules · 4731190

    Track fleet/src/api/vmm client stack (required by vm_management on main), pipeline/common provisioning/DNS/TLS/SSH helpers, hosting_runtime shims, compose control-plane contract, and check_vmm_consumer_imports guard.

  1030. Replace standalone Any in common harbor/purge protocols · 03a24b8

    Category-14 compliance ratchet flagged Protocol -> Any on harbor startup and infra plane purge helpers. Use typed Protocol readers and ResultBase.

  1031. Move Harbor tenant CRUD materialization to IC host · 6f5226c

    Python CI module-boundaries Check 3 flagged tenant.get_infra/update_infra in pipeline/common/harbor_startup_contracts.py. Materialization now lives on HarborManagementPart; common ensure_harbor_startup_contracts delegates via the HarborStartupHost protocol only.

  1032. Track vm_network_labels adapter module · afaf114

    8694ef6e wired _vm_network_ui to this bridge but the file was never added. Refresh post-MRO doc paths to infrastructure_control SSOT.

  1033. Repair KB relative links after workflow sync · ad4c912

    implementation-loop skill paths must use ../../../workflow from .cursor/skills; org kanban template links to GitHub instead of sibling repo.

  1034. Sync cursor bundle for kanban parity · 6c8b3d6

    Deploy workflow/cursor to .cursor/ so bundleParity validate passes; fix stale verification.checks path in agent todo-notes.

  1035. Delete manager reachability/checks shims · 0fa548c

    Reachability and stage checks SSOT is verification.*; remove legacy operator/src/manager/{reachability,checks} re-export packages, refresh docs to verification.reachability paths, add shim invariant tests.

  1036. Move steered redeploy to cli_lib for clean-arch DIP · 86b088e

    Relocate HTTP app-redeploy workflow from src/workflows (interface_adapters) to cli_lib/redeploy_workflow (frameworks_drivers) so gateway delegation no longer crosses layers; fleet shim imports cli_lib.redeploy_workflow.

  1037. Post-MRO hygiene — contract paths, test FILEPATHs, KB/plan sync · d7c18d0

    Point mesh-network OpenAPI and structural tests at infrastructure_control and hosting_runtime SSOT; refresh vmm-integration and tenant API plans.

  1038. Refresh fleet shim paths to infrastructure_control SSOT · 55499eb

    Point operator/fleet/pipeline docs and rules at canonical behavior modules after MRO shim deletion; verify rg finds no stale fleet/_* runtime paths.

  1039. Complete MRO shim deletion (provisioning, edge-tls, mesh) · b3ff027

    Remove fleet/_provisioning, _edge_tls, and _mesh re-export shims; import infrastructure_control.behavior.* at composition and test boundaries. Add shim invariant tests and tighten operator/fleet import boundary gate.

  1040. Remove VM behavior shims; canonical ic imports · 8694ef6

    Delete fleet/_vm package and _vm_management_part facade; FleetManager assembly and tests import infrastructure_control.behavior.vm_* directly. Extends harbor/infra/tenant shim invariants and operator boundary checks. Verify: test_fleet_vm_shim_invariant + vm network tests — 18 passed.

  1041. Delete fleet/_tenant shims (ARCH-FLEET-MRO-TENANT) · 832f32d

    Remove the last fleet/_tenant re-export; tenant unit tests import infrastructure_control.behavior.tenant_* directly. Boundary gate drops _tenant/* exception; invariant tests guard against shim regression.

  1042. Remove _infra shims; tests use operator behavior · 19548eb

    Delete fleet/_infra re-export modules; fleet and operator tests import infrastructure_control.behavior.infra_* directly. Boundary gate no longer whitelists _infra/*; composition root remains _assembled_manager.py only.

  1043. Remove _harbor shims; compose harbor from operator · 385cbd8

    Delete fleet/_harbor re-export package; FleetManager assembly and pipeline CLI delegates import infrastructure_control.harbor directly. Boundary gate allows infrastructure_control imports only on _assembled_manager.py.

  1044. Remove dead infra_ops common re-export shims · 05327ea

    Delete unused _infra_plane_purge_sequence and _harbor_startup_contracts shims now that fleet runner, reconcile, and infra_lifecycle import pipeline/common SSOT directly; add regression invariant test.

  1045. Infra plane purge SSOT; zero runner infra_ops imports · e014608

    Move stop_then_purge_host_and_app_infra_planes to pipeline/common with InfraPlanePurgeHost Protocol so fleet reset ops and operator infra_lifecycle avoid infrastructure.infra_ops; E2E reset script uses common InfraServicePlane.

  1046. Move infra plane purge sequence to pipeline/common · 2bae467

    Fleet runner reset ops and operator infra lifecycle import the shared stop/purge ordering from common instead of infrastructure.infra_ops.

  1047. Runner DNS reassert via InfraManagementPart host · b73dfb0

    Extract outbound DNS reassert into infra_ops/_outbound_dns_reassert.py and expose FleetManager.reassert_outbound_dns_after_infra_foundation so fleet runners no longer import infrastructure.infra_ops directly.

  1048. Decouple harbor startup and vm bootstrap DIP · b6fb149

    Move Harbor startup contracts to pipeline/common so fleet runners and reconcile import the host Protocol SSOT instead of infrastructure.infra_ops. Split VM bootstrap durable job wiring into src/server/vm_bootstrap_worker with lazy imports so infrastructure_control no longer reaches jobs_store.

  1049. Verify harbor startup SSOT decoupling from infra_ops · 591ea26

    Add common and fleet invariants that _orchestration_runtime imports common.harbor_startup_contracts only; document closure in decoupling KB.

  1050. Compose ps status SSOT; fleet CLI infra_ops gate · 269acdd

    Move compose_ps_status_bucket to pipeline/common for shared Fleet CLI and Operator health parsing. Add check_fleet_cli_infra_ops_imports.sh with empty inventory so new fleet/src/cli infra_ops imports fail CI.

  1051. Remote deploy dir SSOT via common.constants_paths · 766a36e

    Fleet CLI stack-log and elasticsearch commands no longer import infra_ops.REMOTE_DEPLOY_DIR; operator keeps a backward-compat alias to DEFAULT_VM_DEPLOY_DIR. Adds decoupling KB article and navigation links.

  1052. Bundle semver refs to fleet-cli-commands log · 92552e6

  1053. Kanban semver evidence via fleet-cli-commands · a3724c9

  1054. Slim AGENTS.md index; migrate runbooks to .cursor KB · 9aca48c

    Move durable agent orientation out of AGENTS.md into KB articles and update rules/skills cross-refs; live semver evidence stays in fleet-cli-commands.

  1055. Harbor compose deploy SSOT paths and test helpers · 0f6ed17

    Centralize operator app-infra compose resolution in harbor_compose_paths, migrate policy tests to harbor_compose_deploy_path(), and gate the hosting_runtime reference copy with explicit SSOT documentation.

  1056. Harbor compose SSOT paths and pipeline audit hygiene · 1e9f79e

    Add harbor_compose_deploy_path helper, document operator vs hosting_runtime compose ownership, wire harbor healthcheck test to SSOT, exclude .venv from pipeline clean-arch scans.

  1057. Batch import paths, nested coercion, hosting bootstrap · 74afb06

    Fleet conftest path order, tenant/security _FIELD_COERCIONS, hosting ensure_hosting_src_on_path for PlatformDetector, serialization wire round-trip, and infra-ops test patches for canonical FPI modules.

  1058. Green full batch — common namespace restore and fleet test paths · 4670239

    Restore pre-test common.* modules after provisioning-contracts isolation so SmtpRelayConfig isinstance stays stable across the tenant suite; update VM syntax-check paths for manager/hosting rehome; fix fleet unit conftest sys.path so import cli resolves to fleet/src/cli not fleet/cli.py.

  1059. Green unit pytest batch via bootstrap SSOT and importlib mode · 6b2d8fe

    Centralize hosting_runtime unit path setup on pipeline/tests/common/bootstrap, anchor pytest rootdir to hosting_runtime, and fix stale compose/DNS test paths so run_batch_main_module_tests.py hosting exits 0 (174 passed).

  1060. Compliance ratchet baseline and hosting pytest bootstrap · 2a0e4b2

    Update pipeline/tools/.compliance-baseline.json for the VMM/control-plane slice so Python CI step 1b passes. Fix trace_usage test path after hosting_runtime migration; rename provisioning.py CLI to hosting_provision_cli.py to stop shadowing src/provisioning; lazy-load hosting conftest imports and omit pipeline/ from hosting unit-test PYTHONPATH until conftest appends it.

  1061. Track control-plane target map SSOT test · 6243128

    Commit pipeline/tests/test_control_plane_target_map.py so CI dry verification matrix manifest resolves ARCH-CONTROL-PLANE-TARGET-MAP-SSOT.

  1062. Remove legacy lab copy and add import guard (TC-D1) · ad437f1

    Delete in-repo vm_api/libvirt lab; keep vm/README.md stub pointing at app-infra-vmm. Add pipeline/tools/check_vm_lab_imports.sh alongside the VMM consumer import gate.

  1063. Fix relative markdown links for CI KB gate · 977ed4a

    Point pipeline hosting docs at provisioning/hosting_runtime; correct workflow paths from implementation-loop skill; use HTTPS for external VMM contract; replace sibling-repo links with plain-text org refs.

  1064. Commit missing OpenAPI model shards for CI tsc · bc1afac

    index.ts exported 22 admin/chat model modules that existed locally but were never tracked (gitignore parent-dir negation gap). Un-ignore api/ and openapi/ directories; add generated model files from product OpenAPI.

  1065. Align module boundary checker with control_plane SSOT · 422bf08

    Document transitional tenant CRUD paths under common/control_plane and deployment orchestration; allow typed tenant/infra contract seams; route compose/rsync helpers through common.provisioning_contracts.

  1066. Fix vmm-integration relative links · cb84039

    Correct deletion-plan path depth; reference KANBAN as plain text (untracked SSOT).

  1067. Use uv pip sync --system on GHA Python jobs · e8010f3

    setup-python installs into the runner system interpreter without a venv; uv pip sync requires --system in that environment.

  1068. Uv lockfiles for Python CI jobs · da96567

    Add ci-python-requirements.in + compiled locks for python-ci and ml-service-tests; wire CI to uv pip sync. Include refresh script and align hosting_runtime dnspython floor with fleet.

  1069. Httpx2 TestClient for API pytest · e14fda9

    Self-contained tests/helpers/asgi_test_client.py mirrors control-plane and ml-service patterns; add httpx2 to dev extras and bump FastAPI floor.

  1070. SSOT VM network selector CLI copy and table · f7e2638

    Centralize VMM-backed selector table rendering and static bridge/VMM prompt strings in _vm_network_ui.py; dedupe network_manager and create-vm wizard paths. NAT guidance references dynamic Notes labels from inventory.

  1071. Httpx2 TestClient SSOT for pytest · be2a2a7

    Starlette/FastAPI TestClient emits UserWarning without httpx2; add pipeline/common/asgi_test_client.py and route operator/fleet/pipeline tests through it. httpx2 added to fleet/operator requirements and tenant pyproject for sidecar smoke coverage.

  1072. Use httpx2 for Starlette TestClient in route tests · 41453df

    Add httpx2 dev dependency and asgi_test_client helper so FastAPI 0.138 / Starlette 1.3 route tests avoid StarletteDeprecationWarning on TestClient import.

  1073. Add uv bootstrap script and CI setup-uv gate · ed62346

    Install Astral uv via scripts/ensure-uv.sh for dev and pin setup-uv v8.2.0 in python-ci. Document orchestration shim re-export rules and export reconcile explicitly from _pipeline_reconcile.

  1074. Restore start-app shim exports and orchestration imports · 3a8fd08

    Star-import shims dropped private symbols needed by pipeline.py; re-export explicitly and fix fleet_start_app_flow lazy imports after orchestration rehome. Align operator reconcile unit tests to patch fleet_reconcile module globals.

  1075. Import domain_resolution from control_plane SSOT · 8dd8b38

    Point fleet and deployment orchestration at common.control_plane.domain_resolution instead of manager.orchestration._domain_resolver shims. Fix fleet_reconcile lazy imports to manager.orchestration.build and manager.deploy.

  1076. SSOT deployment gates for operator workflows · 5bed670

    Move multi-target APP-INFRA gates, domain resolution, and host-infra overlay to pipeline/common/control_plane. Operator workflows import infrastructure_control.deployment_gates instead of manager.orchestration.

  1077. SSOT public edge probe plan for operator and fleet · 561f60a

    Move merged-env probe URL resolution to pipeline/common so Operator verification no longer imports fleet CLI modules (CL-AUDIT-25).

  1078. Trim AGENTS.md semver table; SSOT stage proof in skill + fleet KB · c4b7dbc

    Promoted stage proof checklist to product-stage-deploy-verify skill; cross-refs point to fleet-cli-commands evidence log instead of AGENTS table. Verify: wc -l AGENTS.md ~200; rg 'Current canonical stage stack' → 0.

  1079. Route Harbor MRO through _harbor shim for boundary gate · 51470d9

  1080. Decouple verification from fleet_manager imports · 0ef2b19

    VerificationOrchestrationHost Protocol + fleet_lab_bridge for lab-only FleetManager fallback; checks/reachability use SSOT probes and SSH helpers. Verify: rg fleet_manager in operator/src/verification → 0; pytest 21 passed.

  1081. Rehome HarborManagementPart to infrastructure_control.harbor · 1944ea4

    Canonical harbor package under operator/src/infrastructure_control/harbor; fleet _harbor/* are compatibility shims. host.py and FleetManager import from operator-owned path. Harbor unit tests updated. Verify: rg fleet_manager in infrastructure_control → 0; test_harbor_health_gate 19 passed.

  1082. Move MeshManagementPart to operator behavior; fleet shim re-exports. · 8e3858e

    Compose HarborManagementPart on host/FleetManager MRO separately from mesh. Update fleet_unit tests to import canonical modules.

  1083. ARCH-AUDIT-FINDINGS: pipeline CL-AUDIT-22/23 and operator clean-arch config. · 85962ed

    Exclude common/tests bootstrap probes from pipeline entity audit; document accepted deployment_bindings/runtime_workers cycle; add operator layer map with CL-AUDIT-24/25 for namespace bridge and verification fleet debt.

  1084. Replace src.* lazy imports with fleet_manager.*, api.*, and cli.* so deployment orchestration does not bind to the ambiguous src package namespace (sidecar DIP). · 048a4f7

  1085. FOS-07-FPI-DELETE: route CLI and job workers through FleetManager directly. · 9a9a779

    Compose interface mixins onto FleetManager, replace FleetPublicInterface with load_fleet_orchestration(), and use descriptor_service() on fleet-api routes.

  1086. Replace FleetPublicInterface in fleet/src with orchestration facade · 2856c42

    Rename the pipeline CLI facade to FleetOrchestrationFacade, route fleet CLI and job workers through src.cli.orchestration, and drop FleetPublicInterface exports from fleet/src and operator/src so the import triangle closes for Group FOS-07-D.

  1087. FOS-07-IC-LOADER-COMMON: rehome loader/contracts/requirements to common control_plane. · a9b4584

    Operator infrastructure_control imports common.control_plane SSOT for module loading, contract aggregation, pip requirements, and tenant PAT helpers; manager orchestration modules become thin re-exports.

  1088. TLS certs SSOT without manager loader · 02d88e7

    Add common.control_plane.app_infra_loader for AppInfraPublicInterface resolution and drop manager.orchestration.loader from tls_certs (FOS-07-D).

  1089. FOS-07-IC-TLS-COMMON: rehome tls_certs to common control_plane. · 7800a58

    Move TLS generate/inspect orchestration to pipeline/common/control_plane/tls_certs.py; manager.orchestration.tls_certs becomes a shim; infrastructure_control infra_tls_certs imports common only (no manager.orchestration).

  1090. FOS-07-IC-COMMON-IMPORTS: finish IC control_plane SSOT wiring. · cfc3b6d

    Route infrastructure_control host and behavior through common.control_plane (tenant paths, vm lifecycle, tenant config validation); add vm bootstrap job and VMM target resolve helper; zero manager.orchestration._ imports in IC.

  1091. Tenant config validation SSOT in common · 79b1bae

    Move tenant package gap checks to common.control_plane.tenant_config_validation, point infrastructure_control behavior and fleet tests at the SSOT, and align vm lifecycle policy tests with common imports (FOS-07-D).

  1092. FOS-07-ALLOWLIST-EMPTY: empty Operator↔Fleet import allowlist. · 91821f5

    Rehome mail alerts, VM lifecycle policy, orchestration result, and tenant path helpers to pipeline/common/control_plane with manager shims; tighten boundary script to Operator→src.fleet_manager import lines only; add pytest for empty allowlist and boundary gate.

  1093. Route infra_ops/IC through common control_plane SSOT · 2a285b9

    Point infra_ops and infrastructure_control behavior modules at common.control_plane tenant_paths, orchestration_result, and mail_runtime_alerts; add resolve_app_infra_paths to tenant_paths and drop infra_ops from the import allowlist (FOS-07-D).

  1094. Infra_ops uses common effective target map SSOT · 80eb1ba

    Route infra_ops effective-target-map imports through common.control_plane.effective_target_map instead of the manager.orchestration shim (FOS-07-D slice).

  1095. Close FOS-07-C manager import namespace decouple · eabe311

    Migrate pipeline/deployment/manager off src.fleet_manager/runner aliases, narrow src bootstrap to api/cli bridges, and shrink the import allowlist.

  1096. DRY manager imports off fleet_layout and dns shims · 206bfc2

    Point deploy preflight at deployment.dns_orchestration_enforcement, provisioning SSH validation at infrastructure_control, and Zitadel/PAT compose dirs at infra_dir_from_pipeline_root SSOT.

  1097. Decouple infrastructure_control from fleet_manager imports · 37c3fa5

    Rehome rsync, SSH conn, and DNS preflight enforcement to pipeline/common and pipeline/deployment with fleet compatibility shims; introduce InfrastructureControlHost protocol for provisioning behavior modules.

  1098. Introduce structural typing for compose orchestration hosts, replace broken ..fleet imports, and resolve app-infra paths via pipeline_paths SSOT. · 7ba4324

  1099. Resolve src.api imports after operator src bootstrap (FOS-07-C) · 1311b1e

    Extend the src namespace with fleet/src for sidecar HTTP clients, lazy-load FleetManager assembly to break the infra_management import cycle, and re-bootstrap pytest fixtures after src cache purge.

  1100. SSOT bootstrap_operator_gateway_imports (FOS-07-B) · 8a00868

    Centralize operator gateway sys.path ordering in pipeline_paths so import src.server binds to operator/src after fleet common merge; wire control_plane, sidecar smoke, and pytest conftest to the shared helper.

  1101. SSOT bootstrap for operator src namespace (Group FOS-07-B) · 608e92c

    Add operator/src/__init__.py and bootstrap_operator_gateway_imports in pipeline_paths; wire control_plane paths and sidecar smoke imports; add regression tests proving import src binds to operator after fleet merge.

  1102. Remove deprecated host deploy-runs gateway proxy (FOS-05) · 5420bef

    Steered deploy must use tenant-deployment-runs with Operator gather; the host Pipeline deploy-runs bypass is no longer exposed on :8770.

  1103. Add chat media multipart route verification bundle (Group DRY) · 2315a73

    Register DRY-BACKEND-CHAT-MEDIA-MULTIPART-ROUTE in the matrix; add voice 200 route contract test and mockReset isolation between happy-path cases.

  1104. Consume multipart file during parts() iteration (Group TEST) · 4be1df2

    Deferred toBuffer() after the busboy parts loop stalled chat media inject tests and could hang when type/file field order varies. Buffer the file part inside the loop; document the rule on registerMultipart; add form-auto-content route contract tests (400/413/200).

  1105. DRY mail enforcement stages for migrate script · 6efb4b4

    Import rollout stage literals from dns_mail_preflight_policy SSOT so migrate_mail_domain_contracts cannot drift from deploy preflight policy.

  1106. Refresh Node lockfiles and Python floors (Group DEPS) · 11165f1

    Bump web-client, backend, operator-web, contracts/workflow npm trees via ncu; align Python requirements for tenant, fleet, operator gateway, and ml-service. Fix react-day-picker v10 calendar classNames, backend chat gate RBAC mocks + vitest teardown, operator generate-all cwd, and ml route tests for FastAPI 0.138 OpenAPI path inventory.

  1107. Align chat media 413 copy with photo vs voice intent · 278b664

    Introduce chatMediaPayloadTooLargeDetail SSOT for validation and multipart limit responses; route passes resolved media type to the multipart handler; extend policy tests for photo and voice 413 JSON mapping.

  1108. Unify DNS/mail preflight static rules across fleet and pipeline · 238a77c

    Fleet mail preflight now delegates static contract checks to the shared dns_mail_preflight_policy module while keeping live DNS probes fleet-local; adds BIMI rules to SSOT, wire adapters, DRY matrix bundle, and tests.

  1109. Refresh stage semver table for 2026-06-21 · d762d7b

    OPS-STAGE-SEMVER-RECONCILE: live curl matches repo HEAD at web 0.1.1008, API 0.1.193, and AI 0.1.26.

  1110. Lock VMM package-root DIP with CL-AUDIT-21 · 5452597

    Document docstring-only src/api/vmm/__init__.py and add an AST invariant test; clean-arch audit reports zero violations on the VMM consumer slice.

  1111. Inject sidecar ports for tenant deployment DIP · 9099b9f

    Move Pipeline API client/worker imports to composition root so deployment orchestration no longer crosses into src.* drivers; closes ARCH-PIPELINE- DEPLOYMENT-SERVER-DIP with clean-arch audit at zero violations.

  1112. Drop deprecated chat peer-name shim re-exports · a05a451

    Chat hooks and tests import peerNameDisclosurePolicy SSOT directly; removed chatMutualRevealDisplayName and chat peerNameDisclosurePolicy barrels.

  1113. Ban Stage reconciliation in KANBAN; add board hygiene rules · 822ff57

    Stage semver belongs in AGENTS.md and OPS-STAGE-SEMVER-RECONCILE backlog task, not a standing kanban section. Update engine template, continue-loop skill, and kanban-turn-methodology with explicit hygiene guidance.

  1114. Add verification matrix and runner for Group DRY close-out · 96a84b5

    Document SSOT slices with machine-readable manifest, verify_dry_matrix.sh, and manifest invariant tests (12/12 focused bundles green).

  1115. Lock contract SSOT with wire Zod + invariants · e394800

    Verify wireChatMessageFromDocument output against generated ChatMessageWire, GetMessagesResponse envelope, and source invariants for connections query, media semantics, and profile public wire builders.

  1116. Verify workflow gate ordering and job federation parity · 3de63af

    Add steered-deploy phase-order tests and extend downstream id/jobId + failed-status federation coverage for control-plane gate policy closure.

  1117. Add discovery-from-api-wire strict Zod parser layer · c1b0706

    Mirror connections wire boundary: generated OpenAPI Zod, strip tier-internal profile blobs, and parse in api.ts before hooks cache discovery rows.

  1118. Split discovery score read vs derive APIs · bbd787c

    Add resolvePreMaterializedDiscoveryDisplayScore and deriveDiscoveryDisplayScore; chat inbox reads enriched scores after buildDiscoveryProfileForSheet; adapter rejects un-enriched pairwise rows. Misuse invariants lock the read path in chat.

  1119. SSOT peer name disclosure in profile policy · 9c9d27a

    Centralize stage gate, legal name parts, primary labels, and chat thread display in features/profile/peerNameDisclosurePolicy. Discovery card helpers and chat barrels delegate; discoveryDisplayNameOrNull now uses name-parts SSOT.

  1120. SSOT match ring and percent display in matching · 47439e1

    Move connectionRingForPeerLayout and resolveMatchPercentForDisplay into features/matching so universe layout and chat inbox share one policy. transformToMatch derives rings from the same resolved display % as the row.

  1121. Delegate radar renderable check to pairwise SSOT · d585dfb

    hasRenderableDimensions now calls hasRenderablePairwiseDimensions so chart empty-state logic matches connection-first pairwise precedence elsewhere.

  1122. Single scan root for clean-arch audit config · 15765ac

    Multi scan_roots collapsed package __init__ modules to id "root", producing false entities→interface_adapters violations. Use scan_roots: ["."] and exclude provisioning/** so make audit-app-cli exits 0.

  1123. SSOT read for admin whitelist env CIDRs · a3d56e8

    Centralize TRAEFIK_ADMIN_ALLOWED_CIDRS parsing in admin_whitelist_cidr_policy so deploy preflights and whitelist sync plan share one env-file reader.

  1124. Deprecate useFeatureFlag; document fail-closed policy · 2071d18

    useFeatureFlagQuery remains the SSOT for gates with explicit error surface; the boolean wrapper is deprecated with invariant tests proving no production call sites.

  1125. Stage smoke for connections pairwise wire field · ecb100b

    Adds a Node script that signs in on stage, seeds a connection when the inbox is empty, and verifies peerPairwiseMatchDimensions on every list row — closing match-peer P0 item 6 with live SMOKE_OK evidence.

  1126. Add stubbed ui-authenticated viewport spec for inbox View profile → pairwise radar, shared pairwise section helper, inventory invariant, and npm script. · d43984b

  1127. PeerProfileSheet pairwise empty state when dimensions null · 1dd7ae3

    Always render the fit-by-axis section after chart deferral; delegate null and all-zero skips to CompatibilityDimensionsRadar empty copy with test ids.

  1128. Universe architecture §2.1 pairwise vs connections · 416e35b

    Document discovery pairwiseMatchDimensions vs connections peerPairwiseMatchDimensions with surface table, mermaid flow, and links to matching SSOT; lock with doc invariant test.

  1129. Align offline invariants with admin load-error SSOT · 667b0c2

    Unblocks match-peer regression bundle verify: platform settings uses AdminLoadErrorPanel; admin reports mock uses valid limit; DE openers stub allows qwen vs template source.

  1130. Tighten id-label admin API client types · 13ea9a5

    Use generated OpenAPI wire types in questions.ts; add QuestionWriteInput and fail-closed create validation; type connection statement bulk mapper to ConnectionStatementSeedRow only.

  1131. Remove generation config load_settings DIP violation · 05fcb70

    Re-export qwen_settings from generation/config barrel; mmr adapters never import src.config. Closes Group ARCH ml audit row.

  1132. Resolve clean-arch cross-layer import violations · 2b994c9

    Move DevFunctionsStatus SSOT to lib/dev, drop JSDoc import() links the audit tool treated as real edges; web layer violations now 0.

  1133. Triage web/ml clean-arch layer violations · 8c2d2fe

    Web: include generated/api and messages in audit graph (72→3 real edges); document fingerprints in ARCHITECTURE-AUDIT-WEB-CLIENT. ML: classify output_locale adapter; document accepted routes→dependencies pattern.

  1134. Match storage DIP guard leaf for persist layer · 03c5104

    Extract assertMatchStorageWriteAllowed so matchStoragePersist does not import the policy module; document in ARCHITECTURE-AUDIT-BACKEND. Add admin user-profiles list-rows invariant test (no ?? [] on query failure).

  1135. Apply VMM client DIP — docstring-only package root · 8fd5ce7

    Stop re-exporting VmmClient from src.api.vmm __init__ (entities layer); call sites import client/adapters directly. Clean-arch fleet VMM scan: 0 layer violations; VMM unit tests 8 passed.

  1136. Consolidate SSH tunnel SSOT under src/network/ssh_tunnels · 09d0b71

    Single README for registry push forwards and dev ENDPOINT_SPECS matrix; cross-link CONNECTIVITY_LAYERS, mesh, runner/tunnel, and fleet index.

  1137. Document tenant mesh_network in OpenAPI (P134-L03) · c86bfe7

    Add shared mesh-network.yaml aligned with MeshNetworkConfig and MeshType, type tenant GET/PUT /infra with TenantInfraState, and enum mesh_type on target conn_info. Regenerate tenant/fleet bundles; parity OK; alignment pytest 4 passed.

  1138. Psychometric QA mobile sidebar + Playwright system Chrome · 32baff9

    Keep admin section nav off-canvas on narrow viewports, wait for questions GET, and add PLAYWRIGHT_USE_SYSTEM_CHROME for Ubuntu hosts without Playwright Chromium/ffmpeg bundles. Stage E2E 2 passed @ 540×960 / 1080×2340 on web 0.1.1008.

  1139. Extract dev env defaults so run_operator_server no longer imports control_plane.start (fleet src.server was binding on 8770). · 8a694d9

    Extract dev env defaults so run_operator_server no longer imports control_plane.start (fleet src.server was binding on 8770). Prefer local openapi-typescript for contract preflight; fix admin sidebar e2e helper for next build typecheck. Stage rebuild-web-client succeeded; curl health 0.1.1008.

  1140. Align turn plan with org kanban lifecycle · f0e0dfa

    Merge IFEOMA-CLOUD360 turn-plan structure with TC kanban: group closeout, continuous drain/register, no circumvention rule, and adopter todo-lifecycle KB. Bundle sync + validate/audit gates green.

  1141. DRY control-plane target schemas across fleet and pipeline APIs. · 5ffc6ed

    Shared control-plane-targets.yaml is now the SSOT for tenant targets and FleetTargetDescriptor; bundle tooling merges product shared schemas so nested refs resolve in generated Python models.

  1142. Sync local changes · eaa1a34

  1143. Mark admin OpenAPI wire-parse and arch rebaseline done · fffcc85

    Close API-OPENAPI-ADMIN-SYNTHETIC-MATCH-IRT, PSYCHOMETRIC-JOURNEY, and SIMULATION-MATCH-READS rows; log 2026-05-30 clean-arch rebaseline job ids.

  1144. Strict admin API wire parsers for all JSON responses · cddd8de

    Extend parseAdminResponsesFromWire for recalc, synthetic, psychometric, journey-length, pair-explain, match diagnostics, simulation agents, and max-visible-profiles. Remove response casts from features/admin/api.ts; add AdminTargetUserIdRequiredError, vitest fixtures, and README boundary docs.

  1145. Typed admin recalculate-matches and tighten IRT/synthetic schemas · 5c26c7c

    Add oneOf single/batch recalculate responses, AdminRecalculateMatchesRequest, strict AdminMatchIrtStatusResponse, and AdminBulkRecalcSummary maps on synthetic generate. Regenerate product OpenAPI bundle and zod/web-client artifacts.

  1146. Typed admin profiles and connection-stage responses · 3d20220

    Add OpenAPI schemas for admin profiles CRUD, connection-stage, and biometric reset; DRY adminWireParse; fix connection-stage wire (no phantom success field).

  1147. Typed AdminStats for GET /api/admin/stats · 6c9c32f

    Replace loose additionalProperties response with AdminStats schema; parse at web boundary with generated Zod (no silent field mapping).

  1148. Mark chat-session push done; add admin OpenAPI backlog · 8dd5201

  1149. Typed PersistedChatSession for chat session CRUD · c130d85

    Replace loose session blobs with OpenAPI components and Zod validation at web and backend boundaries; add route test and contract-first invariants.

  1150. CI billing blocker note and OpenAPI chat-session schema follow-ups · 0917c93

    GHA skipped all jobs on 587de743 due to org billing; local backend vitest green.

  1151. Backend route mongo mocks, vitest serial pool, strict chat session messages · 587de74

    Route tests mock platform RBAC so internal auth does not open localhost Mongo; Vitest runs single-file to clear EnvironmentTeardownError; chat session wire requires a messages array instead of defaulting to [].

  1152. Defer UserBlockService Mongo until use; assert self-peer before block checks. · 459b0b8

    Discovery tests mock dismissals/profiles collection modules; align match bulk, pair-explain, and WebAuthn tests with ml_wave default and storage sanitize contract.

  1153. Track tenant manifest JSON and align backend chat test mocks · a4ce0ea

    GHA tenant list smoke failed because manifest.json and state/infra.json were gitignored. Backend vitest failed after messaging gates began calling getExistingConnectionStage: tests now use shared ConnectionService and Mongo stubs (blocks, dismissals, profiles). Config runtime test expects localhost domain from test env; admin bulk authUid prefix sim-gen.

  1154. Mark passkey OTP mock and verify-stack pipeline-root fixes done · 4a1b897

  1155. Resolve pipeline root in fleet verify-stack and UI tests · 5c5d9d7

    Tests used parents[3] as pipeline root; on GHA that is the application root and breaks application_root_from_pipeline_root. Use resolve_app_pipeline_root and hosting_dir_from_pipeline_root; add a fleet unit invariant. Mock InputOTP in passkeyLoginOption tests to avoid input-otp timers after jsdom teardown.

  1156. Remove wrong pipeline_root fixtures overriding conftest SSOT · f4b2824

    Module-level parents[3] fixtures pointed at the application root, breaking tenant_packages_dir_from_pipeline_root on GHA where source/ is not a sibling of the checkout parent. All fleet unit tests use conftest _PIPELINE_ROOT.

  1157. SSOT pipeline_root fixture for unit tests on CI · a97c309

    fleet/tests/unit conftest exposes canonical pipeline/ path; remove wrong parents[3] fixtures that break tenant_packages_dir resolution when the repo has no source/ sibling above the application root (GHA layout).

  1158. Compile discovery.scope.restoreLoadFailed into messages bundles · 3e1632e

    Shard keys must be built before CI messageKeysReferencedInSource runs.

  1159. Hygiene batch — wire parser, match-intent UX, fleet/pipeline tests · 4cf8684

    Fail-closed optional string fields on chat wire rows; surface match-intent restore failures via i18n toast. Fix merge_env(mode=) in tenant-live-health, stabilize ml-internal unit tests with monkeypatch, bind verify-live tests to pipeline/src, and add MATCH_SCORING_SOURCE to env schema for seeder parity.

  1160. Install operator requirements for Python CI pytest batch · b05ce4b

    Operator infra CLI tests import FastAPI TestClient; hosting-only deps were insufficient.

  1161. Anonymous topic modal distinguishes bank load failure · b3e5973

    Reuse useIcebreakerQuestionBank SSOT; show loadFailed + retry instead of empty-bank copy when GET /api/questions fails.

  1162. Fail-closed chat connection transport for unknown stages · a69ed19

    Explicit live-stage allowlist; wire typos and schema drift map to inaccessible instead of live messaging (messagingLifecycleGate parity).

  1163. ML pytest lab fixtures and KB p124 todo token · fa3fd61

    Materialize lab_ui_table_bands and minimal pipeline_artifacts on GHA from tracked config/pytest_lab; ignore testbench-only and rich TUI tests.

  1164. Arch audit rebaseline 30/18/17 and chat fallback backlog · a5bba5c

    Record clean-arch P0=0 audits and scoped anti-pattern findings for follow-up.

  1165. ML pytest policy SSOT, chat peer invariant, test corruption · 8506b04

    Root-cause CI failures: stage learning policy on GHA (prod_mongo), missing gitignored JSON fixtures, REPRO-PATHS app-pipeline typo, chat route normalizing before pair invariant, and a corrupted vitest import line.

  1166. ML pytest policy path and live-test ignores on GHA · a0d6186

    Set ML_SERVICE_LEARNING_POLICY to tracked stage JSON in conftest and CI env so scorecard parity loads at import. Add pytest.ini live-module ignores so jsdom runners skip rich/TUI suites reliably.

  1167. ML pytest green + universe DPR atomic CI fix · e640615

  1168. Stub device hints in universe DPR atomics for CI jsdom · acfbd13

    Vitest reports low hardwareConcurrency and triggered low-power DPR caps; mock desktop-tier hints so cap assertions match UNIVERSE_WEBGL_MAX_DPR SSOT.

  1169. Pytest green — mmr.nlp import SSOT and cohort feature version · 02271fe

    Route mmr.nlp package root through lab (NlpConfig/runner) while production submodules (errors, backends) alias src.mmr.nlp for identical exception types. Align offline learning loop NLP v2 with fit_for_wave cohort affect resolution; fallback outcome models use feature_names_for_version. Tests catch domain_errors and fix live scorecard agent email typo.

  1170. Web atomic green, BFF /uploads reject, admin route invariants · 7a88f91

    Align offline tests with backend admin route split, contract-first feature flags, i18n key SSOT, and post-0.1.909 BFF proxy rules. Refresh compliance ratchet baseline for fleet ML ops additions.

  1171. SBOM prune exported images only; ML CI offline pytest scope · c25aee5

    - Do not docker-rmi manifest images before their SBOM (simulation-worker fix) - Ignore test_live_* in ML pytest; track contracts scorecard fixture in git - Align adminApiDocsTabInvariant with PRODUCT_ADMIN_OPENAPI_SPEC_PATH SSOT - Arch audit rebaseline jobs 4cc4eb0d / 21ee1b25 / 42181ca5 (P0=0)

  1172. Prune peer images before each syft SBOM on Build once · 5ec193d

    GHA runners keep all built images until the SBOM step; syft still hit no space left on device for application-ml-service. Drop other manifest images before each scan, sort ml-service last, and clear stereoscope /tmp.

  1173. Free GHA disk after each syft SBOM export · 5c05b06

    Syft failed on application-ml-service with no space left on device when writing docker image tar. Prune each local image after a successful scan and surface syft stderr in BuildSbomError messages.

  1174. Restore web tsc inventory tests and ML pytest dev deps · 06c993a

    - Remove markdown corruption from universePrototypeDockI18nE2eInventory.test.ts - Add getOrbStateByPercentage SSOT; fix connection stage test fixtures - CI installs ml-service requirements-dev.txt (mongomock + httpx) - Syft SBOM export: drop --quiet so CI logs stderr on failure

  1175. Un-ignore web-client features/**/lib next to src/lib gitignore rule · 7fa270e

    Parent-directory exclusion from blanket lib/ blocked feature-owned helpers even with late negation rules; colocate exceptions with src/lib.

  1176. Track web-client feature lib helpers ignored by blanket lib/ rule · df313d0

    Move features/**/lib un-ignore next to src/lib exceptions and add eight error/journey/i18n/ui resolver modules so Docker Build once can resolve imports that passed locally but were never committed.

  1177. Track missing OpenAPI generated api model files · d6d4e2f

    Root cause: src/generated/** gitignore blocked new OpenAPI Generator model modules while models/index.ts re-exported them — local builds worked (files on disk) but GHA Docker build:direct failed with 55 module not found errors. Un-ignore generated api client paths and commit the missing model artifacts from contracts generate-all.

  1178. Mark CI web-lib gitignore fix todos done · 005aa1f

  1179. Track web-client src/lib sources omitted by gitignore · e68bd56

    Root cause: blanket lib/ ignore had app-source un-ignore rules only; source/20_web-client/src/lib/** (strictJsonObject, errors/core, navigation SSOT, etc.) existed locally but never reached GHA, breaking npm run build:direct in Docker. Mirror app-source exceptions and commit lib + tests/atomic/lib invariants.

  1180. Track prod learning policy and psychometric config JSON · 689df3e

    Root cause: blanket *.json gitignore hid files required by backend/ml-service Docker COPY steps, breaking GHA Build once. Add SSOT exceptions matching learning_policy.stage.json and commit both artifacts.

  1181. Mark audit evidence commit todo done · 357178a

  1182. Sync audit rebaseline 25 and stage semver evidence · 1e1e606

    Record P0=0 jobs ef7f4cab/c26655c8/bc909fea, refresh AGENTS.md stage table to web 0.1.1001 and API 0.1.188, and align project todos.

  1183. Mark architecture commit and stage deploy todos done · 2abc19b

  1184. Sync architecture audit evidence and project todos · e00ca37

    Record latest clean-arch rebaseline jobs and close commit-gate hygiene rows.

  1185. Arch hygiene, i18n shards, and production build fixes · 5b1208c

    Stop exporting server-only UnprefixedRouteShell from the app-shell barrel, localize discovery scope and profile culture copy, consolidate dev operator errors under devShell i18n, remove dead adminAuth, and fix TS/build blockers.

  1186. Auth request SSOT and fail-closed profile route guards · 41185a0

    Extract AuthenticatedRequest to lib/auth, route profile handlers through getAuthenticatedRequest, and add architecture invariants for clean-arch audit.

  1187. Mirror @config alias in vitest for SSOT threshold tests · 55e6fd2

    Vitest only resolved @/ while threshold loaders use @config/* from tsconfig; add the alias to both vitest configs, an invariant test, and the prod audit sweep.

  1188. Unblock clean-arch rebaseline at P0 zero · 86bbc0a

    Document dependency_graph_analyser at /home/doc1024/Documents/tools/… in core-agent rules; remove JSDoc import() links that caused phantom P0 edges. Re-audit job f4b90c1e confirms error_violations 0 (was 116 pre-epic).

  1189. Enable prod learning and ML wave env keys for ifeoma-tc · 3ba7ef6

    Add learning scorecard ingress, outbox polling, and local NLP backend settings to prod tenant env so ML wave scoring aligns with stage policy.

  1190. Record clean-arch audit runbook and close WEB-ARCH todos · 5c8d55c

    Document dependency_graph_analyser path, navigation index entry, rebaseline metrics (P0 116→2), and mark WEB-ARCH epic items done in project todos.

  1191. Clean architecture layer boundary sweep · e28c454

    Split design-system presentation from features wiring: AppNav, match-card, journey chrome, i18n shell, errors, auth guards, and UI chrome resolvers. Remove nextjs-api shim, move Match type to features/discovery, add layer invariant tests, waitlist landing client, and contract-first HTTP gates.

  1192. Add diagnostics CLI commands for fleet invoke · 63bfd2f

    Register workstation diagnostics helpers and fleet subprocess wrapper with CLI docs and tests so operators can run targeted health checks without chaining legacy fleet CLIs ad hoc.

  1193. Add mobile app waitlist public API · 27a96cc

    OpenAPI POST /api/public/mobile-app-waitlist with generated web client, Zod schemas, and BFF public-route proxy exclusion so the Next.js handler receives traffic instead of Fastify upstream.

  1194. Centralize product threshold JSON SSOT · 0e93a15

    Move match, connection-ring, admin, and journey maturity thresholds to source/config with web-client mirrors and a Docker sync script so runtime and vitest SSOT tests read the same files.

  1195. Remove deprecated matchScoreBandLocaleKey · 2270851

    Unused after formatMatchScoreBandRangeLabel SSOT labels; closes CL-HYGIENE-003.

  1196. Close continuous-learning prod audit v3.5 · 8995927

    Centralize threshold and scorecard-label SSOT in config JSON with parity CLIs and vitest/pytest guards; migrate ML routes to mmr adapters with a single routes/dependencies seam and thin jobs shims; remove IRT paths and silent fallbacks; rebuild i18n for dynamic maturity/learning band placeholders.

  1197. Sync project todos, AGENTS stage table, E2E merged-env notes · 30e96d7

    Record Qwen/match-fit/openers/admin QA completion rows, stage deploy verify todos, and E2E helper documentation for locale shards and health gates.

  1198. Prototype dock operator locale i18n build scripts · d5c1635

    Add scripts to build and apply final prototype-dock operator locale strings for universe scene debug chrome.

  1199. E2E and vitest for match-fit, openers, admin QA · 409dcc8

    Add Playwright specs and route stubs for match-fit peer sheet, connection openers DE language note, admin journey-length narrative, and outcome-by-band viewports. Locale shard helpers, health version gates, and invariant tests.

  1200. Match-fit, openers, admin QA, server-prose language chips · 8eaa035

    Ship discovery match-fit narrative, connection openers, profile NLP affect, admin psychometric/journey-length/outcome panels, and shared ServerGeneratedProseLanguageNote. Contract-first generated clients, typed connections API validation, admin confirm-modal SSOT, universe empty-pool i18n, and web 0.1.999.

  1201. Match ML ops CLI, tenant gather NLP, contract models · d960ad7

    Add fleet commands for match-item-stats and admin outcome-by-band probes; refresh generated contract models; extend operator tenant-deployment gather and CLI HTTP helpers for steered deploy workflows.

  1202. NLP secrets, ml-service health probe, stage env · 0480160

    Extend merge-env and tenant API for NLP backend settings, bake ml-service NLP deps in compose, and refresh ifeoma-tc stage/deploy env templates for Qwen.

  1203. Match-fit, openers, admin QA, E2E ml_wave materialization · c37a182

    Wire discovery match-fit narrative, connection openers, icebreaker recommendations, profile NLP affect, and admin psychometric/journey-length routes. Add grounded fact bundle SSOT, Qwen client integration, ml_wave E2E discovery peer seeding, and match recalculation scheduler guards (API 0.1.187).

  1204. Qwen grounded generation, NLP jobs, learning audits · 7782ce1

    Add on-prem Qwen routes and jobs for match-fit narrative, question-bank QA, reflection enrich, and connection openers. Ship learning scorecard ingress, label audits, cohort weight tests, and NLP env contract updates (0.1.6).

  1205. Regenerate web-client and fleet API clients · e091c23

    Refresh generated TypeScript and Python models after OpenAPI additions for match-fit, openers, admin QA, profile NLP affect, and ml-service Qwen routes.

  1206. Qwen surfaces, match-fit, openers, admin QA routes · a59b6a6

    Add product OpenAPI paths and schemas for match-fit narrative, connection openers, icebreaker recommendations, profile NLP affect, admin psychometric audit, journey-length recommendation, and match outcome by band. Extend ml-service and tenant API contracts for grounded generation and NLP settings.

  1207. Restore structural label fix row · 12df5c7

  1208. Bank audit DONE, rename outcome label diversity todo · c229bde

  1209. NLP backend blank settings defer to env (0.1.17) · 9f43918

    Empty Settings.nlp_backend no longer blocks NLP_BACKEND merge-env. Profile NLP route maps NlpError to HTTP 503 with explicit detail.

  1210. Tenant-audit-profile-bank-alignment + gate plane C trace (0.1.16) · a5470bc

    Ship audit script in ML image; Fleet SSH docker exec for legacy bank drift. Learning gate logs plane C skew/kurtosis for operator grep.

  1211. Sync cohort deploy and plane C partial status · 612331c

  1212. Mark ML wave stage gate pass and cohort deploy DONE · eb7adfe

    Stage wave 0 commitApplied true on AI 0.1.15; plane C y=0 diversity remains partial.

  1213. PsychometricRegistry.questions is a list; build_item_surfaces_for_wave incorrectly called .values() causing wave 500 after gate pass on mongo bank. · 84c6784

  1214. Bootstrap 03_weights for wave commit (0.1.14) · ce6ac27

    Stage wave run-once returned HTTP 500 when gate passed but calibration-artifacts lacked 03_weights.json. Bootstrap uniform baseline under bootstrap_mode and map LearningExportError to HTTP 200.

  1215. Add grep-friendly cohort overlap traces and a Mongo bank-alignment audit CLI for legacy profile journey key drift. · e7f058f

    Add grep-friendly cohort overlap traces and a Mongo bank-alignment audit CLI for legacy profile journey key drift. Fix label_all_pairs to resolve agents by subject_id (authUid) instead of email-only lookup. Untrack lab learning.db.

  1216. Phase 1 prod wave, mongo psychometric bank, NLP boundary · d67abfb

    Port continuous-learning core to src/mmr (wave runner, cohort, egress, NLP affect), load psychometric registry from Mongo on stage, fix prod NLP to use src/mmr/nlp/models (not lab/), pass ML/NLP env through compose, and align tenant stage mode_overrides. ML service 0.1.11; tests include import boundary and OpenAPI route SSOT.

  1217. Align ifeoma-tc stage env ML service version to 0.1.6 · ce1b3e9

    Refresh PACKAGE_INDEX and stage/deploy env pins after ML service semver bump.

  1218. Update master-plan and module todos for peer lifecycle, admin Q&A, and mailbox gate workstreams. · cef5ee6

    Update master-plan and module todos for peer lifecycle, admin Q&A, and mailbox gate workstreams. Extend CI workflow coverage and document admin answers import versioning.

  1219. Contract-first APIs, chat peer lifecycle, admin question bank, mailbox gate · 575ad4b

    Migrate remaining product HTTP to generated clients; add inactive-chat inbox filtering, acknowledge-unavailable-peer UX, admin Q&A export/import UI, and strict preferences parsing. Fail closed when session and profile lack a mailbox (app shell gate, onboarding read-only email, settings without no-email fallback). Bump web client to 0.1.969 with i18n and tests.

  1220. Peer lifecycle dismissals, admin Q&A export/import, preferences strict blob · a3ff718

    Implement acknowledge-unavailable-peer with viewer_peer_dismissals, filter dismissed peers from connections and discovery lists, admin answers export/import routes, and UserPreferencesBlob validation on preferences. Add mongo integration tests and chat session peer profile policy. Bump API package to 0.1.175.

  1221. Extend product API for peer lifecycle, preferences, and admin Q&A · 791d70f

    Add OpenAPI paths and schemas for acknowledge-unavailable-peer, user preferences blob, admin question answers export/import, and stricter question/connection-statement models. Regenerate web, zod, and fleet contract models from the updated product spec.

  1222. Record ProfileDeleteResponse and landing trust todo evidence · 5da98e4

    Mark contract and landing-trust slices done; clarify full-deletion scope backlog.

  1223. Regenerate release-notes after ProfileDeleteResponse and landing trust commits. · 2beef78

  1224. Guard landing trust strip against data-export copy · f2f1c10

    Assert dataSelfService uses delete iconography and docs omit export claims.

  1225. Align profile settings README with delete-only data UX · a61b8e8

    Remove export-account references; document DELETE /api/profile and sign-out after self-service deletion.

  1226. Validate ProfileDeleteResponse at parser boundary · be7b36d

    Require profilePictureCleared and journeyReflectionCleared on DELETE /api/profile and expose the typed result from deleteProfileAccount.

  1227. Regenerate clients for ProfileDeleteResponse fields · 9673583

    Refresh OpenAPI types, profile API stubs, and Zod bundles after extending the profile delete response with picture and journey reflection flags.

  1228. Extend ProfileDeleteResponse with deletion scope fields · 0a70ffa

    Document profilePictureCleared and journeyReflectionCleared on self-service DELETE /api/profile, including what is and is not hard-deleted today.

  1229. Landing trust badges reflect delete-only data controls. · 068a1a3

    Removes export copy from the trust strip, uses a delete-account icon, and refreshes landing locale shards plus compiled message bundles.

  1230. Document ProfileDeleteResponse on DELETE /api/profile. · 8273417

    Adds the OpenAPI schema and route response for self-service account deletion so codegen and client parsers share one contract-first delete envelope.

  1231. Records completed chat lifecycle, contract-first HTTP, i18n CSV hardening, account-deletion orchestration, and stage E2E verification rows. · de32b99

  1232. Regenerates messages/*.json and release-notes evidence after profile-delete, chat contract-first, and i18n shard updates in this batch. · b170687

  1233. E2E journey welcome gate and chat viewport shell specs. · abaaeb8

    Dismisses journey-intro before polling hub progress URLs and adds Playwright viewport coverage for lifecycle-ack and unknown-peer chat routes.

  1234. Harden i18n CSV tooling with shared SSOT helpers. · 40021a5

    Centralizes shard listing, leaf flattening, and cell codec across export/import scripts; rejects CSV path conflicts and missing locale cells; removes dead chat.system.profileNotAvailable keys from locale shards.

  1235. Contract-first chat messages, media upload, and transcript export. · bbd0b10

    Routes chat HTTP through generated api.chat clients with strict response parsers and shared error mapping so features/chat no longer uses ad-hoc fetch or raw JSON casts.

  1236. Chat peer lifecycle ack dialog and strict chats-route transport. · b05ea41

    Ports lifecycle-ack test ids onto BaseModal, decouples thread render phases from connection-stage gates, and resolves embedded chat routes through strict peer transport validation with general peer-unavailable copy.

  1237. Contract-first profile delete and honest settings UX. · 0490bb6

    Uses generated deleteProfileAccount with parseProfileDeleteResponse, signs the user out after a successful delete, and localizes updated delete-modal copy across all base locale profile shards.

  1238. Orchestrate self-service account deletion side effects. · fd491c1

    Adds AccountDeletionService to purge profile media, journey reflection, and connection rows; wires DELETE /api/profile to structured success logging and extends contract tests for the delete response envelope.

  1239. Regenerate product API clients across modules. · e68ecc1

    Keeps fleet, tenant, pipeline, and ML service generated models aligned with the current OpenAPI contract surface; refreshes tracked web Zod schema index.

  1240. Mark chat lifecycle hardening todos done at web 0.1.929 · 9427ea0

  1241. Fail-closed connection validation and profile delete contract · 0e83bbe

    Remove English getConnectionActionLabel shim, add canBlock SSOT, align DELETE /api/profile OpenAPI with connectionsEnded, and wire resolvePeerTransportId in ChatView.

  1242. Record chat peer lifecycle completion and repo semver 0.1.928 · 7f1e022

    Update master plan, AGENTS semver table, and project todo rollups for the lifecycle slice.

  1243. Regenerate product API clients and profile delete route · e97ae93

    Refresh OpenAPI-derived web/backend artifacts for self-service profile delete and admin API docs surfaces.

  1244. Chat peer lifecycle UX with general unavailable copy · 950e876

    Decouple viewer vs peer thread gates, add lifecycle acknowledgement, inbox stub labels, and i18n for quiet peer-unavailable messaging across five locales.

  1245. Chat peer lifecycle gates and profile-delete cascade · 1e97251

    Centralize peer profile checks and read-only transcript policy on chat paths, terminate connections when a profile is deleted, and document viewer-only block semantics.

  1246. Extract admin maturity bands · 2ba5aea

    Move platform maturity thresholds into a named helper so analytics buckets and averages do not depend on inline coercion.

  1247. Capture product readiness gate layers · e5138de

    Document the separate onboarding, journey, signal, discovery, and chat gates so future cleanup does not collapse unlike completeness metrics.

  1248. Record admin cleanup follow-up evidence · 22f81ee

    Update product todos and stage notes with completed verification rows plus remaining deploy/report work.

  1249. Bump product versions · 21e1710

    Refresh deployable semvers and release notes after the admin cleanup and UI consistency work.

  1250. Cover admin journey and locale invariants · d0ccfe8

    Lock admin analytics to capped Match targets and add regression coverage for locale-aware links, timestamps, percent display, and quadrant labels.

  1251. Localize dynamic admin and profile UI · 7d44a9d

    Move hardcoded profile/admin presentation through locale-aware helpers so operators and profile surfaces do not render English-only fallbacks or browser-default dates.

  1252. Drop legacy discovery English fallbacks · 8996439

    Let missing legacy list bio and location remain absent so display components, not transformers, own user-facing fallback copy.

  1253. Share discovery intent score reader · 5b1f792

    Consolidate viewer and peer intent score branching so both readers derive from the same enriched-or-scoped path.

  1254. Centralize journey readiness targets · b6f8907

    Route journey completion checks through the target SSOT so hub, You, analytics, and route phase logic cannot drift from Match readiness.

  1255. Delete selected profiles from table · 9445aeb

    Replace the one-off no-email cleanup with table filters, sorting, and explicit selected-profile deletion so admin cleanup is inspectable before destructive action.

  1256. Add WEB-I18N-BASELINE-ZERO todos and refresh score SSOT evidence · d68483c

    Roll up the remaining i18n scanner baseline cleanup across master-plan and module todo indexes, and document the stricter discovery score SSOT audit (8 tests).

  1257. Audit discovery match score math stays in score model · 7bd0f9c

    Extend SSOT audit to forbid computeDiscoverySessionMatchScores and sessionMatchScore calls outside the canonical discovery score modules.

  1258. Mark P133-MERGE-PR done after p124-repo-layout merge to main · 05d6c58

  1259. Sync generated schemas and P133 merge-pr todo note · 17b59e0

    Regenerated contract models and web zod schemas; update pipeline todo for PR #4 CI status after hosting/python-ci fixes on p124-repo-layout.

  1260. Defer VMCreator until after network preflight · a129c09

    Unit tests for create_vm policy and network discovery must not require virt-install on CI runners; only disk/image provisioning needs it.

  1261. Hosting VM guard before virt-install; align chat media wire test · ac68e17

    Check existing VM policy before VMCreator init so unit tests pass without virt-install on GHA. Install hosting requirements in python-ci job. Expect API media URLs from mediaId in wire parity test.

  1262. Install operator hosting requirements in GHA python-ci (paramiko for edge TLS unit tests). · d93d783

    Install operator hosting requirements in GHA python-ci (paramiko for edge TLS unit tests). Align chat media wire test with API URL derivation; mock UserBlockService in POST messages gate test so offline route tests avoid Mongo.

  1263. Add dnspython to fleet requirements for DNS unit tests · f74abce

    GHA python-ci fleet batch imports fleet_manager._dns; dnspython was only listed under operator hosting, not fleet/requirements.txt.

  1264. Add pytest-order for hosting pytest.ini addopts · c1d2cac

    Fleet batch runs operator hosting tests with --order-scope=module; install pytest-order alongside httpx in fleet/requirements.txt.

  1265. Add pytest-order for hosting pytest.ini addopts · 7a110ab

    Fleet batch runs operator hosting tests with --order-scope=module; install pytest-order alongside httpx in fleet/requirements.txt.

  1266. Install httpx for pipeline sidecar client tests · c796139

    Fleet CI batch imports deployment orchestration tests that use httpx-backed sidecar clients; declare httpx in fleet/requirements.txt with operator parity.

  1267. Install httpx for pipeline sidecar client tests · 9ef4422

    Fleet CI batch imports deployment orchestration tests that use httpx-backed sidecar clients; declare httpx in fleet/requirements.txt with operator parity.

  1268. Defer PatReadResult annotations in deployment contracts · 1a5641a

    Add future annotations so classmethod return types resolve during module load (fixes Python CI collection on deployment whitelist tests).

  1269. Defer PatReadResult annotations in deployment contracts · 4a66f5b

    Add future annotations so classmethod return types resolve during module load (fixes Python CI collection on deployment whitelist tests).

  1270. Restore P133 PR gates (KB link, PyYAML, match-gate parity) · af03efe

    Track pipeline/build/README-BUILD-DIGEST-PROMOTION.md for KB link checks; install PyYAML in manifest post-build CI job; add source/tools parity script after app-source → source layout.

  1271. Restore P133 PR gates (KB link, PyYAML, match-gate parity) · 9c30325

    Track pipeline/build/README-BUILD-DIGEST-PROMOTION.md for KB link checks; install PyYAML in manifest post-build CI job; add source/tools parity script after app-source → source layout.

  1272. Skip PR build-once when diff has no catalog components · 398c482

    Doc-only or layout-only PRs no longer fail the affected-components step; downstream SBOM/cosign/upload and deploy-consume skip when compose is skipped.

  1273. Skip PR build-once when diff has no catalog components · 67052fc

    Doc-only or layout-only PRs no longer fail the affected-components step; downstream SBOM/cosign/upload and deploy-consume skip when compose is skipped.

  1274. Exclude root .gitignore from P124 path gate · a61df76

  1275. Track manifest fixtures and install pytest in post-build job · 9260cf2

    Un-ignore pipeline/common/tests/fixtures/*.json so GHA offline manifest gates can read promotion fixtures. Add pytest + fleet PYTHONPATH to the build-manifest-post-verify workflow job.

  1276. Mark B52-CI-GHA-COMPOSE done · c9da0f1

  1277. Mark B52-CI-GHA-COMPOSE done after green build-once · b143c9a

  1278. Default build CLI invocation_id for build-once GHA · 30d4631

    Build manifests require invocation_id; ci_build_once invokes build/cli.py without fleet. Generate a UUID v4 per CLI run when --invocation-id is omitted.

  1279. Default build CLI invocation_id for build-once GHA · 3d6e146

    Build manifests require invocation_id; ci_build_once invokes build/cli.py without fleet. Generate a UUID v4 per CLI run when --invocation-id is omitted.

  1280. Narrow P124 path gate and refresh tenant path strings · e7dcf64

    Gate only flags app-pipeline/ layout paths and pipeline/tenant/ (not every "tenant" token). Update KB, tests, and tracked env paths for post-layout tree.

  1281. Narrow P124 path gate and refresh tenant path strings · 88ab4f8

    Gate only flags app-pipeline/ layout paths and pipeline/tenant/ (not every "tenant" token). Update KB, tests, and tracked env paths for post-layout tree.

  1282. Track src/lib/api/version.json for Docker builds · 23970f8

    The API semantic version module imports version.json; the global *.json ignore rule kept it out of git so CI build:direct type-check failed.

  1283. Track src/lib/api/version.json for Docker builds · 5e23f0a

    The API semantic version module imports version.json; the global *.json ignore rule kept it out of git so CI build:direct type-check failed.

  1284. Restore consumer map links and fleet bootstrap in manifest scripts · 6837d43

    Add contracts/consumers/README.md, point KB links at operator-control-plane.mdc and Operator hosting paths, and call ensure_fleet_sys_path from repo-root manifest verify scripts so GHA post-build gates load common.vm_states.

  1285. Restore consumer map links and fleet bootstrap in manifest scripts · 75d0387

    Add contracts/consumers/README.md, point KB links at operator-control-plane.mdc and Operator hosting paths, and call ensure_fleet_sys_path from repo-root manifest verify scripts so GHA post-build gates load common.vm_states.

  1286. Whitelist web-client scripts/lib and features/*/lib · 2f9bf31

  1287. Add releaseNotesCliExit for prebuild scripts in CI · 9957b59

    Docker build:direct type-checks scripts/; releaseNotesCliExit was missing from the repo (ignored lib/ path). Provide fatal stderr helpers used by generate-release-notes and verify-release-notes-bundle-semvers.

  1288. Add releaseNotesCliExit for prebuild scripts in CI · b9b8f8e

    Docker build:direct type-checks scripts/; releaseNotesCliExit was missing from the repo (ignored lib/ path). Provide fatal stderr helpers used by generate-release-notes and verify-release-notes-bundle-semvers.

  1289. Commit landing scroll hooks and journey seed JSON for CI · 79270c4

    Restore missing landingScrollPerformance module referenced by landing UI, whitelist lib/data/seeds JSON from the global *.json ignore, and track default question/statement banks required by build:direct in Docker.

  1290. Commit landing scroll hooks and journey seed JSON for CI · 80406c6

    Restore missing landingScrollPerformance module referenced by landing UI, whitelist lib/data/seeds JSON from the global *.json ignore, and track default question/statement banks required by build:direct in Docker.

  1291. Compliance ratchet bootstrap and operator fleet status path · 444463e

    Bootstrap fleet/src before check_compliance imports common; refresh compliance baseline after layout-era drift. Restore GET /fleet/tenants/{tenantId}/status in operator-gateway fleet paths source. Harden compose-build test subprocess mocks with stderr fields.

  1292. Track ISO geography JSON for Docker/CI builds · cb92902

    The backend imports iso3166Alpha2Codes.v1.json at compile time; it was ignored by the global *.json rule so GHA build-once backend images failed with TS2307. Whitelist the file like cultureTaxonomyV1.json.

  1293. Surface compose build errors and inject CI compile-time env · f0697e4

    Log redacted docker compose stderr on failure, pass --ci-public-site-url from ci_build_once for allowlisted NEXT_PUBLIC_* / Server Actions keys, and add ci_build_time_env helper for GHA build-once web-client builds.

  1294. Bootstrap fleet common merge for build-once GHA job · 897f547

    Load pipeline_paths via importlib before common package init, set job PYTHONPATH to fleet/src, and pass fleet_operator_pythonpath_entries to build subprocesses so ci_build_once resolves common.vm_states on runners.

  1295. Repair build-once workflow YAML and cosign step guards · b186c3e

    Indent embedded Python in the PR affected-components step so GitHub accepts the workflow file; map cosign secrets to job env for valid step-level if conditions. Add contract test that the workflow parses.

  1296. Record full-product-workflow GHA E2E pass · 775c0d7

  1297. Inject infra into build_pipeline_build_context callers · 4bca282

    Pass tenant infra snapshot from Operator bridge and fleet tests instead of reading tenant.get_infra() inside pipeline build (module-boundaries).

  1298. Restore valid OpenAPI fragment after control-plane commit corruption. · 7afa48b

    Align compliance script bootstrap with fleet_operator_pythonpath_entries.

  1299. Close ADMIN-MATCH-PAIR-EXPLAIN with Playwright CI evidence · 1743205

  1300. Preflight skip for authenticated E2E workflows when E2E_MERGED_ENV unset · 3fdde88

    Align chat icebreaker and full-product-workflow GHA with admin match diagnostics (notice + skip). Add ubuntu24.04 Playwright override. Close admin match E2E todo row and refresh master-plan reconciliation.

  1301. Admin match E2E green on stage and CI; fix pipeline pytest imports · 04ecd1b

    Record Playwright admin-match-diagnostics 2 passed (stage + GHA run 26378285439). Pipeline tests import infrastructure.infra_ops via ensure_fleet_sys_path; add pipeline_control_src fixture for src namespace isolation.

  1302. Green admin match diagnostics on stage via email-token login · 4bd629c

    When E2E_ZITADEL_SKIP_MANAGEMENT_PROVISION=1, sign in with NextAuth email-token only (no flaky Zitadel signedin loop). Navigate admin shell then user-profiles section. Verified: explain panel and compare matrix passed against stage (ifeoma-tc).

  1303. Harden admin Zitadel login and document E2E_MERGED_ENV secret · 0a72a51

    Fix pipeline traefik tests to import infrastructure.infra_ops via ensure_fleet_sys_path. Admin session helper handles Zitadel signedin interstitial and email-token fallback; add GitHub secret setup doc. Extend admin route diagnostics vitest coverage.

  1304. Align build context and tests with tenant.get_infra() registry · 8b2683b

    Use resolve_infra_registry_url on tenant infra snapshot; mark control-plane smoke tests integration; tighten deployment architecture pytest. Refresh operator-control-plane KB for HTTP-only steered deploy CLI.

  1305. Note build:direct i18n compose and GHA admin E2E skip · 350b398

    Docker image build uses build:direct (shard messages + SW + next build). Document that admin match diagnostics workflow_dispatch skips Playwright when E2E_MERGED_ENV is not configured.

  1306. InfraOrchestrationHost SSOT for deploy and reachability · fcf11e3

    Introduce pipeline deployment.infra_orchestration_host and operator infrastructure_control host/composed_behaviors so deploy gates, whitelist policy, and verification resolve infra through one protocol instead of FleetManager type hints. Extend operator gateway contracts, steered-deploy UI invariants, and fleet/operator pytest coverage for host resolution.

  1307. Skip admin match diagnostics E2E when E2E_MERGED_ENV is unset · 5c0e866

    Add a preflight job so workflow_dispatch no longer fails on repos without the merged tenant secret; emit a notice with setup instructions instead.

  1308. Extract e2eSeedConversationRequest helper; repeat seed when pair is already conversation_active returns 200 without 500. · 3cda08e

    Extract e2eSeedConversationRequest helper; repeat seed when pair is already conversation_active returns 200 without 500. Admin profile search utils aligned.

  1309. Record product push and post-push stage rebuild · bbd1be7

    Eleven commits on main deployed via rebuild-app; stage semver unchanged at web 0.1.913 / API 0.1.165 / AI 0.1.6; chat media 401/404 smoke OK.

  1310. Refresh stage reconciliation to web 0.1.913 · 94d0de6

    Align reconciliation table with AGENTS.md live semver after admin match and weight-pipeline deploy loop.

  1311. Stop proxying public /uploads; map wire mediaUrl to participant read path. · b2ed317

    BFF and proxy matcher tests lock routing behaviour.

  1312. Participant-only GET /api/chat/media/:mediaId · 96e929b

    Authorize thread participants before streaming GridFS bytes; mediaUrl points at /api/chat/media/{id}. Remove public registerUploadsStatic plugin.

  1313. Chat media read route and mediaUrl contract · 3af70e4

    GET /api/chat/media/{mediaId} plus UploadMediaResponse.mediaUrl as participant-authenticated path (not public /uploads).

  1314. Localize profile last-active labels via profileEnrichment · ccd26cf

    Replace hard-coded activity strings with profileLastActiveLabel + i18n shards; ProfileCard surfaces pass translate into enrichProfile.

  1315. Single SSOT for discovery match percent display · c7d3d13

    Centralize display scores in getDiscoveryMatchScore / deriveDiscoveryProfileScoreModel; resolveMatchPercent returns null without silent zero; list, universe, chat, and connection surfaces share enrichment. Vitest SSOT audit and parity tests.

  1316. Admin match diagnostics Playwright and stage evidence · dc61521

    workflow_dispatch CI, npm test:e2e:ui:admin-match-* scripts, runbook links, and AGENTS.md stage 0.1.913 / API 0.1.165 / AI 0.1.6 verification rows.

  1317. Admin pair-explain panel and compare matrix UI · 8e498fd

    User Profiles: explain pair, 2–3 profile compare matrix, journey 15/5 targets, materialized-score SSOT for operator diagnostics. i18n admin.matchExplain/* and admin.matchCompare/*; build:direct runs i18n:messages:build (0.1.913).

  1318. Admin pair-explain API and match weight floor · b06f168

    MatchPairExplainService exposes bidirectional operator diagnostics; discovery list shares discoveryPeerInclusionEvaluator. loadMatchItemWeights applies floor when stats exist but weight is null (0.1.165).

  1319. Materialize match item weights for degenerate histograms · 37e28fa

    Resolve matchingDimension from the questions bank when answers omit it, use a present-answer bucket for item-stats, and apply entropy floor 0.15 for single-bucket items so backend recalc can load weights (0.1.6).

  1320. Add admin match pair-explain OpenAPI and codegen · 05a2016

    Operator diagnostics for bidirectional match rows, journey gates, discovery exclusion reasons, and ML weight context. Regenerates product zod and web-client types.

  1321. Refresh stage order consistency doc references · 1073f06

  1322. Stage web 0.1.908 and API 0.1.160 voice upload evidence · 740693e

  1323. Deployment DTO boundaries, chat uploads proxy, semver bump · 00e6d77

    Align module boundary checks and deployment contracts with P133 schema batch; centralize infra registry URL resolution; extend tenant-deployment runner tests. Serve chat media via backend static /uploads plugin and BFF proxy routes. Bump web 0.1.907 and API 0.1.158; refresh generated contract models and todo evidence.

  1324. P133-CI-SCHEMA partial progress on schema batch · a3e7c12

    Record schema workflow steps 1–6 green; module-boundaries step 8 blocked by three pre-existing deployment/fleet import violations.

  1325. List only tenants with initialized infra mode · 028ab9c

    Exclude manifest-only lab directories from GET /v1/tenants so partial packages do not 500 the control API. Schema batch module-boundaries step now includes fleet PYTHONPATH for common.vm_states.

  1326. Record duplication refactor plan closure · 1cfd437

    Mirror DUPLICATION-REFACTOR-B7F5 as done on master plan and pipeline todo rollup.

  1327. Align inbox and adapter tests with duplication SSOT · c58a37e

    Update transformToMatch and chats inbox tests for chat_active name policy and enriched display scores; preserve authUid in discoveryProfileAdapter; fix useDiscoveryProfilesForMatch sort invariant source check.

  1328. Unify chat wire, media semantics, and contract parity · 31c5807

    Emit full ChatMessageWire including icebreaker fields; centralize media kind resolution for send, push, and export; align matchScope on discovery vs connections; use ListConnectionsQuery Zod at runtime and ProfilePublic builder for picture routes; add generated schema and route parity tests.

  1329. Dedupe profile, score, ring, and name policies · a0bbe95

    Add shared pairwise dimensions, connection ring, peer name disclosure, discovery wire parser, match percent helper, and chat profile stub factory. Wire inbox and connection detail through connection-first discovery resolvers; fence legacy ListView mapper; align score APIs with enriched reads; update SSOT invariants.

  1330. Single-source deploy gates and preflight policies · 7c99112

    Extract deployment gate, whitelist CIDR, DNS/mail, and infra health policies so steered Operator workflows run the same multi-target gates as in-process deploy. Fence Pipeline re-gather behind explicit debug options, block direct Pipeline production bypass without runtimeContext, and add parity tests for gather fencing, job federation, legacy delegates, and sidecar clients.

  1331. Refresh project todo rollups · dab026d

    Update the workspace plan and pipeline todo rollups so committed work reflects the latest control-plane and product status.

  1332. Version matching intelligence materials · e89e00a

    Replace draft matching intelligence docs with versioned overview, peer, press, and whitepaper materials for clearer ML-service publishing.

  1333. Add deploy preflight remediation · ced8658

    Wire manifest deploy preflight and admin whitelist remediation through Operator workflows so deployment gathers fail clearly before Pipeline execution.

  1334. Remove execute workflow route · f67d747

    Drop the legacy Fleet execute route and refresh Fleet contract/client surfaces so status and proxy behavior move through explicit supported routes.

  1335. Expose infrastructure control facets · 07b6c09

    Add contract-backed gateway routes and UI types for infrastructure control so the operator surface owns these workflows through explicit API facets.

  1336. Relocate infrastructure test suite · aa084d3

    Move infrastructure-heavy operator tests under the z_infrastructure package so the default test layout can separate focused gateway checks from long-running infra coverage.

  1337. Add media wire message contract · cb944ca

    Promote chat media payloads into the product contract so backend and web clients share the same generated message wire shape.

  1338. Unify profile sheet score source · c96dd9b

    Move chat and match profile-sheet data onto a discovery-owned resolver and score model so the same peer uses one enriched DiscoveryProfile across surfaces.

  1339. Unify chat peer profile resolution with discovery sources · 53a8730

    Resolve inbox and thread peer labels from discovery profile data, remove the unused consent hook, and add atomic/E2E coverage for profile-source parity.

  1340. Explicit-context deploy preflights and snapshot rollback (P1) · 90edcbd

    Gather tenant infra/targets/domains from Tenant API into deployContext, extract preflight and snapshot logic into deploy_preflights, and skip manager-bound snapshots on the Pipeline-exclusive deploy path.

  1341. Drop Fleet live-health proxy and refresh migration docs · 4c8f5e4

    Remove the gateway proxy for Fleet live-health-runs, regenerate Operator web types/mocks, and update migration runbooks to point at Operator-native workflows.

  1342. Remove remaining transitional workflow routes (P6) · 74a9311

    Drop live-health-runs and transitional route helpers from Fleet so workflow orchestration stays on Operator/Pipeline. Update Fleet OpenAPI, route catalog, and async-route tests to assert the removed surface returns 404.

  1343. Add matching intelligence overview materials · bc28e6c

    Add audience-facing ML and matching overview docs to explain the matching intelligence service and related launch narratives.

  1344. Run post deploy health in full deploy worker · afe3196

    Run explicit-target post-deploy health checks from Pipeline fullDeploy so deploy verification starts moving out of the legacy manager deploy spine.

  1345. Own app infra dispatch helper · 25a7063

    Move the generic app-infra lifecycle dispatch body into Operator infrastructure control so Fleet's facet delegates through the owning layer.

  1346. Remove direct infra sidecar route · 1270dcf

    Shrink Fleet's HTTP contract by dropping the app-infra action endpoint and keeping Operator's infrastructure route as the compatibility entrypoint.

  1347. Move reachability checks to verification · 638197c

    Make Operator verification the implementation home for reachability and stage checks while leaving manager compatibility wrappers for transitional callers.

  1348. Add Operator infrastructure OpenAPI surface · 2084e5e

    Bundle POST /v1/infrastructure/tenants/{tenantId}/infra/{action}, mark legacy fleet infra proxy deprecated, and regenerate operator web API types.

  1349. Add infrastructure control package and native infra routes · c169dd7

    Introduce operator/src/infrastructure_control for app-infra lifecycle dispatch, POST /v1/infrastructure/tenants/{tenantId}/infra/{action}, and manifest-deploy infra preflight in tenant-deployment workflows. Deprecate fleet infra proxy path.

  1350. Reconcile todos, KB, and rules for manager and infra extraction · 60ff058

    Update master plan, module boundaries, fleet-cli KB, and operator todos after splitting fleet manager control into operator-owned packages.

  1351. Embed discovery profile filters in match intent scope picker · a8835aa

    Bridge list/universe filter chips into the scope picker modal, normalize viewer residence country codes, and add atomic plus Playwright viewport coverage.

  1352. Refresh generated clients and route catalogs · 4dc847b

    Regenerate sidecar contract models and update fleet/pipeline route catalogs after control-plane API surface changes.

  1353. Fix imports after manager relocation and infra extraction · db5842d

    Update integration and VM/traefik tests to use operator infrastructure paths and manager.* orchestration modules.

  1354. Update unit and batch tests for manager and import paths · a3ec557

    Refresh fleet test imports for operator/src/manager and fleet_manager, keep reconcile multi-target coverage in fleet, and add workflow CLI redirect guards.

  1355. Update CLI, server, and runners for manager split · 74e1f1a

    Redirect workflow commands to Operator/Pipeline successors, fix import paths to manager.* and fleet_manager, and refresh fleet docs for the new layout.

  1356. Wire deploy orchestration and tenant deployment runner · 857c6e0

    Port deploy helpers to deploy_orchestration, extend tenant deployment context and runner intents, and align preflight/import paths with the manager split.

  1357. Migrate fleet infra unit tests and add infrastructure harness · e2217eb

    Add operator/tests/infrastructure conftest and fleet fixtures, move VM/provision/infra unit coverage from fleet, and drop operator/tests/__init__ that shadowed fleet helpers.

  1358. Align infra_ops paths and execution with operator layout · a62866d

    Use pipeline_paths for app_infra resolution and tighten infra execution, firewall, reachability, and remote ops against the operator infrastructure trees.

  1359. Split manager into fleet_manager facets and operator control · 41848dd

    Move orchestration, deploy, reachability, and checks under operator/src/manager while FleetManager facets live in fleet/src/fleet_manager. Update sys.path bootstrap and import rewrite tooling so callers use manager.* without fleet owning workflow source.

  1360. Move contracts_generate and paths out of fleet · dad9e98

    Centralize schema-generation helpers under the contracts module and route pipeline preflight imports through contracts_import so fleet no longer owns contracts tooling source.

  1361. Fix ifeoma-tc deploy env paths for application repo layout · 0e7a675

    Point APP_PIPELINE_ROOT and APP_INFRA_ENV_FILE at pipeline/ and tenant/ paths after repo layout normalization.

  1362. Document operator gather → runtimeContext → pipeline flow, refresh master plan/todo rows for build-runs mock closure, and extend agent anti-patterns. · c6421ad

  1363. Align infra/hosting tests with operator app_infra paths · 58a1da1

    Update traefik and harbor compose test paths after infra module extraction from fleet into operator-owned infrastructure control.

  1364. Cover operator workflow gather/runtimeContext wiring, direct-pipeline CLI guard, fleet proxy routes, and regenerate operator-web API types/mocks. · 69eabe6

  1365. Tenant deployment, gather wire, and import path coverage · 051d7d9

    Add unit tests for wire/validation/runner/context, migrate deployment tests off load_package path hacks, and sync build/deploy run API tests with inline background job execution.

  1366. Centralize sidecar import path bootstrap for pytest · 1acc436

    Add ensure_pipeline_sidecar_import_path SSOT, root pipeline conftest, and infra registry URL helper so src.client resolves consistently across tests.

  1367. Package-relative start_app imports and inventory contracts · 86cd1d3

    Use deployment package imports in start_app/zitadel_provision, resolve inventory contracts via deployment package init, and drop legacy deployment conftest path hack.

  1368. Remove duplicated build/deploy context loaders and fleet rebuild/reconcile HTTP routes; thin orchestration to pipeline sidecar calls and pipeline-owned dev_sync/deploy modules. · 4784b80

  1369. Expose domains, manifest, and PAT value for deployment gather · 3146669

    Add control-plane routes consumed by operator tenant-steered deployment workflows when materializing env and building runtimeContext.

  1370. Tenant deployment gather workflow and CLI steering · 7223722

    Gather Tenant+Fleet material over HTTP, attach runtimeContext to pipeline tenant-deployment-runs, add tenant proxy facades, and route redeploy through the operator workflow instead of subprocess chains.

  1371. Sidecar HTTP clients and tenant-deployment runs API · 531fac3

    Add pipeline src.client for Tenant/Fleet descriptor calls and wire tenant-deployment-runs plus runtime workers through prebuilt runtimeContext.

  1372. Move deploy orchestration and tenant deployment core · e0d6358

    Relocate fleet deploy helpers, dev_sync, build context, and registry push tunnel into pipeline; add tenant deployment wire/validation, context resolution, runner, purge runtime, and rebuild prefights.

  1373. Tenant-steered deployment OpenAPI surface · 5ae2334

    Add pipeline tenant-deployment-runs, tenant materialize/domains/PAT facades, and operator workflow routes; trim stale fleet reconcile/rebuild paths and refresh parity tooling.

  1374. Gitignore local test-golden VM image blob · 1add956

    Exclude multi-GB provisioning test-golden from git; file remains local only.

  1375. Remove ProfileEnvironmentBadge from header · ffb64f2

    Drop the redundant profile environment badge; tenant and profile selectors remain in the operator header.

  1376. Verify contract-revisions manifest in schema-contract workflow · 02eaf21

    Run update-contract-revisions.mjs --check after generate-all-contracts so CI fails when the committed manifest drifts from generated artifacts.

  1377. Document contract-revisions manifest and codegen flow · 9efefb3

    Cross-link revision tooling from contracts, apis, generated, and tools READMEs.

  1378. Expose contractRevision on control-plane capabilities · 7da0721

    Extend contracts OpenAPI and wire fleet, pipeline, and tenant sidecar capabilities/health routes to surface module revision metadata from the manifest. Fix contracts sidecar import test to include pipeline on sys.path.

  1379. Add contract-revisions manifest tooling · 92b3f09

    Introduce per-module content hashes in contract-revisions.json, update scripts to refresh or verify the manifest after codegen, and add a shared Python loader plus unit tests for sidecar capabilities.

  1380. Operator infra paths and workflow CLI split · 2fbb588

    Route hosting/app_infra through fleet_layout and infrastructure.* imports with operator/src on PYTHONPATH (no fleet→operator symlinks). Redirect migrated fleet workflow commands to operator/cli.py and document symlink bridges as an anti-pattern in agent rules.

  1381. Refresh agent rules and KB for contracts repo layout · 412c230

    Update cursor rules, skills, master plan, and AGENTS.md to document the apis/, tools/, and generated contracts structure and operator boundaries.

  1382. Update schema-contract workflow for contracts layout · a2c5519

    Point CI and root gitignore at contracts/apis, contracts/tools, and the tracked contracts/generated hub instead of legacy app-* paths.

  1383. Align tenant API docs and P124 path migration scripts · d647b2b

    Update tenant server routes and documentation for the contracts layout and refresh repo-layout migration helpers under scripts/.

  1384. Adopt application-root layout and gateway contract paths · c9c5cf7

    Update operator control plane, web client, infrastructure hosting paths, and tests for the monorepo layout and contracts/apis operator gateway SSOT.

  1385. Refresh contract consumer paths in product modules · 444e624

    Update web-client, backend, and ml-service scripts and docs for the contracts/generated hub and distributed schema locations.

  1386. Update contract tool paths and control-plane wiring · 5c3c5fc

    Align Makefile, path helpers, server routes, and agent docs with the centralized contracts/apis and contracts/tools layout.

  1387. Align contract paths and move app_infra to operator · c2ddec5

    Update Fleet API clients, schema generation, and tests for the contracts layout and drop the in-tree app_infra package now owned by operator.

  1388. Update module entrypoints and retire app-* packages · faaeaab

    Point interface.py, cli.py, and the contracts control plane at the new apis/, tools/, and generated paths and remove the legacy app-* layout.

  1389. Keep product codegen hub tracked at contracts/generated · 922dc16

    Restore the generated OpenAPI hub after gitignore rules incorrectly dropped it from the index, and align ignore rules so contracts/generated stays versioned like the former contracts/product/generated tree.

  1390. Move product codegen hub to contracts/generated · c17cd3d

    Relocate zod schemas and web-client distribution artifacts from contracts/product/generated to contracts/generated and remove the legacy product package folder.

  1391. Centralize codegen and compliance under contracts/tools · 4a3ec18

    Move product, tenant, fleet, pipeline, operator-gateway, and compliance tooling into contracts/tools so generators, parity checks, and boundary validators share one orchestrated entrypoint.

  1392. Relocate OpenAPI SSOT to contracts/apis · c604173

    Centralize product, tenant, fleet, pipeline, contracts, ml-service, and operator gateway specs under contracts/apis so downstream tooling shares one layout instead of scattered app-* openapi trees.

  1393. Remove deprecated control_plane shims · 7c3e2a5

    Control plane entry lives under operator/control_plane_start.py; drop root scripts/ forwarders that duplicated the operator CLI.

  1394. Fix ifeoma-tc stage env paths for pipeline layout · c2e8dab

    Update APP_PIPELINE_ROOT and APP_INFRA_ENV_FILE from legacy app-pipeline paths to tenant/ and pipeline/ roots.

  1395. Align README and START paths with monorepo layout · 7db7837

    Point architecture links at project KB and Traefik location under fleet app_infra after pipeline/tenant path consolidation.

  1396. Discovery peer identity and match pipeline hardening · e69f41c

    Introduce discoveryPeerIdentity and filtered profile page assembly; tighten profile/match mappers and storage sanitization; extend matching lib and tests. Bump backend to 0.1.157.

  1397. Regenerate tenant contract models from tenant-control OpenAPI · 8f06306

    Refresh fleet and ml-service generated Python models after tenant-control spec updates.

  1398. Add OpenAPI response descriptions for control bundles · dda9c2b

    Swagger bundle validation requires description on every response; tenant and pipeline *-control sources and rebundled YAML are aligned so validate-control-bundles.mjs passes.

  1399. Add control plane agent guidance · fc65953

  1400. Extend tenant control API server · 8748ecf

  1401. Add control sidecar run APIs · f28f98d

  1402. Add control sidecar API flows · c8a64d7

  1403. Add control plane contract bundles · 5ff52bf

  1404. Add control plane web UI contracts · 734a05a

  1405. Remove duplicate tenant-api cursor rule · 9fc4632

    Rule content lives under fleet and application .cursor after layout consolidation; tenant module keeps module.mdc only.

  1406. Remove duplicate cursor rules from pipeline module · 290553e

    Drop pipeline/.cursor/rules now that fleet and application roots own MODULE_BOUNDARIES, AGENT-BEHAVIOUR, and runbooks; keep pipeline/.cursor/kb.

  1407. Remove archived cursor plans under pipeline/.cursor · 7d7d97e

    Delete completed, tbd, and todo plan trees from the pipeline module; agent norms and runbooks live under fleet/.cursor and application .cursor after P133.

  1408. Gitignore ephemeral test-20260522 tenant scaffolds from local runs · ece151a

    Fleet unit tests that call create/status leave timestamped tenant dirs under tenant/tenants/; ignore them so generated .env and secrets trees stay local.

  1409. Add empty infra compose scaffolds for dev template tenants · e15b68e

    Track placeholder docker-compose.yml under ifeoma-dev and source-tenant so tenant package layout matches ifeoma-tc and test-unit-delegation after P133.

  1410. Note P133 layout cross-links in module todos · bc0fd9f

    Align source module boundaries doc and PROJECT-TODOS with fleet-owned pipeline relocation; no product runtime changes in this slice.

  1411. Sync master-plan P133 todos with fleet layout batch state · 95b9321

    Record open P133-CI-BATCH2, loader-path, and merge-PR rows after the pipeline-to-fleet relocation commits on p124-repo-layout.

  1412. Update workflow paths for fleet-owned common and schema checks · 8d9549b

    Adjust ci.yml and schema-contract.yml for imports and working directories after pipeline/common moves under fleet/src.

  1413. Package exports and control-plane route paths for P133 layout · 8deb134

    Update tenant module init, server allowlist, and tenant API docs so Fleet/T-API loaders resolve packages from application root consistently.

  1414. Align tenant-control generation and compliance bootstrap · f7e4dfd

    Refresh app-tenant OpenAPI sources and generators for fleet layout; move compliance script bootstrap paths so boundary checks resolve modules from application root after pipeline/common relocation.

  1415. Point tests and tools at fleet-owned modules · 4677867

    Keep pipeline as build/deploy entry with shims under pipeline/common; update run.py, compliance trace tools, and integration tests for the fleet/src/common and app_infra import paths introduced in P133 layout.

  1416. Wire imports, fleet API server, and layout test helpers · 05dfd3a

    Update FleetManager, CLI, runners, and unit tests for fleet-owned common and app_infra paths; add fleet control HTTP server, network mesh package, and isolated-test layout helpers used by P133 batch CI.

  1417. Relocate pipeline common, infra, hosting, and tenant API · 4c80437

    Move pipeline/common, pipeline/infra (app_infra), pipeline/hosting, and pipeline/network into fleet/src; rename tenant_api to api/tenant so Fleet owns shared orchestration code beside FleetManager.

  1418. Drop the standalone Figma export app from the application root; product UI lives under source/20_web-client per the P133 layout. · c207ba6

  1419. Sync open todos across master plan and module PROJECT-TODOS files · 2dfc6ae

    Mirror P133 batch-2 blockers, merge/schema gates, and B52-CI-GHA-COMPOSE on master-plan, pipeline hub, fleet, contracts, and tenant todo tables.

  1420. Add build-once workflow and offline manifest post-verify in ci.yml · 7803603

    Introduce build-once.yml for compose build, SBOM, and optional cosign artifacts; extend ci.yml with build-manifest-post-verify parity checks.

  1421. Build invocation correlation and tenant-rebuild component docs · 932b57f

    Pass invocation_id into build requests, document tenant-rebuild component catalog alignment, and keep batch CI runner in sync with layout branch.

  1422. Manifest v2 output, component catalog, and deploy digest handoff · dc37ed5

    Wire build interface to provenance/SBOM byproducts, align deployment start_app with tenant-rebuild component order, and document completed generalised-build phases in module todos.

  1423. Build-once manifest v2 helpers, SBOM, cosign, and CI scripts · debe9dc

    Add shared build provenance, SBOM export, cosign sign/verify gates, manifest post-build and deploy-consume checks, tenant rebuild component IDs, and offline CI contract tests plus operator scripts for GHA parity.

  1424. Test layout SSOT and tenant API session coercion · d75ba96

    Introduce tenant_packages_dir_for_test_root for isolated pytest trees, align status/tenant manager tests with T-API contracts, fix merge_env app_tenant_package_init path, and coerce leader/target config execute responses to TargetConfig.

  1425. TenantManifest from_dict and edge_tls execute allowlist · 746bea1

    Add typed from_dict/to_dict on TenantManifest so fleet status and tenant API sessions coerce HTTP manifest JSON correctly. Allow edge_tls_material_status on the tenant execute allowlist for merge_env TLS checks.

  1426. Canonical continue-loop mission paste for master-plan loop · 72f86ea

    Add continue-loop-mission-paste.md with 2026 paths (master-plan.mdc, pipeline/source todos, doing state) and wire it through product-continue-master-plan, agent-behaviour, source-agent-behaviour, agent-hub, and AGENTS.md.

  1427. Extend KB link checker for memory modules and handbook · f0e0f6e

    Scans module/meta/hooks memory, agent-behaviour-full.md, and pipeline/00_PROJECT-todos.md so broken relative links fail CI locally.

  1428. Refresh source hub links for renamed product rules · 003782a

    Updates source README and product-test-determinism rule description plus agent todo-notes pipeline rule paths.

  1429. Point fleet docs and runners at pipeline/.cursor/rules paths · 4b21197

    Replaces stale app-root pipeline rule links and updates MODULE_BOUNDARIES doc pointers to fleet-module-boundaries.mdc across runners, tests, and README indexes.

  1430. Align app memory, hooks index, and skills with rule rename · 1b7a5ee

    Fixes README.mdc as KB index SSOT, app-pipeline/app-source module paths, continual-learning-index hook, fleet-cli and diagnostics paths, and fleet-tenant-cli-ops skill references.

  1431. Fix rule and KB cross-links in pipeline module · fce591b

    Corrects pipeline-runners and stage-remote paths, fleet-module-boundaries references, relative links in 00_PROJECT-todos.md, and active tbd/todo plan pointers.

  1432. Rename handbook reference to agent-behaviour-full.md · fd7f3fd

    Keeps the fleet-pipeline-agent-handbook deep reference aligned with kebab-case rule naming and fixes stale README_INDEX / AGENT-BEHAVIOUR pointers inside the handbook body.

  1433. Sync KB, plans, and skills with renamed module rules · ec28c27

    Update agent-navigation index, module memory cards, master plans, fleet skill, PR template, and todo-notes for fleet-module-boundaries and kebab-case paths.

  1434. Propagate renamed cursor rule paths through KB and tooling · 5b12f06

    Update fleet-cli KB, done/todo plans, agent handbook, runners overview refs, and pipeline README/todos to kebab-case rule filenames.

  1435. Update fleet docs, runners, and tests for renamed cursor rules · 729e191

    Replace legacy MODULE_BOUNDARIES and runbook rule paths with fleet-module-boundaries and kebab-case pipeline rule filenames across READMEs, runners, and batch test entrypoints.

  1436. Refresh source module hub and docs for product-* rule names · bc70071

    Cross-link source-agent-behaviour, product-layer-boundaries, and related rules after kebab-case rename; fix design-system README boundary pointer.

  1437. Align hub and compliance tooling with renamed cursor rules · f54133c

    Update module hub, README, todos, and boundary-check scripts to reference contracts-openapi-surface and contracts-compliance rule paths.

  1438. Update app-root rules index for renamed module paths · d3e6fc2

    Point module-boundaries, modules-index, rules-index, and errors hub at fleet-module-boundaries, product-*, and contracts-* rule filenames; add naming convention table to rules-index.

  1439. Rename cursor rules to kebab-case fleet-* names · c64301d

    Retire SCREAMING_SNAKE rule filenames (AGENT-BEHAVIOUR, MODULE_BOUNDARIES, SWIMLANE, etc.) in favour of clear kebab-case paths such as agent-behaviour, fleet-module-boundaries, and fleet-swimlane; update pipeline module hub.

  1440. Sync generated models after OpenAPI regen · 6509b77

    Refresh ml-service contract_models and minor ProfileService alignment with generated contract shapes.

  1441. Harden tenant API server deps and extended routes · 170d84f

    Adjust server entrypoints for layout and tenant API contract consistency.

  1442. Refresh hosting test paths and compliance baseline · 8fca3cd

    Keep workload provider unit test and compliance baseline aligned with current pipeline package layout.

  1443. Layout-aware test helpers and tenant package fixtures · a4bcce9

    Add layout_roots and tenant_package test helpers; align unit tests and CLI paths with repository layout under pipeline/ and tenant/.

  1444. Fix documentation paths after pipeline layout rename · 00acb6c

    Update fleet/docs and manager README links from legacy app-pipeline paths to pipeline/ and current rule locations.

  1445. Track cursor skills and plans README in version control · f75f767

    Un-ignore .cursor/skills and plans/README.md; drop obsolete MASTER plan symlink entry now that master-plan.mdc is the rollup SSOT.

  1446. Point source READMEs at profile-identity and error rule paths · a2616ee

    Align backend and web-client documentation with .cursor/rules paths after the kebab-case and five-module agent layout.

  1447. Application agent map, skills, and navigation indexes · 7b9709c

    Add .cursor/README, modules-index, product/fleet skills, slim errors index, and KB cross-links; retire duplicate plan filenames; point AGENTS.md at new map.

  1448. Restructure cursor rules and dedupe cross-module copies · f978149

    Add module hub and web-product rule; rename layer boundaries and product change-flow; remove duplicate ROOT_CAUSE, tone, and PYTHON-PACKAGE rules (now canonical under pipeline); drop CONTINUOUS-DEV-LOOP superseded by skill.

  1449. Cursor module hub, handbook skill, and rule dedupe · 5bccf3a

    Add pipeline/.cursor/rules/module.mdc and fleet-pipeline-agent-handbook skill; consolidate cross-module norms; remove duplicate e2e-playwright rule (canonical under source); fix done-plan links to MODULE_BOUNDARIES.

  1450. Add cursor module hub and tenant-api rules · 7fc8a40

    Document tenant HTTP API ownership, merge-env contract, and links to fleet-tenant-cli-ops without in-process TenantInterface in fleet.

  1451. Add cursor module hub and fleet-orchestration rules · 6e69c05

    Fleet hub points to handbook skill, pipeline AGENT-BEHAVIOUR, and shared cross-module norms without duplicating pipeline runbooks.

  1452. Add cursor module hub and openapi topic rules · 56ff87f

    Introduce contracts/.cursor/rules/module.mdc with openapi-surface and compliance topics; link todos and README to the five-module map.

  1453. Extend KB rule link checker for module rules and skills · 2e036bb

    Scan per-module .cursor/rules trees and skill SKILL.md files so agent navigation links stay valid after the five-module layout.

  1454. Update renamed rule bodies and add master-plan todos-index · a3c11c4

    Slim agent-hub navigation, expand rules-index registry, add core-agent always-on stub, master-plan and todos-index intelligent rules.

  1455. Rename application .cursor/rules to short kebab-case names · 587f061

    git mv only — follow-up commit updates rule bodies (agent-hub, rules-index, master-plan, todos-index, core-agent).

  1456. Sweep remaining path references after layout rename · f1e86ba

    Mechanical app-* to contracts/pipeline/fleet/tenant/source updates across workflows, contracts, product source, compliance tools, and fleet modules. Tenant merged .env.* files left unstaged (operator secrets).

  1457. Align rules, KB, and master plan with pipeline layout and build-once · c7204c3

    Refresh agent rules, memory KB paths, AGENTS semver table, master plan rollups, and fleet-cli runbook for contracts/pipeline/fleet/source layout.

  1458. Gate stale app-* paths and run affected-components tests in batch · 76f3ede

    Wire p124-rg-active-gate.py into the kb-rule-links job and enable CI_AFFECTED_COMPONENTS step in run_batch_ci_tests for F-BUILD-07.

  1459. Thread invocation_id through reconcile and affected build CLI · 9a40178

    Mint one invocation_id per reconcile, pass it to build and deploy, persist on last_deployment, and add affected-components / build --affected-only CLI for CI subset builds plus source_revision deploy gates on stage/prod.

  1460. Digest-first deploy gates and affected-component SSOT · 56d11d3

    Add component-id validation for service_registry_images, pre-deploy source_revision matching, and git-diff affected-component resolution. Document promotion in build-output/DEPLOY.md and extract compose service name mapping to common.compose_full_service_names.

  1461. Rename top-level modules and flatten contracts/product out of the app-pipeline mirror path. · 85b3abc

    Rename top-level modules and flatten contracts/product out of the app-pipeline mirror path. Update SSOT path helpers, compliance scans, codegen scripts, compose paths, CI workflows, docs, and KB references. Operator cwd: pipeline/ with PYTHONPATH=.:../fleet:../fleet/src. TC_TENANT_PATH=tenant/tenants/<id>. Post-merge: merge-env and target dev-sync for /opt/app/deployment paths on VMs.

  1462. Reconcile KB, master plan, and behaviour rules for build-once · de678cb

    Refresh layer-trace docs, master plan closure rows, and knowledge-base paths for generalized builds, digest deploy, and OpenAPI hub layout.

  1463. Point schema and contract workflows at app-contracts root · 0c365b6

    Update CI paths and root README/AGENTS pointers after hoisting contracts and standardizing OpenAPI verification entrypoints.

  1464. Refresh todos, compliance tools, and fleet KB paths · 615dceb

    Update project todos and pipeline entrypoints for application-root paths; extend compliance checks and KB cross-links for build-once workflows.

  1465. Align CLI paths with application-root layout · a2baac1

    Update pipeline and tenant health commands for hoisted app-contracts and application_root resolution used by build and deploy.

  1466. Sync generated clients and route contracts from OpenAPI · c5e51f9

    Refresh web-client, backend zod, and ml-service generated types; align admin and internal routes, health probes, i18n, and tests with the expanded contract surface.

  1467. Extend OpenAPI sources and tighten mutating error responses · 717a80c

    Add decomposed path YAML, shared error response components, compliance bootstrap for app-contracts layout, mutating-500 verification tools, and regenerated hub zod/tenant types from the bundled spec.

  1468. Cover build manifest load and tenant artifact handoff · 10410a8

    Add regression tests for manifest promotion, git revision helpers, and tenant state artifact_manifest digest resolution.

  1469. Read artifact manifest digests from on-disk build output · a52df9a

    Prefer the persisted manifest file for registry digest fields in tenant state and align control-plane routes with the build-once contract.

  1470. Propagate build components and artifact_path to tenant API · e5ee462

    Map BuildResult components into BuildStateSummary and prefer manifest artifact_path for digest handoff; add unit tests for summary and deploy manifest wiring.

  1471. Resolve deploy images from build manifest digests · 952176d

    Use deploy_image_refs so compose deploy pins images by digest from the on-disk artifact manifest instead of tag-only references.

  1472. Generalize per-component builds and split build_interface · b8d405b

    Add build-components catalog, bundle registry, failure policy, and digest metadata; replace the monolithic build_interface module with a focused package while validating application_root via constants_paths.

  1473. Add build manifest and deploy image ref contracts · 8a9a3e4

    Introduce ComponentArtifact SSOT, digest-first deploy_image_refs, and build manifest load/promotion helpers so fleet, build, and deploy share one artifact shape.

  1474. Unify codegen entrypoints for product, tenant, and ML · 072bb21

    Add generate-all-contracts.js so Fleet reconcile, app-contracts CLI, preflight, and schema-contract CI always regenerate tenant and ML artifacts, not only the product OpenAPI pipeline.

  1475. Remove stale build-output and container_mount docs · 38dbcf3

    Drop generated README copies under app-build/build-output; deploy notes live in app-build README and fleet docs.

  1476. Relocate golden-image VM API and E2E helpers beside app-fleet for a flatter application repository layout. · f8349d2

  1477. Refresh rules and KB for application-root layout · c40c50e

    Update AGENTS.md, root README, and cursor memory/rules paths for app-contracts, app-fleet, and app-tenant at the repository root.

  1478. Point OpenAPI codegen paths at app-contracts root · 8a78c57

    Update web-client and backend schema script paths, generated READMEs, and mobile docs for the hoisted app-contracts layout.

  1479. Align paths after fleet, tenant, and contracts hoist · cb6d4c3

    Update common/, tests, tools, and pipeline docs for application-root app-fleet, app-tenant, and app-contracts; add tenant API HTTP tests and check_no_direct_tenant_import; remove app-pipeline/app-source symlink.

  1480. Add OpenAPI contract and Pydantic codegen · 0888f6c

    Introduce app-contracts/app-ml-service with health and internal match job paths; generate contract_models.py into 30_ml-service; chain ML regeneration in generate-contract-schemas and schema-contract CI.

  1481. Hoist app-contracts to application root · 6bbb1e1

    Move product OpenAPI, compliance tools, and tenant-control specs from app-pipeline/app-contracts to app-contracts/; add consumers index and deferred app-api-contracts shell.

  1482. Move app-tenant from app-pipeline to application root · dc553c7

    Relocate tenant packages, control API server, and fixture tenants next to app-fleet and app-contracts for a single application-root layout.

  1483. Move app-fleet from app-pipeline to application root · 319340c

    Hoist FleetManager, CLI, and tests so PYTHONPATH and imports use app-fleet/ at the repo root; app-pipeline remains the pipeline shell.

  1484. Repair doc and runner references after hub removal · 31c780b

    Point agents, CI, KB, and web-client READMEs at live paths (batch test runners, feature-local chat/profile/universe docs, FigmaDesign folder). Fix corrupted iOS/Android doc links from the platform docs move.

  1485. Remove pipeline docs hub and legacy runner shims · 8dd2740

    Intentional cleanup: drop app-pipeline/docs, chat-gap-program, README-HOW-TO-RUN-TESTS, run_tests/run_ci wrappers, HA todo doc, FIGMA_DESIGN_REFERENCE rule, and continual-learning hook index. Point CI and agent rules at app-fleet/tests/run_batch_* scripts and in-repo KB; refresh broken markdown links.

  1486. Fix README links after documentation tree removal · 00703c9

    Point indexes at module READMEs, app-pipeline architecture docs, and in-repo KB paths so check_kb_rule_links.py stays green.

  1487. Align agent docs with removed hub trees and scripts path · d75eab5

    Point KB link checker at scripts/, drop references to deleted docs/agent-rules-changelog.md, and document match list route wording.

  1488. Discovery list overlap filter and responsive E2E guards · a3c6dee

    Align generated validation schemas, tighten overlap filtering tests, and add viewport scroll assertions for public responsive specs.

  1489. Regenerate Zod schemas from OpenAPI · 875c91f

  1490. IRT gate jobs and SSOT threshold parity checks · f7eb542

    Add match_gate_thresholds loader, IRT pilot/sparsity/theta jobs, Docker config copy, pytest SSOT test, and CI parity script under app-source/tools.

  1491. Load match gate thresholds from shared JSON SSOT · da7bb88

    Centralize population gate constants in app-source/config for Docker and backend parity; wire matchGateConfig and IRT proximity paths to the file and add regression tests.

  1492. Remove hub documentation trees and relocate link checker · b4b3d89

    Drop platform docs, web-client docs hub, documentation-archive, and root tools/ per intentional cleanup. Move check_kb_rule_links.py to scripts/ and point CI kb-rule-links job at the new path.

  1493. Move simulation-worker under 10_backend · 6bf895b

    Relocate the headless API exerciser to app-source/10_backend/simulation-worker, update imports to ../../src/services/sim-user, fix Dockerfile and compose dockerfile path, and refresh CI, Fleet, and doc cross-links.

  1494. Replace stale hosting_remote deploy steps in app-pipeline README · b336fa2

    Update workflow diagram and production deploy section to Fleet merge-env, rebuild, and tenant-live-health instead of legacy hosting_remote scripts.

  1495. Fix pipeline README tree, indexes, and link checker scope · 902a5b6

    Align app-pipeline/README with app-pipeline/* module layout; replace missing README_INDEX links; document slim legacy-central in web index; fix Fleet rebuild snippet in discovery-universe-manual-matrix; extend link checker to web-client top-level docs and app-pipeline/README.

  1496. Clarify app-hosting lives under app-pipeline in root README · 2fd5475

    Replace top-level app-hosting/ references with app-pipeline/app-hosting and Fleet merge-env in the architectural overview.

  1497. Trim legacy-central and align root READMEs with Fleet layout · e6d2c34

    Archive stale web-client legacy-central slices (infrastructure, phases, patterns, tasks) while keeping ADR-001, API client guides, feature matrix, and chat phase 13. Replace obsolete 00_bootstrap snippets in root and app-pipeline READMEs with Fleet merge-env and live-health commands.

  1498. Fix archive links, service paths, and link checker scope · d691db7

    Correct documentation-archive relative URLs from module doc indexes, refresh investor proposal and Zitadel footer targets, repair backend README code links after service folder moves, archive obsolete 01-README_FIRST.md, and extend check_kb_rule_links.py for app-source docs (excluding legacy-central stubs and root README).

  1499. Archive obsolete material and refresh active indexes · 7731a9e

    Move superseded web-client task boards, verification snapshots, pipeline audits, and related dumps to documentation-archive/2026-05-21/ with paths preserved. Update module README hubs, phase native links, KB paths, and replace stale CQRS marketing copy with Fastify + OpenAPI wording.

  1500. Fix Android paths in legacy-central phases README · 593b0f4

    Point verification/plan links at 50_android/docs instead of obsolete docs/40_android paths.

  1501. Second-pass audit — fix stale paths and CQRS copy · 0765abb

    Replace obsolete CQRS/Firestore architecture text in 00_platform, fix README_INDEX links, and retarget iOS/Android/web path references after module doc migration.

  1502. Drop obsolete CQRS archive from web-client legacy-central · f0b5871

    Remove project-management-cqrs copies and backend-endpoints-cqrs task guides that referenced deleted 00_platform/08-implementation-cqrs docs.

  1503. Refresh platform hub and cross-links for module docs · 721c16f

    Update 00_platform ownership table, central docs README, iOS/Android indexes, and repo READMEs after native-module doc moves and CQRS removal.

  1504. Move iOS docs into 40_ios/docs · 6f84678

    Relocate app-source/docs/03_ios under the iOS module and add a docs index.

  1505. Retarget links after module doc relocation · fa2d2d0

    Update READMEs, agent rules, pipeline docs, and in-repo cross-references from app-source/docs/{01_backend,02_web-client} to per-module docs paths.

  1506. Point module owners at 10_backend, 20_web-client, and 30_ml-service docs/ and document what remains in the central folder. · 31b484b

  1507. Move ML matching doc into 30_ml-service/docs · 8ec2a5f

    Relocate README_MATCH_CALCULATION_ML.md under the ml-service module with a docs README index.

  1508. Move web-client docs into 20_web-client/docs · 0ca96f3

    Relocate docs/02_web-client archive to legacy-central/, verification reports, and universe/responsive matrices under the web-client module.

  1509. Move backend docs into 10_backend/docs · 968b39c

    Relocate docs/01_backend, matching E2E/privacy evidence, and chat ADRs under app-source/10_backend/docs with a module README index.

  1510. Verification reports use /match product URLs (P97) · 88113bb

    Align reveal and list screen routes with App Router paths (/match, /match/list).

  1511. Model Fleet simulation-worker bootstrap route in OpenAPI sources; regen Zod and web client API types. · 4cad939

    Model Fleet simulation-worker bootstrap route in OpenAPI sources; regen Zod and web client API types. check:openapi-backend-paths now OK.

  1512. Sync generated schema index timestamps (P88) · 282e2f8

    Regenerate via generate-all.js; web copy matches app-contracts SSOT.

  1513. Dedupe universePeerHoverCardModel vitest (P87) · 5588ab9

    Merge features/discovery cases into tests/atomic/discovery SSOT; remove duplicate file.

  1514. Universe hover age and why-match rows (P86) · 22ea1b2

    Wire universePeerHoverCardModel age and whyMatch into UniversePeerHoverTooltip; extend vitest invariants. Web 0.1.906 on stage.

  1515. Force-recreate simulation-worker after web rebuild · 220e4ef

    Use docker compose up -d --force-recreate --no-deps when re-upping the profile-scoped worker after tenant-rebuild-web-client prunes fixed-name containers.

  1516. Reject blocked peers on chat peer-scoped routes · e2aba83

    assertViewerPeerNotBlocked in normalizeChatRouteOtherUserId and thread resolution; replyIfConnectionClientError on chat handlers (404 parity).

  1517. Invalidate connections and conversations after block · 306b1a1

    ChatSessionApplication.invalidateCachesAfterPeerSafetyAction wires discovery plus invalidateConnectionCaches; fallback path passes viewer+peer auth uids. Vitest 3; backend listConversations block test; typed-error routing doc row.

  1518. Return 404 on connection stage for blocked peers · 8acbf43

    ConnectionService checks UserBlockService before materializing rows; replyIfConnectionClientError maps CONNECTION_PEER_NOT_FOUND (discovery parity).

  1519. Exclude blocked peers from connections and chat inbox lists · 6041609

    UserBlockService.listBlockedAuthUidsForViewer filters GET /api/connections and GET /api/chat/conversations after canonical peer resolution; vitest coverage.

  1520. E2E semver gate SSOT and remove reportPending i18n keys · 7e11378

    Add skipE2EWhenWebVersionBelow helper with vitest; wire P62 viewport spec. Drop obsolete reportPending* from chatMessageKeys and translation CSV export.

  1521. Fix P62 E2E when viewer has residence country · c3fe1c4

    Stage E2E user has DE residence so My country is enabled per P59; assert visible instead of disabled. Close P62/P71 in plan docs and refresh AGENTS stage semver (web 0.1.904, API 0.1.148).

  1522. Regenerate merged locale JSON from shards and refresh release-notes bundle for the discovery filter, admin reports, and chat safety slices. · 92b70d3

  1523. Reconcile MASTER plan and todos for P57–P70 closure · 618f869

    Mark P64b, P57–P61, P66, P56d, P68–P70 done; keep P62 viewport proof and P71 stage deploy as the only open items. Refresh AGENTS stage vs repo row.

  1524. Add signed-in E2E coverage at 540×960 and 1080×2340 for match profile filter bundle (P62) and embedded /chats?userId= shell (P64b). · 264978e

  1525. Wire POST user block and tighten report UX · 26b5a6e

    Route blockPeerUser through POST /api/users/{id}/block instead of DELETE connections; guard report when no connection exists; remove stale pending-report copy and align MessagingHeader errors across locales.

  1526. Universe hover card polish, a11y, and operator debug · 251e8cb

    Improve hover tooltip dialog semantics, reduced-motion transitions, and coordinate debug panel peer snapshot for P56d operator workflows.

  1527. Admin user reports tab with paginated list · c97ea44

    Wire GET /api/admin/reports into AdminPanel User reports section with React Query, table UI, and five-locale admin i18n shards.

  1528. Match toolbar profile filters and display score boost · 15dfe59

    Add age, gender, and residence country filter chips on discovery list chrome; pass query params to discovery API; SSOT filter-positive bumps on displaySessionMatchPercentage. Regenerate API client and discovery i18n.

  1529. Exclude blocked peers from discovery list and detail · 9a321eb

    Wire UserBlockService into DiscoveryQueryService so blocked profileIds never appear in list results and single-peer fetch returns not-found. Add blocked-peer vitest and userBlocks stubs on discovery test harness.

  1530. List user reports from Mongo with cursor pagination for the admin panel. · 993c814

    List user reports from Mongo with cursor pagination for the admin panel. Register route on admin plane with vitest coverage.

  1531. Discovery list filters for age, gender, and residence · 87f19b3

    Apply optional ageBand, gender, and residenceCountryCode on GET /api/discovery/profiles; map ageBand on DiscoveryProfile. Bump API 0.1.148 with focused route and filter unit tests.

  1532. Discovery profile filters and admin reports OpenAPI · e43532b

    Add ageBand, gender, and residenceCountryCode query params on discovery list; DiscoveryProfile.ageBand on wire; admin GET /api/admin/reports with typed list response. Regenerate bundled OpenAPI and zod schemas.

  1533. LabelKey typing on hover card model · 81d06ce

    Use labelKey() for intent scope titles and age-band labels so stage build type-check passes.

  1534. LabelKey typing for universe hover age bands · 0d93514

    Unblocks production build after ageBand hover row addition.

  1535. Wire peerSeen prop on universe hover tooltip · dafc699

    Layer already passes peerSeen from impression storage; accept optional eyebrow on UniversePeerHoverTooltip so stage build type-checks.

  1536. Universe peer hover card P56 + seen impressions + sphere decals · 38db388

    Hover IA with orb preview, context rows, ageBand display, why-match line; localStorage impressions with Seen eyebrow and dim canvas labels; Canvas2D blurred profile decals; strict intent toggle moved into scope picker modal.

  1537. Coarse age bands derived from stored birth year on the discovery mapper; OpenAPI DiscoveryAgeBand enum and Zod regen distributed to backend. · 621d50a

  1538. Universe hover card IA (P56c, 0.1.895) · 405b44d

    Orb header, single match line, intent/geo context rows, placement axis only, and truncated synergy chips; drop redundant ring/band/intent score panels.

  1539. Stage web 0.1.894 after P64 deploy · d92083f

  1540. Close P64 deploy evidence; P64b browser proof open · 5dd782f

    Stage web 0.1.894 after tenant-rebuild-web-client; reconcile P54/P63/P55/P67 semver rows; split P64 shell (done) from viewport browser proof (P64b).

  1541. Stage 0.1.894 deployed; P55/P64 code closed · 452b614

    Reconcile MASTER after tenant-rebuild-web-client; P64 viewport proof remains open.

  1542. Embedded chat thread shell gutters (P64) · 32bc5f3

    Use chatEmbeddedThread BaseScreen band instead of discoveryFullBleed so embedded /chats?userId= threads get LAYOUT_BRAND gutters and safe-area top without double vertical padding; LayoutGrid shellVerticalPadding opt-out for ChatContainer.

  1543. Reconcile MASTER-PLAN and add detailed rows · b94898f

    Close P55/P65 in MASTER; split P64 code-done vs stage proof; add P66–P67 with acceptance columns in app-source todos; note stage 0.1.893 vs repo 0.1.894.

  1544. Verify and complete ML match calculation pipeline · 9941bc2

    Add README_MATCH_CALCULATION_ML.md with code-backed boundaries between ml-service population jobs, backend pairwise persistence, and web-client session intent. Fix stale 45s debounce and profileId wording in README_MATCHING_SYSTEM.md; cross-link E2E and module READMEs.

  1545. Embedded chat shell + universe label privacy (0.1.894) · 5132ea8

    chatEmbeddedThread BaseScreen band owns gutters/safe-area; composer pad only in route. Universe 3D chrome uses discoveryUniversePeerLabel (no quote/bio).

  1546. Record chat header, embedded shell, and universe backlog rows · 23d7869

    Update AGENTS stage semver evidence and MASTER-PLAN / project todos for P52–P63 chat work and P55–P62 universe filter bundle.

  1547. Regenerate merged next-intl messages (presenceOffline/Online) and release notes so stage builds match chat header i18n shards. · 7f10bac

  1548. Chat header, embedded shell, and gate invariants · 761ef74

    Add Vitest coverage for legal-name header wiring, presence resolution, embedded pathname layout, and explore-shell gate suppression on active chats; add Playwright viewport spec and E2E stubs for P54.

  1549. Full-bleed embedded chats thread shell layout · a65a60e

    Recognize embedded thread pathnames in the app shell, remove extra padding, and align composer margins for in-shell /chats?userId= threads.

  1550. Suppress Universe gate on embedded chat_active threads · 55cd26e

    Derive embedded shell gate from connection stage query and defer overlay until peer context loads so active chats do not flash Connect from Universe.

  1551. Messaging header presence dot and peer photo chrome · 084237b

    Simplify MessagingHeader to peer name plus online/offline indicator; add expandable peer avatar with lightbox and i18n for presence labels.

  1552. Show peer legal names in chat only at chat_active · 4f0b1f7

    Remove secure-profile reveal path from thread enrichment; resolve labels via discovery legal-name helpers and single-peer fetch after mutual reveal.

  1553. Add P52 chat header reveal Playwright smoke · 4a3e6df

  1554. Close P51 chat name privacy on stage 0.1.889 · 2dea042

    Update AGENTS semver table and MASTER/product todo evidence after verified deploy.

  1555. Gate chat peer legal names on chat_active stage · cbef4fd

    Use discoveryPeerLegalDisplayNameOrEmpty across inbox, transformToMatch, and thread chrome; fetch single discovery profile after reveal when the peer is outside the prefetch window; reject authUid stub labels. Web 0.1.889.

  1556. Record web 0.1.888 chat reveal fix and plan reconciliation · 56a4767

    Update AGENTS stage semver table, project master plan, and product todos for mutual-reveal passkey removal and discovery placement work.

  1557. Remove passkey gate from chat mutual reveal · 71d7fb9

    Delete useSecureProfilesAfterMutualReveal and resolve thread names from public profile and discovery rows via chatMutualRevealDisplayName. Align useConnections.hasMutualReveal with validation consent flags. Login and Settings passkey flows are unchanged. Web 0.1.888.

  1558. Align universe placement with axis chrome and shared fit copy · 4ddbdc2

    Sector center angles match Canvas2D ring layout; tooltip and list rows show placement axis plus style profile via DiscoveryPeerFitPlacementLines; Vitest coverage for sector alignment, tooltip model, and list card placement.

  1559. Stage simulation worker, BFF internal auth, and admin sim APIs · 68699b7

    Consolidate synthetic profile logic under sim-user/, add provision-actor and ensure-simulation-worker Fleet/compose paths, wire simulation-worker ticks from Mongo with traefik networking, and allow Fleet POSTs to /api/internal/* via x-internal-secret on the web BFF. Includes OpenAPI behaviour schemas, long-admin and discovery SSE Node BFF routes, profile generator server generate, and docs/KB. Excluded from commit: ifeoma-tc .env.stage (SIMULATION_ACCESS_TOKEN and rotated IdP secrets — apply via merge-env on the o…

  1560. Fix matchCalculation Mongo mock for item weights · 2840b39

    Add createMatchCalculationMongoMock with getDb + empty matchItemStats so loadMatchItemWeights does not emit vitest mock errors during calculateMatch tests.

  1561. Close P21 on MASTER-PLAN and product todos · 1800afb

  1562. Synthetic profile generate API and Fleet CLI · 9f82c81

    Add persona-complete lab cohort generation (reflection answers, connection ratings, match recalc), OpenAPI route, tenant-generate-synthetic-profiles, ML README, Redis overcommit KB, and backend 0.1.135. Excludes tenant .env.stage secret rotation from the commit.

  1563. Post-deploy hygiene for AI strip (AGENTS, tenant ML version) · 68ecf7e

    Refresh AGENTS.md stage table to web 0.1.876 and aiServiceVersion 0.1.1. Add ML_SERVICE_VERSION=0.1.1 to ifeoma-tc .env.stage (revert accidental ZITADEL_CLIENT_SECRET rotation). Sync contract generated index timestamps after Fleet rebuild.

  1564. Add AI service version to build-info and landing footer · 07022c4

    Expose ml-service semver via GET /api/build-info (ML_SERVICE_URL health probe), BuildVersionsStrip, and release-notes bundle schema v6. Fleet merge-env injects ML_SERVICE_VERSION from 30_ml-service pyproject.toml. Web 0.1.876, ML 0.1.1.

  1565. Close P14 on MASTER-PLAN · cb06bb5

  1566. Align Xcode tree references to app-source/40_ios · d7338fa

    Updates operational docs, START.MD, and validate-path FOLDER_MAPPINGS after P13 rename. Documentation namespace docs/30_ios/ is unchanged. Adds 40_ios/README_INDEX.md as the module entry point.

  1567. Close P13 on MASTER-PLAN and product todos · 41a31eb

  1568. Renames app-source/30_ios to 40_ios with DIR_IOS and SourcePublicInterface updates. · 8108f57

    Renames app-source/30_ios to 40_ios with DIR_IOS and SourcePublicInterface updates. Adds MatchMlVars to seed_env (REDIS_URL, ML_SERVICE_URL, IRT flag) and documents Fleet tenant-rebuild-app as ml+backend+web. Excludes operator .env.stage secret churn from this commit.

  1569. Wire REDIS_URL and ML_SERVICE_URL in ifeoma-tc env definitions · 5b4c6d2

    Non-secret internal service URLs for match item stats and ML proxy on all profiles; stage keeps MATCHING_V2_IRT_ENABLED=false until irtPilotGates.ready.

  1570. ML service, item stats, IRT pilot gates, and CI pytest · dd77b64

    Add 30_ml-service on app_net/traefik for population item stats and IRT trait vectors; parse profile journey fields as Mongo maps aligned with backend. Enforce B0 sparsity gates before IRT fit; extend sparsity report with irtPilotGates; wire Fleet admin triggers and GitHub Actions ml-service-tests. Backend 0.1.134.

  1571. Model admin match ML and e2e discovery-peer OpenAPI paths · 54a6078

    Add five platform-admin /api/admin/match/* routes plus POST /api/internal/e2e/ensure-discovery-peers with request/response schemas. Regenerate bundled OpenAPI, Zod, and web Admin/Internal API clients; check:openapi-backend-paths is green. Align backend passesStrictDiscoveryMatchIntentScopeFilter with web exact-match semantics (distinct from mutual visibility). Backend 0.1.133.

  1572. Refresh ifeoma-tc PACKAGE_INDEX after stage deploys · 1e21ba0

  1573. Record web 0.1.875 / API 0.1.131 evidence and reconcile master-plan todos for client-derived match intent and misalignment penalty work. · 6dc3b3f

  1574. Refresh OpenAPI-generated client types, validation schemas, service worker bundle, and release-notes metadata for discovery intent contract changes. · 3e60dd1

  1575. Discovery UI polish, i18n, and match-intent documentation · dfb2b96

    Align list/universe copy with client-derived scores; harden list name privacy; document match intent scope and discovery features in README and shards.

  1576. Discovery peer intent SSE and service worker cache patch · e7b0def

    Forward discovery events through the BFF; patch TanStack discovery cache on SSE and push without refetching scores. Add contract tests and strict-scope E2E helpers.

  1577. Chats inbox transport match % with intent enrichment · 409541e

    Resolve peer match scores from dimensions and connection fallback before transformToMatch; skip rows with no score instead of throwing when API omits %.

  1578. Universe strict-intent ghosts and intent-aware layout scores · 362b2d9

    Dim non-matching peers on the disc when Same intent only is off; use displaySessionMatchPercentage for radius, labels, and pick targets. Keep layout transition keys scoped to session intent.

  1579. Client-derived match intent scores and 75% misalignment penalty · 4ccca29

    Derive session, peer-intent, and display percentages from pairwise dimensions in the browser; apply ×0.25 display when focused viewer intent does not exactly match peer scope (null or other focused id; explicit Open exempt). Remove legacy matchScope query wiring.

  1580. Discovery slim batch, null intent on wire, and intent SSE · 16299dd

    Map peer discoveryMatchIntentScopeId without defaulting missing Mongo rows to balanced; align matchIntentScopeAlignment with client strict/penalty rules. Add discovery events SSE and optional Web Push on peer intent updates. Bump 0.1.131.

  1581. Nullable peer discovery intent and discovery events API · b55db78

    Expose discoveryMatchIntentScopeId as null when a profile never persisted a scope so the web client can apply the misalignment penalty without treating legacy rows as explicit Open. Regenerate OpenAPI bundle and Zod schemas.

  1582. Update README_* path references in app-source comments · b067adb

    Align JSDoc, test README invariants, and cross-module comments with the README_INDEX / README_<TOPIC> naming convention across backend and web-client.

  1583. Update AGENTS semver table and project todos · 94114f2

    Record stage evidence for discovery scope work, mark universe disk-spin E2E done in 00_PROJECT-TODOS, and note README_* doc convention in rules changelog.

  1584. Sync README_INDEX path references in pipeline and cursor · a6b216d

    Update cross-links in app-pipeline KB, plans, rules, and .cursor memory to match app-source README_* naming (no runtime behaviour change).

  1585. I18n for push embedder errors and strict-scope load · d09a849

    Refresh locale bundles with embedder-aware push failure copy, strict-filter load error string, and README_INDEX path references in admin fleet hints.

  1586. Discovery E2E disk spin and scope realtime helpers · e91696a

    Add Playwright disk-spin viewport spec, shared discovery list/stub helpers, and tighten scope-realtime E2E selectors. Register npm scripts for the new spec and bump web client to 0.1.858.

  1587. Match-intent strict scope UX and feature doc · 0e04f90

    Harden strict-scope provider load failures with localized copy, expand README_MATCH_INTENT_SCOPE product description, and add Vitest for provider invariants and E2E list-padding helper.

  1588. Uniform disc spin and animated universe peer layout · f488ce0

    Peers rotate with the full colour-ring angle (remove radius-weighted spin). Add on-disc layout interpolation for enter/exit transitions and centralize discovery list request URL building. Extend coordinate-debug and Vitest coverage for spin convention and layout lerp.

  1589. Internal E2E route to ensure discovery peers · 89798b4

    Add POST /api/internal/e2e/ensure-discovery-peers for lab flows that need at least two discoverable profiles on stage. Wire helpers under lib/e2e and cover the route with focused Vitest. Bump backend to 0.1.124.

  1590. Add main features catalog and docs hub index · f6faf99

    Introduce README_MAIN_FEATURES.md as the product-area catalog (nav, gates, shell features, onboarding, public pages) and docs/README_INDEX.md as the web-client documentation entry point. Cross-link area plans from the hub.

  1591. Adopt README_INDEX and README_* naming in app-source · ceede91

    Rename per-directory README.md to README_INDEX.md and topic markdown to README_<TOPIC>.md under app-source/10_backend and 20_web-client. Update in-tree cross-links and comments that referenced the old paths.

  1592. Update project plans and stage semver evidence for discovery scope · 944578b

    Reconcile MASTER-PLAN and AGENTS.md with shipped match-intent scope work on ifeoma-tc stage (web 0.1.852, API 0.1.120).

  1593. Discovery scope, universe layout, and push atomics · a82020b

    Add Vitest coverage for strict scope, profile rehydrate, disk spin parity, enrichment scope invariants, and discovery scope realtime E2E helpers. Bump web-client to 0.1.852.

  1594. I18n for discovery strict scope and push embedder errors · ac859a3

    Update discovery and profile shards plus legacy message bundles across all base locales.

  1595. Web Push VAPID validation and embedder-aware subscribe errors · 2e413c7

    Validate P-256 application server keys at health and subscribe time, share parsing with the service worker, and surface clearer copy when the host has no push messaging service.

  1596. Map discoveryMatchIntentScopeId from profile wire · ec760a7

    Expose nullable scope on Profile for session rehydrate without inventing a default before the user has chosen or persisted a scope.

  1597. Discovery match-intent scope, strict filter, and rehydrate · 247d6a1

    Session scope stays unset until gate or profile rehydrate; strict filtering applies on Match only; realtime poll and layout transitions; enrichment GETs skip session scope outside discovery.

  1598. Discovery match-intent scope alignment and strict filter · 372bfca

    Gate strict scope on Match discovery requests only, omit self-profile scope when never persisted, and align discovery row pipeline with scope visibility.

  1599. Sync Zod schemas and generated API clients · 0622bbc

    Regenerate web and backend validation bundles and OpenAPI TypeScript client after discovery match-intent scope contract changes.

  1600. Add discovery match-intent scope to OpenAPI · 131e76a

    Expose discoveryMatchIntentScopeId on profile payloads, strictMatchIntentScope on discovery list GET, and regenerate contract schemas for downstream modules.

  1601. Colocate universe layout modules under universe-layout/ · 0c9ceaf

    Move positioning, peer selection, orb visuals, and layout compatibility from discovery root/utils into a dedicated universe-layout folder for clearer boundaries.

  1602. BaseScreen layout SSOT, settings skeletons, and shell follow-ups · 6ee848e

    Add BaseScreen/BASE_SCREEN_LAYOUT for landing, auth, app shell, journey, release notes, and marketing routes; profile settings modal skeleton UX; landing scroll perf CSS; dedupe ConnectionStatusIndicator on discovery; document /dev PageLayout split. Bump web client to 0.1.840.

  1603. Post-codegen timestamp alignment only; no contract shape changes. · b97fb0f

  1604. Record done row in project todos and MASTER-PLAN rollup note. · 84c0df1

  1605. Add profile settings load and You hub modal invariants · 1cb6197

    Cover loadProfileSettingsData and deferred photo-editor mounting with atomic guards and fleet KB notes for You hub settings performance.

  1606. Record stage 0.1.827 evidence and close PWA todo rows · b72c2a9

    Update AGENTS semver table, project todo archives, master plan hygiene, fleet KB cross-links, and tenant PACKAGE_INDEX after the stage rebuild loop.

  1607. Refresh generated schema index timestamps · 8e4095e

    Regenerate OpenAPI distribution copies after fleet contract-schemas preflight.

  1608. Bump 0.1.827 and refresh release notes bundle · 95f2cdb

    Align package semver with stage deploy, add esbuild for service-worker build scripts, and regenerate release-notes.generated.json from git history.

  1609. Defer profile settings and photo editor mount work · a1fef8e

    Split profile settings data loading and defer ProfilePhotoEditorCore until the settings sheet is ready so You hub open stays responsive on mobile.

  1610. Defer heavy peer profile charts until sheet is painted · 42b930f

    Defer dual-radar rendering until after open animation frames so peer profile sheet interaction stays smooth on mobile viewports.

  1611. Dedupe preferences and incoming connections fetches · ee88819

    Share TanStack Query keys for GET /api/preferences and listConnections so app shell and match surfaces do not issue parallel duplicate requests.

  1612. Disable app-shell prefetch on match routes · 10fe346

    Skip Next.js RSC prefetch from AppNav and discovery CTAs while the match universe shell is loading so tab navigation does not compete with first paint.

  1613. Landing hero shell-first LCP and lazy below-fold · ecc4375

    Paint the hero title immediately, defer shooting stars and below-fold sections, and add Playwright and Vitest guards for landing LCP regression.

  1614. Split You hub into controller and body modules · 6633797

    Move YouScreen orchestration into useYouScreenController and YouScreenHubBody with localized loading copy so the hub file stays within the 400-line policy.

  1615. Split universe WebGL runtime and add performance tier · 7f8acbe

    Extract canvas-runtime modules, apply device performance tiers and DPR caps, and defer heavy work so match universe shell stays responsive on mobile GPUs.

  1616. Split passkey sign-in out of useAuthSignInMethods · 0cb8f0f

    Extract useAuthPasskeySignInMethods so the auth provider orchestrator stays under the 400-line policy while preserving passkey and OTP-gated registration flows.

  1617. Regenerate service worker before tenant web rebuilds · 1fb9034

    Run npm run build:service-worker on the operator host before rsync for tenant-rebuild-web-client and tenant-rebuild-app, with CLI and env opt-out mirroring the release-notes preflight pattern.

  1618. Generate PWA service worker from TypeScript sources · 2ba103c

    Bundle src/lib/pwa/service-worker into public/sw.js via esbuild, wire build:service-worker into prebuild and build:direct, and add CI freshness guards so locale bypass rules cannot drift from the app router.

  1619. Update ifeoma-tc PACKAGE_INDEX after stage rebuild and bump generated schema index timestamps from contract distribution. · 2cb0b7d

  1620. Bump 0.1.813 and record stage evidence · 667bcc9

    Refresh release notes bundle, E2E LCP/a11y script entries, AGENTS semver table, and tenant package index timestamp after passkey and performance deploy loop.

  1621. Carry passkey setup intent through mandatory onboarding gate · 9e3dfc7

    Preserve passkey registration callback query across app shell onboarding so settings can open after profile completion without losing setup context.

  1622. BFF upstream proxy, gateway errors, flags, and SEO URLs · d83a5e1

    Bodyless DELETE passthrough for settings routes, validate feature-flag payloads before cache, delegate JSON-LD base URL to runtime public domain resolver, and extend atomic coverage.

  1623. Journey hub LCP shell and match-intent chip a11y · 0b30511

    Hero paints before progress skeleton on phase=welcome, add LCP probe coverage, and fix scope chip label-content-name-mismatch by using visible text as the accessible name (remove overriding aria-label).

  1624. Shell-first match universe LCP and deferred bank meta · e028905

    Paint discovery strapline before WebGL and profile gates, code-split the universe scene, defer journey bank API on match, and add stage LCP probe tests.

  1625. Email-identified passkey login, register, and settings · b8766da

    NextAuth passkey providers with backend error mapping, OTP-gated setup handoff, BFF routes, profile passkey management, signalUnknownCredential cleanup, and generated client plus focused atomic and integration tests.

  1626. Harden passkey auth and biometric credential routes · f45f32c

    Email-bound challenges without credential hints, typed biometric errors, register/status routes, rate limits, and BiometricService split with tests.

  1627. Passkey register, status, and biometric credential APIs · 3bfd957

    Extend OpenAPI with email-bound passkey challenge/register flows, non-enumerating status, and biometric credential inventory endpoints; regenerate zod schemas and tighten backend path compliance scanning.

  1628. Consolidate project todo files and master plan index · 7e89223

    Rename module TODOS.md files to 00_PROJECT-TODOS.md, roll open work into 00_PROJECT-MASTER-PLAN.md, and archive completed rows to *-DONE.md files.

  1629. Refresh release-notes and indexes after stage rebuild · b0bebc3

    Regenerate release-notes bundle from git history and update Fleet-generated PACKAGE_INDEX plus schema index timestamps from tenant-rebuild-app.

  1630. Refresh ifeoma-tc PACKAGE_INDEX generated_at · 491031f

    Fleet-regenerated package index timestamp and public_hostnames ordering.

  1631. Mark large-file split backlog rows done · bbefda9

    Align app-fleet TODOS with MASTER-PLAN closure for ReleaseNotesActivity and MatchManagementTab refactors shipped in web 0.1.704+.

  1632. Record stage 0.1.792 evidence and close plan/TODO rows · d2272bf

    Update AGENTS stage semver table, MASTER-PLAN progress, and app-source TODOS for auth OTP, design tokens, and backend test splits.

  1633. Bump to 0.1.792 and refresh release notes bundle · 54b0bf4

    Regenerate release-notes data and extend Playwright integration-internal project matching for auth-internal E2E specs.

  1634. Update feature imports for design-system token paths · 597dfcc

    Point chat, journey, landing, and matching modules at tokens/* after the design-system brand shim removal.

  1635. OTP E2E, session polling, and design-system path atomics · 5cccace

    Add internal email-OTP integration spec, auth login method helpers, polled NextAuth session waiter, and update atomics for token paths and waitlist API.

  1636. I18n(web-client): add auth, UI, and chat_answer_generator locale shards · 6ad4b27

    Translate chat answer generator strings for de/es/fr/ar, extend auth provider error copy, and regenerate merged locale bundles.

  1637. Add mobile waitlist API and ComingSoon modal i18n · 3eda168

    Wire public waitlist route, platform helpers, WebAuthn passkey mode split, and localized Coming Soon modal copy with feature-flag alignment.

  1638. Harden sign-in API parsing and OTP request validation · 8b31da9

    Parse sign-in BFF JSON explicitly via readSignInApiJson, return 400 on invalid email-otp request bodies, and wire login method test ids for E2E selectors.

  1639. Unify peer profile orb avatar presentation · c4259d9

    Add ProfileCardOrbPreview and resolvePeerProfileOrbAvatarPresentation so discovery, connections, and admin surfaces share the same orb/photo rules.

  1640. Reorganize discovery components into feature subfolders · 9e502d4

    Move list, universe chrome, and legacy visualization modules out of the flat components/ directory; update barrels and discovery page imports.

  1641. Consolidate design-system brand tokens under tokens/ · a97c662

    Remove root *-brand.ts shims, relocate canonical token modules into tokens/*, and update design-system imports and atomics for the new paths.

  1642. Split admin and discovery route tests into modules · 323d830

    Move oversized route tests under tests/routes/admin/ and tests/services/discovery/; mock PlatformSettingsService to avoid Mongo during admin route registration.

  1643. Harden passkey login, biometric verify, and feature flags · 6dcd15b

    Split passkey registration vs authentication verification, fix FeatureFlagService for MongoDB driver 7, and bump backend package version.

  1644. Extend passkey challenge OpenAPI and regen Zod schemas · dd3e526

    Add allowCredentials to AuthPasskeyChallengeResponse and refresh generated schemas for contracts, backend, and web-client consumers.

  1645. Cover email OTP, JWT bridge, and passkey route ownership · 3989913

    Add atomic tests for OTP identity and rate limits, E2E OTP retrieval, JWT email-otp provisioning, passkey BFF proxies, and login method selector UI.

  1646. Add i18n copy for OTP login and method selector · 4c02648

    Add auth shard strings for email code, magic link, and passkey login flows across base locales and regenerate merged message bundles.

  1647. Add email OTP login with passkey BFF routes and method selector · 8ff3a69

    Introduce hashed email OTP challenges with rate limits, NextAuth email-otp credentials, internal E2E OTP retrieval, Next.js passkey proxy routes, and a login card that defaults to email code while keeping magic link and passkey.

  1648. Separate passkey registration from login assertion verification · d3e818f

    Split BiometricService into registration vs assertion paths, map authentication to assertion envelopes in verifyBiometricWebAuthnOrThrow, and add focused route tests so pre-auth login cannot accept registration payloads.

  1649. Add backendPackageVersion helper for health probes · c917654

    Read and cache semver from package.json relative to dist layout so GET /api/health does not depend on a fragile path from route modules.

  1650. Bump web 0.1.775 and update plan tracking · d3d4422

    Regenerate release-notes bundle, sync contracts generated index, and record completed maintainability work in TODOS.md and MASTER-PLAN.md.

  1651. Add atomic coverage and split E2E helpers · b671e18

    Add Vitest for peer presentation, error-handler i18n, error toast retry labels, answer generator, dev functions, and refactored admin or layout invariants. Split app_shell_navigation and brevo E2E helpers into subfolders with barrels and READMEs.

  1652. Split dev functions page and add dev API routes · c714d6c

    Refactor /dev/functions into cards, hooks, and API helpers. Add platform-admin gated Next.js routes for dev status, change-stream probe, and scheduled-task smoke tests with shared lib/dev parsing helpers.

  1653. Add i18n shards for errors and answer generator · 566f53d

    Introduce errors_handler and chat_answer_generator locale shards with errorHandlerI18n wiring in useErrorHandler and answerGeneratorI18n in useGeneratedContent. Regenerate merged messages bundles for all base locales.

  1654. Split large feature modules into subfolders · 7a1decf

    Break up admin tabs, chat hooks and wire mappers, connection API wire parsing, discovery ViewMyProfile, landing HowItWorks, and profile edit flows into orchestrator-sized modules. Add profile avatar package, matching radar frame, and discovery render-path documentation without behaviour regressions.

  1655. Split lib utils into focused submodules · ccbf08b

    Extract error-handler, error-types, answer-generator, question-bank, profile-generator, orb-states, and personalized-universe-positioning packages with thin root barrels. Add peerProfilePresentation for shared discovery/chat orb and core-value rules plus lib/profile README.

  1656. Reorganize design-system primitives and tokens · b846598

    Cluster primitives into auth-shell, journey-ui, landing-effects, layout-shell, loading-states, modal, and pwa-prompts with barrels and READMEs. Split the design-system index into domain token modules and display/chart subfolder. Remove unused landing-effects exports, WaitingForSouls, ProfileIdentityForm, and duplicate ShootingStar layers; document background shooting-star product split in README.

  1657. Split discovery, match, journey, and profile services · 3a3d5dd

    Extract DiscoveryQueryService pipeline modules, MatchStorage persistence helpers, QuestionService validation/stats, calculateProductMatch dimension scoring, and ProfileService provisioning/journey writes. Keeps facades under 400 LOC and documents layout in service READMEs. Bump API to 0.1.104.

  1658. Move registrars under src/routes/<domain>/ with thin root barrels for stable imports. · 8565ef0

    Move registrars under src/routes/<domain>/ with thin root barrels for stable imports. Split monolithic admin, auth, chat, connections, and profile route files into focused modules and add per-domain READMEs.

  1659. Bump 0.1.742 and reconcile plan tracking · 6d4888e

    Record completed refactors (error-states, icebreaker bank, component splits) in TODOS.md and MASTER-PLAN.md; set package.json to 0.1.742.

  1660. Regenerate merged locale bundles from i18n shards · 35b4b38

    Refresh messages/*.json after auth, chat, and ui.errorPage shard updates so runtime next-intl bundles stay aligned with src/i18n/messages sources.

  1661. Align hub and connection detail error recovery paths · a09a24c

    Use journey i18n for YouScreen server errors and discovery.refetch on ConnectionDetail instead of a full page reload.

  1662. Co-locate error-states cluster with locale-aware ErrorPage · c97dc99

    Move ErrorPage, ErrorScreen, ErrorBoundary, and setup hints under error-states/ with cookie-locale ui.errorPage shards, NextAuth sign-out, and thin primitive barrels.

  1663. Extract inbox row, action column, accept handler, and orb/percent resolvers with transport guards; log when match percentage is missing instead of silent zero. · be8212d

  1664. Split CompatibilityDimensionsRadar into subfolder · 1bf0e8e

    Move Recharts radar layout and dimension mapping into compatibility-dimensions-radar/ so the barrel orchestrator stays under 400 LOC.

  1665. Split LoginForm into login-form subfolder · cac128e

    Break sign-in, email-sent, and passkey steps into separate modules with a thin orchestrator and preserve the public LoginForm import path.

  1666. Split icebreaker mode and surface empty question bank · dd33782

    Extract IcebreakerConnectionMode into icebreaker-connection-mode/ with typed bank failures, operator ErrorScreen when the question bank is empty, and i18n shards.

  1667. Split QuestionCard into question-card subfolder · 4e1583d

    Decompose choice, slider, free-text, and footer sections into focused modules with a thin orchestrator to meet the 400-line component policy.

  1668. Split useChatSystemThreadSafetyHandlers into subfolder · d456b84

    Extract report/block/end handlers with transport identity guards into thread-safety-handlers/ and keep a thin hook barrel under 400 LOC.

  1669. Localize biometric errors via providerErrorKey · 288a91a

    Expose BiometricResult.providerErrorKey and map web passkey failures to auth.providerErrors.webBiometric* shards instead of opaque English strings.

  1670. Split universe WebGL lifecycle and canvas2d paint · e5f00f3

    Move engine lifecycle and paintUniverseCanvas2d into focused subfolders with thin barrels so orchestrators stay under 400 LOC; add devicePixelRatio atomic test.

  1671. Resolve discovery orb hex without silent color fallbacks · adba48d

    Centralize orb color parsing for StarField2D/3D via resolveDiscoveryProfileOrbHexForRender so invalid stored colors log explicitly instead of defaulting to white.

  1672. Split release-notes analytics into subfolder · ed4c14b

    Extract punch card, day buckets, and UTC date helpers from the monolithic buildReleaseNotesAnalytics module so the orchestrator stays under the 400-line policy.

  1673. Split large modules and tighten discovery/platform contracts · 761985f

    Break up 500+ LOC orchestrators into focused subfolders (chat, discovery, auth, journey, platform, design-system) with barrels ≤400 LOC, add targeted Vitest coverage, localize auth provider errors, replace silent orb-color fallbacks in UniverseView3D, and map web getBiometricType via WebAuthn UVPA. Bump web to 0.1.730; update TODOS and MASTER-PLAN.

  1674. Ifeoma-tc stage env — TC_FLEET_MANAGER_VERSION 1.0.4 · 32fd789

    Align stage merge-env with live cloud build-info; group E2E registration emails (peer before primary). Zitadel client secret rotation stays in local merge-env only (pre-commit secret guard).

  1675. Refresh PACKAGE_INDEX generated_at timestamp · b477b62

    Fleet package index regen after stage rebuild (ifeoma-tc).

  1676. AGENTS stage table — live web 0.1.706 / API 0.1.94 · e668f84

    Refresh canonical stage semver row and evidence bullet after tenant-rebuild-web-client + tenant-rebuild-app (2026-05-16).

  1677. Refresh release-notes bundle for 0.1.706 · b5b8edc

    Regenerated during tenant-rebuild-web-client; includes recent refactor commits through docs/AGENTS update (web 0.1.706 / API 0.1.94).

  1678. Sync generated schema index timestamps · a841be1

    Fleet tenant-rebuild refreshed generate-all metadata in contracts and web-client validation barrels (no zod body change).

  1679. Record deploy evidence, closed refactor rows, and large-file audit progress; align matching doc paths with backend services/ layout. · d3a1080

  1680. Remove throw-only api-client shim · a8c4ccb

    Delete lib/api-client.ts; route callers through HttpStatusApiError and generated client; refresh validation schema barrels and release-notes bundle (0.1.706).

  1681. Split UniverseView into universe-view modules · bd5869d

    Extract scene-prototype hook, pointer-tooltip hook, and overlay sections; orchestrator ~302 LOC (was ~892); web 0.1.706.

  1682. Split admin match and question management tabs · dd2b1b2

    Add match-management/ and question-management/ hooks and section cards; thin tab orchestrators (web 0.1.705).

  1683. Split release-notes activity into sections · 8ab87ca

    Extract heatmap/format helpers, hooks, and activity section components; orchestrator under ~120 LOC (was ~1200).

  1684. Split universe-webgl canvas, dock, and hooks · 0c552de

    Extract WebGL runtime hooks, pointer-hover helpers, and prototype dock sections; thin UniverseWebGLCanvas and UniversePrototypeDock orchestrators.

  1685. Modularize services into domain folders · fd14b08

    Group orchestrators under admin/, chat/, connection/, discovery/, journey/, match/, platform/, profile/, push/, and user/ with domain modules and barrels; update routes, lib, and tests; add Vitest global env setup (0.1.94).

  1686. Split server API tests into server_api package · aa58154

    Extract monolithic test_server_api into focused modules with shared harness; keep smoke re-export for discover compatibility.

  1687. Split CLI registration and tenant fleet runner · 67cb238

    Move subparser registration into src/cli/register/ and tenant runner logic into tenant_fleet_runner/; thin cli.py entry shell; fix unit test import paths.

  1688. Remove container_mount generated schema copies · 193fba4

    Delete stale hub package/types under container_mount; document the mount layout and drop /app/shared binds from full-stack compose templates.

  1689. Remove legacy schema hub generators and validators · 9f0fd3d

    Drop obsolete api-generate, copy-to-platforms, zod shim, and validate-openapi-generated; consolidate distribute/generate-all around the single generate-schemas pipeline.

  1690. Vibe-check contract, typed-error routing sweep, narrowed mongo races, module READMEs · 1697401

    Closes a deep audit pass against silent fallbacks, deprecated shims, and inline error-mapping drift across backend + web client. Vibe-check (full stack): - New OpenAPI path POST /api/connections/vibe-check + ConnectionService.recordVibeCheck (idempotent per-user tap, materializes vibeCheck.bothTappedAt, gated on anonymous_chat_active via ConnectionTransitionError 409). - Connection list/stage responses now include vibeCheck + vibeCheckComplete. - Web client drops the hand-maintained PostConnectionVibeCheckResponse…

  1691. Fleet VM flows, strict tenants, hosting libvirt API, and web client API cleanup · 30b8413

    FleetManager gains offline VM resource orchestration and live config snapshots; list_tenants fails fast on unloadable packages; Zitadel purge and external config validation no longer swallow errors; misc_cmds re-exports and unit tests align with src.manager. HostManagementInterface exposes libvirt offline helpers via a mixin; provisioning PPI resolves workload providers. Web client consolidates same-origin API usage under lib/utils/api, improves PWA registration and push handling, i18n shards and roundtrip tooling…

  1692. Split misc_cmds into package; track i18n locale shards · baf7db0

    Replace monolithic app-fleet `misc_cmds.py` with `misc_cmds/` while keeping `from src.cli.misc_cmds import …` paths. Un-ignore `src/i18n/messages/<locale>/*.json` in `.gitignore`, add per-locale shard JSON (ar/de/en/es/fr), refresh `translations-bundle.csv`, import-shards script, shared `scripts/i18n/_lib/`, and shard README. Update fleet `src/cli/README.md` module table.

  1693. Merge IdP mailbox into profile POST when body omits email · 77c7546

    Onboarding shows read-only account email; Fastify uses JWT or stored email for the mailbox invariant and backfills Mongo when needed. Shard i18n, merged locale bundles, release notes, and semver (web 0.1.693 / API 0.1.80). Update PROFILE_SURFACES, AGENTS, MASTER-PLAN, and TODOS. Harden ErrorBoundary recovery and push entry prompt auth gating with Vitest coverage.

  1694. Regenerate OpenAPI clients before tenant rebuild · b6f1edb

    Run app-contracts generate-all on the operator host after release-notes and before gates/rsync for tenant-rebuild-web-client and tenant-rebuild-app, with CLI/env skip mirrors. Document in app-fleet README and KB; add unit tests.

  1695. Refresh stage evidence and MASTER-PLAN status · a5eb3e6

    Update AGENTS semver table for web 0.1.690 / API 0.1.79 and extend MASTER-PLAN closure notes for platform settings, OpenAPI parity, and E2E health gating.

  1696. Runtime tunables, bearer parity, and client limits · ee348cf

    Add Mongo-backed platform settings with admin patch routes and a public viewer snapshot; tighten internal Bearer [redacted]; wire chat list/message and discovery prefetch limits to tunables; improve push key comparison and E2E health gating against live backend semver; extend docs and Vitest coverage.

  1697. Track multi-file OpenAPI sources and bundle workflow · 096c63a

    Add Redocly-authored `openapi/sources/`, bundle script, CI path filters, and web-client dev hooks so edits to fragments trigger regen without hand-editing the monolithic spec.

  1698. Rebundle OpenAPI from sources and regen clients · 192ca83

    Sync committed openapi.yaml with multi-file sources (Redocly bundle) and refresh Zod + openapi-typescript + axios generated artifacts for web and backend.

  1699. Passkey flow, feature flags UI, and repo hygiene · 2ed132f

    Wire passkey auth and Mongo-backed flags end-to-end; move biometric client code under auth; refresh i18n, docs, CI, and E2E helpers. Exclude tenant .env.stage from the commit (secrets / merge-env).

  1700. Refactor db layer into grouped helpers · 4314c75

  1701. Add frontend feature flag admin · e1f18ef

  1702. Add backend feature flags · 4032f41

  1703. Refresh agent orientation and backlog pointers · 7d64d26

    Update MASTER-PLAN progress, AGENTS semver table, agent behaviour annexes, app-source TODOS, rules changelog, and remove superseded match-peer plan.

  1704. Bump version and refresh release notes · 390aaa4

    Align package semver with the regenerated release-notes bundle for this delivery slice.

  1705. Harden app shell navigation and viewport specs · d1a520d

    Improve shell navigation helpers, logging, full-workflow smoke timing, responsive discovery coverage, and document gated Playwright scripts.

  1706. Guard README roots and chat layout invariants · 87a7a0c

    Add module README root checks, assert design-system chat surface docs, cover peer private sender label clustering, and refresh chat diagnostic layout atomics.

  1707. Atomics for layout, runtime domain, and platform adapters · cc11325

    Cover network layout and quadrant helpers, runtime public domain and migration contracts, platform voice/WebAuthn helpers, and module README presence for data, generated, and services trees.

  1708. Add route and module README stubs · 3ae88fc

    Document app route folders, shared feature entrypoints, and supporting lib/service modules so contributors can navigate the tree quickly.

  1709. Split ChatSystem orchestration and polish messaging UI · f9710f9

    Extract thread prop builders and orchestration hook, tighten transcript chrome and glass tokens, refresh chat i18n shards, and align the onion plan with the new structure.

  1710. WebAuthn and voice platform adapters · 7cef899

    Wire biometric WebAuthn and web voice recording through the platform adapter surface, refresh types and dev test cards, and document hooks.

  1711. Deterministic universe layout helpers · b4d0915

    Add stable pair-unit hashing, tighten network layout and quadrant math, and align discovery network visualization with the deterministic paths.

  1712. Mirror runtime public domain and migration contract · bd88742

    Expose runtimePublicDomain alongside runtime config, tighten migration helpers and docs, and align translation cache with the new domain source.

  1713. Document merged-env build host parameters · dc406aa

    Clarify merged env / build host wiring in docs, refresh fleet README pointers, extend the deployment template, and note tenant module layout.

  1714. WebAuthn biometric flow and runtime public domain · 89a4fd2

    Add WebAuthn helpers, extend BiometricService and admin paths, surface runtimePublicDomain on config, tighten Mongo index setup, and refresh route tests plus package metadata.

  1715. Allow nullish peerPairwiseMatchDimensions · 8a00fd1

    Regenerate mirrored Zod and API client artifacts; add backend wire schema test for nullish peerPairwiseMatchDimensions payloads.

  1716. Centralize todos and archive legacy backlog · b4a5ea8

    Move root TODO markdown into docs/archive, add per-module TODOS stubs, and refresh the pipeline todos index plus test runner notes.

  1717. Close app-tenant hygiene todos; document icebreaker stage web version · b92778e

    - Reverted ifeoma-tc PACKAGE_INDEX + .env.{stage,dev,prod} to HEAD; track closure in app-tenant/TODOS.md - tests/README.md: icebreaker bullet — deploy web ≥0.1.674 for /chats Accept on fresh users - MASTER-PLAN: workspace hygiene done row

  1718. Icebreaker E2E blocked on stage until web 0.1.674 edge · 0974844

    - app-source/TODOS.md: evidence for stage health 0.1.654 vs package 0.1.674 + deploy note - MASTER-PLAN: closure row for web 0.1.674 repo + stage rebuild prerequisite - chat-icebreaker-in-thread.spec: file doc on deriveChatsListShellGate / Accept CTA

  1719. Chats inbox gate when connection unlocks; journey E2E welcome · f850f05

    - deriveChatsListShellGate: return none when chatShellUnlocked so incoming consent is not hidden behind complete_journey - useAppShellNavGates: enable Chat tab when connections resolve and shell is chat-unlocked - ChatsPageClient: document gate + inbox behaviour - Playwright: ensureJourneyWelcomeCompleteForShellE2e in journey hub smoke; URL phase check via JOURNEY_URL_PHASE; isJourneyProgressUrl post-onboarding reflection handoff + atomic test - web 0.1.674, release-notes bundle, MASTER-PLAN progress row

  1720. ChatSystemThreadPhaseBody phase switch (0.1.660) · 71bcb5f

    - Extract phase switch + shells to ChatSystemThreadPhaseBody; ChatSystem builds ComponentProps bundles for icebreaker, active thread, and PeerProfileSheet. - ChatSystem.tsx ~528 LOC (wc -l); fix phase test session cast via unknown. - Refresh chat-onion counts, feature/core README, MASTER-PLAN, TODOS, AGENTS, release-notes bundle.

  1721. ChatSystem thread render phase hook (0.1.659) · ab88109

    - Add useChatSystemThreadRenderPhase / resolveChatSystemThreadRenderPhase with ordered gates; profile_query_failed uses profileLoadFallback when error is nullish or blank (avoids getClientApiErrorDisplayMessage(undefined) string). - ChatSystem switches on threadPhase; Vitest chatSystemThreadRenderPhase. - Refresh chat-onion wc -l + atomic counts, READMEs, MASTER-PLAN, TODOS, AGENTS, release-notes bundle.

  1722. Transport derivations + peer profile trailing (0.1.658) · 10d3857

    - Add useChatSystemThreadTransportDerivations for icebreakerActive + blindFreeTextStages. - Add ChatSystemPeerProfileTrailing presentational control for PeerProfileSheet. - Indent ChatSystemActiveThreadView props; refresh chat-onion wc -l, TODOS, MASTER-PLAN, AGENTS.

  1723. Blind reveal thread controls hook (0.1.657) · 5b4e133

    - Add useChatSystemBlindRevealThreadControls for busy flag, transport-guarded press handler, and PrivateMode blindRevealUi / anonymousComposerHint memo. - Wire ChatSystem; export ChatSystemBlindRevealUi for PrivateMode props DRY. - Track useChatSystemThreadShellDerivations (was missing from index). - Docs: chat README mermaid/deep trace, hooks/core README, chat-onion wc -l, TODOS, MASTER-PLAN, AGENTS repo parity; release-notes bundle for 0.1.657.

  1724. UseChatSystemSharedThreadProps; TODOS audit · 156f277

    Extract shared anonymous/private column props memo; ChatSystem 641 LOC. Mark transformToMatch and chat/core barrel rows done; E2E rows note env. Web 0.1.655; MASTER meta TODOS sync done.

  1725. Extract useChatSystemSessionMessaging from ChatSystem · 1fad0ef

    Bundle useChatMode, useMessagePolling, useTypingStatus, useGeneratedContent, and useMessagingHandlers with press-reveal cache sync; ChatSystem keeps blind-reveal busy UI. Web 0.1.654; docs and stage health verified.

  1726. OpenAPI admin max-visible-profiles POST · 12a3cd4

    - Document POST /api/admin/user-preferences/max-visible-profiles (was Fastify-only; compliance script expected GET in stale todo — method is POST). - Schemas AdminSetMaxVisibleProfilesRequest/Response; operationId adminUserPreferencesMaxVisibleProfilesPost. - Regenerate web api-types; check:openapi-backend-paths OK. - Web 0.1.653; admin api/README cross-links; backend route JSDoc operation ref. - Close app-contracts TODOS; app-source TODOS + MASTER-PLAN; AGENTS pre-deploy table.

  1727. Stage web 0.1.652 evidence after tenant-rebuild · 208dbfb

  1728. - New hook composes useProfile, peer resolution, connections, connection validation, secure profiles, enrichment memos, and header display strings. · 3970927

    - New hook composes useProfile, peer resolution, connections, connection validation, secure profiles, enrichment memos, and header display strings. - ChatSystem.tsx ~756 LOC (was ~850); hook ~204 LOC. - Docs: chat-onion plan, hooks README, MASTER-PLAN, followups wc table, app-source TODOS; app-contracts TODOS tracks OpenAPI gap for admin max-visible-profiles route. - Web 0.1.652; release-notes bundle; AGENTS semver table.

  1729. OpenAPI beforeCursor and GetMessagesResponse.prevCursor · dc9eb78

    - Document GET /api/chat/messages beforeCursor (mutually exclusive with cursor). - Add prevCursor to GetMessagesResponse (required nullable; matches Fastify payload). - Regenerate web-client api-types.ts; web 0.1.651; release-notes bundle. - Close app-contracts TODOS row; refresh MASTER-PLAN, app-source TODOS, followups plan, AGENTS.

  1730. AGENTS stage web 0.1.650 + Fleet release-notes after §4.2 deploy · ffc984d

  1731. Chat-transport §4.2 parity with BFF + callers · f13402c

    - Document getMessages nextjsApiRequest, beforeCursor, sendMessage/mark split - Moderation: report vs DELETE end/block vs POST …/block (OpenAPI) - Supplementary row for useChatSystemThreadSafetyHandlers; 6.6 send 401–413 note - messages/index.ts BFF path docstring; chat-onion §4.2 mandatory row + followups backlog - app-contracts TODOS: OpenAPI beforeCursor gap; app-source TODOS §4.2 done - Web 0.1.650; regenerate release notes; MASTER plan closure row

  1732. Stage web 0.1.649 evidence + Fleet release-notes + 3.3 composition row · 235085f

    - AGENTS canonical table + post-deploy curl/live-health - chat-onion: 3.3 composition lists useChatSystemThreadSafetyHandlers - Regenerated release-notes from Fleet rebuild

  1733. Extract useChatSystemThreadSafetyHandlers from ChatSystem · 41a5b34

    - New hook: end/mute/report/block/end+report with transport-identity guards - ChatSystem shrinks ~850 LOC; logging tag remains ChatSystem for observability - Semver 0.1.649; chat-onion + followups wc/l; TODOS §3.3 slice done + remaining row - Vitest chat 147/41; npm run build green

  1734. AGENTS stage web 0.1.648 + Fleet release-notes refresh · 94318d3

    - Canonical table + ship note after tenant-rebuild-web-client - Regenerated release-notes.generated.json from remote Fleet build

  1735. Classify outbound send HTTP errors (401/403/400/413) · d8aea85

    - Extend MessagingSendFailureKind + classifyMessagingSendFailure for status codes - Map toasts via resolveMessagingSendToastPresentation + chat.errors.* locales - Track i18n chat shards (git add -f); rebuild messages/*.json and CSV - Vitest: messaging send failure + toast presentation; chat-transport + README - Semver 0.1.648; regenerate release notes; TODOS + MASTER plan progress

  1736. Restore stage history · 0762c8f

  1737. Record deployed release notes refresh · 9336cb4

    Commit the release-notes bundle regenerated by the 0.1.632 stage rebuild so the repository matches the deployed artifact.

  1738. Refresh release notes after route design cleanup · 84ff81d

    Regenerate the 0.1.632 release-notes bundle so it includes the shipped route, design-system, and docs cleanup commit.

  1739. Ship route design and docs cleanup · 1e1d766

    Bundle previously local-only welcome, design-system, journey, and chat documentation work with focused invariant tests and web semver 0.1.632.

  1740. Record local-only web-client ship gap · 41de354

    Track the completed-but-unshipped web-client route, design-system, and docs changes as a mandatory delivery invariant before bundling them.

  1741. Align chat follow-up priority wording · 59f03b8

    Reword active chat follow-up docs so mandatory work, manual operator proofs, and wire-field optionality are clearly separated.

  1742. Refresh chat plan evidence · fc80a8d

  1743. Refresh release notes after chat layout deploy · 7540411

  1744. Polish chat thread layout · 4072c0c

  1745. Record chat thread layout follow-up · 7c394e2

  1746. Refresh release notes after universe i18n deploy · a2ed1e2

  1747. Add universe operator toolbar copy · 41e8522

  1748. Record universe toolbar i18n regression · 23731b6

  1749. Refresh release notes after auth shell deploy · 7a3437c

    Include the auth shell and stage evidence commits in the generated release-notes bundle for web 0.1.629.

  1750. Record stage web 0.1.629 · f2925a0

    Refresh the stage semver table with the verified auth-shell deployment and browser proof.

  1751. Centralize localized auth route shell · da892c1

    Route localized sign-in and auth-error pages through a shared design-system shell so public auth gates use one brand ambient and viewport-safe layout contract.

  1752. Record auth route shell follow-up · d441ac0

    Track and close the localized auth route shell consistency finding in the working-loop master plan.

  1753. Bump version and refresh release notes · d3ee892

    Align package.json semver with the generated release-notes bundle.

  1754. Expand TSDoc across discovery and shared libs · cddeded

    Add or refine module and function documentation for discovery helpers, connection icebreaker wiring, journey path resolution, profile merge and picture hooks, i18n bundle loaders, error utilities, and route constants.

  1755. Align matching algorithm write-ups · 5f37c1b

    Update matching algorithm summary and deep doc for backend signal and scoring behaviour changes.

  1756. Cap universe WebGL present rate at 24 FPS · 2018090

    Throttle the rAF loop with UNIVERSE_WEBGL_MIN_FRAME_INTERVAL_MS, scale idle disk drift by wall time, and export the new constants.

  1757. Admin match management UI and strings · 9533c71

    Wire MatchManagementTab to new admin fields, extend message keys, and refresh locale bundles plus the translations export CSV.

  1758. Chat inbox, icebreaker, and polling hardening · 2ab617a

    Improve ChatsPageClient and thread chrome, message merge/map wiring, icebreaker/private/anonymous modes, polling stability, and sender-name resolution with new atomic tests.

  1759. Refine modal primitives and chat surface tokens · 857e3ee

    Update BaseModal behaviour/structure, modal brand tokens, design-system exports, and chat messaging surface styling hooks.

  1760. Match calculation, discovery, and admin diagnostics · de7face

    Extend match pipeline (versioning, profile signals, connection ratings), discovery query enrichment, admin routes and diagnostics, and operator backfill messaging. Includes new connectionRatingSignals helper and expanded service tests.

  1761. Sync OpenAPI and generated schemas · bafb624

    Regenerate app-contracts zod, backend/web validation copies, and web OpenAPI client models from the updated discovery/admin surface.

  1762. Add operator universe tools toolbar aria for discovery view · d152515

    MISSING_MESSAGE for discovery.universe.view.operatorUniverseToolsToolbarAria (operator toolbar in UniverseView). Add copy in all base locales.

  1763. Prune stale outbound matches after materialised recalc · f87e33e

    When peers are removed or the viewer has no eligible peers, `matches` rows for deleted `otherUserId` values were never deleted, so admin match-index showed permanent (orphan) weak-band rows after profile purges. After each `calculateAndStoreMatchesForUser` pass, delete outbound rows for the viewer not in the computed peer set (or all outbound when the set is empty). Also prune when the viewer lacks reflection/connection basis. Extend BulkMatchResult with optional `staleOutboundRemoved`; update contract tests with …

  1764. Let admin scroll column shrink above bottom nav · 7db4d7f

    Add min-h-0 on the AdminPanel root and scroll region so flex-1 respects the dock spacer + fixed AppNav, matching the (pages) shell pattern. Document the bottomDockSpacer contract in the module header.

  1765. Journey explainer, discovery, landing, profile crop, infra · bd1bcd5

    Journey "how it works" explainer: richer layout, ICU-safe copy, footer context and disclosure UI; align hub/welcome/you surfaces and hooks. Discovery: universe WebGL and scope picker refinements; docs and message keys. Landing: simplify How it Works, responsive footer grid, locale overlays; add og-image asset. Profile: optional picture crop modal and canvas helper; API wiring updates. BFF binary forwarding, PWA service worker tweak, admin panel copy, design-system primitives (LayoutGrid safe centering) and new gla…

  1766. Add profile API contract tests · 3663f04

    Cover GET /api/profile shape, successful POST updates, and 400 paths for invalid preferredLocale and out-of-range birthYear (BIRTH_YEAR_INVALID).

  1767. Remove fixed-name app containers before compose up · ccbc452

    Try `docker rm -f` before `sudo docker rm -f` on SSH targets so docker-group users still prune orphan `container_name` rows when sudo is not passwordless. Refresh ifeoma-tc PACKAGE_INDEX generated_at ordering (merge-env).

  1768. Sync release-notes with post-deploy git range · 5ad860a

  1769. Refresh release-notes after chat unlock TS fix · 985f9c2

  1770. Type-safe wire guard in hasChatShellUnlockFromConnections · 5c3aea6

    Validate stage via string allowlist so Next.js typecheck accepts empty-string and unknown wire values without comparing ConnectionStage to "".

  1771. Regenerate release-notes bundle; refresh PACKAGE_INDEX for ifeoma-tc stage. · 6363924

  1772. Align app shell navigation with Universe gate flows · 23c69d7

    Update journey-hub-and-you-smoke for gated shell behaviour.

  1773. Universe vocabulary, journey and E2E notes · a2029fb

    ADR and README touch-ups for Match/Universe naming.

  1774. ChatHeroOrb for tutorial, private request, reveal panels · 977c66d

    Shared orb chrome across chat onboarding surfaces.

  1775. Hub screen and explainer totals wiring · a17017b

    Tighten JourneyHubScreen; align journeyVisualChrome and ReflectionPhaseExplainer.

  1776. Universe tab, journey gate modal, shell layout tokens · caeaf29

    Bottom nav and explore-shell gate copy/behaviour; globals for nav height.

  1777. I18n: Universe product copy, nav journey gate, discovery scope labels · bf340dc

    Match→Universe strings, journey-bank gate for discovery list, Business/Mindful for professional/support scope titles. Sync translations-bundle.csv.

  1778. Session focus picker as Open plus 2×2 grid · 0b9a01a

    Quadrant order: Heart, Friends, Business, Mindful (canonical scope ids). Export MATCH_INTENT_SCOPE_FOCUS_QUADRANT_IDS from catalog.

  1779. Require known non-terminal stages for Chat shell unlock · 35cdd8c

    hasChatShellUnlockFromConnections rejects empty, unknown, and terminal stages. Add Vitest for rejected/degraded/invalid rows.

  1780. Keep Match step locked until bank caps known and both axes complete · c559655

    Treat reflectionTotal/connectionTotal undefined or non-positive as incomplete. Pass through from useJourneyBankMeta without coercing to 0. Extend Vitest for hub edge cases.

  1781. Export bottom nav height for screen shell · e1c8423

  1782. View peer profile from thread chrome · 9f75bd9

  1783. Assert pairwise radar in modal · 42e3044

  1784. Expose pairwise radar target · 8c50b52

  1785. Mark discovery profile adapter fix · ee19c85

  1786. Align discovery type labels with matching signals · e52bd61

  1787. Record P2.2 cleanup · cb351f2

  1788. Align app shell height with nav · ebbb5ac

  1789. Shell nav, match intent scope, discovery docs, OpenAPI, i18n · 43ae57e

    - Bottom nav: Journey → Match → Chat → You; sign out on You hub; E2E helpers and tests - Match intent: picker modal/body, scope URL helper, catalog; discovery toolbar and gates - Discovery: filter/quadrant docs, StarField comments, transformToMatch quadrant allowlist + log - OpenAPI: DiscoveryProfile personalityQuadrant descriptions; backend matching doc examples - i18n: shards, bundles, EN peerProfile hint, DE Growth Seekers label; Figma parity - AGENTS + Fleet KB evidence for stage web 0.1.605 / API 0.1.65; rele…

  1790. Bottom nav tab shows Universe (app.nav.tabMatch) · d9813ea

    Rename visible Match label per ADR; keep message key and /match routes. Update five locales + CSV export; AppNav docs; web 0.1.599 release notes.

  1791. Single discovery list toolbar for scope and view toggle · 431208a

    Merge MatchIntentScopeChip and ListViewToggle into DiscoveryToolbarRow on /match/list; add scopeFillsRemaining layout for flex chip + ml-auto view group. Remove DiscoveryOverlapRefineListRow (superseded). Web 0.1.598; AGENTS + notes.

  1792. GetDisplayName default fallback is empty string · 6319d44

    Avoid English Anonymous when callers omit the second argument; document localized fallback contract. Web 0.1.597 + release notes; AGENTS repo parity.

  1793. Gitignore local test-phase1 scratch directory · 8f5ba9d

  1794. Repo parity web 0.1.596, backend 0.1.65; note Web 0.1.596 · a2d4572

    Refresh package.json parity row and add HEAD bullet for profile-card unknown-name alignment; mark 0.1.578 row as superseded in repo.

  1795. Localized unknown name on profile cards · 31c5214

    ProfileCard adapter drops English Anonymous; use empty minimal names and resolveTrimmedPeerDisplayNameFromProfile for API rows. ProfileHeader shows app.people.displayNameWhenUnknown when the normalized name is blank so all BaseProfileCard surfaces match chats/discovery. Bump web to 0.1.596 and refresh release-notes bundle.

  1796. Align profile settings and identity prototype · 6f2a3c9

    Mirror profile identity form and settings surfaces in the Figma design reference tree.

  1797. I18n bundles, release notes 0.1.595, docs, and tenant index · 69cc57c

    Refresh locale JSON and translation CSV, bump web-client semver with release-notes bundle, update matching-system and chat plan docs, responsive audit matrix, AGENTS and todos, PACKAGE_INDEX, and add match-peer-plan notes.

  1798. Admin match management API and i18n keys · 37c8d5a

    Extend admin API helpers and match management tab messaging keys.

  1799. Discovery list toolbar and layout-brand tokens · 913129f

    Tighten list filter toolbar and search bar; adjust match intent chip and overlap refine row for the discovery list shell.

  1800. Chats inbox and thread peer labels stay consistent · 346798b

    Align ChatSystem header title with ConversationMatchCard and ChatView consent copy. Simplify chats list shell, mode indicator, transformToMatch, and related docs and tests.

  1801. AppBrandHeroOrb stack and slow glow across hero surfaces · 9ec9a99

    Centralize brand hero orb props, wire slow opacity pulse timing in Orb, and replace ad hoc YouBrandOrbMark stacks on landing, journey, you hub, universe preview, network viz, and dev theme showcase.

  1802. Profile identity, settings, and public schema validation · 594caba

    Use loose ProfilePublicSchema so wire fields are not stripped. Tighten peer photo loading when profileId is absent. Update settings surfaces, email normalization, and docs.

  1803. Profile routes, admin extensions, and email-required tests · 2f81193

    Add profile and admin route behavior with locale error strings. Extend profile-recalc-schedule tests and add profile-email-required coverage.

  1804. Discovery list refactor, matching ring bands, shell updates · 2b12aa5

    - Remove DiscoveryFilterPanel, list sort dropdown, and extractFilterOptions; streamline DiscoveryPageClient and overlap refine row - Add connectionRingBands module and matching axis order contract test; adjust radar and universe positioning - Journey hub/welcome and explainer chrome; PeerProfileSheet and culture save gate tweaks - App shell layout, routes constants, i18n bundles, matching-system agent rule, docs ADR/profile surfaces - Update atomic and E2E tests; remove obsolete testbench universe_test.html protot…

  1805. Tune universe performance UX and debug-only FPS HUD · 2817640

    - Stop auto-switching to list view and remove GPU LOD overrides from FPS tier; keep measuring FPS for future use and diagnostics. - Show the performance readout only when Global Debug Mode is on; restyle as a compact low-contrast HUD above the bottom nav. - Add atomic tests for the hook and universe view performance contract.

  1806. Reconcile match-peer P2.0/P2.1 and MASTER stage parity row · ccc0240

  1807. Remove fake ListView compatibilityBreakdown (P2.1) · 569d380

    Web 0.1.589. MatchCard does not read compatibilityBreakdown; discovery list Match uses API-backed match percentage only.

  1808. Match-peer P1.6 ConnectionDetail + MASTER log · 260f457

  1809. Pairwise radar on ConnectionDetail · aa2bb1b

    - [redacted] + findConnectionRowForPeerAuthUid - ConnectionDetail: useConnections + CompatibilityDimensionsRadar variant pairwise - ConnectionsPageClient: JSDoc — depth charts live on ConnectionDetail - Vitest: resolveConnectionDetailProfile.pairwise Web 0.1.588

  1810. Match-peer P1 chats inbox + MASTER stage table refresh note · a829334

  1811. Chats inbox PeerProfileSheet + Match pairwise axes · 3fefb2a

    - Match: optional peerPairwiseMatchDimensions and peerMatchingSignalDimensions - transformToMatch: connection-first pairwise precedence; discovery extras args - ChatsPageClient: pass discovery matchingSignalDimensions and pairwiseMatchDimensions - ConversationMatchCard: View profile opens PeerProfileSheet (reuse discovery i18n) - Vitest: transformToMatch.peerPairwisePrecedence Web 0.1.587

  1812. Match-peer P0 reconciliation + MASTER log row · ad3f408

  1813. Pairwise dimensions on connections and discovery · 9093fa4

    - OpenAPI: peerPairwiseMatchDimensions on list Connection; pairwiseMatchDimensions on DiscoveryProfile - Backend: enrich connection list rows with pairwise axes; discovery mapper/query pass through - Zod (contracts, web, backend): AdminCompatibilityDimensions hoisted; nullable pairwise fields use .nullish() - Web: Connection type + connectionListRowWireToClient preserve peerPairwiseMatchDimensions; DiscoveryProfile type; tests and semvers web 0.1.586 / API 0.1.65

  1814. Record Fleet rebuild outputs · 517b8a0

    Capture the Fleet-generated package index and release-notes refresh after deploying web 0.1.583 with backend 0.1.64.

  1815. Align generated i18n and release notes · fbc8c21

    Keep translation exports and release-note metadata aligned after the deploy-version refresh.

  1816. Keep the generated release-notes bundle aligned with the backend version that will be deployed through Fleet. · d949464

  1817. Bump deploy version · faee8a5

    Mark the backend health-check hardening for a distinct Fleet rebuild and build-info verification.

  1818. Harden change stream health checks · e111b1c

    Surface profile change-stream down state in health checks and stabilize route tests around peer resolution and RBAC dependencies.

  1819. Preserve simplified scope copy · 24552f0

    Keep the direct session-scope labels in generated locale bundles after the universe translation refresh.

  1820. Add missing discovery universe translations · 05d3518

  1821. Simplify match scope choices · 5afec90

    Collapse the session scope gate into direct intent choices so people can pick what they want to find without parsing matching mechanics.

  1822. Checkpoint cross-module updates and i18n tooling · 6c151fc

    Bundle current application, backend, and rules updates into one checkpoint commit, including new web/backend translation CSV round-trip tooling while excluding tenant environment files.

  1823. Add adaptive fps fallback · 8b1fe64

    Add an FPS meter, low-power layout, and admin slider so the Universe view trims heavy effects or falls back to 2D when performance drops below the configured thresholds. Serialize the new control in the scene prototype JSON bundle and refresh the release notes.

  1824. Stabilize universe peer card taps and gate match percent debug UI · 8570d8c

    Ensure peer cards stay open on click/tap across mobile and desktop by distinguishing hover vs click interactions, and hide numeric match percentage rows unless explicitly enabled from the Scene Prototype debug dock.

  1825. Reconciliation row — correct plan vs rules commit order · 7eb0f96

  1826. Reconciliation row — include 77b91aed plan footnote · 67cf1c3

  1827. Reconciliation row — cite rules commit SHAs · 77b91ae

  1828. Pipeline + app AGENT_BEHAVIOUR — Continue, reconciliation, OOP pointer · f457c61

  1829. Reconciliation 2026-04-29 — stage 0.1.582 + agent-contract row · 57527cb

  1830. Landing footer → dedicated legal routes + public pages E2E (0.1.581) · 01c16da

  1831. Canonical cookie policy at /cookie with /cookies redirect (0.1.580) · bce0bcc

  1832. Public legal pages use landing document scroll + doc routing (0.1.579) · 93d42ab

  1833. MASTER reconciliation 2026-04-30 — chat-onion SSOT + §8 §100 · 1ba8eae

  1834. Chat-onion atomics 127/34 + SSOT paragraphs · e50fac0

  1835. Stage table web 0.1.578 post-rebuild curl · 83c5336

  1836. MASTER reconciliation — universe radial 34cbc77d + §8 0.1.578 · 27cad28

  1837. Web 0.1.578 universe match-first radial (34cbc77d) · 651eb95

  1838. Root cause: API connectionRing could contradict displayed match% and pinned peers on ring 4. · 34cbc77

    - connectionRingForPeerLayout: prefer getDiscoveryMatchScore → bands (same as backend) - Vitest: stale ring 4 + 60% vs 50% radial ordering - UNIVERSE_ARCHITECTURE §4 alignment

  1839. MASTER reconciliation — integration icebreaker suite 251f8fc2 · 0741cfa

  1840. Run icebreaker two-peer with integration suite (no opt-in env gate) · 251f8fc

    - Remove E2E_ICEBREAKER_TWO_PEER_TRANSCRIPT skip; extend test:e2e:integration + test:e2e:all - Add run_e2e_registration_preserve_stack.py --integration (merge-env + npm integration) - Docs: README, chat-transport, playwright.config comments, .env.example

  1841. Reconciliation post-af73f0af — stage 0.1.577 + §2 atomics 127/34 · 70e2af9

  1842. Stage web 0.1.577 post messages/index wire-mapping tests deploy · dc17191

  1843. Guard messages/index GET/POST wire→ChatMessage mapping (0.1.577) · af73f0a

  1844. Stage web 0.1.576 post integration icebreaker E2E deploy · d6f6df3

  1845. Icebreaker two-peer transcript E2E as integration project (0.1.576) · 7e5da8f

  1846. E2E_PEER_REGISTRATION_USER_EMAIL for two-peer icebreaker E2E (ifeoma-tc) · a281b00

  1847. Reconciliation row close de2fdaba + document history · a8d36b3

  1848. Allow MASTER web-client plan files without git add -f · de2fdab

  1849. Reconciliation post-4befdffa + symlink verify + gitignore Step 4 note · ef37ef6

  1850. Symlink hyphen MASTER plan path to canonical underscore file · 6e69f14

  1851. Reconciliation post-51afe2e6 + Step 4 symlink note · 4befdff

  1852. Note bd9aed1c chat E2E + transport docs (Plans/KB §8) · 9143aad

  1853. Reconciliation post-bd9aed1c — docs-only, stage parity unchanged · 51afe2e

  1854. Icebreaker transcript polling note, onion verify stamp, E2E env hints · bd9aed1

  1855. Reconciliation 2026-04-28 post-37e6ef59 — stage evidence + §1 checklist · 73415c6

  1856. AGENTS stage backend 0.1.61, release-notes bundle, plan reconciliation row label · 37e6ef5

  1857. Reconcile backend 0.1.61 stage deploy + §8 backend parity row · cacff48

  1858. Parse chat media POST with multipart parts() not body.file (0.1.61) · 919165f

    Root cause: @fastify/multipart does not set request.body.file unless attachFieldsToBody. Reading undefined.file threw → 500 Internal server error on POST /api/chat/:id/media. Use request.parts() + validateChatMediaUpload; map FST_REQ_FILE_TOO_LARGE + validation errors.

  1859. Close §8 stage parity post-deploy 0.1.575 · 9878292

  1860. Stage web 0.1.575 mutual consent deploy evidence · 55c3863

  1861. MASTER reconciliation repo 0.1.575 vs stage 0.1.574 + mutual consent gap row · 586bd95

  1862. Mutual reveal consent copy + chats consent dismiss URL race (0.1.575) · 8ae0f4f

  1863. AGENTS 0.1.574 + chat onion atomics 125/33; test chats inbox two-peer display-name scenario · a35367a

  1864. MASTER reconciliation 0.1.574 atomics 125/33 + inbox display-name gap row · d9afd5c

  1865. Chats inbox used legacy name only; peers with split first/last in Mongo showed as Member. · 7c4e6cf

    Align transform + discovery adapter + inbound notification map with backend name composition. Dedupe prefers named row when activity/% tie.

  1866. AGENTS stage 0.1.573 + chat-onion atomics 121/32 · 50cc289

  1867. MASTER reconciliation 0.1.573 wire map, §2 atomics 121/32 · 7c2b432

  1868. Map Fastify chat message rows to domain ChatMessage (0.1.573) · d722133

    GET / POST responses use messageType without domain type/content; MessageBubble returned null. Normalize via mapApiRowsToChatMessages and sendMessage wire map.

  1869. MASTER — stage 0.1.572 parity post-deploy (4410466a) · c010546

  1870. Icebreaker transcript-well test id + two-peer E2E (0.1.572) · 4410466

  1871. MASTER reconciliation — stage 0.1.571, icebreaker 0.1.572 WIP gap · d8e1dab

  1872. MASTER Step 1 reconciliation — chat-transport §4.2, journey spot-check · ee304e7

  1873. §4.2 chats inbox Open thread peer resolution (18b17849) · 19e37cc

  1874. Canonical stage stack web 0.1.571 — chats inbox peer key · 15c4598

  1875. §8 stage parity Done — curl 0.1.571 · 245f957

  1876. MASTER reconciliation 2026-04-28 — chats inbox peer key, §8 0.1.571 deploy gap · 1ac170d

  1877. Chats inbox Open thread uses row peerAuthUid (0.1.571) · 18b1784

    - resolveChatsInboxOpenThreadPeerAuthUid: prefer ConversationMatchCard peerRowKey over re-resolving match.id - Atomic tests document stale discovery map vs connection peer divergence

  1878. Profile settings snapshot hydrate + match-profile copy (0.1.570) · 78783af

    - Add settingsSnapshotId to merged GET profile+prefs; hydrate form only when snapshot changes so matchingProfile/email churn does not reset identity gates (Save stayed disabled). - i18n: match profile terminology across base locales; analytics/maturity English fallbacks. - Atomic: profileSettingsAdapter snapshot id test.

  1879. Reconciliation 2026-04-28 — stage 0.1.567 vs repo 0.1.570, §8 deploy parity row · a8380a9

  1880. MASTER §8 — backlog pointers §2–§6 · 73e55dd

  1881. Canonical stage stack web 0.1.568 · fe70684

  1882. Todos §6 FIXME inventory + chat onion #3/#4 rows · d7edca2

  1883. Icebreaker shell test id + onboarding lead hooks (0.1.568) · de9f0e4

  1884. §8 AGENTS narrative dedupe Done (8ede7cdd) · 21c693c

  1885. Consolidate 0.1.523–0.1.531 archaeology vs 0.1.537 rows · 8ede7cd

  1886. Reconcile post-ac647b34 — phaseMatchLabel, discoveryLabel drift row · 88290e6

  1887. Chat-onion plan — atomic slice 118 tests / 31 files (2026-04-29) · 1b7d8bd

  1888. §5 ChatIcebreakerShell backlog row Open→Done (ec936c92) · ac647b3

  1889. Post–567 reconciliation — §5 ChatIcebreaker Done, §2 chat atomics 118/31 · 782f7c1

  1890. Static source assertion guards flex column wrapper for ChatMessagesArea virtual list. · ec936c9

    AGENTS + release-notes for web 0.1.567.

  1891. Reconciliation 2026-04-29 — §5 QuestionPhaseBase Done, ChatIcebreakerShell Open, icebreaker gap · 9218841

  1892. HAR + API show icebreaker rows returned; scroll container had zero height because the transcript well was not a flex parent so ChatMessagesArea flex-1 did not resolve. · d3f7cde

    HAR + API show icebreaker rows returned; scroll container had zero height because the transcript well was not a flex parent so ChatMessagesArea flex-1 did not resolve. AGENTS + release-notes for web 0.1.566.

  1893. QuestionPhaseBase ambient slot source invariant (0.1.565) · 645df3d

    Vitest strips TS comments and asserts BRAND_ORB_AMBIENT_IN_APP_BASE_CLASSNAME does not appear in executable source; journey (pages) main owns the base wash. AGENTS: canonical stage table + 0.1.565 evidence row. release-notes: regenerate for web 0.1.565.

  1894. Reconciliation 2026-04-29 — reopen 0.1.564 tests criterion for QuestionPhaseBase ambient · 2822eab

  1895. Remove duplicate ambient base behind reflection/connection cards (0.1.564) · 2d3cc9e

    QuestionPhaseBase stacked BRAND_ORB_AMBIENT_IN_APP_BASE_CLASSNAME again inside the rounded AnimatePresence slot while journey (pages) main already applies that base — doubling the near-black wash behind semi-transparent glass QuestionCard/RatingCard surfaces. Paint BRAND_ORB_AMBIENT_IN_APP_LAYERS only via getBrandOrbAmbientStackedLayerStyle.

  1896. Chat-transport §4.2 icebreaker row + backend 0.1.60 semver + web 0.1.563 · 22620f8

    - chat-transport: POST /api/connections/icebreaker/submit-step matrix row (IcebreakerConnectionMode). - Align app-source/10_backend/package.json with stage build-info backendVersion. - chat-onion-refactor-plan + MASTER + AGENTS + todos mirror; release-notes bundle.

  1897. AGENTS + MASTER stage 0.1.562 — publicPages overlay + legal routes evidence · 14a193a

  1898. Merge publicPages overlay in server bundle loader (0.1.562) · 5a91c28

    - Load overlays/<locale>/publicPages.json and deep-merge into publicPages (MISSING_MESSAGE on stage). - Extract deepMergeMessageNamespace; parity tests require publicPages.json per locale; collectStringLeafPaths walks section arrays. - Docs: CONTRACT, overlays README, tests README.

  1899. Public legal pages in repo + robots disallow you/onboarding (0.1.561) · 7ed882a

    - Add locale About/Terms/Privacy/Cookies routes via PublicMarketingArticle and publicPages overlays (all base locales). - Add onboarding draft storage helpers + atomics; marketing route/path atomics; admin redirect atomic. - Extend robots.txt disallow list with locale-prefixed /you/ and /onboarding/ (authenticated shells). - Refresh release-notes bundle for web 0.1.561.

  1900. Onboarding photo lead preview + dialog a11y (0.1.560) · bd4b35b

  1901. Skip-analytics intro Done + ship reconciliation 0.1.559 · 528e272

  1902. Skip analytics intro bucket + SSOT mapper (0.1.559) · 75c072d

  1903. Step 1 reconciliation 2026-04-29 + skip-analytics SSOT gap · 7b74f27

  1904. V0.1.558 ROUTES marketing build fix + gap row · 65535b8

  1905. ROUTES marketing paths + document-scroll segments (0.1.558) · 0f315dd

  1906. History line v0.1.557 compatibility band i18n · 20005a4

  1907. I18n universe match-layout bands (0.1.557) · 509e04f

  1908. Transparent journey LoadingScreen overlay (no black flash) (0.1.544) · 5513d9c

    Route shells already use (pages) main gradient; stacking BRAND_ORB ambient base on LoadingScreen caused a near-black slab during hub/reflection/connection transitions. Spinner + message only with bg-transparent.

  1909. Instrumentation 0.1.543 Done + stage curl evidence · 0f90f90

  1910. Split instrumentation.node for Edge Turbopack (0.1.543) · f188392

    Node-only uncaughtException capture lives in instrumentation.node.ts; instrumentation.ts dynamic-imports under NEXT_RUNTIME=nodejs only.

  1911. §5 explainer Done + 0.1.543 instrumentation Open + reconciliation (night) · 69ff1f7

  1912. §5 ship verification 854a74fe + stage web 0.1.542 curl evidence · 07ff92e

  1913. Journey explainer ROUTES parity + legacy hyphen redirect (0.1.542) · 854a74f

    - ROUTES.JOURNEY_HOW_IT_WORKS uses journeyAppPath(explainer); legacy phase=how-it-works → explainer - OpenAPI journeyWelcomeCompleted description: phase=journey-intro - KB journey-path-phase + doc/table parity; i18n explainer grid; release-notes bundle

  1914. Step 1 reconciliation — reopen §5 explainer row (routes HEAD ≠ working tree) · f6f60ca

  1915. JourneyRoutePhase SSOT, track atomic/lib Vitest, 0.1.540 · f887dc2

    - Root .gitignore: negate app-source/20_web-client/tests/atomic/lib/** for CI - journeyRoutePhase.ts + journeyRoutePhaseConstants.test.ts - Stage evidence: AGENTS + Fleet KB + MASTER plan (curl 0.1.540)

  1916. Audit 2026-04-29 + §5 vocabulary Done (ADR) + §8 AGENTS dedupe row · ec9a49c

  1917. ADR Explore shell vs Match vocabulary + KB cross-link · 16a311d

    Accepted decision: product Match/`/match` vs ExploreShell* gate identifiers; optional symbol rename deferred.

  1918. docs(plan): Explore shell Done + reconciliation 2026-04-29; Step 2 mitigation. · b0e7213

  1919. Explore shell nav gates + profile gate stamps (0.1.537) · 984b519

    useAppShellNavGates + evaluateExploreShellMatchSurfaceReadiness (solo signal parity with viewerMatchingSignalReady); deriveExploreShellActiveGate; AppShellNavGateOverlay / ExploreShellGateModalLayer; AppNav + ChatsPageClient intercepts; profileGateStamps for stable React Query gate deps; backend DISCOVERY doc cross-link; Vitest atomics.

  1920. docs(plan): §5 profile photo Done + reconciliation; §2 stage line. · 9463d6c

  1921. Profile photo above Profile information (0.1.536) · cbebe6e

    Settings + Discovery UserProfileMenu: ProfilePhotoEditorCore before ProfileInformationSection; modal header text-only. Atomic tests + PROFILE_SURFACES; release-notes bundle refresh.

  1922. Step 1 reconciliation 2026-04-28 — stage 0.1.535, doc-vs-git reopen · 26186d4

  1923. PhaseMatch i18n + skip navigation DRY (0.1.535) · ebc67f3

    Rename journey.matchmakingPath discovery* keys to phaseMatch* across locales. Add nextJourneyStepForSkipNavigation for QuestionPhaseBase skip/early-continue paths.

  1924. §8 backlog + journey KB phaseMatch keys (0.1.535 prep) · 90d9081

  1925. HowItWorks five-card vs hub four-phase (KB + JSDoc) · 0bbc493

    Web 0.1.534 — MASTER §5 HowItWorks row, §2 parity, Step 2 gap mitigated; AGENTS semver.

  1926. Step 1 reconciliation + Step 2 journey gaps (2026-04-28) · 5900b52

  1927. Document discoveryLabel vs match phase id; §5 backlog shipped rows; refresh stage table. · 819e2f3

  1928. Remove unused JourneyConstellation and JourneyCircle · 1c66728

    No app or feature imports; hub uses JourneyMatchmakingPath + resolveJourneyPathPhase. Update journeyPhases module doc, orb-brand/JourneyConstellation label helper JSDoc, journey-constellation-brand notes, primitives README, and feature/responsive docs rows.

  1929. Add §5 journey hub SSOT vs landing pentagon + backlog · 8d1babf

  1930. Stage curl evidence web 0.1.525 · 7c74d2e

  1931. AGENTS + MASTER + todos — shell pathname guards 0.1.525 · 9cd55d7

    Evidence: tenant-rebuild-web-client + curl / curl parity.

  1932. Shell pathname guards for Match/Chat (routes.ts) · 8925a49

    Add isMatchShellPathname / isChatsShellPathname using pathnameWithoutLeadingLocale and exact or /segment/ prefix checks — avoids naive substring matching. Wire AppPagesLayoutClient and AppNav; add Vitest routesShellPathname. Bump web to 0.1.525; refresh release-notes bundle.

  1933. AGENTS + MASTER + todos — AppPagesLayoutClient route DRY 0.1.524 · 4a49cca

    Evidence: curl /api/health 0.1.524; tenant-live-health public_edge.ok.

  1934. DRY AppPagesLayoutClient match/chats route flags · 398ec70

    Single onMatchRoute / onChatsRoute / pushPromptEligibleSurface (onMatchRoute || onChatsRoute). Remove discoveryFullBleed duplicate pathname.includes("/match"). Bump web to 0.1.524; refresh release-notes bundle.

  1935. Fix hooks.ts JSDoc line wrap for push prompt mount · faf3f97

  1936. AGENTS + MASTER + todos — push prompt shell mount 0.1.523 · a77766a

    Stage evidence: curl /api/health 0.1.523; tenant-live-health public_edge.ok.

  1937. Shell-mount push browser entry prompt on Match/Chat · 007a45d

    Mount PushNotificationsBrowserEntryPrompt once from AppPagesLayoutClient with eligibleSurface for /match and /chats paths. Remove duplicate mounts from DiscoveryPageClient and ChatsPageClient so Match ↔ Chat navigation does not reset scheduling or show a second modal. Bump web version to 0.1.523; refresh release-notes bundle.

  1938. Stage web 0.1.522 curl evidence · 6d1d001

  1939. AGENTS + todos queue — Web Push UX 0.1.522 · 87a551e

  1940. Match/Chat push consent modal; drop onboarding auto-request (0.1.522) · eda65a7

    - Remove enablePushNotifications from welcome onboarding submit (root cause of immediate browser prompt) - PushNotificationsBrowserEntryPrompt: BaseModal + bullets for Match + Chat; sessionStorage dismissed/enabled - Mount on DiscoveryPageClient + ChatsPageClient (inbox + embedded thread) - i18n profile.settings.notifications.browserEntryPrompt* (en/de/es/fr/ar); profileUiMessageKeys - device README + hooks doc + PROFILE_SURFACES navigation note

  1941. Stage web 0.1.521 curl + public_edge evidence · 6bbb018

  1942. Todos Chat onion #3 finding; AGENTS + MASTER stage 0.1.521 · 89d15c1

  1943. - Root cause: raw | in 502|503|504 broke GFM columns (same class as §4.2 Web Push) - Extend Pipe-table hygiene process note; Evidence + chat-onion document history - Regenerate re… · 1df95e5

    - Root cause: raw | in 502|503|504 broke GFM columns (same class as §4.2 Web Push) - Extend Pipe-table hygiene process note; Evidence + chat-onion document history - Regenerate release-notes bundle

  1944. Mandatory onboarding helper notes reflection URL contract · 2ab080d

  1945. AGENTS stage 0.1.520 evidence; MASTER §2 parity; todos queue · a026dbd

  1946. MASTER chat phases parity 0.1.519; onboarding E2E contract; todos queue · 5fddc0b

  1947. Document JOURNEY_YOU vs reflection; E2E asserts section=reflection · aa0125c

    - ROUTES.JOURNEY_YOU JSDoc: legacy naming; post-welcome onboarding uses JOURNEY_REFLECTION - ensureMandatoryOnboardingCompleteForShellE2e: URL must include section=reflection after submit - Semver 0.1.520; regenerate release-notes bundle - chat-onion-refactor-plan: Code layout row 2026-04-29 sweep stamp

  1948. Align public-edge evidence row with web 0.1.519 · 9f430c2

  1949. Canonical stage web curl 0.1.519 · 379635c

  1950. Verify stage web 0.1.519 onboarding navigation deploy · 9e39962

  1951. Refresh release-notes bundle after Fleet rebuild · 906be92

  1952. Route post-onboarding save to Journey reflection · a727d4f

    Welcome onboarding used ROUTES.JOURNEY_YOU (/you) after submit while the CTA says "Continue to reflection". Replace with ROUTES.JOURNEY_REFLECTION (phase=progress&section=reflection). Document in PROFILE_SURFACES; bump 0.1.519 and regenerate release-notes bundle.

  1953. Todos queue mirror + MASTER — §4.2 finding and Chat onion #3 note · 9d6d188

    Sync backlog with markdown repair; optional wording in historical mirror rows replaced with working-loop framing where §5.2 E2E was referenced.

  1954. Fix §4.2 Web Push pipe-table row and transport index hygiene · ff5b99d

    The Connection-request Web Push row contained an unescaped | inside a markdown table cell, breaking column alignment. Replace with explicit Fastify paths (request-conversation, request-chat). Document pipe-table hygiene in the process section; extend chat-onion Evidence row with wc -l / atomics re-verify.

  1955. Normalize profile-photo mission curl rows; document release-notes bundle fix, Fleet deploy evidence, and MASTER §2 stage parity. · 0dc2f15

    Normalize profile-photo mission curl rows; document release-notes bundle fix, Fleet deploy evidence, and MASTER §2 stage parity. Cursor queue mirror updated.

  1956. Regenerate release-notes bundle and bump 0.1.518 · 5559256

    Committed bundle had stale webClientVersion (0.1.499) vs package.json; verify:release-notes failed and /release-notes lagged /api/health on stage. Fleet rebuild refreshed generated JSON from git log; prebuild verify passes.

  1957. Align birth-year mission checklist with 0.1.517 ship evidence · 5e80171

  1958. AGENTS + Fleet KB — stage web 0.1.517 BirthYearTextInput evidence · ad18cf6

  1959. BirthYearTextInput DRY + MASTER §4 + PROFILE_SURFACES · 0719d85

    Shared calendar birth-year field for onboarding, ProfileEditForm, ProfileInformationSection. Web 0.1.517; chat phase metrics unchanged (plan §2).

  1960. AGENTS + Fleet KB — stage web 0.1.516 birth year input evidence · d2852dd

  1961. Birth year text input — no leading-zero stickiness · 27848b1

    Use type=text + birthYearTextInputDisplayValue; number inputs left a visible leading 0 (e.g. 01984) while parse already normalized. Web 0.1.516.

  1962. MASTER web-client follow-ups plan + backlog + Fleet KB evidence (stage 0.1.515) · f8e3b83

    - Add tracked MASTER plan (git add -f; .cursor/ default-ignore). - todos: chat onion wording neutral; profile mission + KB README gap closed. - app-fleet-cli-commands: Evidence row web 0.1.515. - AGENTS: canonical stack + Web 0.1.515 narrative (verified curl).

  1963. Rename onboarding photo gate to shouldShowOnboardingProfilePhotoInLead · 9181d69

    Accurate name for lead-slot gating (not a separate preview row). Web 0.1.515.

  1964. AGENTS + todos — stage web 0.1.514 onboarding lead circle evidence · 7845727

  1965. Show onboarding profile photo in lead circle · dcb77f6

    - Render PeerProfilePictureOrOrb in the primary circle when photo is ready; camera placeholder only when not ready. - Upload row uses replace vs upload i18n; data-testid onboarding-profile-photo-lead. - PROFILE_SURFACES + onboardingProfilePhotoPreview module docs; web 0.1.514. - todos.md: mission aligned with lead slot + pending stage proof.

  1966. AGENTS 0.1.513 stage evidence and todos onboarding missions · a63795d

    - Canonical stage table + Web 0.1.513 narrative (curl + tenant-live-health). - Profile photo mission: gate helper + test id; §6 TODO inventory row.

  1967. Gate onboarding photo preview on profileId + test id · d299c2e

    - Add shouldShowOnboardingProfilePhotoPreviewRow (lib/profile) and tests. - Onboarding: data-testid onboarding-profile-photo-preview for E2E. - PROFILE_SURFACES.md: document replace-row preconditions. - Version 0.1.513.

  1968. Stage 0.1.512 evidence, todos, chat onion wc-l anchors, KB plan index · 4a59a9c

    - AGENTS.md canonical stage table + Web 0.1.512 narrative (deploy + curl + tenant-live-health). - todos.md: profile photo + birth year missions; chat onion table note. - chat-onion-refactor-plan.md: refresh wc -l and atomic test counts (2026-04-28). - .cursor/kb/README.md: link to web-client deeper-followups MASTER plan.

  1969. Profile picture initial loading state and birth year input policy · 70f732f

    - Export profilePictureObjectUrlInitialStatus and use lazy status in useProfilePictureObjectUrl so first paint matches the fetch the effect starts (fixes empty onboarding preview). - PeerProfilePictureOrOrb: show error shell whenever status is error. - Birth year: controlled input + parse strips leading zeros; coerce stored 0 to null. - Bump package.json to 0.1.512.

  1970. Refresh ifeoma-tc PACKAGE_INDEX metadata · e7b4fa7

    Regenerated table-of-contents timestamp and key ordering from Fleet merge-env.

  1971. Chat transport notes, canonical stage table, and authenticated-chat CI · d6352d1

    Align agent rules with chat refactor documentation; extend main-features checklist; refresh MATCHING_PRIVACY evidence; record stage semver in AGENTS.md; add web-client authenticated chat E2E workflow.

  1972. Prefs hydration, stale async guard, and structured logging · 5931218

    Gate preference saves until successful load; add stale async generation helper; log runtime-config probes, token decode, sign-out subscribers, and positioning errors; strict quadrant validation; admin question upload row error metadata.

  1973. Chat transport identity, polling staleness, and messaging UX · 0137cb8

    Harden transcript polling vs stale responses; unify thread identity checks; surface send failures consistently; refactor ChatSystem modes and session app; expand atomic tests for domain errors and cache sync helpers.

  1974. Profile query merges, settings resilience, rating submit flow · 4920f67

    Stable self-profile caches after uploads; safer settings/export/deletion prefs; coordinate connection rating mutations with refreshed query keys.

  1975. Connection stage query keys and cache invalidation · 23095bd

    Normalize stage query keys; extend ConnectionManager flows; align invalidation tests with multi-profile cache clears.

  1976. Journey reflection question bank failures and typed selection · bc99bd3

    Throw on invalid balanced selection and unsupported extraction rules; map load errors; align Reflection mode and hub/welcome UX with tighter journey hooks.

  1977. Discovery storage hardening and operator scope UX · 3fdc8df

    Persist match intent and universe guide with typed errors; tighten list/universe hooks and query keys; extend tests for storage modules.

  1978. Strict auth uid resolution and invalid-session shell UX · 7a1f6b5

    Typed auth errors, AuthProvider handling, shell copy for broken sessions, onboarding/profile guards, and biometric sign-out bridge; align authUid tests.

  1979. I18n for invalid session copy and universe guide persist · bec617a

    Expose app shell strings for unusable session UX; add discovery universe guide persistence failure message across base locales.

  1980. Semver, OpenAPI-aligned codegen, and release-notes refresh · 67b896b

    Bump web-client version; regenerate API types/clients/zod from contracts; refresh release-notes data; add E2E health version gate helper script.

  1981. Add behavior and tests for list conversations and two-peer private text paths; align generated zod with contracts; bump package version. · 4710cfc

  1982. Extend ConversationSummary in OpenAPI and regen codegen · f5c00fe

    Sync OpenAPI YAML with generated TS/zod artefacts for typed client and BFF payloads.

  1983. Backlog #4 npm script + fix chat-onion H1 corruption · 090b23c

    - package.json: test:e2e:ui-authenticated:chat-icebreaker-in-thread + semver 0.1.439 - chat-onion mandatory #4/#5 + Outstanding + Remaining short; document history row - tests/README: npm shorthand; AGENTS repo parity 0.1.439

  1984. Single process § (#3), fold detail into index para · f2849e3

    - Remove duplicate H2; keep operator/E2E + stronger API hub / RQ key hooks in one block

  1985. TypingStatusResponse in lib/types/chat (import audit) · 1596ee6

    - lib/api/types: TypingIndicatorResponse from @/lib/types/chat — no lib→features/chat/types coupling - features/chat/types re-exports TypingStatusResponse from lib SSOT; bump 0.1.438 - AGENTS repo parity + evidence row

  1986. Repo web 0.1.437 vs stage 0.1.435 + recent evidence · feb49da

    - Canonical table: repo parity 0.1.437; live web 0.1.435 until tenant-rebuild-web-client - Narrative row: send toasts, resolveMatchPeerKey→lib, icebreaker E2E green

  1987. Relocate resolveMatchPeerKey to lib/utils · 31d173d

    - SSOT in lib/utils for peer key (authUid vs Match.id) - chatGrouping/chatSorting/chatsInboxPeerDedupe import lib; chat path re-exports - Vitest tests/atomic/utils/resolveMatchPeerKey.test.ts; bump 0.1.437

  1988. Send-failures row in chat-transport; README for icebreaker E2E · 37f26cc

    - chat-transport HTTP table: outbound send toasts vs resolveMessagingSendToastPresentation - tests/README: optional chat-icebreaker-in-thread spec, env + example command

  1989. Typed send-failure toasts for messaging API · fb3c8c3

    - resolveMessagingSendToastPresentation: 429, CHAT_SESSION_PERSISTENCE 503, upstream 502/503/504, fetch-style network - i18n: chat.errors.toastSendRecoverableTitle + sendRateLimited/upstream/persistence/network - Atomics: resolveMessagingSendToastPresentation.test.ts; chat slice 109 tests - chat-onion-refactor-plan: mandatory #1 partial, vitest counts

  1990. Move chat-sync under features/chat, thin pages, internal E2E seed · 0649634

    - Relocate messaging sync to features/chat/sync; browserCapabilities to lib/browser - Barrel: explicit hooks exports; ESLint restricts sync imports outside feature - Chats/Discovery/Connections page clients live under feature pages - Backend: POST .../e2e/seed-conversation-request provisions initiator via getOrCreateProfile; optional advanceToConversationActive - Docs, AGENTS semver, release-notes data, main-features index; chat-onion plan Phase 3.3 baseline ~1170 LOC Excludes tenant PACKAGE_INDEX.yaml and .env.st…

  1991. Never classify scope optional/deferred without user approval · 05975d5

  1992. Optional onion backlog table; semver 0.1.425 · 91d000b

  1993. Regenerate release-notes bundle for 0.1.425 · a4d2dab

  1994. Onion optional slices — peer scope strip + transport docs · c14cd9e

    - Extract ChatContainerPeerDataScopeNotice from ChatContainer (3.3, no UX change). - Clarify Phase 1.2 barrel: use resolveChatThreadTransport for combined gates. - chat-transport: supplementary 4.2 call-site matrix; defer 6.6 optimistic-send note.

  1995. Queue mirror — continuation sweep (/en/you, backend logs) · f02d489

  1996. Queue mirror — 2026-04-28 chat-onion + stage sweep · db9735f

  1997. Canonical core/ paths + useChatMode line anchors · c83de84

  1998. Evidence row + document history (2026-04-30 coherence) · c8846b3

    - Plan summary Evidence: 2026-04-30 archive pass without duplicate SHAs in table - Document history: merge 0ed08b72 narrative + follow-up clarification - todos: mirror sweep + PACKAGE_INDEX checkout note

  1999. Reconcile Code verification + obsolete archive (L29–§details) · 0ed08b7

    - Clarify pick* + useChatThreadController wiring; Vitest bundle date - Still-optional rows + Phase 6 note (no phantom Partial backlog) - Obsolete snapshot rows 3–6: superseded drafts (ChatSystemActiveThreadView, atomic 88/22 @ ~0.1.424, 6.6 + pick*) - Archive preamble + § After closure / anchor line refs (useChatMode 189–214, 2026-04-30)

  2000. Phase 5 atomic verification row ~0.1.424 + todos sweep row · 9020a87

  2001. Stage snapshot Web 0.1.424 + API 0.1.56; evidence paragraph (ifeoma-tc) · e28ac42

  2002. Release-notes from tenant-rebuild-app; AGENTS + plan + todos evidence 0.1.424 / 0.1.56 · 146046e

  2003. Close 2026-04-28 connection workflow + chat onion mirror · ab8e3bc

  2004. Repo parity Web 0.1.424 + API 0.1.56; stage redeploy gate · 7d98a96

  2005. Onion ADR/checklist/plan coherence (pick*, ActiveThreadView, wc -l) · 7fedc37

  2006. Pick shared ChatSessionApplication per thread + ActiveThreadView · 71e1149

    - pickChatSessionApplicationForThread: dedupe ChatSessionApplication for parent/embedded chats - ChatSystemActiveThreadView: Phase 3.3 slice for happy-path container surface - Wire useChatThreadController / handlers / polling; ChatSessionApplication tests - Design-system chat glass/inset surfaces exports - Bump web-client to 0.1.424

  2007. Incoming connection workflow badge + unified cache invalidation · e0358c4

    - Incoming requests: conversation_requested plus peer-initiated chat_requested (incomingConnectionWorkflowPending helper + tests) - Discovery requestConversation: invalidateConnectionCaches after success (replaces narrow incomingRequests invalidation only) - AppNav docstring aligned with badge semantics

  2008. Web push for connection workflow requests · b668696

    - ConnectionWorkflowPushDispatcher: conversation + private chat request notifications (preference gate + i18n; fire-and-forget with structured warn on failure) - Wire dispatch after successful request mutations in connections routes - Vitest preference gating contract - Bump backend to 0.1.56

  2009. Mirror 2026-04-29 backlog vs open working tree · 97df2ee

    - References docs commit fc27ac35 pushed; stage web/api semver evidence - Lists Cursor todos A-E for topical commits + E2E + env noise cleanup

  2010. - chat-transport: pair session blob; no client overwrite of currentTurn when messages empty - chat-onion: Evidence line counts, ICEBREAKER refs to CHAT_* tokens, 2026-04-29 histor… · fc27ac3

    - chat-transport: pair session blob; no client overwrite of currentTurn when messages empty - chat-onion: Evidence line counts, ICEBREAKER refs to CHAT_* tokens, 2026-04-29 history - AGENTS canonical stage semver (web/backend) + fleet rebuild evidence - useChatModule docblock refs chat-transport; release-notes bundle refreshed by Fleet

  2011. Fix onion plan stale-check line refs (describe Done table) · dd91aad

  2012. PLAN_STATUS=closed HTML marker in onion plan (clarify archived Partial) · 8abc9a0

  2013. 4.2 BFF cross-refs in hooks and api (messages JSDoc-safe) · 5f13c63

    - Point useChatMode, useMessagePolling, useTypingStatus, downloadServerChatTranscriptExport, api barrel to chat-transport BFF index; fix messages block comment (no */ inside). - Web 0.1.405; plan history + AGENTS.

  2014. Staleness callout + messages module BFF cross-ref · 9196f74

    - Plan: blockquote so Partial tables are not mistaken for open work. - messages/index.ts: point to chat-transport BFF index (4.2).

  2015. Icebreaker route module + BFF index (4.2); plan obsolete snapshot · 6a82711

    - Add ChatSystemIcebreakerRoute for icebreaker Container+shell (3.3). - Document features/chat → BFF paths in chat-transport.md; archive pre-closure Partial table in plan. - Web 0.1.404; AGENTS + release notes.

  2016. Extract ChatSystemErrorShells for early-return gates (3.3 slice) · 515744a

    - Add ChatSystemErrorShell: DRY profile/messages/session error frames (same UX). - Shrink ChatSystem.tsx (~1374 lines); plan doc notes stale Partial snapshot + 3.3 progress. - Web 0.1.403; release notes bundle; AGENTS stage table.

  2017. Close chat onion plan, typing 409 handling, and E2E match-intent fixes · c93234e

    - Mark chat-onion-refactor-plan as complete; ADR and chat-transport reference updates. - Re-export chat connection transport from @/features/chat/core; consolidate imports. - Map connection-stage 409 for typing polls without noisy error logging; add atomic tests. - Harden match_intent_scope_gate E2E (post-Continue URL) and add route pattern atomics. - Sync AGENTS.md stage evidence for web 0.1.402; refresh release notes bundle and semver. - Discovery shell/layout and i18n touch-ups; E2E helper improvements (app she…

  2018. Release-notes bundle after fleet rebuild · b653bff

  2019. Regenerate release-notes bundle (web 0.1.388) · 1ffca12

  2020. Chat onion plan checklist, stage 0.1.388, transport ADR alignment · 1a4c967

    - chat-onion-refactor-plan: master checklist [x], product flow cleanup, Phase 1 note - AGENTS: canonical stage table + Web 0.1.388 evidence row

  2021. Chat onion — icebreaker ChatContainer, press-reveal cache sync, errors · 6ca97e6

    - ChatSystem: wrap icebreaker in ChatContainer; layout transcript-first - useChatMode: optional synchronizeCachesAfterPressReveal (DRY with synchronizeConnectionCachesForThread) - IcebreakerConnectionMode: mapChatApplicationError + logComponentError - ConnectionManager/validation: document invalidate vs thread sync; onboarding md:max-w-56 - Bump version to 0.1.388

  2022. AGENTS + fleet KB evidence web 0.1.385 Phase 4.1 · cd76989

  2023. AGENTS + release notes for web 0.1.385 (Phase 4.1) · a3b3dc7

  2024. Chat application errors and cache-sync log lines (Phase 4.1 partial) · 9f11ae5

    - chatApplicationErrors: thread-identity i18n key map, formatMissingApplicationLogWithThreadIdentity. - synchronizeConnectionCachesForThread: named DRY default log line; explicit override supported. - ChatSystem/ChatView pass thread-identity context when application is null. - chat.application.threadIdentity.* in 5 locales; docs; web 0.1.385. - Fix resolvePeerAuthUid test agreedAt as Date for Connection type.

  2025. AGENTS stage row + fleet KB evidence web 0.1.384 shells · faa5ebc

  2026. Stage evidence for web 0.1.384 chat shells · 73aefef

  2027. AGENTS + release notes for web 0.1.384 (chat shells deploy) · 7cc1102

  2028. ChatAnonymousShell and ChatPrivateShell for ChatSystem (Phase 3.2) · 693e2ae

    - Named shells delegate to AnonymousMode / PrivateMode; ChatSystem uses shells barrel. - Docs: chat-onion plan 3.2, chat-transport. Web 0.1.384.

  2029. ConnectionStage key in matching-system; fleet KB evidence 0.1.383+API 0.1.53 · 1720c9b

    - matching-system: icebreaker sync points to connectionStageQueryKey. - app-fleet-cli-commands: append evidence row (tenant-rebuild-app, stage parity).

  2030. - Fleet full app rebuild aligned stage backendVersion with 10_backend 0.1.53. · 44e72ba

    - Regenerated release-notes.generated.json (fleet). AGENTS.md canonical table + evidence.

  2031. Stage evidence for web 0.1.383 connectionStageQueryKey deploy · 4c80d34

  2032. Release-notes Activity methodology for same-day commit bursts · bd5ca16

    - Clarify interval spread: window from last day with a commit before current day. - i18n methodology (5 locales), types JSDoc, commit doc, atomic test header. - Regenerate release-notes.generated.json (web 0.1.383).

  2033. DRY connectionStageQueryKey for connection stage cache · fcf541b

    - Centralize ["connectionStage", peerAuthUid] in connectionStageQueryKey. - Wire useConnectionStage, invalidateConnectionCaches, useChatMode, ChatView. - Docs: chat-transport.md, chat-onion-refactor-plan.md. Web 0.1.383. AGENTS.md.

  2034. Link chat-transport to components/shells · 0c0e8a0

  2035. Chat shells ChatIcebreakerShell + ChatTranscriptReadOnlyBanner · ea53cf9

    - Phase 3.2: extract transport UI from ChatSystem; barrel exports in components/shells - Remove unused CHAT_SYSTEM_DEGRADED_BANNER_AUX_TEXT_CLASSNAME import from ChatSystem - Web 0.1.382; plan + AGENTS; stage verified via curl /api/health

  2036. SynchronizeConnectionCachesForThread + end-connection cache sync · cfea501

    - Add util DRYing ChatView and ChatSystem post-mutation connection cache refresh - handleEndConnection and handleEndAndReport call it after endConnection (no connection seed) - Vitest; web 0.1.381; AGENTS + chat-onion plan + chat-transport

  2037. OpenAPI DTO checklist (0.2); DRY safety discovery invalidation · 43db977

    - Add docs/chat-openapi-dto-checklist.md; mark Phase 0 complete in plan - Extract invalidateDiscoveryAfterPeerSafetyAction; ChatSystem block path uses it - Vitest for util; mock logComponentError in test; web 0.1.380; AGENTS stage evidence

  2038. Chat onion core, ChatSessionApplication, ChatView cache sync · 1e18096

    - Add chat/core (ThreadIdentity, resolveChatThreadTransport, icebreakerFlow) - Add ChatSessionApplication + useChatThreadController; wire ChatSystem transport - Route ChatView consent/request flows through synchronizeCachesAfterConnectionMutation - Optional connection seed matches invalidateConnectionCaches; Vitest coverage - Docs: chat-onion-refactor-plan, chat-transport, ADR; AGENTS repo parity 0.1.379 - Bump web-client to 0.1.379

  2039. Chats inbox peer key + peerAuthUid enrichment · 1068e58

    - Dedupe key uses resolveMatchPeerKey via chatsInboxMatchPeerKey (aligned with status maps). - Enrich missing Match.peerAuthUid from discovery/connection maps before dedupe. - Version 0.1.377.

  2040. Canonical peer auth for connections and icebreaker · 9a1b8fa

    - Export peerWireIdToCanonicalAuthUid; resolve direct connection rows where userA/userB stored a profileId as the peer slot to the profile authUid. - DRY: all connection routes resolve peer via resolveChatPeerOtherUserIdForViewer before services, persist, and icebreaker transcript (fixes wrong-pair writes). - listConnections dedupes by canonical peer after profile mapping. - Tests: viewerPairDedupe canonical merge. Version 0.1.53.

  2041. Release-notes + AGENTS/todos — stage web 0.1.376 · API 0.1.52 (icebreaker + dedupe) · a9bbc64

  2042. Icebreaker cache merge, transcript UI, wire type · 169ade1

    - Merge mutation connection into connectionStage query before refetch; await refetch + reload messages - icebreaker_transcript ChatMessage mapping, MessageBubble, client export - Show transcript strip during icebreaker; i18n for labels - Docs: matching-system icebreaker source of truth - Bump web to 0.1.376; refresh release-notes bundle

  2043. Persist icebreaker steps as chat transcript rows · d9d7be5

    - Append icebreaker_transcript message lines after submit-step + session persist - Pure payload builder + Vitest; server transcript export i18n - Bump backend to 0.1.52

  2044. Dedupe inbox rows per peer auth + log invariant breaks · 9e28654

    - Web: collapse duplicate Match rows by canonical peer key in ChatsPageClient; log ChatsInboxDuplicatePeerRowsError via logComponentError when discovery yields multiple cards for one peer. - Backend: dedupe GET list paths (connections + conversations) by viewer-normalized peer with structured rootLogger.error when Mongo returns duplicate pair rows. - Tests: viewerPairDedupe (backend), chatsInboxPeerDedupe (web). - Bump web 0.1.375, backend 0.1.51.

  2045. Refresh PACKAGE_INDEX generated_at (Fleet) · c5e17e5

  2046. AGENTS + todos — stage web 0.1.374 deploy evidence · 4fd49f2

  2047. Refresh release-notes bundle after chat peer commits · 14c5383

  2048. Chat transport peer auth + mark-read + analytics · 6f891cc

    - resolvePeerAuthUidForChatTransport + chatConnectionTransportState (DRY with backend) - ChatView/ChatSystem/useMessagePolling/messages: canonical peer keys - Release notes analytics: same-day burst spread after quiet gap - Bump web to 0.1.374; regen release-notes bundle

  2049. Resolve chat peer id for profileId and peerProfileId · c9eb1f9

    - Add resolveChatPeerOtherUserIdForViewer (BOLA-safe via connection proof) - Wire chat routes to normalize otherUserId to peer authUid - Vitest: chat-session-null route tests - package.json 0.1.50 (align with deployed API semver)

  2050. Private chat photo upload without fetch(data:) — CSP · 221f894

    - Add blobFromDataUrl() to decode data URLs locally (connect-src blocks data:) - PrivateMode: use blob for uploadMedia after camera/file pick - Vitest: tests/atomic/utils/blobFromDataUrl.test.ts - Bump web to 0.1.373; refresh AGENTS.md + todos.md (stage evidence)

  2051. Release-notes after stage rebuild; docs stage 0.1.369 evidence · 7f0ee25

    Fleet tenant-rebuild-web-client refreshed git log bundle. AGENTS + todos mirror: live edge matches web 0.1.369, public_edge ok.

  2052. Align MessagingHeader safety button with title row · 96f25b3

    - Single flex row + items-center on all breakpoints; drop mobile column stack - Remove self-end on shield row (was bottom-aligning to subtitle) - Web 0.1.369; release-notes bundle; AGENTS semver note

  2053. Close 2026-04-28 queue mirror with commit refs · 8375cec

  2054. Canonical table + product note for mark-read body; todos open/closed rows. · 0b3aa86

  2055. Connection stage contracts, icebreaker wire, mark-read body · f77e1b0

    - markMessagesRead: otherUserId2 JSON for Fastify validateBody on mark-read - ConnectionManager/ChatView: ConnectionStagePayloadContractErrorPanel; wire from API - classifyDiscoveryConnectionStageField; connectionFromApiWire; icebreaker modules - Discovery/orbs/profile: explicit stage badge and orb colors; dateConversion DRY - i18n + release-notes bundle; version 0.1.368 Refs: GET /api/connections/stage payload; list row enrichments from OpenAPI.

  2056. Connection list/stage fields and ConnectionStageResponse typing · bd44db9

    OpenAPI: ConnectionStageResponse uses ConnectionConsent refs; stage payload fields for vibe-check and icebreaker; Connection gains list enrichments and anonymous_chat_active. Regenerate zod (contracts, backend, web) and TS client models.

  2057. MarkMessagesRead passes otherUserId2 for POST /api/chat/mark-read · dbb1619

    Regresses OpenAPI dual-param footgun: Fastify validates JSON body only. Ignore local *.har capture files at repo root.

  2058. Fleet CLI snapshot 0.1.357/0.1.49 + evidence row (cancel/503) · d80ce22

  2059. Refresh release-notes bundle; docs(agents): stage 0.1.357/0.1.49 evidence · 3fbf15c

    AGENTS.md: canonical table + row for cancel-request + 503 client recovery (verified on stage).

  2060. Record repo 0.1.357/0.1.49 vs stage until rebuilds · c71d9c7

  2061. Connection mutation 503 recovery and cancel response parsing · ae63513

    - apiDataConnectionMutation: recover CHAT_SESSION_PERSISTENCE_FAILED for generated client POSTs - nextjsConnectionMutation: same for press-reveal and icebreaker submit (BFF ApiError body) - Fix 503 JSON parser to match flat ChatSessionPersistence503WithConnection - convertConnectionDates: explicit error if connection is missing - Tests for parser, convertConnectionDates, and 503 paths

  2062. Cancel-request returns connection snapshot and aligns chat session · 8489a77

    POST /api/connections/cancel-request now mirrors other connection mutations: persistChatSessionAfterConnectionMutation, 503 CHAT_SESSION_PERSISTENCE_FAILED with connection snapshot, and 200 ConnectionMutationResponse body. Add route tests for success and persistence-503 recovery.

  2063. Stage web 0.1.354 evidence + release-notes (invalidateConnectionCaches test) · 12af61f

    - AGENTS + Fleet KB snapshot and Evidence for 0.1.354; 0.1.353 note superseded - Regenerated release-notes from fleet rebuild - docs/agent-rules-changelog, todos queue mirror

  2064. Lock invalidateConnectionCaches seed contract (0.1.354) · e2df248

    Vitest: setQueryData receives mapped stage view; optional seed skips set. Bump semver for the next image.

  2065. Close Chats 0.1.353 queue mirror (evidence + commits) · dfb4f77

  2066. App-fleet evidence web 0.1.353 + snapshot table · 83bd711

    Append-only Evidence line (Chats consent); refresh canonical stage snapshot to match AGENTS; changelog row; check_kb_rule_links ok.

  2067. Release-notes bundle + AGENTS stage evidence (web 0.1.353) · 2a388ce

    Fleet tenant-rebuild-web-client refreshed the generated release-notes JSON; update canonical stage table and evidence after live health/build-info probes.

  2068. Chats consent sync + list loading (0.1.353) · 02da188

    - Seed useConnectionStage cache from connection mutation rows before invalidate - Decouple Chats list full-page block from listConversations; subtitle + spinner fallbacks - Poll connection stage every 2.5s while conversation_requested; keep 8s for conversation_active - Return ConnectionResponse from [redacted] - i18n: chats.page.loadingConversationIndex (all base locales) - Tests: refetch interval + mapConnectionToConnectionStageView

  2069. Continued working loop and agent behaviour consolidation · a4730a9

    - Add 'Continued working loop (product application repo)' to application AGENT_BEHAVIOUR.MDC: todos/todos.md sync, evidence-based closure, onion trace, strict refactors, stage ifeoma-tc, browser proof, Fleet/KB, i18n, design system, versioning, security, debug/test policy, finalisation. - Cross-link from app-pipeline AGENT-BEHAVIOUR §0.4, app-source rule, AGENTS.md - Changelog row for 2026-04-28

  2070. Refresh PACKAGE_INDEX (fleet table of contents) · 7c102d5

    Regenerated/merged index metadata and layer ordering. Does not include runtime env (see merge-env) or HAR captures.

  2071. Strict optional string[] wire + discovery filters · 91439d9

    - Add lib/utils/optionalStringArray (OptionalStringArrayWireError, optionalStringArrayOrEmpty) and atomic tests; replace silent ?? [] for interests, culture selections, shared lists - discoveryProfileAdapter: validate values object; parse core/sharedValues/interests - filterAndSort: parse list fields; min/max match require finite score (no ?? 0) - extractFilterOptions: strict list parsing - resolveConnectionDetailProfile: parse interests, sharedInterests, synergy - useChatListInboundSignals: explicit branch when c…

  2072. Strict release-notes Activity line-rate and errors · 8c32cad

    - Add ReleaseNotesLinesPerHourInputError and ReleaseNotesActivityModelParameterError in features/release-notes/errors for typed, code-classified failures. - parseLinesPerHourEquivalentInput: throw on invalid user text (no null returns). - getReleaseNotesActivityAnalytics: optional numeric lineRateOverride; assert finite positive line rate for bundle and override; drop Partial-parameter merge. - ReleaseNotesActivity: committed line rate + draft; charts update only after Apply (form submit) with explicit errors; Res…

  2073. Strict API mapping, typed errors, journey map parse · 0e077c2

    - Profile: ProfileMappingError + validate GET/POST/secure wire (no silent ?? coercions); mapProfileJourneyRecord wraps parseJourneyRecordMap into profile errors - Journey: JourneyResponseInvariantError; getQuestions/getConnectionStatements require arrays and matching count; saveAnswer uses parseJourneyRecordMap - lib: remove normalizeJourneyRecordMap; parseJourneyRecordMap + JourneyRecordMapInvariantError - mergeSelfProfileJourneyCache + admin UserProfilesTab use strict parse - Chats/connections/discovery: explici…

  2074. Sync release-notes after stage fleet rebuild · 7022c57

  2075. Journey gate for match/universe when solo signal absent (0.1.336) · 93460a3

    - Wire viewerMatchingSignalReady from API; CTA to journey on list + universe - i18n discovery.list.viewerSignalGate* (5 locales) - Regenerate release notes

  2076. OpenAPI + axios client + api-types for discovery list gate field. · 734dcac

  2077. Empty discovery when viewer has no solo matching signal (0.1.48) · 8a5a594

    - Add viewerDiscoveryGate (computeProfileMatchingSignalDimensions + all-zero check) - getDiscoveryProfiles: early return viewerMatchingSignalReady false - getDiscoveryProfile: 403 DISCOVERY_VIEWER_NOT_READY - Tests: rich viewer profile mocks; gate case - DISCOVERY_AND_MATERIALIZED_MATCHES: document gating

  2078. Stage web 0.1.335 chats peerAuthUid evidence; dedupe semver row · 7135618

  2079. Sync release-notes after tenant-rebuild-web-client · d174ec2

  2080. Resolve chats peer auth from connection row (0.1.335) · ffad3aa

    Chats list passed peerAuthUid to ConversationMatchCard only when the peer appeared in the paged discovery map, so connection-only rows lost the peer Zitadel subject and showed Connection not available / could not Accept. - Add resolvePeerAuthUidForChatsListRow: prefer match.peerAuthUid, then map - ChatsPageClient: single resolved uid for statusMap and card - Tests for connection-only + empty discovery map

  2081. Align last verified row with web 0.1.334 / API 0.1.47 (stage evidence) · 4215e23

  2082. Mark API 0.1.47 stage evidence · 4bbfb35

  2083. Regen release-notes after fleet; AGENTS API 0.1.47 verified on stage · c276dd9

  2084. API 0.1.47 matchScope discovery hardening · f01d7ac

  2085. MatchScope discovery skips missing dimensions and all-zero axes · 9919dbe

    - tryReadMatchDimensionsFromDocument + isNoStoredDimensionalSignal - Filter matches before session reweight; empty list returns 200 - Connection list enrichment: no throw when scope set but dimensions absent - Tests: discovery + enrichment + dimension helpers Bump to 0.1.47.

  2086. Regen release-notes after fleet; AGENTS stage API 0.1.46 verified · 890b56a

  2087. API 0.1.46 discovery orphan-row fix; table parity · 79692d5

  2088. Return partial discovery list when match rows are orphaned · b41f28e

    Omit unresolvable rows instead of aggregating into a 500. Log per-row error, warn with skip counts, and keep totalCount as match-row cardinality. Bumps package to 0.1.46.

  2089. Sync release-notes after fleet rebuild; AGENTS stage 0.1.334 evidence · a2c2c6c

  2090. 0.1.334 + release notes; AGENTS stage table · 686d048

    Regenerate release-notes data. Document 0.1.334 universe ring placement; stage edge still 0.1.333 until tenant-rebuild-web-client.

  2091. Place discovery universe peers on connection-ring annuli · d903cbc

    Peers use connectionRing (or match-% bands aligned with backend) for XZ radius; strongest-dimension sector and separation unchanged. Update UNIVERSE_ARCHITECTURE and dimension module docs; extend atomic tests and add connectionRingLayout.

  2092. Document Mongo profile purge via Fleet and refresh stage evidence · 3272f16

    Update app-fleet-cli-commands.md, README, AGENT rules, pipeline runners, AGENTS.md, and agent-rules-changelog. Canonical snapshot table: web 0.1.333, API 0.1.45, cloud 1.0.4; stage verification and browser note for 2026-04-26.

  2093. Tenant-purge-mongodb-profiles and runner purge-mongodb-profiles · 742a484

    Expose DELETE /api/admin/profiles (Super Admin clear-all contract) with the same bearer options as journey bank seed: cli.py tenant-purge-mongodb-profiles; FleetPublicInterface.purge_mongodb_profiles; run_tenant_fleet_manager --action purge-mongodb-profiles with --force/--keep-self/--dry-run. Add HTTP helper and unit tests for parse plus dry-run report.

  2094. Stage evidence web 0.1.333 + full-workflow E2E command · 792443a

  2095. Regen release-notes after fleet pre-rebuild (0.1.333 stage) · a344c98

  2096. Full authenticated E2E workflow + 0.1.333 · 40a68f2

    - Add exerciseFullProductWorkflowShellE2e: onboarding, You settings, reflection and connection banks, match universe, list, optional Connect, chat, logout - assertSignedInConnectionPhaseNoSessionError; export clickAppNavLink - New spec full-product-workflow-smoke; npm run test:e2e:ui-authenticated:full-workflow - Bump package to 0.1.333; regen release-notes data; document in tests/README and AGENTS.md

  2097. Magic-link login vs Playwright auth for operators · b533890

    - AGENT_BEHAVIOUR.mdc §9: 9.1 fleet magic-link-create; 9.2 setup+ui-authenticated - Expand magic-link-fleet-cli.md: stage example, --mode vs --profile, hygiene, Playwright table and run command; renumber live-health/stack sections - Index KB in app and app-pipeline README; app-fleet-cli-commands blurb; root AGENT_BEHAVIOUR.MDC browser-session bullet; link check passes

  2098. Document magic-link session + primary nav verification on stage · 1625438

  2099. Refresh stage evidence for web 0.1.332 and operator browser sweep · 41981a1

    - Replace stale 0.1.328 last-verified line with curl, tenant-live-health, and 540x960 landing/release-notes; note onboarding redirect without session.

  2100. Align swimlane with deployment probe path and module policy · 4c39977

    - Remove misleading FleetManager-to-targets reconcile SSH edge; document that host probe and inventory go through DeploymentInterface and that infra reachability gates are separate orchestration. - Add MODULE_BOUNDARIES note distinguishing deploy transport from fleet gates.

  2101. Regen release-notes after web rebuild · 6adc29a

  2102. Remove E2E-driven list bailouts; fix match-list in tests · 6307820

    - Restore DiscoveryPageClient + UniverseView + discovery index to pre–ListViewRouteNavButton - Delete ListViewRouteNavButton (no product shims for Playwright) - match-list spec: baseURL goto, assert not sign-in, list subtitle; scope helper uses force on Continue - match_intent_scope_gate_e2e: 8s h1 probe + force continue (test-only) - Web 0.1.332, release notes, AGENTS (E2E policy note)

  2103. Scope loading shell, gate probe, double ensure · fd1ed25

    - DiscoveryPageClient: show LoadingSpinner when match intent scope status is loading (no empty main) - ensureMatchIntentScopeContinued: wait for gate heading OR Continue (10s), then submit - match-list: call ensure twice after Match for hydration ordering - web 0.1.331 + release notes

  2104. List-view testid, scope-gate short probe, match-list waits · 37660be

    - ListViewRouteNavButton: data-testid list-view-route-nav for stable Playwright selection - ensureMatchIntentScopeContinued: 8s gate-probe (avoid 45s penalty when scope already set) - match-list spec: prefer testid, 90s to list control - web 0.1.330 + release notes

  2105. Refresh release-notes after post-deploy + align AGENTS with stage 0.1.329 · 2ab7bf5

    - Fleet tenant-rebuild-web-client appended git commits to release-notes bundle; cloud 1.0.4 on stage per /api/build-info

  2106. - Regenerate release-notes data; document 0.1.329 discovery + E2E operator path · 4b589a2

  2107. Ui-authenticated journey + match list smoke · cd4ecc0

    - match-list: You hub, Match, list view via radio or List view button, list subtitle - match intent gate: 45s initial heading wait for slow stage - journey hub: effective en landing hero title helper; photo spec narrowed to journey + You settings

  2108. Add ListViewRouteNavButton for client-only list route escape · e24c534

    - Reuse list toggle i18n; wire DiscoveryPage pending shell and UniverseView loading/finish states - Export from discovery index for reuse

  2109. Operator commands for ES logstash index prune and ILM · ef09f79

    Add elasticsearch-prune-logstash-indices and elasticsearch-put-ilm-logstash under fleet operator, with remote bash scripts and unit tests. Bump app-fleet to 1.0.4. Document in README and cli.py examples.

  2110. Stage snapshot 0.1.328 / 0.1.45 / 1.0.3 + evidence row · 5670424

  2111. Stage verified web 0.1.328 after rebuild · a0aa894

  2112. Regen release notes and PACKAGE_INDEX after web rebuild 0.1.328 · 1aee160

  2113. Signed-in Journey + profile photo + Match list (web 0.1.328) · 9c282a8

    - Add match_intent_scope_gate_e2e: dismiss MatchIntentScopeGate before discovery fetch - New signed-in-journey-profile-photo-match.spec (hub, Settings upload, list/empty) - match-list peer modal uses same gate helper; docs + release notes + AGENTS

  2114. Fleet merged .env not committed; link merge-drift runbook · 0e7256c

  2115. Stage verification 2026-04-26 + fix repo parity row · a089c26

  2116. Regen release notes and PACKAGE_INDEX after web rebuild · 914a995

  2117. Signed-in Match list peer profile modal smoke (web 0.1.327) · 5cb75b4

    - Add ui-authenticated spec: /match/list → show details → Open full profile → Profile BaseModal - MatchCard: aria-label on Open full profile (narrow viewports + a11y) - tests/README.md, AGENTS; regenerate release notes

  2118. Release-notes after 0.1.326 peer profile modal (fleet regen) · 22b1e50

  2119. Peer profile as BaseModal aligned with You My profile (web 0.1.326) · 28fc518

    - PeerProfileSheet: replace fixed side panel with BaseModal (large), journey-style eyebrows, violet panels, rect-brand CTAs; ProfileIdentityStrip for peer identity - ProfileIdentityStrip: self/peer variant, optional name/bio overrides, invalid orb well - DiscoveryPageClient: comment update; AGENTS + release notes

  2120. Release-notes after journey hub 0.1.325 (fleet regen) · 7a2a9e3

  2121. Hub shows hero title above return-visit subline (web 0.1.325) · c8caeb2

    JourneyHubScreen: h1 (landing.hero.title) before journey.hub.returnVisitSubline under the milestone path. Update module docstrings, journey page/README, AGENTS; regenerate release notes.

  2122. Release-notes bundle after profile-picture commits (fleet regen) · 61adc4d

  2123. Canonical web 0.1.324 + profile picture UI note · a9691ae

  2124. Profile picture refresh after upload (query cache + media URL bust) · fc92ee0

    Apply POST/DELETE profile payloads to selfProfileQueryKey like onboarding. Add v= revision query param to profile-picture media GET; revision includes updatedAt and GridFS paths. Bump web to 0.1.324; regenerate release notes.

  2125. Release notes from fleet pre-rebuild (0.1.323) · e7a76b8

  2126. Canonical stack 0.1.323 / 0.1.45 / 1.0.3 + discovery evidence · fa9e854

  2127. Bump package to 1.0.3 (mongo-profile-journey) · 1fe203a

  2128. Operator mongo-profile-journey for profile audit · 66aa2a3

    Read-only mongosh summary: updatedAt and questionAnswers key list by email or authUid. Documented in app-fleet CLI KB for ifeoma-tc stage operators.

  2129. Profile maturity ring from solo signal axes · ac56c2c

    When a complete matchingSignalDimensions object is present, the maturity percentage is the mean of the five 0-100 axis scores (aligned with My profile radar). Shared axis key list and isComplete guard; stricter parse errors. Web 0.1.323; release notes bundle regenerated.

  2130. Include solo matchingSignalDimensions on discovery peers · 37e01b1

    DiscoveryProfile responses now carry the same server-computed five-axis solo signal scores as self GET /api/profile, so peer radar and overlap tables match the match row. OpenAPI and Zod schemas updated; profile collection audit doc amended. Backend package 0.1.45.

  2131. Sync release-notes bundle (874 commits, post-deploy) · 8066099

  2132. Web 0.1.322 + API 0.1.44 profile media hardening · f370153

  2133. useProfilePictureObjectUrl rejects empty or non-image blobs. · d909862

    PeerProfilePictureOrOrb resets and uses img onError to fall back to the gradient orb. Regenerate release notes.

  2134. Refuse to open a download stream when the files collection has no row or length is zero, avoiding 200 responses with empty bodies for stale gridfsId. · 8489941

  2135. Sync release-notes bundle after 0.1.321 · 2e27ca4

  2136. Remove MatchIntentScopeChip from /chats; keep scope UI on Match/discovery only. · 81c588c

    useConnections omits matchScope; useDiscoveryProfiles uses applySessionMatchIntentScope: false for enrichment. Document ListFilterToolbarRow and request type; update AGENTS.

  2137. Sync release-notes bundle (868 commits, post-0.1.320 deploy) · a554b57

  2138. Web 0.1.320 release notes + semver table · abdd337

  2139. Full release-notes history within configurable cap · e382595

    Replace fixed git log -n 800 with min(non-merge count, cap). Default cap is 50_000; override with RELEASE_NOTES_MAX_COMMITS. Bundle maxCommits records the effective -n. Document in docs/release-notes-commits.md. Regenerate bundle and bump to 0.1.320.

  2140. Connection rating scale — cyan track, white thumb, layout (0.1.319) · 3e281d9

    - connection-rating-scale-brand: #40C4FF active fill, chip glow, thumb glow - RatingCard: prompt → value → end labels → track → 1–10 chips; native buttons; chip segment fill matches current value; exports from design-system barrel - AGENTS + release notes

  2141. Reflection subtext matches question affordances (0.1.318) · 7400450

    QuestionCard: pick journey.questionPhase.promptSubtextChoiceOnly, promptSubtextTextOnly, or promptSubtextChoiceAndText from showTextInput/ showMultipleChoice. Replaces one line that mentioned writing your own on choice-only steps. i18n en/de/fr/es/ar; message key list; AGENTS; release notes.

  2142. 0.1.317 journey hub swap — mark stage as verified · 14c5214

  2143. Journey hub — status above hero title (0.1.317) · 866fc5f

    JourneyHubScreen: render journey.hub.returnVisitSubline before landing.hero.title under the milestone path. Docstring + AGENTS stage line; regenerate release-notes bundle.

  2144. Index journey-path-phase; rules nav; agent-rules-changelog · d5595a2

  2145. Stage web 0.1.316, journey path phase evidence, semver table · ef3c3ce

    Stage verified: GET /api/health version 0.1.316; public_edge.ok from tenant-live-health; release notes build line 0.1.316 on /en/release-notes.

  2146. Journey path phase when reflection and connection are complete · b47ff69

    resolveJourneyPathPhase returns match on section=reflection|connection when both banks are done, so the Match step is not shown locked in-flow while the hub already reflects full progress. Unit tests and KB at .cursor/kb/ journey-path-phase.md. Bump to 0.1.316; regenerate release notes.

  2147. AGENTS stage API 0.1.43 + release-notes after fleet app rebuild · b7bc074

  2148. OpenAPI matches Fastify 503/E2E bodies (0.1.43) · ed2b535

    - ConnectionMutationSnapshot: exact connectionSnapshotForResponse fields - ChatSessionPersistence503WithConnection + ConnectionMutationResponse use it - ErrorResponse: optional message, details.stack (internalServerErrorPayload) - E2eSeedProfileResolutionFailed; internal seed POST 500 oneOf - VapidPublicKeyNotConfigured503 for GET /api/push/vapid-public-key 503 - Zod + axios models regenerated (contracts, backend, web client)

  2149. Stage web 0.1.315 + profile depth evidence · 82eec73

  2150. Sync release-notes bundle after fleet stage rebuild · bc600b7

  2151. Responsive audit — profile depth on ConnectionDetail · 631d655

  2152. - Journey matching signals: band helper, two-lowest+global CTAs, i18n, maturity ring via globals - CompatibilityDimensionsRadar: journey reference frame, custom ticks, legend, hid… · 1f5d05e

    - Journey matching signals: band helper, two-lowest+global CTAs, i18n, maturity ring via globals - CompatibilityDimensionsRadar: journey reference frame, custom ticks, legend, hide table; admin unchanged - ConnectionDetail: ProfileIdentityStrip + maturity; modals i18n titles - Recharts colors from BRAND_VIOLET_RGB; release notes regen

  2153. Stage web 0.1.313 verified · cf51fed

  2154. Release notes from fleet pre-rebuild (0.1.313) · 86848dc

  2155. Brand orb background on journey hub (0.1.313) · 90208ee

    - JourneyHubScreen: decorative YouBrandOrbMark behind stepper + progress card (z-0), matches welcome screen; avoid BrandOrbSectionAmbient double-wash. - Docs: journey README; AGENTS + fleet KB semver; release notes regen.

  2156. Stage web 0.1.312 verified after tenant-rebuild · 63dcb4f

  2157. Release notes from fleet pre-rebuild (0.1.312 stage) · c1c3664

  2158. - Several low dimensions (thinking, emotional, conflict) shared Reflection route; show one chip per destination, first axis in radar order. · 403428a

    - Several low dimensions (thinking, emotional, conflict) shared Reflection route; show one chip per destination, first axis in radar order. - Add matchingSignalsLowAxisCta util + Vitest; refresh release notes + KB semver.

  2159. Release-notes CI/local drift, stage semver snapshot, KB · 8b30290

    - JSDoc on generate-release-notes-data.ts; AGENTS + fleet KB table for 0.1.311/0.1.42.

  2160. Verify OpenAPI icebreaker request body in CI and schema batch · b2e6ac6

    - Add verify-openapi-critical-request-bodies.mjs; wire GitHub schema-contract workflow and run_batch_schema_workflow (step 3/5). - Note invariant in generate-schemas.js; update fleet/docs drift guard references.

  2161. Application secrets in common; track app-tenant secrets module · ad00dfd

    - Move merge/get/absorb/stubs implementation to common/secrets_application.py so app-deployment (zitadel_provision) does not import app_tenant_root; satisfies check_module_boundaries. - Re-export from app-tenant/src/secrets/application.py; un-ignore that package in .gitignore (directory name 'secrets' matched global pattern). - Update unit test and Zitadel module docstrings.

  2162. Note E2E strapline key discovery.universe.view.modeStraplineExplore · 17c2d20

  2163. Sync release-notes.generated.json after fleet rebuild · 6664272

  2164. 0.1.311 and regenerate release notes data · e9ed599

  2165. I18n: use Match surface name across journey, connections, discovery, chats · 4689933

    Align en/de/fr/es/ar strings and privacy hints with the Match tab. Update analytics suggestedNextSteps and E2E universe smoke to use en.json strapline and legacy bottom-nav Match link.

  2166. Release notes after fleet post-push sync · 53d3cfd

  2167. Match tab, /match routes, and i18n (0.1.310) · e180ca9

    - Route (pages)/match with ROUTES.MATCH/LIST; Next.js redirects for old /discovery URLs - AppNav: tab id match, label app.nav.tabMatch; journey phase and path step id match - discoveryViewModeFromPathname: only match segment (redirects own legacy paths) - Query keys, settings accordion matchFeed, manifest shortcuts.match, PWA and robots - Non-EN discovery.page, webgl a11y, matchmakingPath, and preferences aligned to Match - Regenerate release-notes; doc kb discovery-universe-view for /match BREAKING: client no lon…

  2168. Atomic coverage for profile-information-photo embed · f037d8e

  2169. Stage evidence web 0.1.308 profile photo inline · 500b076

  2170. Profile photo inline in Profile information (0.1.308) · c7d167c

    - Extract ProfilePhotoEditorCore (upload/replace/remove); embed in ProfileInformationSection - You/UserProfileMenu: photo controls + header shows PeerProfilePictureOrOrb when ready - Remove separate ProfilePictureSection accordion; update PROFILE_SURFACES.md

  2171. Ifeoma-tc INDEX + bundle after 0.1.307/0.1.42 stage rebuild · aca13fc

  2172. OpenAPI 1.0.26 503 + stage 0.1.307 / API 0.1.42 · d45cbea

  2173. - api-types, axios, zod; new 503 model docs; release-notes bundle · bdfbe19

  2174. OpenAPI 1.0.26 — CHAT_SESSION_PERSISTENCE 503 body schemas · a51a53b

    - ChatSessionPersistence503WithConnection, E2eSeedChatSessionPersistence503 - Document 503 on request/response/icebreaker paths; zod regen; API 0.1.42 - Cross-ref OpenAPI from persistChatSessionAfterConnectionMutation docstring

  2175. Refresh ifeoma-tc PACKAGE_INDEX (stage rebuild 2026-04-26) · 12ccd03

  2176. Evidence OpenAPI 1.0.25 + web 0.1.306 / API 0.1.41 on stage · de89093

  2177. Sync generated Zod validation with OpenAPI 1.0.25 · e96462f

  2178. - api-types, axios client (Internal tag), zod; release-notes bundle - New generated InternalApi, block + e2e seed models · 61a5469

  2179. OpenAPI 1.0.25 — transcript, connections, block, e2e seed · 361e2ae

    - Document five Fastify routes in openapi.yaml; add internalE2eSecret security scheme - New schemas: BlockUserResponse, E2eSeedConversationRequest/Response - Remove matching onlyInBackend allowlist entries; zod regen (contracts + backend)

  2180. Refresh ifeoma-tc PACKAGE_INDEX (fleet regen 2026-04-26) · 3467522

  2181. Note openapi allowlist + check:openapi-backend-paths OK · a2d49cc

  2182. Allowlist Fastify-only API paths pending OpenAPI · e9a8ef3

    Document five routes (transcript-export, end-connection, press-reveal, e2e seed, user block) so check:openapi-backend-paths passes until schemas are added.

  2183. Stage evidence for profile first/last (0.1.304–305) + API 0.1.40 · ed785c1

  2184. First/last name UI, client mapping, and ProfileIdentityForm · 01750bc

    - Settings, onboarding, profile edit, View My Profile, discovery types/adapter - i18n (all base locales) + identityForm a11y keys; profileNameParts for split/compose - ProfileIdentityData uses firstName/lastName; generated API + zod - release-notes data; web 0.1.305; AGENTS + PROFILE_SURFACES

  2185. Profile first/last name persistence and API responses · 9dfb48b

    - Add profileNameParts helpers and profileNameFieldsFromStoredProfile - POST /api/profile merges firstName/lastName or splits legacy name - GET/POST responses include name block; discovery peer mapper aligned - Bump backend to 0.1.40; zod from generated bundle

  2186. OpenAPI firstName/lastName on profile shared + update request · 42f1604

    Add ProfilePublicShared and UpdateProfileRequest fields; regenerate app-contracts zod for distribute pipeline.

  2187. 0.1.303 residence hint i18n; stage evidence · cd20d94

  2188. Sync after 0.1.303 i18n deploy · 1541990

  2189. onboarding.residence.hint: local matches and one country only; feature removed. · ddcb15b

    Web 0.1.303.

  2190. Sync after OpenAPI icebreaker commit (0.1.302 / 0.1.39) · 6bace75

  2191. OpenAPI icebreaker submit-step, full regen · 938376b

    - Path POST /api/connections/icebreaker/submit-step + IcebreakerSubmitStepRequest - Regenerate zod (backend, web) and web OpenAPI client; remove Fastify-only gap - Web 0.1.302, API 0.1.39; release-notes bundle; AGENTS + fleet KB evidence

  2192. Sync bundle after 0.1.301 deploy commits · aa9184a

  2193. Update fleet KB append-only row for stage verification. · 5406d32

  2194. Journey welcome phase and profile gate · 319169f

    - Route /journey?phase=welcome: JourneyWelcomeScreen (glass, orb, how-it-works) - JourneyProfileWelcomeGate until journeyWelcomeCompleted is true - Remove localStorage hub welcome hook; hub uses kicker only - Profile types + API mapping; i18n en/de/es/fr/ar; bump to 0.1.301 - Regenerate clients, release-notes, zod (Icebreaker restored)

  2195. Persist journeyWelcomeCompleted on profile · 088b1f8

    GET/POST /api/profile expose boolean; POST accepts optional update. Bump package to 0.1.38.

  2196. Profile journeyWelcomeCompleted in OpenAPI · 30d2892

    Add self-only journey completion flag; regenerate zod. Restore IcebreakerSubmitStepRequest after schema sync (not yet in OpenAPI).

  2197. Stage web 0.1.300 parity · 683fe47

  2198. Sync release-notes after fleet rebuild (0.1.300 stage) · 0542e2b

  2199. AGENTS + fleet KB 0.1.300 journey welcome gate · ec92e79

  2200. Gate hub welcome on path intro; sync storage when past intro; web 0.1.300 · 3db27d5

    - showFirstVisitHubWelcome = storage && pathPhase intro - effect: dismissWelcome when hub path is not intro (new device + existing progress) - docstrings: JourneyHubScreen, useJourneyHubWelcomeState

  2201. Stage web 0.1.299 repo+stage parity · 9ccbe24

  2202. Sync release-notes after fleet rebuild (0.1.299 stage) · bffa42a

  2203. AGENTS + fleet KB 0.1.299 journey hub first-visit · b673802

  2204. First-visit hub welcome glass + orb; localStorage gate; web 0.1.299 · ef6c565

    - useJourneyHubWelcomeState: dismiss welcome once; path stepper shows Welcome done + Reflection current only on first visit when profile phase is still intro - JourneyHub: matchmaking first; grounding + hero title inside SURFACE_BRAND.glassJourneyPanel; YouBrandOrbMark in pointer-events-none layer z-0, panel z-10 - Return visits: landing hero title + journey.hub.returnVisitSubline - i18n: welcomeRegionAria, welcomeContinueCta, returnVisitSubline (en/de/es/fr/ar) - journey README + resolveJourneyPathPhase note

  2205. App-fleet-cli-commands — stage 0.1.298 snapshot + QuestionPhaseBase evidence · 3de53f2

  2206. 0.1.298 stage evidence + public-edge · 8deb194

  2207. Sync release-notes after fleet rebuild (0.1.298 stage) · 5c00967

  2208. Web 0.1.298 QuestionPhaseBase connection + removal of top step nav · af613a0

  2209. QuestionPhaseBase progress below card for all modes; drop top prev/next · 5a7ca1d

    Unify itemProgressAndBar for session + default under RatingCard/QuestionCard. Remove showTopStepNav; navigation stays in cards. Web 0.1.298.

  2210. Stage web 0.1.297 + Reflection session chrome below card evidence · eda3c3b

  2211. Sync release-notes after fleet pre-rebuild (0.1.297 stage) · c54cf8e

  2212. Place Reflection session progress below QuestionCard; web 0.1.297 · e0ea69f

    Move session progress line, time, save & exit, and item bar under the card in QuestionPhaseBase when sessionProgress is set; Connection keeps chrome above the card. DRY itemProgressAndBar. Regenerate release notes.

  2213. Release-notes after fleet; AGENTS stage 0.1.296 · 1f56349

  2214. Update prototype dock i18n (all locales), ADR, Scene prototype section title, universeCompatibilityDimensions doc, matching docs, testbench comment; refresh release notes, AGENTS,… · 102a2ca

    Update prototype dock i18n (all locales), ADR, Scene prototype section title, universeCompatibilityDimensions doc, matching docs, testbench comment; refresh release notes, AGENTS, fleet KB evidence.

  2215. Stage verify web 0.1.295 (score arcs removed) · 973c675

  2216. Release-notes JSON after fleet rebuild (0.1.295 stage) · bb6876d

  2217. Sync release-notes after 0.1.295 score-arc removal · d563d10

  2218. Remove Canvas2D score arcs around peer orbs; web 0.1.295 · e9faba7

    Per-peer disk-plane arc strokes and hover ring duplicated match encoding and read as "Saturn rings." Drop drawScoreArcs, CANVAS2D_SCORE_ARC, scoreArcAngles module + tests. Align testbench legend and drop U.overlay.scoreArc / drawScoreArcs. Update UNIVERSE_ARCHITECTURE and debug-issues note; AGENTS + fleet KB.

  2219. Discovery universe view — guide modal and universeGuideStorage · a133d97

  2220. Verify web 0.1.294 stage; fix repo parity row; lib/ path note · 9344055

  2221. Sync release-notes JSON after fleet rebuild (0.1.294 entries) · 7a6a9f3

  2222. Document visual guide (UniverseGuideVisualPanel) and 0.1.293 historical row. · 23702a3

  2223. Replace tabbed guide with UniverseGuideVisualPanel (diagram, callouts, warning, color key, list bailout). · 4b6616c

    Replace tabbed guide with UniverseGuideVisualPanel (diagram, callouts, warning, color key, list bailout). Add universeGuideStorage with warn-on-failure persistence; aria-label for callout list. i18n guideVisual* in en/de/es/fr/ar. Bump 0.1.294; refresh release notes. Update ADR and UNIVERSE_ARCHITECTURE.

  2224. Stage verify web 0.1.293 discovery guide · 4f1f847

  2225. Sync release-notes JSON after 0.1.293 fleet rebuild · fedb304

  2226. Ship Canvas2D legend off; pointer line in universe guide; web 0.1.293 · df91c47

    - Default showCanvas2dLegend false (avoids app shell nav covering bottom-left block) - UniverseGuideTabs: i18n guideBulletPointer; scenePrototypeDraft paste default false - E2E: scene prototype dock expects Canvas legend checkbox unchecked - ADR + UNIVERSE_ARCHITECTURE + AGENTS + fleet KB

  2227. AGENTS + fleet KB evidence for web 0.1.292 stage verification · 83b04e0

  2228. Sync release-notes JSON after 0.1.292 commit hash · 6a708c3

  2229. Remove universe profile-count line; web 0.1.292 · cad2598

    - Drop peer-count + 3D/List/badges copy from UniverseDiscoveryHeadlines (overlay + info modal) - Remove positionedProfileCount from RevealHeader and UniverseScreenInfoModal; trim i18n keys - Regenerate release notes; update AGENTS and UNIVERSE_ARCHITECTURE §8

  2230. Sync release notes after 0.1.291 fleet rebuild · 5eb3ad5

  2231. 0.1.291 release notes + AGENTS + fleet KB (connection journey) · 5e232ad

  2232. Connection URL path phase + skip connection launch intro · 1e1f9cb

    - resolveJourneyPathPhase: section=connection always yields connection so the 4-phase row matches the page (was explore when 5/5 ratings already stored). - ConnectionJourney: showIntro defaults to false; go straight to RatingCard. - Unit test for connection section with all ratings complete.

  2233. AGENTS + fleet KB — stage 0.1.290 read-only check and evidence row · 448e7b8

    Record curl/tenant-live-health parity, no backend rebuild needed, local tenant file hygiene; append ifeoma-tc 0.1.290 evidence to app-fleet-cli-commands.

  2234. Sync release notes after 0.1.290 fleet rebuild · 0373b9f

  2235. Full-width journey stepper on reflection/connection (QuestionPhaseBase) · 3a15314

    Match JourneyHub path layout: stretch wrapper + min-w-0 grid column; path nav/ol self-stretch. Applies to /journey?phase=progress&section=reflection|connection. Web 0.1.290; update AGENTS and journey README.

  2236. Evidence row for web 0.1.289 stage deploy and journey e2e · 8e08a63

  2237. Sync release notes after 0.1.289 deploy + AGENTS stage evidence · d479b1c

    Fleet rebuild refreshed generated JSON with latest commits; document verified stage curl + tenant-live-health + journey hub smoke in AGENTS.

  2238. 0.1.289 release notes + stage parity notes in AGENTS · e388d7a

    Regenerate release-notes.generated.json; document Web 0.1.289 in AGENTS canonical table and product notes.

  2239. Journey hub stepper width vs progress card (375–768) · 1ba84d4

    Authenticated spec asserts nav and card bounding boxes differ by at most 2px and no excess page horizontal scroll; document in tests README.

  2240. Full-width journey matchmaking path aligned with hub card · 93c113f

    Stretch flex-1 connectors so the 4-phase stepper matches the Journey Progress card width; nav min-w-0 with narrow-viewport horizontal scroll when needed. Add data-testid on the progress glass card for E2E width checks.

  2241. Release notes from fleet dual rebuild; AGENTS + fleet kb evidence (stage 0.1.288 / API 0.1.37) · 994f3a5

  2242. Evidence read-only loop web 0.1.288 journey hub order · 1ab77d8

  2243. Hub vertical order — hero copy, orb, path, card · 09b9d75

  2244. Release notes after fleet pre-rebuild (0.1.288) · 46f8cbc

  2245. Journey hub — hero + grounding copy above orb (0.1.288) · d9aa11b

    - Reorder stack: h1/paragraphs, YouBrandOrbMark, JourneyMatchmakingPath, glass card - Docstring describes vertical layout; AGENTS + release notes

  2246. Rename journey hub smoke spec; document in tests README · 5ea7de0

  2247. Evidence for web 0.1.287 journey + API 0.1.37 stage · 76b835a

  2248. Refresh release-notes after fleet app rebuild (API 0.1.37 live) · f651d6e

  2249. Bump 0.1.37; sync release notes + AGENTS (stage API still 0.1.36 until deploy) · e2c43d8

  2250. Icebreaker submit-step API and ConnectionService support · a775468

    - POST route + Zod IcebreakerSubmitStepRequest; service methods and tests - Regenerated zod-schemas in app-contracts and 10_backend

  2251. Journey hub consolidation, 4-phase path, DRY Screen (0.1.287) · db3dad1

    - Default /journey to progress hub; legacy grounding/how-it-works redirect - JourneyMatchmakingPath + useJourneyPathPhase; remove Grounding/HowItWorks screens - Hub: grounding copy, reassurance row, fixed CTAs to JOURNEY_REFLECTION - navigation Screen re-exports journeyPhases; remove unused getJourneyStepFromScreen - i18n introLabel, E2E/orb spec updates, release notes, AGENTS + fleet kb evidence

  2252. AGENTS + fleet kb for web 0.1.285 (reflection DELETE fix) · 3f59f9b

  2253. Sync release-notes after 0.1.285 · 076ee9e

  2254. Set JSON Content-Type on nextjsApiRequest only with a body · e02c5b9

    Avoids Fastify FST_ERR_CTP_EMPTY_JSON_BODY on bodyless DELETE to /api/journey/reflection/:id (e.g. clear reflection progress). Bump to 0.1.285.

  2255. Sync release-notes after fleet pre-rebuild · 89789d6

  2256. 0.1.284 release notes, AGENTS, fleet KB · 5a19f3f

  2257. DRY culture/residence save gate for Settings and Discovery menu · 65e1c1c

    - Add CultureResidenceSaveGatePanel using design-system amber well styles - Export CULTURE_BLOCK_DOM_ID for scroll target (CulturalIdentitySection) - UserProfileMenu: same prerequisite banner as ProfileSettings when invalid - PROFILE_SURFACES.md + atomic test expectations

  2258. Sync release-notes after fleet pre-rebuild · 2ef64fa

  2259. 0.1.283 release notes, AGENTS, fleet KB evidence · e4ee681

    Regenerate release-notes; document 0.1.283 profile-surface work in AGENTS and app-fleet-cli-commands (post-rebuild stage verification to follow).

  2260. Profile surface docs, settings gate, Discovery menu prefs · a0e3ec5

    - PROFILE_SURFACES.md: table of onboarding vs settings vs profile vs UserProfileMenu - Settings: persistent culture+residence gate with CTA; link to Profile for bio - UserProfileMenu: document contextual subset; add DiscoveryPreferencesSection - CulturalIdentitySection: anchor id for scroll-into-view - Atomic test: menu imports discovery prefs, not ProfilePictureSection

  2261. Drop unused OnboardingCultureFields variant and dead onboarding.subtitle · 8f69e57

    Remove the no-op variant prop from the shared culture typeahead. Remove the unused onboarding.subtitle key from all locales (copy wrongly implied a required photo; only subtitleShort is rendered on the welcome screen).

  2262. Append 0.1.282 read-only verification row · a7c7748

    Mirror AGENTS.md closing loop: tenant-live-health, curl routes, logs, browser.

  2263. 2026-04-26 stage read-only loop for web 0.1.282 · 2a6d240

    Record public_edge health, route HTTP 200s, target-stack-logs sample, and 540x960 browser checks (landing, release-notes, journey nav).

  2264. Stage web 0.1.282 Explore i18n evidence · 6f4b870

  2265. Stage web 0.1.282 verified (curl, release-notes, journey Explore copy) · a43eab8

  2266. Release-notes bundle after fleet web-client rebuild · 970ad38

  2267. Sync release-notes after build; docs(agents): stage web row without pending tag · a5076f3

  2268. Web 0.1.282 Explore i18n note and semver table · 0f07add

  2269. 0.1.282 and release-notes bundle · b433c2b

  2270. Align Discovery product copy with Explore across locales · b2c618c

  2271. Stage web 0.1.281 verified · 873f531

  2272. Release-notes after 0.1.281 fleet deploy · 9bbb28a

  2273. Web 0.1.281 connection intro note · da3fa5a

  2274. 0.1.281 and release-notes bundle · 8ded6a8

  2275. I18n(journey): connection launch copy across locales · a87c672

    Add preview, meta row, reflection eyebrow, scoped CTA; remove intro skip; parameterize lead by statement count.

  2276. Connection launch intro with preview and slimmer CTA · 00e6040

    Replace duplicate milestone cards and duplicate prose with a launch layout: eyebrow, headline, one lead, statement preview (static 1–10 sample), meta row with time/save and inline how-ratings work link (same modal, new inline trigger). QuestionPhaseIntro gains introCustomBody, outroCtaSubline, introStartButtonClassName; remove connection skip. JourneyPhaseImpactInfoSection supports infoModal inline link.

  2277. Stage web 0.1.280 verified after tenant-rebuild · 87367fd

  2278. Release-notes bundle after fleet web-client rebuild · 68d6697

  2279. Align release-notes bundle with post-build git log · dba9f39

  2280. Note web 0.1.280 and stage redeploy expectation · 8810c99

  2281. Sync release-notes bundle for 0.1.280 · 725a6c6

  2282. Bump version to 0.1.280 · 0d18d7b

  2283. Reflection session layout and in-card step navigation · daa1ca6

    Replace broken curiosity line and orb with a category metadata pill, chips with clear selected state, textarea after chips with length counter, and Save & continue with chevron. QuestionPhaseBase supports optional session progress header and hides duplicate top step nav. Reflection rehydrates drafts and resumed progress, adds Skip/Previous, save & exit to journey hub, and maps stored option ids to labels for chip state.

  2284. I18n(journey): question phase session strings and reflection copy · 11a78e1

    Add locale keys for session progress, time estimate, save & exit, category pill subline, prompt helper text, or-write-own-words, save & continue, and skip. Remove the broken categoryCuriosityLine pattern across all bundles.

  2285. Refresh last verified row for 0.1.279 read-only stage loop · 04b7e30

  2286. Evidence row for web 0.1.279 milestone path graphic · 43b91e3

  2287. Stage web 0.1.279 + milestone path graphic note · 3121a7c

  2288. Sync release-notes after fleet rebuild (0.1.279) · 711d34f

  2289. Align milestone path graphic — one connector, circle Discovery (0.1.279) · a45f9c1

    - Same gradient bar between 1-2 and 2-3 (remove arrow) - Connectors use circle row height so lines align to icons, not labels - Discovery: dashed ring + lock, label below like Reflection/Connection - Drop sky CTA glow on current Connection for parity with step 1

  2290. Append stage evidence for web 0.1.278 journey handoff deploy · 8416ccf

  2291. Refresh stage semver table to web 0.1.278 with deploy evidence · 86ca5f3

  2292. Sync release-notes JSON after fleet rebuild (0.1.278) · ea232d1

  2293. Replace two-card explainer with prompt preview, reassurance row, solid CTA, post-CTA next-step line. · dcf54a5

    Replace two-card explainer with prompt preview, reassurance row, solid CTA, post-CTA next-step line. Add JourneyReflectionHandoffPreview; soften stepper bloom on milestone path. View-transition timing in globals. i18n all locales; refresh release-notes data.

  2294. Sync release-notes data after stage rebuild · 617c469

  2295. Remove the Family or cultural roots block from onboarding and settings. · 08abf16

    Profile saves pass countriesOfOrigin: null; fix adapter so explicit null is not dropped (null ?? undefined). Bump web-client to 0.1.277 and refresh release-notes data.

  2296. Stage 0.1.276 read-only loop evidence (curl, health, browser) · d347e4a

  2297. Release notes after fleet 0.1.276; docs(agents): stage + KB · aeeed2c

  2298. Add optional name input (profile.editForm.* i18n) in About you; map to API name on submit. · 9e0251b

    Add optional name input (profile.editForm.* i18n) in About you; map to API name on submit. useRef prevents GET /api/profile refetch from clobbering in-progress edits. Regenerate release-notes bundle for semver 0.1.276.

  2299. Stage 0.1.275 loop evidence; fleet KB snapshot · d5004f6

  2300. Release notes from fleet pre-rebuild (0.1.275) · 878f5cc

  2301. Show residency field on profile edit; DRY with settings (0.1.275) · 8ddd3dc

    Profile /profile edit form already sent residency in updateProfile but had no input, so Culture & origin parity with UserProfileMenu settings was broken. Extract ProfileResidencyTextField; reuse in CulturalIdentitySection and ProfileEditForm. Bump package to 0.1.275.

  2302. Stage 0.1.274 closing loop evidence (curl, logs, browser) · 1b2afa2

  2303. 0.1.274 chats peer row evidence; fleet release-notes sync · e69d226

  2304. Chats inbox lists connection rows when peerProfileId is absent · db5d10c

    - resolveChatsListPeerRowKey: fallback to peer authUid (aligns AppNav incoming badge with list) - ChatsPageClient: build stub/transform with row key from profile id or authUid - Tests + AppNav docstring; web 0.1.274

  2305. Refresh ifeoma-tc PACKAGE_INDEX after last merge-env · 10d8918

  2306. Stage evidence for 0.1.273 loop (curl, health, browser) · d195411

  2307. Release notes + PACKAGE_INDEX from fleet 0.1.273 deploy · 2512e55

  2308. Culture typeahead clears search when a culture is added · 0d416ec

    - useLayoutEffect: onCultureSearch('') when selectedCulture length increases (covers race with click vs parent re-render) - Suggestion buttons: onPointerDown preventDefault (combobox focus/pointer pattern) - Bump web to 0.1.273; regenerate release notes; refresh AGENTS + fleet KB snapshot

  2309. Consolidate stage semver source; refresh rule navigation · f7300e0

    - AGENTS.md: current canonical ifeoma-tc/stage table; trim dated comments from tenant-rebuild snippet; fix tenant-live-health cwd (stay in app-pipeline) - app-fleet-cli-commands.md: canonical snapshot + append-only Evidence note - Cross-link AGENT_BEHAVIOUR (root, pipeline, app-source); changelog row - app-monitor: replace informal block with professional contract (same intent)

  2310. PACKAGE_INDEX regen commit ref e7202eb5 · 5eac38d

  2311. Refresh ifeoma-tc PACKAGE_INDEX timestamp · e7202eb

  2312. Post-0.1.272 close-loop evidence (logs, commits) · f79c50e

  2313. Refresh ifeoma-tc PACKAGE_INDEX after merge-env · ae174a1

  2314. Stage evidence for 0.1.272 culture typeahead and CSP · c87c04f

  2315. Sync release-notes and PACKAGE_INDEX after 0.1.272 deploy · 429c1d5

  2316. Culture typeahead clears query on select; CSP img-src blob · 9713c8c

    - List selection: onCultureSearch('') and close list after picking a culture slug - CSP: allow blob: for object-URL profile previews (prod + dev) - Version 0.1.272; regenerate release-notes bundle

  2317. Stage evidence for 0.1.271 and API 0.1.36 deploy · 352c7bf

  2318. Sync release-notes and PACKAGE_INDEX after 0.1.271/0.1.36 deploy · 9cfeb28

  2319. Onboarding layout, single-country residence, gender More; 0.1.271 · 34070cd

    - About you: culture, gender (OnboardingGenderChips + dialog), birth year; Where you are: residence + app language - Iso3166TypeaheadField: summary row for maxSelections 1; iso2ToFlagEmoji; z-index on listbox - ResidenceHeritageFields: compact Detect; soft geolocation copy when no country - Culture: addAnotherPlaceholder when selections exist; taxonomy Swiss children; i18n all locales - Release notes bundle regenerated

  2320. Swiss regional culture taxonomy slugs; version 0.1.36 · bbb2dad

    - Add swiss-german, swiss-french, swiss-italian, swiss-romansh (parent swiss) for API validation - Align with web-client cultureTaxonomyV1; verify via /api/build-info after deploy

  2321. Sync release-notes and PACKAGE_INDEX after final web-client rebuild · 4184d39

  2322. Regenerate release-notes after AGENTS verification commit · 4e0723a

  2323. Stage 0.1.270 fleet and browser verification evidence · c887483

  2324. Sync release-notes bundle after deploy commits; refresh PACKAGE_INDEX · aee1277

  2325. Refresh PACKAGE_INDEX generated_at · 7a5a502

  2326. Stage 0.1.270 welcome onboarding; deploy with tenant-rebuild-web-client · a4c4d87

  2327. Welcome gate gender and birth year; photo upload on pick · f812580

    - Complete onboarding when API accepts gender and calendar birth year only - Upload profile picture on file selection; cache self profile query - Send null cultural identity when culture section incomplete - Align i18n footnote and photo strings; E2E shell helper for new gate - Version 0.1.270; regenerate release-notes bundle

  2328. Stage 0.1.269 post-deploy verification evidence · 1fda6e8

  2329. ResidenceHeritageFields supports segment residence|heritage|full for layout. · cc1cadd

    About you card: culture + country side-by-side (md+); identity row below. Heritage remains under Where you are. Settings/profile unchanged (full stack).

  2330. Stage 0.1.268 post-deploy verification (health, fleet, browser, E2E) · 448a598

  2331. Move app language into the About you section beside gender and year of birth. · 8ca69b6

    Stacked single column below md breakpoint; remove duplicate locale block from Where you are. docs(agents): stage deploy note for 0.1.268

  2332. Stage 0.1.267 verification evidence (health, fleet, browser, E2E) · a6ca810

  2333. Drop optional self-describe input from CultureTypeaheadField; onboarding/settings no longer collect it. · 6d755cf

    Drop optional self-describe input from CultureTypeaheadField; onboarding/settings no longer collect it. toCulturalIdentityApiPayload always sends selfDescribe null. Onboarding gate: taxonomy selections or prefer-not-to-say only; legacy selfDescribe alone no longer completes onboarding. Remove i18n keys; update tests; refresh release notes.

  2334. Refresh ifeoma-tc PACKAGE_INDEX (fleet) · 5125a3d

    Regenerated table-of-contents timestamp and section ordering. docs(agents): stage verification evidence 2026-04-25 (health, tenant-live-health, browser, logs)

  2335. Stage E2E command evidence and 0.1.266 · b2eee81

  2336. Web 0.1.266 (E2E onboarding + nav smoke) · b73d27f

  2337. PNTS culture gate and discovery shell smoke vs TanStack cache · f4c508d

    - Replace setChecked on PNTS: checkbox unmounts after click; assert summary or skip if already PNTS - After Explore, assert /discovery URL first; optional short wait for GET (warn if cache-only)

  2338. Stage web 0.1.265 after e2e deploy · 30bdee7

  2339. Web 0.1.265 (e2e onboarding + release notes) · 5c528cf

  2340. Mandatory onboarding uses residence typeahead, not origin list · 9d36a63

    Aligns Playwright shell helper with residence + optional heritage; updates gate docstring.

  2341. Note web 0.1.264 stage deploy · 307879b

  2342. Web 0.1.264 and release notes (settings i18n key) · 88cde83

  2343. Profile.settings error key matches culture+residence gate · f97d259

    Rename to cultureAndResidenceRequired; localized de/fr/es/ar; drop stale same-as-en allowlist entry.

  2344. Record stage web 0.1.263 and API 0.1.35 deploy evidence · 3b3c6a4

  2345. Align release notes bundle after fleet tenant-rebuild-app · 4ac3484

  2346. Web 0.1.263, API 0.1.35, refresh release notes bundle · 1a5c4dd

  2347. Onboarding and profile residence keys for de fr es ar · 1b633a7

  2348. Residence country onboarding, culture typeahead, geography reverse API · 07ea43f

    - Gate completion on residenceCountryCode; optional heritage (countriesOfOrigin) - DRY typeahead and ISO country fields; geolocation + server reverse to ISO2 - Regenerate OpenAPI client and zod; Permissions-Policy geolocation for Detect - Fix discovery sort trigger width with named Tailwind (sm:min-w-48 sm:max-w-xs) - Use rect-neutral-outline-inline for Detect (valid ButtonOnlyPresetId)

  2349. Persist residenceCountryCode on profile and discovery DTOs · f2bd3ee

  2350. Add residenceCountryCode to profile and update API schema · 75b9dd0

  2351. Ifeoma-tc stage 0.1.262 / API 0.1.34 closing loop evidence · a9955e0

    Record curl + tenant-live-health + target-stack-logs --scan and release-notes/landing browser checks; note merge-env tenant file revert and deferred multipart profile-picture test.

  2352. Refresh release notes after stage rebuild · a4ffe5d

  2353. Bump web/api versions and refresh release notes · 900dccb

    Advance web-client to 0.1.262 and backend to 0.1.34, then regenerate release-notes data for /release-notes and build-info parity.

  2354. Parse profile picture multipart upload via stream API · 083354f

    Use Fastify multipart request.file() + toBuffer() so uploads from the BFF stream are reliably parsed and validated before storage.

  2355. Improve onboarding readability and move photo upload to top · 004d83f

    Reorders onboarding sections so profile picture is first, adds clearer section grouping, and shows a live avatar/orb preview beside upload controls.

  2356. Refresh release notes after fleet pre-rebuild · 46112fb

  2357. 0.1.261 and release notes data · 01cf64e

  2358. Cover origin ISO ordering for culture selections · ac7f6a8

    Asserts DE collator order, single-region priority, and multi-region union behavior.

  2359. Pass countryLabelLocale in settings and profile menu · 8ff9740

    Cultural identity origin picker labels follow preferred app language in slide-over settings and discovery profile editor.

  2360. Track web-client geography JSON data and unignore in git · d478a43

    Root *.json policy requires explicit allowlist; ISO and region-priority files are static product data (same class as cultureTaxonomyV1.json).

  2361. Locale-driven origin countries and culture-region ordering · 80b9fbb

    Wire Intl.DisplayNames and ordering to the form preferred locale; union taxonomy region priority sets for multiple culture selections. Adds geography helpers and priority map JSON.

  2362. Stage web 0.1.259 onboarding hint i18n evidence · 379c770

  2363. Release notes for i18n onboarding hint 0.1.259 · 7d3c4d7

  2364. Onboarding culture hint matches UI (no self-describe on onboarding) · b3b66f2

    Align onboarding.culture.hint with variant=onboarding: drop self-description from copy; keep keys in sync across en/de/fr/es/ar per i18n policy. Web 0.1.259.

  2365. Stage web 0.1.258 onboarding culture variant evidence · 25fde47

  2366. Release notes for 0.1.258 culture variant · 5d524b8

  2367. Culture fields variant; hide self-describe on onboarding · 6a6dfe5

    Introduce OnboardingCultureFieldsProps variant onboarding|full: onboarding omits the self-describe line; full keeps it for settings and profile edit. Mount the shared culture block in ProfileEditForm so profile save matches visible fields. Semver 0.1.258.

  2368. Stage 0.1.257 and API 0.1.33 cultural identity deploy evidence · fbab67f

  2369. Document why JSON is imported. · 231528e

    Extend /release-notes with the dist hotfix and set apiVersion to 0.1.33.

  2370. Load culture and ISO JSON via imports so dist includes assets · da79c12

    readFileSync paths next to compiled output omitted JSON from the image; static JSON imports let tsc emit files into dist and fix backend-stage unhealthy (ENOENT cultureTaxonomyV1.json) in Docker. Bump API to 0.1.33.

  2371. Release notes for cultural identity 0.1.257 and API 0.1.32 · 7e33dad

    Add the top /release-notes row and align webClientVersion and apiVersion with the deployed module versions.

  2372. Cultural identity onboarding, profile, and settings UI · b3cc3c1

    Add taxonomy-backed culture fields in onboarding and profile edit, settings section, menu and profile summaries, generated client and zod updates, i18n across locales, onboarding completion rules, and a 1x1 fixture for E2E uploads. Bump web-client version to 0.1.257.

  2373. Cultural identity v1 scope; add taxonomy seed script · a982e12

    Document that v1 covers persistence and display only; pairwise matching is deferred. Add an operator script to seed or verify the culture taxonomy data where needed.

  2374. Cultural identity profile fields and taxonomy validation · daf59f9

    Add cultureTaxonomyV1-backed validation, persist culturalIdentity, countriesOfOrigin, and residency on GET/POST /api/profile, and surface them in discovery profile mapping. Bump package version to 0.1.32.

  2375. Add CulturalIdentity and profile origin fields in OpenAPI · eb888b7

    Introduce shared CulturalIdentity, countries of origin, and residency on profile and discovery DTOs. Regenerate Zod helpers for the pipeline and downstream code generation.

  2376. Track culture taxonomy JSON in web-client and backend · aafd48c

    The global *.json ignore excluded shipped cultureTaxonomyV1.json from both runtimes. Add explicit negations for the two static taxonomy files so CI and clones build without missing-asset errors.

  2377. QuestionPhaseBase intro impact modal note · 78496d7

  2378. Release notes from fleet pre-rebuild (0.1.256) · cc59280

  2379. Connection intro impact in info modal · 11c3793

    Add JourneyPhaseImpactInfoSection (BaseModal + glass) and QuestionPhaseIntro.impactPresentation. Connection pass uses infoModal; milestone view stays scannable. Clarify connection intro copy; i18n for impactInfo in en/de/fr/es/ar. Version 0.1.256.

  2380. Release notes from fleet pre-rebuild (0.1.254) · c44faa5

    Regenerated by tenant-rebuild-web-client for ifeoma-tc stage; aligns /release-notes with deployed web 0.1.254.

  2381. Center question-phase impact panel on contentNarrow lane · 7206d12

    Replace ad-hoc max-w-lg glass panels with LAYOUT_BRAND.contentNarrow so copy and impact rows align with the journey medium column. Classic intro impact rows match milestone mobile/desktop stacking. Bump to 0.1.254.

  2382. Connection & reflection milestone intro layout · a2e2043

    Tighter vertical rhythm and horizontal padding for journeyMilestoneBoard intros; single max-w-2xl column for headline, cards, lock, and impact panel. Impact rows stack title/body on small screens; primary CTA matches How it works width and touch targets. Bump to 0.1.253.

  2383. - Stepper: single row with horizontal scroll on narrow viewports; nav max width and padding. · 4d4a339

    - Cards: two columns from md; stacked headers and lock strip below min width; CTA area rhythm. Bump version to 0.1.252.

  2384. C6f87a6d release-notes sync 123ccf58 4757c7d5 · b46a23f

  2385. Release notes from fleet (embed 123ccf58) · 4757c7d

  2386. Release notes from fleet pre-rebuild (HEAD c6f87a6d) · 123ccf5

  2387. Release-notes double-rebuild a3ac4c96 c5a73cfd evidence · c6f87a6

  2388. Release notes from fleet (embed a3ac4c96) · c5a73cf

  2389. Release notes from fleet pre-rebuild (HEAD 8808d51e) · a3ac4c9

  2390. Stage 0.1.251 journey deploy evidence · 8808d51

  2391. Release notes from fleet (embed e80a320e) · 09bdf4c

  2392. Release notes from fleet pre-rebuild (HEAD 05419263) · e80a320

  2393. Journey milestone stepper, bridge cards, phase intros (0.1.251) · 0541926

  2394. Stage loop eb54761e→9a99122e + merge-env revert policy · 8e7df0c

  2395. Release notes from fleet (embed 95d91ee6) · 9a99122

  2396. Release notes from fleet pre-rebuild (HEAD eb54761e) · 95d91ee

  2397. Stage double-rebuild release-notes row 5293d5a9 + landing nav · eb54761

  2398. Release notes from fleet (embed 5293d5a9) · c74f675

  2399. Release notes from fleet pre-rebuild (head 70cc1ca4) · 5293d5a

  2400. Stage /release-notes evidence b0a158d3 + a82d11b embed · 70cc1ca

  2401. Release notes from fleet pre-rebuild (KB a82d11b2 head) · b0a158d

  2402. Mongodb app-infra deploy + mongo-express log evidence · a82d11b

  2403. APP_INFRA sweep evidence and --infra-service usage · a7d9b7a

    - ifeoma-tc stage: traefik tail, elasticsearch watermark INFO, mongo-express cert path - Command block: --infra-service examples, --since 7d vs 168h note

  2404. Clear NODE_EXTRA_CA_CERTS for mongo-express · 2fa51eb

    Merged .env may set NODE_EXTRA_CA_CERTS for app-deployment TLS mounts; mongo-express does not mount that path. Override to empty so Node/OpenSSL does not warn on a missing file.

  2405. Target-stack-logs --infra-service for HOST/APP planes · c35115a

    - Add --infra-service (repeatable) to target-stack-logs and target-stack-logs-levels - Shared _parse_target_stack_log_service_args validates plane vs filters; fail fast before FleetManager init - Pass services= to logs_app_infra via collect_target_stack_logs; extend interface delegates - Unit tests for APP_INFRA filter and plane=all rejection

  2406. Stage evidence KB a98f4885 first on /release-notes · 10e7e4b

  2407. Release notes with KB head a98f4885 (fleet sync) · 0e33570

  2408. Stage 0.1.250 release-notes row order and c983 lag · a98f488

  2409. Release notes JSON after rebuild (10283cda head) · c983f12

  2410. Release notes from fleet pre-rebuild (0.1.250 operator sync) · 10283cd

  2411. Release notes from second fleet pre-rebuild (0.1.250 full git) · 850d994

  2412. Stage evidence for web-client 0.1.250 release-notes parity · 3cb62fb

  2413. Release notes from fleet pre-rebuild (0.1.250) · 269853f

  2414. 0.1.250 and sync release notes (include KB head) · edebabe

  2415. Stage evidence for web-client 0.1.249 admin Debug testid · e787bed

  2416. Release notes from fleet pre-rebuild (0.1.249) · 1212180

  2417. Data-testid on Super Admin Debug tab; 0.1.249 · 6f1f11c

  2418. Stage evidence for web-client 0.1.248 admin access notice · 7d61947

  2419. Release notes from fleet pre-rebuild (0.1.248) · 95f84e0

  2420. Landing notice when admin RBAC denies access; 0.1.248 · 298ed2a

  2421. Stage evidence for web-client 0.1.247 and admin RBAC browser check · fed8f60

  2422. Release notes from fleet pre-rebuild (0.1.247) · 93727f4

  2423. UniverseView operator gate uses PLATFORM_ROLE_ADMIN; 0.1.247 · 835d220

  2424. Stage evidence for web-client 0.1.246 deploy (merge-env --mode) · f034111

  2425. Sync release notes after 0.1.246 KB commit · 5c49b82

  2426. Stage evidence for web-client 0.1.246 · cb109af

  2427. Release notes from fleet pre-rebuild (0.1.246) · d2760da

  2428. 0.1.246 and refresh release notes (includes test tsc fix) · 998df3a

  2429. Type samples as DiscoveryFilter for tsc (remove as const) · 4ac7e95

  2430. Stage evidence for web-client 0.1.245 redeploy · cd3341f

  2431. Release notes from fleet pre-rebuild (0.1.245) · fa5484d

  2432. 0.1.245 and refresh release notes · 71333a1

    Ship latest generated notes bundle and semver for stage redeploy.

  2433. Refresh release notes after 0.1.244 commit stack · 28bf212

  2434. Stage evidence for web-client 0.1.244 discovery list · 1da562d

  2435. Document discovery list two-row filter layout · e0bd262

  2436. 0.1.244 and refresh release notes data · cd7cd0f

  2437. I18n: discovery list refine and remove unused list result keys · b68f7b6

    - Add discovery.page overlap/refine strings (en, de, fr, es, ar) - Remove discovery.list results heading and count keys; update canonical key lists

  2438. Consolidate list chrome with overlap bar and refine popover · c2e197c

    - Add DiscoveryOverlapRefineListRow: overlap control, popover for DiscoveryFilterPanel, list toggle - Centralize countActiveDiscoveryFilters in filterAndSort; align isDiscoveryFilterActive and tests - Remove standalone results header strip from DiscoveryListView; drop always-visible filter panel on list page

  2439. Stage 0.1.243 discovery operator-hint gate evidence · aa883c7

  2440. Show bulk-import / staging operator hint only to platform admins · 5e8b6a9

    DiscoveryEnvironmentHint (Staging or bulk import?…) is for operators; end users see only the standard empty list copy. Gate on session user platformRole. Web 0.1.243; refresh release-notes data.

  2441. Note MCP browser push subscribe limitation vs real Chrome · 31d858f

  2442. Sync release-notes.generated.json (563 entries, post-0.1.242) · 6ef7f8e

    Keeps git log-derived notes aligned after v0.1.242 and follow-up commits; edge image at 0.1.242 embeds the prior bundle until the next web-client semver bump.

  2443. Stage 0.1.242 evidence (release-notes embed after rebuild race) · edb300e

  2444. Release v0.1.242 with release-notes data aligned to git · 7c129f2

    Embeds the post-0.1.241 release-notes.generated.json so stage matches main after the fleet CLI git-log refresh cycle.

  2445. Sync release-notes.generated.json after v0.1.241 deploy (560 entries) · 6409199

  2446. Stage web 0.1.241 deploy evidence (git/image parity) · 6d29616

  2447. Release v0.1.241 and regenerate release notes · ed63912

    Aligns stage image semver with latest git (post-4232e07f) so /api/health and embedded release-notes data match the operator tree after rebuild.

  2448. docs(fleet-kb): append stage 0.1.240 journey deploy evidence (BRAND_VIOLET_HEX import fix). · 4232e07

  2449. JourneyMatchmakingPath color-brand import and useMemo; v0.1.240 · 2a9a14e

    Turbopack resolves question-phase-intro-brand without re-exporting BRAND_VIOLET_HEX; import violet from color-brand. Add missing React useMemo import for typecheck. Regenerate release-notes data for deploy.

  2450. Release v0.1.239 and regenerate release notes data · e61300c

  2451. Linear journey matchmaking path on how-it-works · d7e74b3

    Replace the five-node constellation on the bridge screen with JourneyMatchmakingPath, GlassCard Q&A, bank meta expectations, and compact path on reflection/connection intros. Harden JourneyConstellation/JourneyCircle for reduced motion and honest center affordance. Update orb journey E2E testids and all locale strings.

  2452. Stage settings notifications UI proof and admin route behavior · d32a8a6

  2453. Sync PACKAGE_INDEX after tenant-rebuild-web-client · 1799b64

  2454. Refresh PACKAGE_INDEX after Fleet metadata touch · 1c3358c

  2455. Web Push VAPID validation and operator remediation · 32080eb

  2456. Validate VAPID P-256 key for Web Push · 5dfc845

    - Add parseP256VapidApplicationServerKeyFromUrlBase64 and VapidKeyInvalidError - usePushNotifications: validate key, unsubscribe before subscribe, classify vapid-key-invalid - Extend PushNotificationErrorKind; i18n pushErrorVapidKeyInvalid (en/de/fr/es/ar) - Atomic tests; bump 0.1.238 and refresh release-notes data

  2457. Sync release notes JSON after 0.1.237 stage rebuild · b9c12d5

  2458. Scope chip opens Journey editor instead of clearing storage · 61d6dd5

    - MatchIntentScopeChip navigates to journey?phase=progress&section=session-scope - Journey renders MatchIntentScopeGate for that section; Continue returns to hub - MatchIntentScopeGate optional onAfterContinue (replaces router after save on Journey) - i18n: Adjust CTA + aria/tooltip; release notes gen for 0.1.237

  2459. Correct CLI flags for tenant-live-health and log commands · eae8df7

    - tenant-live-health, target-stack-logs, tenant-suspect-logs: --profile only (no --mode) - app-infra-refresh-traefik-tls, tenant-rebuild-app: --profile only per --help - operator verify-upstream-api: --mode (not --profile); document in app-fleet-cli-commands - Refresh dev-tenant-fleet-diagnostics, AGENT_BEHAVIOUR, stage KB playbooks, 00-MASTER

  2460. Sync release notes JSON after 0.1.236 stage rebuild · dc8e333

  2461. Release notes Activity recomputes from commits, 8 heat bands, weekly trend (0.1.236) · 830f05b

    - Resolve analytics at runtime from entry stats via buildReleaseNotesAnalytics so charts match the commit list; document that new rows need bundle regen. - Add weekly hours trend SVG; open cumulative card by default. - Expand heatmap quantile bins to 8 non-empty steps with a finer violet ramp. - i18n: lead, weekly trend, heatmap legend; tests for resolve helper.

  2462. Sync release notes JSON after 0.1.235 fleet rebuild · 6508199

  2463. ChatContainer uses getChatLayoutColumnGroundStyle (0.1.235) · 79e90ff

    Use the existing design-system helper from chat-messaging-surfaces-brand so the column ground stays a single canonical source (no duplicate hex at the call site). Regenerate release-notes bundle.

  2464. - Resolve chat peer from discovery or connection-scoped profile; show localized peerDataFromConnectionContext when Explore slice has no row (after success). · ba1e25c

    - Resolve chat peer from discovery or connection-scoped profile; show localized peerDataFromConnectionContext when Explore slice has no row (after success). - Localize compatibility dimension radar empty and non-finite admin states; remove unused peerNotInDiscovery key. - ChatContainer: brand ground token, optional peerDataScope notice. - Add buildChatSessionPeerProfileStub + atomic test; refresh release notes data.

  2465. Recharts 3 ChartContainer with positive initialDimension · 782c4e8

    Set ResponsiveContainer initialDimension, minWidth/minHeight, and replace default flex aspect-video root with a block layout + min-w-0 so radar charts do not log width/height -1 in nested flex.

  2466. Sync release notes JSON after fleet rebuild (0.1.232) · d3493c0

  2467. Record web 0.1.232 MatchIntentScopeGate master-detail evidence · 5976ae3

    Add Fleet CLI quick-ref row and agent-rules-changelog entry for the responsive scope picker layout.

  2468. Move recommended Even blend into the left rail; show option checkboxes only in the right column that swaps by active topic. · bdb3558

    Move recommended Even blend into the left rail; show option checkboxes only in the right column that swaps by active topic. Use md+ for side-by-side layout; stack on small screens. Sync active rail with draft scope via groupId (incl. general). Update discovery.scope.groupNavAria across locales; regenerate release notes data.

  2469. Stage 0.1.231 closing-loop evidence in Fleet CLI quick ref · 7b2edc2

    Expand ifeoma-tc 0.1.231 row with curl, tenant-live-health, target-stack-logs, browser, and ops caveats. Log the KB refresh in agent-rules-changelog.

  2470. Sync release notes JSON after fleet rebuild (0.1.231) · 5f233af

  2471. 0.1.231 evidence; unified app.people other-person copy · 6aa95db

  2472. App.people.displayNameWhenUnknown for other-person label; web 0.1.231 · f14f122

    Unify Member/Someone/Peer/Them into one message key (en Member; localized in de/fr/es/ar). Wire Discovery, universe 2D+3D, Chats, private chat, dual radar, admin match table. Remove redundant message keys; add appPeopleMessageKeys. Regenerate release notes.

  2473. Sync release notes JSON after fleet rebuild (0.1.230) · bff26a3

  2474. Stage 0.1.230 evidence; Discovery search input aria · ba6599c

  2475. Discovery list uses localized input aria (bio/interests) instead of inbox copy. · fd0641b

    Chats keeps default ui.searchBar.ariaSearchConversations. Regenerate release notes.

  2476. 0.1.229 and regenerate release notes data · 2357f28

  2477. Align Discovery list filters with Chats ListFilterToolbar · 4ffeae9

    Extract ListFilterToolbarRow to design-system; chats and discovery list share scope row, SearchBar tray, and sort Dropdown. APP_LIST_FILTER_CONTROL unifies select/input chrome. DiscoveryFilterPanel uses glassToolbar for extended filters; list heading uses mediumColumn typography. i18n: discovery.page.listFilter* keys.

  2478. Stage 0.1.228 discovery full-bleed layout evidence · f374832

  2479. Sync release notes JSON after fleet rebuild · ea3531b

  2480. 0.1.228 and regenerate release notes data · abfd9a7

  2481. Full-bleed universe behind bottom nav, list scroll pad · 899eb4b

    Use pb-0 on (pages) main for /discovery* so WebGL+gradient fill the shell to the fixed nav (removes the darker empty band from main padding). Add APP_SHELL_SCROLL.discoveryListScrollPadBottom for list/loading/error LayoutGrid so content still clears AppNav. Document in layout-brand, README, globals.

  2482. Pointer to discovery universe positioning and stage 0.1.227 KB evidence · 890eee3

  2483. Stage evidence for web-client 0.1.227 discovery universe layout · a746bdc

  2484. Sync release notes JSON after fleet rebuild · ec0d62e

  2485. 0.1.227 and regenerate release notes data · c93db31

  2486. Dynamic intra-sector spread and peer separation · 1fef359

    Peers in the same dimension bucket get equal angles on a sector fraction that widens with bucket size; dynamic separation strength scales with total peer count. Explicit peerSeparationStrengthPct: 0 disables ring separation.

  2487. Sync release-notes after stage web rebuild · 304a32b

  2488. Add discovery toolbar overlap filter (solo signal axes) · 7c7369d

    - Add matchingAxisAlignment (merge peer partials, max min(you,peer) per axis) shared with DualRadar - filterDiscoveryProfilesByMatchingSignalOverlap + Overlap only switch after scope in list and universe - Disable switch until GET /api/profile matchingSignalDimensions; reset on profile error - i18n en/de/es/fr/ar, discovery page message keys, web 0.1.226, release notes, AGENTS.md

  2489. Sync release-notes bundle after fleet rebuild · e0e2cf1

  2490. Use inbox thread CTA on Chat tab list, keep Open Conversation for Explore · 3e07e86

    ConversationMatchCard (conversations list under Chat) now uses chats.page.inboxOpenThread so connections.page.openConversation only appears on ConversationStarters (Explore / universe / connection detail). Bumps web to 0.1.225, regenerates release-notes data, documents the split in AGENTS.md.

  2491. Match intent scope UI layout; tenant-live-health example with --tenant · bdce287

  2492. Master–detail layout for match intent scope · 3b37863

    - Replace 2-column grid of accordions with a category rail + options panel. - Stack vertically on small viewports; side-by-side from lg (max-width rail). - Add discovery.scope.groupNavAria for the category nav landmark (en/de/es/fr/ar). Bump web-client to 0.1.224; regenerate release-notes data.

  2493. Note short post-deploy window before /api/health is 200 · 1a04e7a

  2494. Refresh French profile and app-shell copy · b0091bc

    - Sentence case and clearer error/welcome/notFound strings; tabYou → Vous. - profile_looking_for → Vos intentions (distinct from EN). Bump web-client to 0.1.223; regenerate release-notes data.

  2495. Update locale copy and ICU contract for landing hero · fc00ac9

    - Refresh EN/DE/ES/AR message bundles (tonal and UX copy). - Ensure landing.hero.subtitle and journey.explainer.introOrder keep {appName} where required by i18n tests; fix ES/AR hero subtitle branding. - fr.json: dropped a corrupt partial merge; keep fr aligned with origin until a reviewed FR sweep lands (JSON structure preserved). Bump web-client to 0.1.222; regenerate release-notes data.

  2496. Document connections query invalidation after mutations · 2d7307e

  2497. Refetch connections list after workflow mutations · 3ebe0b9

    - Back useConnections with React Query so GET /api/connections can invalidate. - invalidateConnectionCaches also invalidates [connections] for inbox parity. - Bump web-client to 0.1.221; regenerate release-notes data.

  2498. Note tenant-rebuild-web-client --skip-release-notes-refresh · a908f59

  2499. 0.1.220 and regenerate release-notes data · 53697ce

  2500. I18n: peer profile overlap states and preview quote formatting (en, de, es, fr, ar) · 554c185

  2501. Discovery list match-row chrome, universe View profile, peer overlap chart · 239c519

    - Extract shared MatchPercentRing; reuse in chats and discovery list rows - Add CompatibilityDimensionsDualRadar and PeerProfileSheet overlap section - Explicit viewer signal states (loading / error / missing) without zero fallbacks - List: onViewProfile; universe tooltip secondary View profile; i18n quote via ICU

  2502. Prevent stacked locale segments in language-picker URLs · 653b4b0

    Root cause: assignWithLocalePreservingPath passed usePathname() through withLocale without stripping existing /{locale} when the hook surfaced a prefixed path, yielding /de/en/landing after multiple switches. - Loop-strip all leading locale segments in pathWithoutLocalePrefixForIntlRouter and pathnameWithoutLeadingLocale - Pipe picker paths through pathWithoutLocalePrefixForIntlRouter before withLocale - proxy: 307 to collapse /{a}/{b}/… when a and b are both locales (bookmarks) - Vitest coverage for stacked paths…

  2503. Sync release-notes bundle after fleet web rebuild · 2427822

  2504. Bump 0.1.218 and regenerate release-notes data · 5cc0fc1

  2505. Universe guide modal-only, clearer copy and layout · 2e89825

    Remove the on-canvas glass guide panel so the WebGL scene stays clear. Universe guide remains on the toolbar Info (ⓘ) modal: larger BaseModal, prose in UniverseDiscoveryHeadlines, readable tabs and list bullets in UniverseGuideTabs. i18n: summary line works for scene/List; refreshed guide bullets in en/de/es/fr/ar.

  2506. Note fleet post-rebuild release-notes.json refresh · 10d27bb

  2507. Refresh release-notes bundle after fleet web rebuild · 279a42a

  2508. Bump 0.1.216 and regenerate release-notes data · 6a4b917

  2509. Conversations inbox lists post-request peers only · 82dcb48

    Introduce isPeerVisibleInConversationsInbox in connection validation (DRY). ChatsPageClient filters discovery and connection-stub rows; allUserIds matches the inbox. ConversationMatchCard drops Request to Connect (Discovery-only CTA). Add atomic tests for inbox eligibility.

  2510. Refresh release-notes bundle after fleet preflight · 1e41bcd

  2511. I18n scene prototype — disk reach vs peer separation · b8d94bd

    Localize Hub & spheres section; rename disk spread control for clarity; add hint lines under disk reach and peer separation sliders. RowRange optional hint. Bump web to 0.1.215; refresh release notes data.

  2512. Gate live-stack atomics behind E2E_ATOMIC_LIVE · 1429f64

    Plain vitest run skips infra TCP/Zitadel checks and HTTP atomics that expect Next/API unless E2E_ATOMIC_LIVE is set (1/true/yes). CI still uses vitest.offline.config.ts; comment documents the flag.

  2513. Document landing Hero safe-center first fold · 38f3569

  2514. Set version 0.1.214 and refresh release notes bundle · 7dca7c8

  2515. Landing Hero safe-center fold and compact narrow portrait · d5f159b

    Add LANDING_HERO_FOLD_SECTION/INNER tokens (100dvh + CSS safe center); tighten badge/headline/orb/ring spacing and orb diameter on short narrow viewports; document in Hero and orb-brand. Bump web to 0.1.214.

  2516. Universe toolbar info opens shared guide modal · dc409e7

    Add Info control after the universe/list toggle; BaseModal shows screen context (UniverseDiscoveryHeadlines) plus UniverseGuideTabs, DRY with the bottom-left dock via shared tab state and distinct aria id prefixes. Introduce universeModeStraplineKey and headline component for RevealHeader. i18n: infoModalTitle, infoButtonAria, infoButtonTooltip in all locales. Bump web to 0.1.213; refresh release-notes data.

  2517. Refresh release-notes bundle after fleet preflight · 8d244ae

  2518. Add /[locale]/release-notes and DRY server module · bd82a64

    Expose release notes at locale-prefixed URLs for SEO and deep links; keep unprefixed /release-notes as the marketing canonical. Share body and metadata via ReleaseNotesPageServer. Bump web to 0.1.212; extend e2e smoke.

  2519. Sync ifeoma-tc package index · 568d353

    Update PACKAGE_INDEX.yaml to match current tenant artifact layout.

  2520. Skip atomic backend suites when internal auth is disabled · 16796af

    Use describe.skipIf(!isInternalAuthEnabled()) for integration and UI atomics that require a configured internal auth target.

  2521. Universe WebGL labels, tooltips, and peer ring layout · c97fcb5

    Refine canvas2d painting, peer tooltip placement, prototype dock, and positioning helpers; add tests for ring separation and scene draft.

  2522. Chats list layout, match ring, and connection CTAs · bc43783

    Bump web to 0.1.211. Refine ChatsPageClient loading/aria, two-row toolbar with full-width scope chip, group tabs glow, and match cards with percent ring plus request/accept states. Add i18n keys and design tokens; refresh release notes.

  2523. Stack title above search+sort, localize list sort, harden sorter (web 0.1.200) · 4e2631e

    - Chats list header: always column layout so Conversations + count sit above the glass toolbar (search, scope chip, sort) on all breakpoints; removes md:flex-row beside-title pattern. - Replace hard-coded SORT_OPTION strings with chats.page.sort.* in all message bundles; CHAT_LIST_SORT_SPECS in chatSorting carries id+icon only. - Dropdown uses sortFilterAriaLabel; extend chatsPageMessageKeys for static i18n parity tests. - sortConversations: throw on unknown SortOption instead of returning unsorted data. sort/matc…

  2524. Refresh release-notes bundle after AGENTS docker note · f7ff7d8

  2525. Document web-client-stage docker name conflict on rebuild · ea4d9c7

  2526. Center Hero in viewport with my-auto and dvh (web 0.1.199) · 4d838bc

    - Apply safe centering: flex min-h-100dvh + inner column my-auto; clear auto margins on max-height/short-landscape for scroll without clipping - Tighten section padding, safe-area for language picker, optional tall-portrait nudge - Document pattern in file header; bump 20_web-client to 0.1.199

  2527. Session scope UX, OpenAPI + dev-sync watch (web 0.1.198, fleet 1.0.2) · fed0c0d

    Web-client - Remove global MatchIntentScope loading gate from AppPagesLayout; users reach the app shell without blocking on scope selection. - Surface active session scope on Profile (read-only card + CTA to Discovery) and as contextual GlassCard banners in ChatView for pre-establishment stages. - Release notes: sync Activity/Notes tab with URL on popstate (back/forward); extend bundle schema/types and atomic tests; add Playwright e2e for tab/URL sync. - Connections: pass optional matchScope query; journey hub/how…

  2528. Cron route returns uniform 401 + boots a one-shot warn instead of leaking deployment state via 500 (0.1.31) · d7030eb

    The /api/cron/recalculate-all-matches handler used `if (!env.CRON_SECRET) throw new Error("CRON_SECRET environment variable is not set")` which surfaced as a generic 500 with internal-server-error body for anyone probing the route on a backend that did not have the secret configured. That distinguished "deployment lacks the cron secret" from "wrong cron secret" — leaking deployment state to unauthenticated probes (the route is reachable from the public internet for external cron orchestrators per its docstring). R…

  2529. Refresh release-notes bundle to include 0.1.196 AGENTS.md commit · 87d0d0e

  2530. Point AGENTS.md at the typed-error → HTTP routing pattern doc (0.1.196) · c74f5f0

    Per the user spec ("memorize always update / refresh agent rules kb"), adds a "Where to look first" entry that names the canonical src/lib/http/typed-error-routing.md doc and summarises the rule a future agent should follow: - typed Error subclass + replyIf<Type>(reply, error) helper + one-line route catch - never inline `if (error instanceof XxxError)` or error.message.includes(...) in a route catch — both anti-patterns were responsible for the six bugs fixed across loops 8-12 Also confirms in-loop infra health a…

  2531. Refresh release-notes bundle to include 0.1.195 docs commit · a243450

  2532. Canonical typed-error → HTTP routing pattern (0.1.195) · 8bf0044

    Captures the pattern that was applied five times across loops 8-12 of this work — every fix had the same shape (service throws typed Error, route catches via a `replyIf<Type>(reply, error)` helper before the generic 500 fallback). The doc now lives next to the helpers it describes (`src/lib/http/typed-error-routing.md`) and references all nine canonical helper modules so future contributors can: 1. See the three pieces (typed error + helper + one-line route catch) with concrete code samples. 2. Know which existing…

  2533. Typed UserRegistrationDuplicateEmailError replaces fragile message-includes path (0.1.30) · 6862709

    Same audit pattern as the discovery refactor in commit 8d9366a4. The POST /api/users/register catch handler used errorObj.message.includes("already exists") || errorObj.message.includes("duplicate") to map 409. Two problems with that: 1. Any unrelated upstream Error whose message happened to contain the word "duplicate" (e.g. an HTTP layer reporting a duplicate header) would have been silently mis-mapped to "Account already exists" 409. 2. UserRegistrationService throws `new Error("An account with this email alrea…

  2534. Scope storage failures emit visible warnings (no silent fallbacks) (0.1.193) · 9406435

    Per the user spec ("NO silent fallbacks, NO defensive code BUT proper error messaging in an architectural approach"), every catch in matchIntentScopeStorage now surfaces the cause through a stable [matchIntentScopeStorage] console.warn prefix instead of a bare catch { return null; }. The function contract still returns null on failure so callers continue with React-state-only behaviour for the current tab — the change is purely making the cause visible to operators in the browser console (and by extension the admi…

  2535. Typed discovery client errors replace fragile error.message string-matching (0.1.29) · 8d9366a

    Same shape as the SELF_PEER_FORBIDDEN bug fixed in commit fdbc6b58 and the user-block / chat-cursor mappings closed in 8ff02f9b. The GET /api/discovery/profiles/:profileId catch handler used error.message.includes("Match not precomputed") / error.message.includes("Profile not found") to map 404 — pure string match on a free-text Error message that drifts the moment a service edits its wording. The self-row throw added in the self-peer rejection work never matched these strings and silently surfaced as 500. Refacto…

  2536. Refresh release-notes bundle to include 0.1.192 commit · 3e02f5c

  2537. Turn the chronic discovery-scope i18n audit failure into a tracked translation backlog (0.1.192) · 2a89fe0

    Background: messagesNonEnMustDifferFromEn has been the only chronically red web-client test for the entire scope-picker feature lifetime. Every loop has documented "out of scope, needs translation pass". The 38 offending keys (audited via vitest output → /tmp/i18n-offenders.txt) all fall under one feature: discovery.scope.* — the gate header, four category labels + descriptions, twelve scope-option leaf labels + descriptions. None are technical labels or proper nouns; all are real user-facing prose that needs nati…

  2538. Same shape as the SELF_PEER_FORBIDDEN bug fixed in commit fdbc6b58. · 8ff02f9

    A focused audit of every typed Error class thrown from backend services turned up two more routes that fell through to a generic 500 instead of mapping the typed error to its canonical HTTP status: 1. POST /api/users/:userId/block swallowed UserBlockPeerNotFoundError as 500 even though the helper replyIfUserBlockClientErrors (which sends 404 + USER_BLOCK_PEER_NOT_FOUND) already existed in lib/safety/userBlockErrors.ts. The route now calls the helper before the generic 500 fallback. 2. GET /api/chat/transcript-expo…

  2539. E2e regression spec for self-peer rejection across all 3 routes (0.1.190) · 4b0e72c

    Permanent regression coverage for the SELF_PEER_FORBIDDEN contract. The spec walks the existing magic-link HTTP-only auth path (auth-registration-http-api.spec.ts pattern), reads the viewer's authUid from GET /api/profile, then exercises the three routes that the service layer guards via assertDistinctPeer: - POST /api/connections/request-conversation { toUserId: self } - POST /api/connections/request-chat { toUserId: self } - GET /api/connections/stage?otherUserId=self Each call must return HTTP 403 with body tra…

  2540. Every connection route maps ConnectionTransitionError consistently (0.1.27) · fdbc6b5

    GET /api/connections/stage, POST /api/connections/cancel-request, and DELETE /api/connections/:connectionId previously fell through to a generic 500 with internalServerErrorPayload when the service layer threw a ConnectionTransitionError. Five other connection routes already mapped the error to the canonical 403/409 JSON body via connectionTransitionHttp; the inconsistency surfaced after the SELF_PEER_FORBIDDEN guard landed because hitting /api/connections/stage?otherUserId=<self> returned 500 instead of 403 — pro…

  2541. Refresh release-notes bundle to include 0.1.189 commit · 63681a3

  2542. Single canonical scope option lookup + explicit expired state (0.1.189) · b20a538

    DRY: extract MATCH_INTENT_SCOPE_OPTION_BY_ID and a typed matchIntentScopeOptionTitleKey() accessor in the matchIntentScope module. MatchIntentScopeChip and MatchIntentScopeOperatorPanel both consumed the same Map locally — three separate re-builds, one per consumer. The shared helper removes that duplication and gives every future consumer a single typed entry point. Three new vitest cases lock the contract: every catalog id resolves, the helper falls back for unknown ids, and the canonical map size matches the ca…

  2543. Refresh release-notes bundle to include 0.1.188 commits · 15c4602

  2544. Admin Debug tab surfaces match intent scope state for operators (0.1.188) · 031a157

    Adds MatchIntentScopeOperatorPanel — a read-only panel inside DebugSettingsTab that shows the live state of the persisted matchIntentScopeStorage record for the current browser session: active scope id + translated title, chosenAt timestamp, lastActivityAt timestamp, and a TTL-remaining countdown that turns amber inside the last 30 minutes. Polls every 30 seconds and on visibilitychange so the countdown stays fresh without a full page refresh. The panel lives in features/discovery (next to its data source) instead…

  2545. Conversation group tabs gain native tooltip + aria-describedby · 02f5d1b

    Each tab in ConversationGroupTabs now carries the matching chats.groups.<id>.description as both a native browser tooltip (title attr, sighted hover) and a visually hidden aria-describedby span (screen reader secondary label after the tab name and count). The "All" tab uses chats.groups.all.description, the per-group tabs reuse GroupMetadata.descriptionKey — the same keys the deleted vertical accordion read, so no new translations are needed and the dormant copy gains a real purpose again.

  2546. Fix universeSceneCameraDebug expectation + extend chats parity list (0.1.187) · 3d79630

    The universeSceneCameraDebug "fills pinch from defaults" test asserted the old idle default (0); the canonical default has since moved to 100 and the test drifted. Reference DEFAULT_SCENE_CAMERA_DEBUG.inputMult.{pinch,idle} directly so the test stays correct under future default changes — same contract under test, no rigid magic numbers. Extend CHATS_LIST_GROUPS_MESSAGE_KEYS_FLAT to include the new tab strip keys (chats.groups.tabsAriaLabel, chats.groups.all.title, chats.groups.all.description) so the locale-parit…

  2547. WAI-ARIA tablist keyboard navigation on ConversationGroupTabs · 20e3ded

    Implements the WAI-ARIA Authoring Practices "Automatic Activation" tablist pattern: ArrowLeft / ArrowRight cycle through the tabs (with wrap-around), Home / End jump to the first / last tab, and roving tabIndex={isActive ? 0 : -1} keeps a single tab in the page Tab order so screen-reader and keyboard-only users follow the same navigation model the rest of the app uses. Focus management is split from the React layer: nextTabForKey() is a pure helper that maps (orderedIds, currentId, key) -> next id (or null when th…

  2548. Refresh release-notes bundle to include sign-out lifecycle commits · 910119f

    Re-run of npm run generate:release-notes after deployment picked up the two preceding commits (lifecycle bus + toolbar empty-slot fix) so the in-app /release-notes page lists them. Same payload the deployed image already ships — this commit only resolves working-tree drift introduced by the fleet-driven prebuild.

  2549. Collapse empty toolbar scope slot + separator (0.1.186) · 5c1eb07

    When MatchIntentScopeChip returns null (status === "loading", or scope is unset on /chats), the parent scope wrapper and its trailing vertical separator used to leave a padded empty slot + a floating divider in the toolbar. Both DiscoveryToolbarRow and ChatsToolbarRow now use Tailwind's peer + empty pseudo pattern so the wrapper collapses on `:empty` and the separator hides via `peer-empty:hidden`. Pure CSS — no React state coupling between the chip and its parent. Bumps web-client to 0.1.186 and refreshes release…

  2550. Client session-lifecycle bus drops scope choice on sign-out · 82428b2

    Adds a tiny dependency-free event bus in lib/clientSession/sessionLifecycle so any feature that caches per-user state in localStorage / sessionStorage can register a cleanup callback through onClientSignOut(). The auth provider calls emitClientSignOut() as the first step of its sign-out path so the local cache is reset even when the network call fails or the NextAuth redirect never happens. The match intent scope provider subscribes its clearMatchIntentScope helper on mount, so the next user on a shared device can…

  2551. Center journey question screens on mobile + reset shell scroll on intro/index transitions · 4357b40

    The reflection and connection question screens looked top-pinned (and earlier versions clipped the Previous-button above the viewport) on 540x960. Two contributing causes: 1. The questions branch of `QuestionPhaseBase` carried a nested `overflow-y-auto` scroller on its `LayoutGrid` and a `[@media(max-height:760px)]:justify-start` override that defeated the safe-centering pattern just introduced in `LayoutGrid`. Removed both so the shell `<main>` owns scroll and the inner column actually centers via `my-auto` when …

  2552. Expose scope chip in universe view + allowlist new i18n keys (0.1.185) · 250fde3

    UniverseView now passes MatchIntentScopeChip into DiscoveryToolbarRow.scopeSlot so the active session scope and one-click "Change" affordance are visible from the default discovery surface (the 3D universe), not just the list view. The chip rides the same toolbar as the universe / list view toggle and inherits the existing glass surface tokens, so no new ad-hoc styles are introduced. The same-as-en i18n audit allowlist (i18nSameAsEnPolicy) gains the new keys introduced in this work — chats group tabs / card aria l…

  2553. Remove orphaned ConversationGroup component and refresh agent KB · 02afac2

    The vertical accordion ConversationGroup design-system component is no longer used now that ChatsPageClient renders ConversationGroupTabs above a flat list. Delete the file and update the design-system list/ README to point readers at the new chats-tabs component. AGENTS.md gains a note that operator redeploy-stage works end-to-end with --no-pre-teardown (the bare command still hits the FleetPublicInterface container_down KeyError) and a target-stack-logs --plane all snippet for log retrieval (target-container-log…

  2554. Bump web-client to 0.1.184 and backend to 0.1.26 with regenerated release notes · 253e2ad

    Cuts a stage build with the new self-peer rejection (backend), the scope picker accordion + checkboxes + 12h TTL persistence + top-bar chip (web-client), and the chats list horizontal group tabs + one-line ConversationMatchCard. Release-notes JSON regenerated so the in-app /release-notes page reflects the new commits and surfaces both bumped semvers next to the unchanged Cloud (fleet manager) version.

  2555. I18n: add scope tooltips, top-bar chip, conversation tabs, and card aria labels · 33c4020

    discovery.scope.groups.{romantic,professional,social,support}.tooltip plus discovery.scope.groups.tooltipAriaLabel back the new Info-icon tooltips on the gate. discovery.scope.topBar.{prefix,change,groupAriaLabel,tooltip, changeAriaLabel} drive the new MatchIntentScopeChip in /chats and /discovery toolbars. discovery.scope.defaultPresetBadge is the small "Default" pill on the recommended Balanced row. chats.groups.tabsAriaLabel + chats.groups.all.* drive the new ConversationGroupTabs strip. chats.page.cardAriaLabe…

  2556. Chats list horizontal group tabs and one-line conversation card · c88e9f7

    ChatsPageClient renders ConversationGroupTabs (an "All" tab plus one tab per non-empty ConversationGroup with its accent color and item count) above a flat priority-ordered list, replacing the previous vertical stack of collapsible group accordions. The tab strip auto-snaps back to "All" when the currently selected group becomes empty so the user never lands on an empty pane while items still exist. ConversationMatchCard collapses to a single horizontal row using the new shared MATCH_CARD_ONE_LINE_* tokens in matc…

  2557. Scope picker accordion + checkboxes, top-bar chip, 12h TTL persistence · 3260c45

    Match intent scope persistence moves from sessionStorage to a versioned JSON record in localStorage with a 12-hour inactivity TTL. The provider heart-beats lastActivityAt every five minutes and on visibilitychange so an interactive session does not silently fall through the gate, then re-gates the user when the bump returns null. clearMatchIntentScope is exported for the auth signout handler. Scope picker UI: each category becomes a native <details> accordion that auto-opens when it contains the current draft sele…

  2558. Reject self-peer connections and align match enrichment query · a658ccb

    Defence-in-depth in ConnectionService: bulk peer get-or-create silently drops self ids so a stray self entry mixed in with real peers does not blow up Discovery, while explicit mutating operations (request-conversation, request-chat, respond-*, end-connection, get-stage) raise a 403 ConnectionTransitionError with transitionCode SELF_PEER_FORBIDDEN that routes already surface via the shared connectionTransitionHttp mapper. DiscoveryQueryService drops rows whose resolved peer authUid equals the viewer (warn-logged) …

  2559. Mobile-safe vertical centering in LayoutGrid + journey intro · 3832e36

    LayoutGrid `verticalAlign="center"` previously used `min-h-full flex flex-col justify-center`. When inner content was taller than the viewport, justify-center overflowed equally above and below the scroll origin, pushing headings above the visible area on short mobile viewports (e.g. 540x960). Users could not scroll up to recover the heading because the outer scroller was already at scrollTop=0. Switch to the "safe centering" pattern: keep `min-h-full flex flex-col` on the outer wrapper and apply `my-auto` to the …

  2560. Refresh discovery and chat contract updates · 90f5d9e

    Consolidate the current discovery/chat UI, backend validation, locale copy, and regenerated API artifacts into one committed state so the stage build matches the working tree.

  2561. Regenerate release-notes JSON + KB note for /not-found localization · 1e8a995

    Refresh after deploying web 0.1.161 (cookie-driven 404 locale) and web 0.1.162 (drop · {appName} suffix to prevent title.template duplication). KB documents the pattern: when a metadata key feeds into a Next title.template, never include {appName} in the key — the template owns the suffix.

  2562. Drop duplicate '· {appName}' from notFound.metaTitle (Next title.template appends it) (0.1.162) · 1411a85

    After the 0.1.161 fix, stage still rendered: <title>Page Not Found · TrueConnection | TrueConnection</title> Brand name printed twice — once from the message key (`· {appName}`) and once from Next's `title.template` (`%s | TrueConnection`) inherited from `defaultMetadata`. Fix: stripped `· {appName}` from `app.notFound.metaTitle` in all five locale bundles. The keys now hold the bare page name only ("Page Not Found", "Seite nicht gefunden", "Page introuvable", "Página no encontrada", "الصفحة غير موجودة"); Next's t…

  2563. Localize 404 page (cookie-driven locale, drop force-static) (0.1.161) · 457099f

    Curl probe across locales surfaced an i18n + a11y regression on the root 404 page: /en/this-does-not-exist → <title>Page Not Found - 404 | TrueConnection</title> /de/non-existent → <title>Page Not Found - 404 | TrueConnection</title> ← English /ar/missing → <title>Page Not Found - 404 | TrueConnection</title> ← English …body text "Page Not Found" repeats in English on every locale. Two impacts: - Screen readers announce <title> on every navigation; a French/Arabic visitor who hits a stale link hears English on eve…

  2564. Regenerate JSON after stage rebuild (sitemap + classifier fixes) · d3f87e2

    Refresh of release-notes.generated.json picks up the latest pushed commits (web 0.1.159 capture-callback rewrite, web 0.1.160 sitemap /release-notes coverage, plus the chore + docs commits) so the public /release-notes page reflects the deployed stage build.

  2565. Regenerate release-notes JSON + KB note for sitemap /release-notes coverage · d9088ab

    Refresh after deploying web 0.1.160 (sitemap now lists /release-notes). KB documents the unprefixed-route trio pattern: when adding a new entry to UNPREFIXED_ROUTES, also add a sitemap append + a guardrail-test assertion so search-engine discovery, link-emission rules, and sitemap coverage stay in sync.

  2566. curl + grep-count probe of stage sitemap showed: total <url> entries: 15 /release-notes entries: 0 /landing entries (per-locale): 30 · 5919ab1

    curl + grep-count probe of stage sitemap showed: total <url> entries: 15 /release-notes entries: 0 /landing entries (per-locale): 30 Per-locale roots / landings / sign-in were correctly enumerated, but the unprefixed `/release-notes` public route was missing entirely. Search engines could only discover the changelog via the footer link from a landing page — sitemap discovery never surfaced it. The page is the canonical product changelog with one entry per shipped commit; missing it from the sitemap directly hurts …

  2567. Regenerate release-notes JSON + KB note for setUncaughtExceptionCaptureCallback rewrite · 6b3d3f7

    Refresh after deploying web 0.1.159 (third-time-fixed: ECONNRESET classifier now uses Node's setUncaughtExceptionCaptureCallback which replaces the EventEmitter pathway entirely, fully suppressing Next's bare ⨯ uncaughtException printer that was added by the framework after register() ran). KB documents the pattern (capture-and-replay misses listeners added later in the boot sequence) and the backend-security sweep findings (cookies hardened, log redaction working, no PII leaks).

  2568. Switch ECONNRESET classifier to setUncaughtExceptionCaptureCallback (suppresses Next's bare ⨯) (0.1.159) · cc10a90

    Stage logs at web 0.1.158 *still* showed both: {"source":"instrumentation","event":"client_socket_abort","severity":"warn",…} ← my classifier ✓ ⨯ uncaughtException: Error: aborted at ignore-listed frames { code: 'ECONNRESET' } ← Next's printer ✗ Two-line bug per harmless peer disconnect persisted across the 0.1.154 and 0.1.157 attempts. Both used `process.on('uncaughtException')` and captured the listener list at install time. Root cause: **Next.js installs its `⨯ uncaughtException` listener during HTTP server sta…

  2569. Record X-XSS-Protection fix + Traefik middlewares.yml structure trap · c4953fe

    Documents the OWASP 2026 guidance for X-XSS-Protection (deprecated; set to 0), the indentation trap with customResponseHeaders (must live inside the headers: block), and the diff-test pattern for traefik_config.py changes (so future operators verify YAML shape before redeploying).

  2570. Traefik security-headers middleware emits X-XSS-Protection: 0 (deprecated header) · d733985

    Curl probe of stage response headers showed `X-XSS-Protection: 1; mode=block`, which per OWASP 2026 guidance is actively *harmful*: the legacy IE XSS Auditor (the only consumer that ever processed the header) had known bypass vulnerabilities that could turn a missing XSS into a real one; modern browsers (Chrome 78+, Firefox, Safari) do not implement the header at all. CSP `script-src 'self' …` (set by the web-client) is the modern XSS mitigation. Fix: in `app-pipeline/common/traefik_config.py::TraefikMiddlewareCon…

  2571. Regenerate release-notes JSON + KB note for localized meta description + ar_SA + X-Powered-By · cc949df

    Refresh after deploying web 0.1.158 (localized <meta description> + og:description across all 5 locales, fixed invalid og:locale ar_AR → ar_SA, removed X-Powered-By: Next.js header). KB documents the curl evidence per locale (de/fr/es/ar all native) and the OG locale country-code rule (territory must be where the language is spoken; ar_AR was Argentina, not Arabic).

  2572. Localize <meta description> + og:description, fix invalid og:locale ar_AR, drop X-Powered-By (0.1.158) · 75a5578

    Continuing the localized-metadata sweep from 0.1.156. Curl probe of `<meta name="description">` and `<meta property="og:description">` across all five locale roots showed identical English on every locale: /en /de /fr /es /ar: <meta name="description" content="Discover meaningful connections based on shared values and authentic compatibility. Join TrueConnection to find your true match through our unique value-based matching system."/> <meta property="og:description" content="Discover meaningful connections based …

  2573. Regenerate release-notes JSON + KB note for localized <title> + classifier fix · 7e5b209

    Refresh after deploying web 0.1.156 (localized landing/layout titles for SEO + a11y) and web 0.1.157 (instrumentation classifier suppresses Next's duplicate ⨯ uncaughtException line via captured-listeners replay). KB documents the per-locale <title> evidence (de/fr/es/ar all native) and the listener-replay pattern that preserves framework error logging for real bugs while suppressing it for harmless socket aborts.

  2574. Instrumentation classifier suppresses duplicate ⨯ uncaughtException from Next's own logger (0.1.157) · 07c2f35

    Stage logs at api 0.1.156 still showed `⨯ uncaughtException: Error: aborted` **plus** the structured `client_socket_abort` warn from my classifier (introduced in 0.1.154). Two log lines per harmless peer-disconnect — the classifier's whole point was to replace the bare `⨯` line, not duplicate it. Root cause: `process.on('uncaughtException')` *adds* a listener; it does not replace existing ones. Next.js attaches its own listener at server start that prints the bare `⨯ uncaughtException` line. My classifier ran (war…

  2575. Localize <title> on /[locale] + /[locale]/landing for SEO + a11y (0.1.156) · 9085c43

    Browser-MCP probe of /de, /fr, /es, /ar plus `curl ... | grep <title>` across all five locales surfaced an SEO + accessibility bug: /en: <title>TrueConnection - Authentic Connections Through Shared Values | TrueConnection</title> /de: <title>TrueConnection - Authentic Connections Through Shared Values | TrueConnection</title> /fr: <title>TrueConnection - Authentic Connections Through Shared Values | TrueConnection</title> /es: <title>TrueConnection - Authentic Connections Through Shared Values | TrueConnection</ti…

  2576. Regenerate release-notes JSON + KB note for npm audit + SSR deep-link fix · 26cdbd1

    Refresh after deploying web 0.1.155 (uuid override + ?view=activity SSR resolve). KB documents the npm audit analysis (advisory non-applicable because next-auth only calls uuid.v4(), but overridden to keep audit clean) and the no-flash deep-link fix (browser-MCP evidence shows Activity tab selected on first paint with no Notes flash).

  2577. SSR-resolve ?view=activity deep-link so Activity tab paints with no Notes flash (0.1.155) · e26671f

    Visual smoke via browser MCP on `https://stage.trueconnection.app/release-notes?view=activity`: the page rendered with `Notes [selected]` for one paint, then flipped to `Activity [selected]` once the client `useEffect` ran. Annoying flash on every shared Activity link. Root cause: `ReleaseNotesPageView` defaulted `useState(NOTES_VIEW)` to keep SSR and client hydration in sync, then ran a `useEffect` to read `searchParams.get('view')` and switch to Activity. Server HTML always said Notes; client switched after firs…

  2578. Pin uuid >= 14 via npm overrides to clear GHSA-w5hq-g745-h8pq (audit-only) · e6f6407

    `npm audit` reported 2 moderate transitives: `next-auth@4.24.14 → uuid@8.3.2` (GHSA-w5hq-g745-h8pq — missing buffer bounds check in uuid.v3() / v5() / v6() when called with a `buf` argument). Verified by source inspection of `node_modules/next-auth/jwt/index.js` that next-auth uses **only** `uuid.v4()` (random, no `buf` arg) for `setJti(...)` — the codebase is **not exploitable**. Fix is purely to keep `npm audit` clean and the operator's "always keep dependencies up to date" rule satisfied. Approach: `overrides: …

  2579. Regenerate release-notes JSON + KB note for cron in-process + ECONNRESET classifier · b8a7646

    Refresh after deploying api 0.1.24 (in-process cron + bulk-peer Promise.allSettled) and web 0.1.154 (ECONNRESET aborted classifier). KB documents the second cross-bridge sweep, the dead chat-media-orphan cron entry that was removed (its underlying service method was a phantom), and the strict instrumentation classifier with stage evidence (17/17 responsive cells green, zero uncaughtException lines post-deploy).

  2580. Classify ECONNRESET aborted as structured warn (not bare uncaughtException) (0.1.154) · 3974f50

    Stage logs intermittently showed: web-client-stage | ⨯ uncaughtException: Error: aborted web-client-stage | at ignore-listed frames { web-client-stage | code: 'ECONNRESET' web-client-stage | } Looks alarming, isn't a crash: container stays `healthy`, process keeps serving traffic. The events come from clients (Playwright `page.close()`, browser navigations, mobile background suspends) closing the socket mid-response. Next.js 16's default `uncaughtException` printer surfaces them with a bright `⨯`, drowning out gen…

  2581. Scheduled tasks run in-process + bulk peer recalc tolerates one bad row (api 0.1.24) · 7745bb0

    Continuing the change-stream cross-bridge sweep from api 0.1.22-0.1.23, two more silently-broken nightly behaviours found: 1. **node-cron scheduled tasks** in `lib/cron/scheduled-tasks.ts` did `fetch(${urlResolver.getBackendUrl()}/api/cron/...)` for the 02:00 UTC match recalculation cron (and a chat-media-orphan-purge cron whose route handler never existed). On multi-host stage the URL resolves to the public host → web-client BFF → 401 — every nightly run silently no-op'd. Refactored to call services in-process vi…

  2582. Refresh after deploying api 0.1.22 (in-process recalc helper) + api 0.1.23 (orphan match row tolerance + self-heal). · 0621286

    Refresh after deploying api 0.1.22 (in-process recalc helper) + api 0.1.23 (orphan match row tolerance + self-heal). KB entry documents the cross-bridge anti-pattern, the in-process helper as single source of truth, and the self-heal behaviour with stage evidence (4 historic orphans cleaned on first run, zero level:50 errors after).

  2583. UpdateMatchForProfileChange tolerates orphan match rows + self-heals (api 0.1.23) · 5f77075

    The previous fix (api 0.1.22) made the change-stream call this method in-process for the first time on stage. That immediately surfaced a pre-existing latent bug masked for months by the broken HTTP-401 path: Error: updateMatchForProfileChange: profile not found for viewer authUid=69e56bff35a55760fecd5788 (match references otherUserId=ecb7bc48-…) at MatchCalculationService.updateMatchForProfileChange Root cause: `Promise.all` over every `matches` row that references the changed profile. When **one** row points at …

  2584. Recalc matches in-process from change-streams (no HTTP roundtrip-to-self) (api 0.1.22) · 6889384

    Stage logs after every profile update emitted two noise lines: web-client-stage | {"tag":"BFF_PROXY_ERROR","event":"No session token","pathname":"/api/internal/recalculate-matches"…} backend-stage | Failed to trigger match recalculation for user … 401 {"error":"Unauthorized","message":"Authentication required."} Root cause (cross-bridge anti-pattern): `lib/db/change-streams.ts` did `fetch(${urlResolver.getBackendUrl()}/api/internal/recalculate-matches)` to trigger recalc when a profile changed. On a multi-host dep…

  2585. Regenerate release-notes JSON + KB note for design-system consolidation (0.1.152 + 0.1.153) · dad87a8

    Refresh of `release-notes.generated.json` after deploying the design-system consolidation (`src/components/` → `src/design-system/components/`) and the `marketing` naming cleanup. KB entry documents the new architectural contract (single submodule, onion direction, full-path imports) and the responsive matrix evidence (11/11 cells green on stage at 320/375/768/1280).

  2586. Per the project's professional-wording rule (variables should not be named 'marketing' when 'landing' already conveys the context), this rename strips the redundant prefix: · c6f21d8

    Per the project's professional-wording rule (variables should not be named 'marketing' when 'landing' already conveys the context), this rename strips the redundant prefix: - File: `src/design-system/landing-marketing-brand.ts` → `src/design-system/landing-brand.ts` (full git history preserved via `git mv`). - Symbol: `[redacted]` → `getLandingFrostCardDiffuseGlowBoxShadow`. - Updated all docstring `{@link …}` and import-path references in `globals.css`, `design-system/index.ts`, `design-system/landing-accent-chro…

  2587. Merge src/components into src/design-system as a single submodule (0.1.152) · d20f859

    The design system now owns *everything* visual + interactive — tokens (`*-brand.ts`) **and** React components ship as one submodule under `src/design-system/`. Previously the two lived in separate top-level folders (`src/components/` for React, `src/design-system/` for tokens), which made it easy to ship UI that bypassed the token layer. Mechanical refactor (no runtime behaviour change): - `git mv src/components → src/design-system/components` — full git history is preserved for every file (`R`/`RM` status in `git…

  2588. Regenerate JSON to include 0.1.150 + 0.1.151 commits · c03b523

    Refresh of `release-notes.generated.json` after pushing the viewport-export and `/dev` hub fixes. Surfaces the new commits on `/release-notes` so the public page reflects the deployed stage build.

  2589. Add /dev hub index page (root-cause: App-Router static-folder fall-through) · 5f9a320

    Stage probe of `GET /dev` returned HTTP 500 with web-client-stage log: `⨯ Error [InvalidLocaleError]: "dev" is not a supported AppLocale` Root cause: `app/dev/` has subfolders with `page.tsx` (`/dev/platform`, `/dev/ui`, …) but no `app/dev/page.tsx` index. Next 16 App Router cannot satisfy `/dev` from the static folder, falls through to the dynamic sibling `app/[locale]/page.tsx` with `params.locale = "dev"`, and the locale layout's `generateMetadata` correctly throws `InvalidLocaleError`. Same trap exists for any…

  2590. Move themeColor from metadata to viewport export (Next 15+ contract) · c3d6227

    Root cause: `src/lib/seo/metadata.ts` baked `themeColor` into `defaultMetadata` (legacy Next 14 placement). Every locale page using `createPageMetadata()` therefore triggered `⚠ Unsupported metadata themeColor is configured in metadata export …` on every render in stage logs. Fix: split `themeColor` into a new `defaultViewport: Viewport` export and mount it once at the root layout via `export const viewport`. Next merges viewport across the route tree, so every descendant inherits the brand theme-color without per…

  2591. Rebalance Calendar HEAT_STEP_BG so all three metric views read coherently (0.1.149) · 1eef368

    The user reported the three Calendar metric views (Commits / Lines / Estimated hours) looked dramatically different — "how can they be so different". Empirical bin-distribution check on the live bundle shows: Commits bin counts → [70 inactive, 18, 3, 2, 2, 1] ← 18 of 26 active days squeezed into step 1 Lines bin counts → [70 inactive, 6, 5, 5, 5, 5] ← spread evenly Hours bin counts → [ 0 inactive, 10, 28, 36, 11, 11] ← dense (backfill) + cap cluster The visual blowout came from **step 1 being too low contrast on d…

  2592. Landing universe demo orbs sit inside the card (0.1.148) · 53be916

    Root cause: the six orbit dots in `HowItWorks → Explore Universe` walkthrough card used CSS percentages with negative values (e.g. `top: -31.96%`, `left: -40%`) that placed four of the six dots **outside** the card's rounded boundary. The "legacy polar layout formula" comment in `globals.css` never reconciled with the actual 160 × 160 (sm: 176 × 176) container size, so the dots were drawn at top-left corner positions that escaped the box. Fix at the design-system layer (`globals.css`): rewrite the six `.landing-de…

  2593. Guardrail — unprefixed-only routes must not use next-intl Link · 184d086

    Architectural follow-up to commit 4844d3df (the `/en/release-notes` href bug). That fix patched the two specific link sites; this test prevents the **pattern** from reappearing anywhere in `src/`. Background: `@/navigation` exports `Link` from `next-intl/navigation`, which transparently prepends the active locale to any relative `href`. That is correct for `[locale]/...` routes but wrong for routes registered in `src/i18n/routing/unprefixed.ts` `UNPREFIXED_ROUTES` that have **no `[locale]/...` twin** (`welcome`, `…

  2594. Release-notes footer/build-strip links use plain Next.js Link, no locale prefix (0.1.147) · 4844d3d

    The user spotted the rendered href in the landing footer build-strip was `/en/release-notes` (locale-prefixed). The route is registered as **unprefixed** in `src/i18n/routing/unprefixed.ts` `UNPREFIXED_ROUTES` — canonical URL is `/release-notes`, and `/{locale}/release-notes` 308-redirects to it. Root cause: both link sites (`BuildVersionsStrip`, `features/landing/components/Footer`) used `Link` from `@/navigation` (the next-intl-wrapped Link), which transparently prepends the active locale to any relative href — …

  2595. Authenticated responsive matrix green; document container-query typography debt (no version bump) · a71d473

    Continued the operator loop after the 0.1.146 mobile-responsive matrix commit (9822d502): 1) **Authenticated matrix runs green on stage.** Configured the setup project via `E2E_MERGED_ENV_PATH` (tenant merged env carries `E2E_REGISTRATION_USER_EMAIL`) and ran the full `responsive-auth-viewports.spec.ts` against `https://stage.trueconnection.app`. **5 routes × 4 viewports = 20 cells all passing**: `/{locale}/{you,journey,chats,discovery/list,profile}` at 320, 375, 768, 1280 widths. Every cell now also asserts the n…

  2596. Test(e2e),fix(web): mobile responsive design matrix + fixes a real /release-notes 320px overflow (0.1.146) · 9822d50

    The user asked for Playwright design tests that **prove** the pages are mobile-responsive, not just trust that the design-system tokens exist. Built on the existing harness (`assertNoExcessHorizontalScroll` + `buildResponsiveViewportPresetList`) — no new infra, just three extensions and one new helper: 1) **New helper `assert_primary_nav_reachable.ts`** — measures every bottom-nav tab's bounding rect against the nav's own width and against the WCAG 2.5.5 Target Size (Enhanced) ≥ 44 × 44 CSS px minimum. Catches exa…

  2597. Doc + KB sweep + fix OpenAPI ProfilePublic security test (no version bump, no runtime change) · e6c307c

    Sweep findings from the operator loop, no new runtime code: 1) **`docs/release-notes-commits.md` was on schema v3.** The Activity tab model had since moved to v4 (totals decomposition into evidenced + backfilled, plus `activeDays`) and gained the GitHub-style calendar axes. Refresh the schema-version line, append the v4 history entry, and bump the Calendar bullet to mention the month strip + Mon/Wed/Fri axis + quantile-on-distinct binning. 2) **`tests/atomic/security/openapi-profile-public-no-platform-role.test.ts…

  2598. Silence NextAuth debug log noise on stage + tighten layout guardrail (0.1.145) · 77973d1

    Two operator-loop sweep findings, both real: 1) **Stage logs were full of `❌ [auth] NextAuth CLIENT_FETCH_ERROR`** on every SPA navigation. Root cause: `NEXTAUTH_DEBUG=true` was set in `app-pipeline/app-tenant/tenants/ifeoma-tc/config/.../tc/.env.stage`, but the inline doc on `nextauth_logger.ts` is explicit that this flag is for **dev-only active debugging** ("set in `.env.dev` only when actively debugging authentication flows"). With it on, our `logAuthDebug` wrapper escalated NextAuth's transient SPA-abort `CLI…

  2599. Two responsive bugs surfaced together: · 433de48

    1) **Bottom AppNav** required horizontal swipe on iPhone-sized widths. Each tab carried `min-w-[3.5rem]` plus `flex-nowrap` and the row wrapped a horizontal-scroll fallback (`overflow-x-auto`). At 320– 375 px viewports, 6 items × 56 px > viewport, so the user had to scroll the primary navigation to reach Admin/Logout — anti-pattern for a mobile bottom bar. Fix: drop `min-w-[3.5rem]`, set `flex-1 min-w-0` on every tab so flexbox distributes them evenly across whatever width the viewport gives. The row class loses `…

  2600. Calendar grid was floating in ~25 % of the card width with no temporal context: a reader couldn't tell which column was January vs April or which row was Monday vs Sunday. · 2b0b04e

    Calendar grid was floating in ~25 % of the card width with no temporal context: a reader couldn't tell which column was January vs April or which row was Monday vs Sunday. The card looked half-broken because nothing labelled the axes the eye expects on a contribution heatmap. Add the standard GitHub-style axes: * **Month strip** above the grid — one short month label per first week-column that touches a new calendar month, computed by `buildMonthSegments` over the chunked weeks (skips leading padding so Jan-19-Mon…

  2601. Per operator request: on first open, every section card except Calendar is collapsed. · d19f406

    Per operator request: on first open, every section card except Calendar is collapsed. Calendar stays default-open because it's the headline visual. The other five sections (Cumulative estimated hours, Weekly summary, Per-commit weight, Daily table, When commits land UTC) now default to closed — readers expand only what they want. User can still open everything; the chevron in each card header rotates to indicate state. State is per-card via the native <details> element, no extra JS state needed. Stage 0.1.141 veri…

  2602. Define brand-violet Tailwind v4 color tokens — fixes silent transparency across admin debug, chat, journey, release-notes (0.1.140) · ebfbc1c

    Project-wide latent bug uncovered by the release-notes Activity v7 work (commit 3effdf63). The Tailwind v4 `@theme inline` block in `src/app/globals.css` historically defined the brand violet **only as the raw CSS variable** `--brand-violet-rgb` (under `:root`), never as `--color-brand-violet*` theme tokens. As a consequence every utility class of the form `bg-brand-violet-muted/N`, `text-brand-violet`, `bg-brand-violet-subtle`, `text-brand-violet-strong` resolved to *no CSS at all* and every consumer rendered tra…

  2603. Release-notes Activity v7 — actually visible heatmap gradient + Fewer→More legend (0.1.139) · 3effdf6

    Real root cause of the "calendar shows only the brightest cell, no gradient" complaint: the project's Tailwind v4 theme exposes the brand violet only as the **CSS variable** `--brand-violet-rgb` (see `app/globals.css`), **not** as a `--color-brand-violet-muted` token. Classes like `bg-brand-violet-muted/45` therefore generated **no CSS at all** — the heatmap cells, weekly bars, and per-commit bars were rendering with a transparent background and what looked like a faint violet tint was just the glass-panel substra…

  2604. Release-notes Activity v6 — split totals into evidenced + backfilled (0.1.138) · 2147048

    Reader couldn't tell which part of `estimatedHours` was Git evidence and which part was the model's backfill assumption. The "Days with commits" KPI also conflated two different questions ("how often did I commit?" vs "how often did I work?") into one number, while the more useful "days the model attributes any work to" was hidden in the byDay array. Model — schema v3 → v4 (no shim): * `totals.evidencedHours` — only the per-commit churn + interval spread; the "this much is observed" part of the bundle. * `totals.b…

  2605. Refresh maintainer doc + KB for churn_interval_v2 / schema v3 · 4aacc94

    `docs/release-notes-commits.md` was still describing the original `churn_interval_v1` model and `schemaVersion: 2`. Refresh: - Document the four ordered steps the model now runs (per-commit hours, interval spread, weekday/weekend backfill split with the 4 h / 8 h defaults, daily ceiling `maxDayHours`). - Note the self-explainable identity: pure no-commit weeks land at exactly 36 h (5 weekdays × 4 + 2 weekend days × 8) with the defaults. - Bump the schema-versioning section to `3` and add a short v1→v2→v3 history. …

  2606. Release-notes Activity v5 — split past-workday backfill into weekday vs weekend (0.1.137) · e794ec9

    Real-world cadence reported by the operator: weekdays vary 2-6 h with the occasional zero day, weekends typically go in as a focused full-day block. The previous uniform 6.4 h/day backfill flattened that pattern. Replace the single `pastWorkdayHoursPerDay` parameter with two: - `pastWeekdayHoursPerDay` default 4 h (Mon-Fri, midpoint of 2-6 band) - `pastWeekendHoursPerDay` default 8 h (Sat-Sun, "the whole weekend") Weekday detection is in **UTC** (`Date.getUTCDay()`) to keep the model deterministic regardless of wh…

  2607. Release-notes Activity v4 — sane day cap + log-scaled weekly bars + KPI label (0.1.136) · 39f0bed

    Three remaining root-cause issues from the previous sweep, fixed in one pass: 1. Daily and weekly totals were physically impossible. The model summed per-commit hours unboundedly per day; a 150-commit day produced 50+ h of work because each commit contributed `log(2)` plus the per-commit floor. Apr 20 week peaked at 979 h (= 140 h/day across 7 days). Add `maxDayHours` parameter (default 16 h) to the analytics model and apply it as a hard ceiling on each day's `estimatedHours` after every additive contribution (per…

  2608. Release-notes Activity v3 — visible past activity, per-commit churn (0.1.135) · cfa0381

    Two visualization regressions exposed real flaws in the v2 scaling: 1. Calendar Commits view hid Jan/Feb singletons. The previous `log(value)/log(max)` scale put a 1-commit day at step 1 (~14 % of the visible range), painting it as nearly empty against a 150-commit Apr peak. Replace with a quantile bin over the **distinct** non-zero magnitudes so each step lands on a different commit-count tier (1 → 7 → 53 → 84 → 150), and lift step 1 from /30 to /45 opacity so a single commit still reads as activity on dark glass…

  2609. Pin release-notes date formatting to UTC to remove hydration mismatch (0.1.133) · 2eaf49c

    `formatEntryDate` (used by the Notes list inside the client island) and `formatBundleLastUpdated` previously inherited the host timezone. SSR runs in UTC and the browser typically does not, so any commit timestamp near midnight UTC formatted to a different calendar day on each side of the boundary — triggering React error #418 (text-content hydration mismatch) on `/release-notes`, and inconsistencies between the Notes date and the heatmap / daily-table day key (which already pin UTC). Both helpers now pass `timeZo…

  2610. Release-notes Activity v2 — collapsible cards, magnitude tinting, past-workday backfill (0.1.132) · acde26f

    Algorithm (`churn_interval_v2`): Add a documented past-workday backfill so historical commit-less days that fell **strictly before** `pastWorkdayBackfillCutoffDay` (default 2026-04-13) receive an extra `pastWorkdayHoursPerDay` (default 6.4 h ≈ 0.8 × 8 h work-day) on top of the existing churn-interval spread. Days at/after the cutoff stay purely commit-driven now that day-by-day reporting is in place. Set `pastWorkdayHoursPerDay: 0` to disable. UI: Each Activity section is now a brand-styled collapsible card (`<det…

  2611. Release-notes Activity tab + estimated hours analytics (0.1.131) · 608b364

    Compose `/release-notes` as a feature submodule: `src/features/release-notes/{model,schema,ui}` with strict Zod validation, pure analytics builder, and a client island that renders calendar heatmap, cumulative estimated-hours line, weekly bars, per-commit weight bars, daily table, and an optional UTC punch-card. The `?view=activity` deep link is honoured; clicking back to Notes clears the query without a router round-trip. The prebuild generator (`scripts/generate-release-notes-data.ts`) parses `git log --numstat`…

  2612. Gitignore WIP features/release-notes; bump 0.1.128 · 085aa5f

    - Prevent partial local trees from breaking Fleet/remote next build; refresh release-notes.generated.json for new semver. - No functional app code change beyond version metadata.

  2613. Sync release notes JSON (664f0dd0 entry, fleet pre-rebuild) · ecc043d

    - Regenerate from git log after e2e/auth gate commit; keep bundle aligned with /release-notes.

  2614. Authenticated grounding + You hub smoke; document auth gate spacing · 664f0dd

    - Add ui-authenticated spec: after onboarding gate, assert grounding h1, CTA, You heading. - Clarify AUTH_GATE_VIEWPORT_COLUMN: sub-640px lower space is intentional (keyboard). - Web client 0.1.127; regenerate release notes.

  2615. Cursor kb, agent rules, and release notes index · f8489d0

    - Update app-pipeline .cursor knowledge base (README, fleet diagnostics, discovery universe); root agent-rules-changelog and release-notes-commits.

  2616. Profile media, discovery, landing, and contract sync · 57bcd95

    - Profile pictures: API integration, settings section, PeerProfilePictureOrOrb, object URL hook, stream selection, chip wrap helper; update cards and headers. - Regenerate OpenAPI client artifacts; drop legacy api-client.ts; sync zod validation; ProfilePicturePublic model and profile API docs. - Discovery: universe WebGL, camera, tooltips, list/profile adapters, types; journey matching-signals card chip layout. - Landing: remove DemoWalkthrough; refresh FAQ, HowItWorks, StickyNav, Footer; i18n overlays and message…

  2617. Profile picture pipeline, routes, and discovery mapping · eddaabf

    - GridFS storage, authorization, paths, types, and ProfilePictureService; register profile picture routes; wire server and main router. - Map discovery profile payloads; update ConnectionService and tests. - Sync validation zod from contracts; bump backend package version.

  2618. OpenAPI and zod for profile picture and profile fields · 4eccf89

    - Extend OpenAPI; regenerate generated index and zod-schemas for profile media and related profile payloads.

  2619. Tenant env, fleet context, docker-compose, schema mount · 281588d

    - Fleet tenant context env behavior; tenant interface and ifeoma-tc package index; docker-compose adjustments. - Remove obsolete container_mount schemas index (schemas generated elsewhere).

  2620. - Add repair for mangled single-line .env key concatenation and fleet manager version overlay handling. · f3d4a1b

    - Add repair for mangled single-line .env key concatenation and fleet manager version overlay handling. - Extend constants_env; unit tests for both helpers.

  2621. Sync release notes after stage 0.1.126 deploy; refresh fleet KB evidence · 4bbeab7

    - Fleet tenant-rebuild-web-client refreshed generated JSON (77a2b94 entry, timestamp). - Document ifeoma-tc stage 0.1.126 curl, health suite, and browser cache-bust checks.

  2622. Align auth, landing hero, and journey intro layouts for mobile · 77a2b94

    - Add AUTH_GATE_VIEWPORT_COLUMN: start on narrow, center from 640px; use on sign-in and auth error with LayoutGrid top. - QuestionPhaseBase intro and ConsentRequestScreen: LayoutGrid top + tighter intro padding. - Hero: top-anchored section with safe-area pt; tighter badge, headline, and orb vertical rhythm. - ErrorScreen: drop h-full centering; min-height + horizontal padding for flex parents. - Reflection empty state: min-height and flex-1 without h-full. - Web client 0.1.126; regenerate release notes.

  2623. Tighten journey grounding and You hub responsive spacing · 1ab385f

    - Add JOURNEY_SCREEN_LAYOUT (fill vs natural route shells) in layout-brand; export from design-system. - Grounding: use LayoutGrid + flex-none orb row, top safe-area, compact CTA gaps; remove flex-1 stretch that centered the orb in empty space; journey page uses natural shell for grounding only. - You hub: top-align LayoutGrid, reduce section spacing, safe-area padding on orb. - Bump web client to 0.1.125; regenerate release-notes data.

  2624. Add TC_FLEET line in .env.stage; refresh release notes · a6a8ed8

    Split TC_FLEET_MANAGER_VERSION and TRAEFIK_ACME_CERT_MAIN on separate lines so dotenv and merge-env see TRAEFIK as its own key. Regenerate release-notes.generated.json from the Fleet (git log) pre-build step.

  2625. Copyright year via UTC in browser (Footer, web 0.1.115) · 543a8b2

    - getUTCFullYear in state + useEffect after mount for client clock - i18n landing.footer.copyrightLine unchanged; prebuild JSON refresh

  2626. BuildVersionsStrip placement + KB QA (You hub, settings, stage curl) · 96924fc

    - BuildVersionsStrip: single module doc (variants + AppPagesLayoutClient / UserProfileMenu) - KB: signed-in build strip QA, tenant-rebuild-app for backend semver alignment

  2627. StickyNav file doc — locale on Hero/Footer only · 4c39006

  2628. StickyNav module note + KB evidence for 0.1.114 sticky bar · e423425

  2629. Remove language picker from sticky nav (web 0.1.114) · 0321467

    - StickyNav: drop PublicLanguagePicker; locale remains in footer and hero - Regenerate release-notes bundle

  2630. Stage 0.1.111 vs local 0.1.113 curl evidence (release-notes) · 392281a

  2631. Align /release-notes with glass surface + CQ typography tokens · 62d74d5

    - Extend LAYOUT_CQ_TYPOGRAPHY with release-notes entry and meta styles - Add PUBLIC_INLINE_LINK; reuse in LoginForm and release-notes - List items use SURFACE_BRAND.glassJourneyPanel (journey/universe glass, not ad-hoc borders) - Bump web-client to 0.1.113 + regenerate release-notes bundle

  2632. /release-notes unprefixed URL + pre-0.1.112 curl evidence · fc45f4c

  2633. Serve release notes at /release-notes, unprefixed locale via cookie · 6330758

    - Add app/release-notes with UnprefixedRouteShell; allowlist in UNPREFIXED_ROUTES - permanentRedirect from /[locale]/release-notes to /release-notes (single canonical path) - introduce resolveUnprefixedRouteLocaleFromCookies for DRY server locale resolution - createPageMetadata pathIsLocaleAgnostic for single-URL SEO canonical - AppProviders: landing document scroll for /release-notes; pathname SSOT when needed - Tests: routing, proxy allowlist, SEO; e2e public viewport path - Docs: application/docs/release-notes-…

  2634. Non-(pages) routes used app-layout (100vh + overflow hidden) without an inner overflow-y scroller, so long release-notes content was clipped with no scrollbar. · b67a587

    Non-(pages) routes used app-layout (100vh + overflow hidden) without an inner overflow-y scroller, so long release-notes content was clipped with no scrollbar. Treat /{locale}/release-notes as a landing path in AppProviders isLandingPath so html/body get landing data-layout and natural document scroll. See AppProviders.tsx isLandingPath; release-notes page docstring.

  2635. Run release-notes generator before app rebuilds (app-pipeline 1.0.2) · f143fc1

    tenant-rebuild-web-client and tenant-rebuild-app invoke npm run generate:release-notes in app-source/20_web-client on the operator host before rsync, aligning shipped JSON with a full git clone. Fail fast with a clear error if npm is missing or the script fails. - New module _release_notes_preflight; skip via --skip-release-notes-refresh or TC_FLEET_SKIP_RELEASE_NOTES_REFRESH=1 - Unit tests; KB + README + agent changelog updated

  2636. Changelog row for onboarding birth-year E2E + 0.1.100 · c2eed6c

  2637. Refresh release-notes.generated.json for 0.1.100 · 93e0ec0

  2638. Require onboarding birth-year control (web 0.1.100) · 72f925d

    Assert data-testid onboarding-birth-year is visible before submit so mandatory onboarding cannot ship without the calendar birth year field. See isProfileOnboardingComplete and profile API birthYear.

  2639. Changelog row for differentiators 0.1.99 KB evidence · ccff037

  2640. Stage evidence for differentiators 0.1.99 + release-notes flow · bf33604

  2641. Sync release-notes bundle — differentiators 0.1.99 lead · a99f74a

  2642. - Expand section subtitle and four cards (values, consent, pace, privacy) - Align with journey: reflection before feed, opt-in steps, no engagement-stack bait - i18n overlays en/d… · 60367fe

    - Expand section subtitle and four cards (values, consent, pace, privacy) - Align with journey: reflection before feed, opt-in steps, no engagement-stack bait - i18n overlays en/de/fr/es/ar; module docstring; release-notes bundle

  2643. Stage evidence for tenant-rebuild-app backend 0.1.20 parity · f2adac9

    - Document build-info 404→200, web 0.1.98, API 0.1.20, public-edge OK - Clarify tenant-rebuild-app vs tenant-rebuild-web-client; agent changelog row

  2644. Release-notes list feat testimonial name formatting first · 5d55815

  2645. Testimonial names as First L. (0.1.98) · 8b39bd6

    - Add formatAttributionNameInitialOnly in displayName utils - Apply in Testimonials for s1–s3; keep full names in messages for translators - Atomic tests; refresh release-notes bundle

  2646. Release-notes.generated.json list fd1f8f4d · 8a2398b

  2647. Refresh release-notes after bundle lead-entry commit · fd1f8f4

  2648. Regenerate from git so /release-notes lists feat(landing) richer demo walkthrough first. · 85e5d25

  2649. - Expand section subtitle; add detail paragraph per step (reflection, connection, universe, chat) - Border-accent layout for detail; update message key map and module docstrings -… · a8d0c9d

    - Expand section subtitle; add detail paragraph per step (reflection, connection, universe, chat) - Border-accent layout for detail; update message key map and module docstrings - Regenerate release-notes bundle

  2650. First entry now includes the chore bundle + KB commit; regenerate was run post-push so git log order matches main. · eb0f361

  2651. Sync release notes bundle, bump 0.1.96; KB stage evidence · 4d8e192

    - Regenerate release-notes.generated.json so /release-notes lists newest commits - Document ifeoma-tc stage rebuild/health/settle and release-notes workflow in KB - Note in agent-rules changelog

  2652. Move build version strip from You hub to settings sheet (0.1.95) · c07b66c

    Omit the fixed BuildVersionsStrip on ROUTES.JOURNEY_YOU in AppPagesLayoutClient. Add BuildVersionsStrip variant settings (inline, end of scroll) to UserProfileMenu so web/API semvers show at the bottom of My Settings. Bump web client to 0.1.95 and refresh generated release notes.

  2653. Stage evidence for web-client 0.1.94 discovery deploy · 4646109

    Record tenant-rebuild-web-client, brief /api/health 404, health and build-info parity, public-edge OK, landing and release-notes probes, signed-in discovery caveat, PACKAGE_INDEX revert.

  2654. Make DiscoveryToolbarRow mode segment optional; universe and list routes show only the universe/list switch. · 95480db

    Make DiscoveryToolbarRow mode segment optional; universe and list routes show only the universe/list switch. Fixed explore strapline via RevealHeader; deprecate UniverseModeToggle for non-product use. Improve narrow-viewport layout: RevealHeader typography, full-width guide panel with tighter max height, larger tab targets and guide copy sizing. Localize updated toolbar aria labels in all locales. Remove dead DiscoveryPageClient handlers; satisfy lint for universe effect sync.

  2655. Stage evidence for web-client 0.1.93 deploy · f963b04

    Record tenant-rebuild-web-client, health/build-info parity, public-edge OK, release-notes HTML check, web-client-stage logs, PACKAGE_INDEX revert note, and link to QuestionPhaseBase questions scroll fix.

  2656. Question phase scroll height and shell padding (0.1.93) · e686ad6

    Remove flex-1 and pb-24 from QuestionPhaseBase questions LayoutGrid. The (pages) main column already grows in the flex tree; flex-1 on the grid forced the question stack to viewport height so users scrolled through empty space below the card. mainPadBottomNav on main already clears the fixed bottom nav — duplicate pb-24 added a second deep inset. Document the invariant in the module docstring.

  2657. Stage evidence for web-client 0.1.92 deploy loop · 3d37e12

    Record tenant-rebuild-web-client, brief /api/health 404, polling to 200, tenant-live-health public-edge OK, release-notes confirmation, and PACKAGE_INDEX.yaml revert guidance for ifeoma-tc stage.

  2658. Replace the native range input with the shared Radix Slider so the thumb and filled track match the 1–10 value. · f9efcab

    Replace the native range input with the shared Radix Slider so the thumb and filled track match the 1–10 value. Extend Slider with optional track, range, and thumb class/style hooks for statement-tinted fills. Keep numeric rating buttons in a five-column grid at all breakpoints so the row no longer overflows on md widths. Tighten RatingCard and question shell vertical padding to reduce empty space above the card. Bump web client to 0.1.92 and refresh generated release notes.

  2659. Visible newest-first hint + document prebuild pipeline · 16f4e80

    The /{locale}/release-notes page already bundles git log via prebuild; add app.releaseNotes.orderHint (en/de/fr/es/ar) under the lead, clarify page and generator docstrings (newest first, oldest last in JSON order), and bump web to 0.1.91 with refreshed release-notes.generated.json.

  2660. Tighten QuestionPhaseBase questions chrome spacing · 39d2bb5

    Progress, Previous, and Next sat in separate grid rows each with large margins, stacking with LayoutGrid top padding into a tall empty band above the card. Group progress + nav in one space-y-2 chrome block, reduce grid gaps, tighten LayoutGrid top padding (!pt-1/md:!pt-2), and use compact ghost row height (h-9). Bump web-client to 0.1.90; refresh release-notes.generated.json.

  2661. Refine QuestionPhaseBase intro layout and CTAs · 6b730cb

    Connection (and reflection) intro screens used a plain h1, tight vertical rhythm, and impact lines that read as one dense block. Use LAYOUT_CQ_TYPOGRAPHY.mediumColumnPageTitle, max-w-prose copy, scrollable intro shell with safe-area padding, subtle impact rows, and rect-brand-solid-main for Begin Rating. Bump web-client to 0.1.89; refresh release notes.

  2662. Halo-inclusive layout frame for Hero, preview, journey centre · c0a93fc

    YouBrandOrbMark’s halo extends past the root box; parents that only sized the sphere (e.g. Hero motion stack with absolute rings) centred rings on the tight box, so the cluster looked shifted. Add YouBrandOrbHaloLayoutFrame (getBrandOrbHaloPadPx) and use it in Hero, UniversePreview, and JourneyConstellation. Bump web-client to 0.1.88; refresh release-notes.generated.json.

  2663. Wrap QuestionCard choice labels; i18n question phase chrome · 51b514f

    Root cause: flex items default to min-width:auto, so long chip text could not shrink inside grid cells and was clipped together with overflow-hidden and tight rounded-full pills. Use min-w-0 on the chip shell and label, whitespace-normal/break-words, rounded-2xl, h-auto/min-h touch target, and optional single-column grid below 380px. DRY shell classes via reflectionChoiceChipShellClassName; keep overflow-hidden only for the examples-branch overlay. Localize hints, submit/complete CTA, examples toggle, slider defau…

  2664. YouBrandOrbMark halo extends past the sphere box with asymmetric gradients, so centring only the tight root shifted the visual cluster. · 6765ce0

    YouBrandOrbMark halo extends past the sphere box with asymmetric gradients, so centring only the tight root shifted the visual cluster. Reserve a square of sphere + 2*getBrandOrbHaloPadPx, expand the constellation stage to fit, and split outer translate positioning from inner Framer scale. Move the You label text-shadow into orb-brand (getJourneyConstellationYouLabelTextShadowStyle) using getSrgbBlackRgba and BRAND_VIOLET_RGB. Bump web-client to 0.1.86 and refresh release-notes.generated.json. Add atomic test for …

  2665. Glass radar panel aligned with No Rush card · 5fc9110

    - Export LANDING_BRAND_VIOLET_FEATURE_CARD_GRADIENT_TAILWIND; reuse in Features and UniversePreview. - Universe preview: rounded-3xl violet glass, card glow, inset ring, subtler rings; drop ambient orb layer. - Tuned demo orb sizes for cross layout; You mark 96px. - Bump web-client to 0.1.85; refresh release-notes data.

  2666. Document PublicLanguagePicker retracted centre fix · 472d1e4

  2667. Center hero PublicLanguagePicker retracted state · c3b9f80

    Remove obsolete translateX peek math (single trigger, no chip row). Use size-11 flex centre so EN stays geometrically centred on mobile and desktop. Bump web-client to 0.1.84; refresh release-notes data.

  2668. Stage semver probes, build-info footer, onboarding cache gate · b753817

  2669. Sync profile cache before post-submit navigation · 97132bd

    Root cause: AppPagesLayoutClient hides the shell when needsOnboarding is true but the path is no longer /onboarding. After POST /api/profile, invalidateQueries refetches asynchronously, so router.replace(/you) could run while the TanStack cache still showed incomplete onboarding — fullscreen redirect appeared stuck. Merge updateProfile response into selfProfileQueryKey before replace and invalidate. Bump web-client to 0.1.83; refresh release-notes data.

  2670. Web-client(0.1.82): responsive shell, landing steps, i18n nav, orb layout · b2366a1

    - Export pathnameWithoutLeadingLocale for locale-aware AppNav active tabs; add Vitest coverage. - Layout-brand tokens for bottom nav scroll, discovery overlay clearance, chat error shells. - How It Works: five-step journey copy; overlay landing.json for all locales. - Grounding/Hero/orb: fix clipping; softer halo stops; overflow-visible orb mark. - MatchCard, RatingCard, QuestionCard, ConsentRequestScreen, MessagingHeader: responsive stacks and tokens. - Admin panel back link uses ROUTES.LANDING and admin.panel.ba…

  2671. Button wraps/shrinks for long labels; You hub grid responsive · 9435ef8

    - Base Button: min-w-0, whitespace-normal, text-center, break-words; drop root shrink-0 so grid/flex can constrain width - YouScreen: single column below 420px, full-width buttons, shrink-0 on icons - Bump web-client to 0.1.78; refresh release-notes JSON

  2672. Gate sign-in social block behind SHOW_SOCIAL_LOGIN_OPTIONS · 054563a

    - Omit divider + OAuth placeholder buttons from DOM when false (default); keep full markup for later - Document flag in LoginForm module docstring; bump web-client to 0.1.77 and refresh release-notes JSON

  2673. Back link from sign-in to landing (i18n, 0.1.76) · fcd0f1e

    - Add auth.login.backToLanding + server copy; Link to ROUTES.LANDING above card title on both steps - Stable data-testid auth-login-back-to-landing for E2E; refresh release-notes bundle semver

  2674. Refresh release-notes.generated.json after release-notes UX · 004db06

  2675. Richer release notes with versions, sanitizer, tsx generator · 730c7f3

    - Replace mjs generator with tsx script; bundle webClientVersion + apiVersion from package.json - Add sanitizeReleaseNoteText + userSummary/userDetail from commit body; PEM/JWT/Bearer/co-author stripping - Public page: headline + optional detail, collapsible technical block, build version line (test id) - i18n (en/de/fr/es/ar), Vitest atomic tests, web-client 0.1.75; refresh generated JSON - KB: fleet doc references ts generator and build-versions test id

  2676. Refresh release-notes bundle after HEAD sync · 0adee76

  2677. Sync release-notes.generated.json with HEAD · d8f310a

  2678. Refresh release-notes.generated.json (a78fae4a) · f53eaaa

  2679. Refresh release-notes.generated.json (580a147a) · a78fae4

  2680. Release-notes JSON refresh workflow for Fleet rsync builds · 580a147

  2681. Refresh release-notes.generated.json after recent commits · aa1db9b

  2682. Agent-rules-changelog for release-notes fleet KB · dfdc65b

  2683. Link release-notes route to fleet KB bullet · 0fa41b8

  2684. Fleet quick ref for /release-notes deploy checks · c5c22e6

  2685. Public /release-notes from Git history + nav links · af57aa8

    - Add prebuild script writing src/data/release-notes.generated.json (newest-first git log) - Locale route /release-notes with LayoutGrid, SEO metadata, i18n (en/de/fr/es/ar) + landing overlays - Link from BuildVersionsStrip and landing footer; ROUTES.RELEASE_NOTES + responsive E2E allowlist - Allowlist tracked JSON under web-client (release notes, i18n overlays) in root .gitignore - Bump web-client to 0.1.74

  2686. Persist birth year on onboarding and self profile · e5f9be3

    - Split OpenAPI ProfilePublicShared vs ProfilePublic so discovery peers omit birthYear - Add birthYear to UpdateProfileRequest; validate UTC calendar range on POST /api/profile - Web: mandatory onboarding + settings + edit form; gate isProfileOnboardingComplete on birthYear - Derive display age from birth year on profile card header (localized) - i18n (en/de/fr/es/ar) and backend errors.profile.birth_year_invalid - Bump web-client to 0.1.73 and backend to 0.1.20; unit tests for policy and onboarding gate

  2687. Explicit response body reads + PWA unregister logs · 9a9cc3c

    - Add readResponseTextOrThrow for DRY, non-silent Response.text failures. - Use it in features/auth/api (validateIdentifier, registerUser) and downloadServerChatTranscriptExport for !ok bodies. - 413 transcript-export: replace empty JSON catch with ChatTranscriptExportTooLargeError including parse failure context. - PWA dev unregister: console.debug scope + rejection reason. - Web-client 0.1.72; stage rebuild, target-stack-logs --scan (clean), tenant-live-health + landing browser OK.

  2688. Surface useAdminData load failures with i18n · 79d6408

    - Add profilesLoadError / statsLoadError state (cleared on retry) with admin.useAdminData.* messages in all locale bundles. - Sanitize API error text for ICU {message} placeholders; fix loadAllProfiles log component name (useAdminData). - deleteProfile rethrows the original error after log (no generic wrapper). - Web-client 0.1.71; stage rebuild + health + landing browser verified.

  2689. Strict error paths in useAdminData hook · 5a18bed

    - checkBackendStatus: log failures with logComponentError before offline. - loadProfileDetails: remove getAnalytics .catch(null); log getAnalytics failures via logError (userId + action); set analyticsRequestFailed on ProfileData when preferences succeeded; rethrow after log on preference errors instead of returning stale profileData. - Document ProfileData.analyticsRequestFailed and hooks README. Web-client 0.1.70; stage rebuild + public-edge health + build-info verified.

  2690. Opt-in wide + landscape viewports for responsive matrix · 1f3cb14

    - Add responsive_viewport_presets helper (core four + 568x320 + 1920x1080 when E2E_RESPONSIVE_EXTENDED=1); use in public and authenticated responsive viewport specs with stable caseLabel diagnostics. - Document in tests README, design-system README, responsive-audit-matrix §A/C, app-fleet KB, and AGENT_BEHAVIOUR memorize bullets. - Bump web-client to 0.1.69; stage rebuild + public-edge health OK; Playwright extended matrix 8/8 passed on stage.

  2691. Define brand-module chat/journey CSS; clear design-system allowlist · f5ec45f

    - Add globals.css rules and RGB tokens for journey steps, typing indicator, cooldown panel, and chat bubble brand classes referenced from *-brand.ts. - Align generated-question borders with Tailwind border-2; respect prefers-reduced-motion for typing dots. - Empty KNOWN_UNDEFINED_CLASSES; point test/docs to responsive-audit-matrix. - Bump web-client to 0.1.68; stage rebuild verified (health, build-info, tenant-live-health public-edge, /en/landing snapshot).

  2692. - Add PUBLIC_ROUTES for root, unprefixed landing and legacy journey redirect; cookie reset set. · e9ee7e4

    - Root readyLocator accepts /welcome, /{locale}/landing, or /{locale} after infra negotiation. - Remove superseded app-shell-layout-viewports.spec.ts; update design-system README + PR template. - responsive-audit-matrix §C/E: E2E cells + ledger + evidence line for stage 0.1.67. Evidence: npm run build:direct, tenant-rebuild-web-client stage, /api/health 0.1.67, responsive-public-viewports 8 passed, tenant-live-health public-edge OK, target-stack-logs --scan OK, browser en/landing Web 0.1.67.

  2693. - Extend DISCOVERY_UNIVERSE_VIEW_MESSAGE_KEYS (canvas2dYou, universe3d*, peerTooltipMatchUnavailable). · 3e379c0

    - UniverseView3D: useTranslations + layout compatibility for orb match line; remove scanner baseline. - Add discovery-universe-manual-matrix.md; link from responsive-audit-matrix §H + evidence 0.1.66. - Parity strings in de/es/fr/ar. Evidence: build:direct, check:translations, tenant-rebuild-web-client stage, /api/health 0.1.66, responsive-public-viewports 5 passed, tenant-live-health public-edge OK, target-stack-logs --scan clean, browser footer Web 0.1.66.

  2694. - Add APP_VIEWPORT.minFull in layout-brand; export from design-system barrel. · b967fe1

    - globals: app/landing shells and document app layout use 100dvh vs 100vh. - Wire LoadingScreen (fullscreen/section dvh), FullscreenLoadingContext, PageLayout, auth layout/error, welcome, ResponsiveCard max-heights, global-error. - UniverseView3D: h-full min-h-0 + docstring; dev/docs-graph calc uses dvh. - Docs: design-system README + responsive-audit-matrix evidence for stage 0.1.65. - Refresh localized UI baseline line keys after UniverseView3D edits. Validated: npm run build:direct, check:translations, tenant-r…

  2695. 0.1.64 APP_SHELL_SCROLL deploy + E2E settle note · 3b76a3b

  2696. APP_SHELL_SCROLL for AppNav + main safe-area · f7e2fcf

    - Add APP_SHELL_SCROLL tokens (mainPadBottomNav, mainPadOnboardingNoNav, bottomNavSafeArea). - Wire (pages) main, AppNav inner/fallback, AdminPanel scroll shell; document in README + globals + fleet KB. - Bump to 0.1.64; matrix evidence (device inset spot-check noted).

  2697. Complete 0.1.63 CQ typography deploy evidence · ecb1144

  2698. Extend LAYOUT_CQ_TYPOGRAPHY to chats, connections, onboarding · 3727a49

    - Rename analytics page tokens to mediumColumnPageTitle/Subtitle (shared shell headings). - Add onboardingPageTitle/Lead with tc-layout md steps; wire Chats, Connections, Analytics, onboarding. - Bump to 0.1.63; refresh design-system README, fleet KB, responsive matrix evidence.

  2699. LAYOUT_CQ_TYPOGRAPHY + tc-layout column guidance · a081958

  2700. Tighten 0.1.62 CQ typography evidence · 8085d3f

  2701. LAYOUT_CQ_TYPOGRAPHY for tc-layout column titles · e6c0ad8

    - Add LAYOUT_GRID_QUERY_NAME + LAYOUT_CQ_TYPOGRAPHY bundles in layout-brand (exported via design-system). - Apply to You hub, Analytics, Discovery list headings; drop redundant @container on Discovery LayoutGrid shells. - Document in LayoutGrid + design-system README; bump to 0.1.62; matrix evidence note.

  2702. Fluid clamp+cqi hero typography (gap 21) · cd71e18

    - Add FLUID_TYPE_LANDING_HERO tokens and globals.css display/lead classes (cqi to landing-hero). - Wire Hero h1 and subtitle via cn(); document in typography.ts and design-system README. - Bump web-client to 0.1.61; record stage evidence in responsive-audit-matrix.

  2703. Note 5-pass Playwright after edge settle (0.1.60) · 68a5eb2

  2704. Post-rebuild Playwright flake + JSDoc */ pitfall · 92c8cee

    Document welcome gate timeout during Traefik settle and block-comment */ termination.

  2705. Stage evidence for web-client 0.1.60 CQ pilot · 1794e23

    Record Playwright welcome flake during Traefik settle and browser check of en/landing.

  2706. Container-query pilot on LayoutGrid and landing Hero · 8bb5889

    - Name inner LayoutGrid wrapper @container/tc-layout for @sm/md/tc-layout density. - Scope landing Hero typography to @container/landing-hero (CQ type steps). - Document Phase 4 CQ pilot in design-system README. - Fix Hero JSDoc: avoid */ sequence inside block comment (Turbopack parse). - Bump 20_web-client to 0.1.60.

  2707. §C ledger + manual backlog; fix connections E2E claim · b7169a0

    - Clarify E2E vs manual (568×320, wide, zoom); add §C.1 Playwright ledger + §C.2 checklist. - Connections not in responsive-auth-viewports — table corrected; drop duplicate landing row. - design-system README: pointer to §C.1 / §C.2.

  2708. Stamp 0.1.59 + responsive-auth-viewports 6 passed (profile row) · 6321b50

  2709. - Profile page: min-w-0 column shell; stack heading+CTAs below sm; full-width stacked CTAs with whitespace-normal on xs for long labels. · d7ef74e

    - Profile page: min-w-0 column shell; stack heading+CTAs below sm; full-width stacked CTAs with whitespace-normal on xs for long labels. - Bump web-client to 0.1.59. - Matrix §C/§E: profile in E2E; evidence paragraph keeps 2026-04-22 counts + post-0.1.59 note.

  2710. Add §K shared src/components inventory (129 tsx) · 55d520c

    - Per-folder counts + primitives thematic groups; note ~122 was estimate. - Sync design-system README responsive-audit pointer to §I–§K.

  2711. Add §J profile / matching / ratings inventory · d026a57

    - Counts: 2 App Router tsx (profile) + 30 feature tsx (27+1+2); grouped tables. - Document matching/ratings as widgets (journey + admin consumers). - §C: dedicated /profile row; §E: note profile omitted from responsive-auth-viewports.

  2712. Add §I inventory for connections, journey, landing · 0cc9a49

    - Mechanical tables: 7 App Router tsx + 34 feature tsx (6+12+16) with evidence date. - §C: split connections/landing rows; cross-link §I for manual focus. - §D: Fleet commands use app-tenant path and PYTHONPATH=.

  2713. Set tsconfig rootDir for TS 6.8 Docker build; bump 0.1.19 · 5da4263

    - TS5011 blocked tenant-rebuild-app until rootDir aligned with include src/. - Bump backend package to 0.1.19 (deployed with journey + error-handling work). - Update responsive-audit-matrix §E evidence and Fleet KB (TS5011 operator note).

  2714. Classify BFF invalid-path 400 as ApiError; journey 403 clarity · 1b718b0

    - Export BFF_INVALID_API_PATH_MESSAGE from api-route-classification (DRY with bff-api-proxy). - Map HTTP 400 with that message to ApiError so logs use [api] not [validation]. - Journey reflection: structured warn log on subject mismatch; explicit 403 message. - Bump web-client to 0.1.58 and backend to 0.1.18; document README mapping; add tests.

  2715. §H discovery inventory (3 app + 25 feature TSX) · f5f2eb0

    - §H: list vs universe vs WebGL grouping; §C cross-links - README: §H pointer; web-client 0.1.57; Fleet stage rebuild → health 0.1.57

  2716. §G chat inventory (25 feature TSX) + stage 0.1.56 · 3b25f3d

    - §G: App Router chats + features/chat component/modal map for §C - §C chats row: manual modal/toolbar note; §E evidence: health semver sync - design-system README: §G pointer; web-client 0.1.56; Fleet rebuild verified edge

  2717. - §F: ADMIN_SECTION_CONFIG table (incl. · b9e665f

    debug tab ↔ global debug stack) - §C: split analytics row; §E: app-main-nav-all-tabs stage pass + debug pointer - design-system README: reference §F; bump web-client to 0.1.55 (redeploy stage to match)

  2718. Stage E2E evidence + post-rebuild /api/health 404 blip (Fleet KB) · 43e675d

    - Matrix §E: ifeoma-tc stage Playwright results and storageState cookie evidence - app-fleet-cli-commands: poll health after web-client rebuild (transient 404)

  2719. Sync §A welcome URL, §E storageState contract, ops semver note · 89db641

    - Clarify welcome lives at unprefixed /welcome only - Document that shell smoke no longer signs out before storageState export - Note health/footer semver vs rebuild in intro and §D checklist

  2720. Keep session for Playwright storageState after shell smoke · f337dcb

    exerciseAppBottomNavFromJourney ended with logoutViaAppBottomNav, which cleared NextAuth cookies before authenticated-session.setup wrote storageState — dependent ui-authenticated specs then saw sign-in. Remove the implicit sign-out; document that callers must logout explicitly when needed. Add assertNextAuthSessionCookiePresentForE2eExport before export as a hard guard. Harden responsive-auth-viewports with onboarding gate and longer describe timeout. Bump web-client to 0.1.54.

  2721. - §C: rows for unprefixed /landing smoke, authenticated (pages) overflow routes, opt-in universe spec, manual remainder. · 0496cc1

    - §C: rows for unprefixed /landing smoke, authenticated (pages) overflow routes, opt-in universe spec, manual remainder. - §E: coverage table (spec → project → paths) + ui-authenticated merge-env prerequisite. - Evidence: responsive-public-viewports + app-shell-layout-viewports (6 passed on stage); tenant-live-health public-edge OK; ui-authenticated fails without E2E_REGISTRATION_USER_EMAIL.

  2722. Add responsive audit matrix; link from design-system README · 6d3f8e8

    - New app-source/docs/02_web-client/responsive-audit-matrix.md: 27 App Router page.tsx inventory, 7 PageClient shells, §C viewport placeholders, stage ops checklist. - design-system README: point manual sheet to committed path (root .cursor/plans is gitignored). - E2E spec comment: public landing shell wording (neutral phrasing). - Evidence: Playwright responsive-public-viewports on stage (5 passed); tenant-live-health public-edge OK.

  2723. Replace marketing surface names with landing; tidy demo step access · c38b136

    - Rename BRAND_ORB_AMBIENT_MARKETING_LAYERS to BRAND_ORB_AMBIENT_LANDING_LAYERS; BrandOrbSectionAmbient variant marketing -> landing (default unchanged for dev templates). - BuildVersionsStrip variant marketing -> landing; update Footer call site. - DemoWalkthrough: drop redundant assertArrayAccess; modulo guarantees bounded index. - Debug logs: stable event keys (sticky_nav.active_section, cta_section.early_access_submit). - Docstrings: neutral public-landing wording across landing components and orb-brand. - KB:…

  2724. Resolve buildVersions keys in AST audit; localize format strings · cae9aab

    - Treat useTranslations() like getTranslations() in extractMessageKeysFromTs so messageKeysReferencedInSource resolves app.buildVersions.* paths. - Differentiate de/fr/es/ar line and apiUnavailable from en (typography). - Bump web-client to 0.1.51.

  2725. CTASection violet radial via globals.css class · f34fe37

    - Add .landing-cta-section-brand-violet-radial using --brand-violet-rgb - Remove inline style from CTASection; document parity in landing-marketing-brand - Bump web-client to 0.1.50

  2726. CTASection violet radial via globals.css class · 71158d2

    - Add .landing-cta-section-brand-violet-radial using --brand-violet-rgb - Document parity with getLandingCtaSectionBrandVioletRadialStyle; bump web-client 0.1.50

  2727. Split §10 annex, tighten globs, KB hygiene tooling · aacc0ed

    - Move validation/testing §10 to AGENT-BEHAVIOUR-ANNEX-VALIDATION.mdc (glob-scoped); shorten pipeline rule description - Scope ROOT_CAUSE_FIX, TEST-DETERMINISM, PYTHON-PACKAGE-API, ZITADEL-CLEAN-RESET with globs; reduce stacked always-on rules - Add ACCESSIBILITY_PRODUCT.mdc, repo AGENTS.md, docs/agent-rules-changelog.md, tools/check_kb_rule_links.py - Fix broken relative KB links; point 502 deep refs at NEXT_FASTIFY_TRAEFIK_ARCHITECTURE - Extend rules-and-knowledge-base with recipe, stop/evidence guidance; tenant…

  2728. Rename landing accent API (drop marketing prefix) · 20dff25

    - landing-marketing-accent-chrome → landing-accent-chrome - getLandingAccentCssVars, LANDING_ACCENT_*_VAR, --landing-accent-* - globals classes landing-accent-*; bump web-client 0.1.49

  2729. Marketing accent CSS vars + globals chrome · 3d5e999

    - Add getLandingMarketingHexAccentCssVars and documented --landing-marketing-accent-* tokens - Move PlatformBadges, pricing, features, how-it-works, demo walkthrough, universe preview, sticky nav surfaces to globals.css (remove imperative nav hover mutations) - Bump web-client to 0.1.48; extend design-system README

  2730. Hero orb rings and badge via CSS vars + globals · dba0f4b

    - Add getLandingHeroOrbDecorativeRingCssVars and ring CSS classes in globals.css - Premium badge bloom uses --brand-violet-rgb (landing-hero-premium-badge-shell) - Bump web-client to 0.1.47; document in design-system README

  2731. Cosmic background via globals.css class · d504db1

    Move LandingPage full-viewport marketing wash to `.landing-page-cosmic-fixed-bg` for DRY tokens and fewer inline styles. Document in design-system README. Bump web-client to 0.1.46.

  2732. Consolidate loop rules, track KB, tenant compose playbook · 3f26d08

    - Slim CONTINUOUS-DEV-LOOP to pointers + loop handoff phrases; fix relative paths - Extend AGENT_BEHAVIOUR (root, app-source, app-pipeline) for responsive UX, tenant secrets via merge-env, KB navigation row - Add tenant-env-compose-contract KB and index README row - Un-ignore .cursor/kb/*.md so operational playbooks version with the repo

  2733. Footer build versions strip (web + API semver) · 6c9e12a

    Add GET /api/build-info (Node) aggregating WEB_CLIENT_APP_VERSION and INTERNAL_API_URL /api/health when available. Mount BuildVersionsStrip in (pages) shell, admin panel, and landing footer; exclude /api/build-info from BFF proxy. Localized app.buildVersions.* in all locale bundles. Bump web-client to 0.1.45.

  2734. Responsive audit E2E, landing 320 overflow, stage 0.1.44 · f78a69f

    - Extend public viewport spec with /auth and /auth/error; fix /welcome gate (clear cookies, welcome-language-gate testid, i18n for title/body). - Clip landing document horizontal bleed (globals landing layout + LandingPage min-w-0) and break long hero headlines; fixes WCAG reflow measure at 320px. - Add opt-in WebGL resize spec (E2E_RESPONSIVE_UNIVERSE=1) for /discovery universe. - Atomic guardrail: disallow arbitrary max-w-[…] under src/app outside allowlist. - Bump web-client to 0.1.44; docs in design-system REA…

  2735. Bump actions to Node-24 runtime (checkout/setup-node v6, setup-python v6) · 9c375e2

    Prep for GitHub Actions Node 20 deprecation (forced Node 24 default starting Jun 2 2026; Node 20 removed Sep 16 2026 per the GitHub Changelog). ## Research-grounded version picks (2026-04-22) - actions/checkout@v4 → @v6 (v5 and v6 both on Node 24; v6.0.2 is the latest stable; v5 was the Node-24 jump) - actions/setup-node@v4 → @v6 (v6.4.0 is the latest stable; upgrades cache + checkout internals) - actions/setup-python@v5 → @v6 (v6 released Sep 2025 with Node 24 runtime) All three v6 releases require GitHub Actions…

  2736. Atomic guard prevents undefined CSS class regressions · 466fff3

    Prevents the 'landing-trust-badge-icon-shell' class of bug from recurring: brand-module constants declaring CSS class names that never get a matching rule in globals.css, silently no-op-ing at runtime. ## Design - Opt-in scope list (CSS_CLASS_BRAND_MODULES) — only scans brand modules that actually export CSS class name strings. button-brand.ts (preset IDs), layout-brand.ts (Tailwind utilities), color-brand.ts (palette helpers), etc. are deliberately out of scope because their exported strings are not CSS class ref…

  2737. Define --brand-violet-rgb + fix button-shimmer class typo · 544fdbb

    Extends the earlier landing-trust-badge-icon-shell fix with two more latent design-system bugs surfaced by a repo-wide scan for CSS classes that are referenced from .tsx but never defined in globals.css. ## Fix 1: --brand-violet-rgb missing from :root The palette module (src/design-system/theme/palette.ts) declares: { cssVar: '--brand-violet-rgb', role: 'Brand violet (r g b triplet for alpha compositing)', category: 'brand', lightValue: '167 139 250', // Tailwind violet-400 } That variable is referenced as rgb(var…

  2738. Define missing .landing-trust-badge-icon-shell so icons render white · 49ce8c0

    Root cause: TrustIndicators.tsx (Shield/Eye/Ban/Smartphone badges on the 'Built on trust and transparency' section) and Testimonials.tsx (Quote badge) both apply .landing-trust-badge-icon-shell + a --sky/--brandViolet/--pink/ --emerald colour modifier, but those classes were never defined anywhere in globals.css or any other CSS file. That made the shell a no-op — the icons inherited currentColor from the document cascade (dark) and the tinted well visible in the design tokens never rendered. Fix: add the missing …

  2739. Reverses the earlier nodemailer 8 → 7 downgrade that was intended to fix the CI npm-install peer-dep warning but inadvertently re-exposed two CVEs fixed only in nodemailer 8.0.5: · 1370a4e

    Reverses the earlier nodemailer 8 → 7 downgrade that was intended to fix the CI npm-install peer-dep warning but inadvertently re-exposed two CVEs fixed only in nodemailer 8.0.5: - SMTP command injection via unsanitised envelope.size (low) - CRLF in transport name option (moderate) Root cause: next-auth@4.24.14 declares peerOptional nodemailer@^7.0.7; that range predates the 2024+ nodemailer-8 CVE fixes and is effectively stale. The only API touched in this repo is createTransport (single call in src/lib/auth/next…

  2740. Bump typescript 5 → 6 across web-client + backend + sim-worker · 4481d76

    Major bump 10/10 (final). TypeScript 6 promotes two deprecations from warning to error (aka.ms/ts6) — fixed properly, not suppressed via ignoreDeprecations. ## Fixes applied (no escape-hatch 'ignoreDeprecations') ### app-source/10_backend/tsconfig.json - 'moduleResolution: "node"' (aka node10) → 'nodenext' node10 is slated for removal in TS 7. nodenext aligns the resolver with Node.js's own ESM/CJS resolution semantics and is the recommended modern default for ESM-emitting Node services (matches the existing 'type…

  2741. Bump vitest 3 → 4 across web-client + backend + simulation-worker · b2f9d3d

    Major bump 8/10. Cross-cutting test-runner upgrade on all three Node packages that use vitest. No @vitest/* companion packages in use, so only the main 'vitest' entry bumped. ## Breaking change encountered + fix vitest 4 tightened constructor-call semantics on vi.fn() mocks: vi.fn().mockImplementation(() => ({...})) is no longer callable with new. One test in the repo used this pattern (the only occurrence found by a repo-wide grep): tests/routes/push-subscriptions-rate-limit.test.ts Migrated to the vitest 4 offic…

  2742. Bump i18next 23 → 26 (backend, 3 majors) · c470805

    Major bump 7/10. Triple-major jump; plugin-interface and public API (init/t/exists/getFixedT) stable across v23 → v26 — no code changes needed. Dependency alignment: - i18next-fs-backend @ 2.6.4 (already latest) compatible with i18next 26 via the stable plugin protocol (.use(Backend) + loadPath option signature). Backend usage (4 imports): src/i18n.ts (plugin init + getTranslations*), src/services/{MatchPushDispatcher,ChatPushDispatcher,AdminSelfTestPushService}.ts (typed translator access via i18next.getFixedT). …

  2743. Bump intl-messageformat 10 → 11 (web-client) · 84c976c

    Major bump 6/10. One direct import in tests/atomic/admin/runDualBankSeed.test.ts (default IntlMessageFormat export). v11 keeps the default-export API stable; no code changes required. - tsc --noEmit → clean - Target test (runDualBankSeed, 3 tests) → all pass - vitest atomic → 935/950 pass (same pre-existing env-dep failures) - npm install → dedupe net -10 packages

  2744. Bump @formatjs/intl-localematcher 0.5 → 0.8 (web-client) · 1b28648

    Major bump 5/10. Single import (match() in src/proxy.ts); API stable across 0.5 → 0.8. Bonus: next-intl already internally resolves ^0.8.1 so aligning our direct dep deduplicates the dependency graph (net -1 package). - tsc --noEmit → clean - vitest atomic → 935/950 pass (same pre-existing env-dep failures) - npm install → clean (added 1, removed 2, changed 1 via dedupe)

  2745. Bump lucide-react 0.562 → 1.8 + migrate removed brand icons · ad298b4

    Major bump 4/10. Lucide 1.x removed brand logos (Twitter/X, LinkedIn, GitHub) for trademark reasons — official migration guidance is semantic-alternative icons or a brand-specific library. Fix applied: Footer.tsx now uses semantic lucide icons. Platform identity is preserved for assistive technology via the existing localised aria-labels (landing.footer.socialTwitter / Linkedin / Github), so screen readers still announce the concrete platform. - Twitter/X → AtSign (universal social-handle symbol @) - LinkedIn → Br…

  2746. Bump undici 7 → 8 (web-client test helpers) · 997b558

    Major bump 3/10. Used only in test helpers for Agent + request API (stable across v7/v8). Six imports under tests/atomic/helpers/ and tests/e2e/helpers/. - tsc --noEmit → clean - vitest atomic → 935/950 pass (same pre-existing env-dep failures) - npm install → clean

  2747. Bump chokidar 4 → 5 (web-client dev watcher) · 395084d

    Major bump 2/10. Dev-only (scripts/dev-watch-sync.mjs), zero prod impact. - Single import: scripts/dev-watch-sync.mjs (dev server file watcher) - chokidar 5 .watch()/.close() API identical to v4 for our use case - tsc --noEmit → clean - Runtime smoke: import chokidar; watch('.'); await close() → OK - npm install → clean

  2748. Bump @types/node 24 → 25 (web-client) · ce82a41

    Major bump 1/10 from deferred list. Type-only, zero runtime impact. - tsc --noEmit -p tsconfig.json → clean - vitest atomic → 935/950 pass (same 15 pre-existing env-dep failures) - npm install → clean resolution, no --legacy-peer-deps

  2749. Package dep sweep — fix CI peer-dep blocker + safe patch/minor bumps · 24e1864

    Resolves the pre-existing CI blocker (web-client `npm install` failing on nodemailer@^8 vs next-auth@^4.24.14's `peerOptional nodemailer@^7.0.7`) and applies safe patch/minor bumps where evidence justified them. ## Fix: nodemailer peer-dep conflict (web-client CI blocker) - app-source/20_web-client/package.json - nodemailer: ^8.0.5 → ^7.0.13 Scope of nodemailer use in web-client: a single `createTransport` call in `src/lib/auth/nextauth/providers/build_email_provider.ts` for the SMTP magic-link transport. That API…

  2750. Bump all module versions (patch) · faae7bf

    Patch-bumps every versioned module in the monorepo so the deployed build can be unambiguously identified via the web-client ``GET /api/health`` response (``WEB_CLIENT_APP_VERSION``, inlined from package.json at build time) and via each Python package's ``pyproject.toml`` version field. Node packages: - app-source/10_backend 0.1.16 → 0.1.17 - app-source/20_web-client 0.1.40 → 0.1.41 - app-source/simulation-worker 0.1.0 → 0.1.1 - app-pipeline/app-build/container_mount 0.1.0 → 0.1.1 Python packages: - app-pipeline 1.…

  2751. Phase 2b authenticated viewport overflow via storageState setup · 1f09032

    Lands the Playwright scaffolding the responsive-audit plan calls out as "near-term priority after first green loop" so the authenticated viewport matrix can grow to cover every (pages) route without paying the ~15 min magic-link cost per test. Single primary intent: Phase 2b authenticated overflow coverage — no product code changes, no regression fixes. - tests/e2e/helpers/authenticated_storage_state.ts: single source of truth for the storageState path (tests/.auth/authenticated-session.storage-state.json). Both t…

  2752. Versions the three-step Fleet sequence that was previously only in chat, so the remaining live-operator work for the 0.1.40 web-client bump and the P4 Login v2 dev/prod rollout is… · 41b4408

    Versions the three-step Fleet sequence that was previously only in chat, so the remaining live-operator work for the 0.1.40 web-client bump and the P4 Login v2 dev/prod rollout is discoverable in-repo: 1. tenant-rebuild-web-client --profile stage (ships 0.1.40 breadcrumbs) 2. app-infra-start-services --service zitadel-login-v2 for dev + prod 3. tenant-live-health --suite full-stack (confirm stage) Flag table verified against this commit of app-fleet/cli.py (see `_add_infra_args`, `tenant-rebuild-web-client` subpar…

  2753. Scaffold responsive-audit Phase 1-2a + PR checklist · 96fb09d

    Lands the non-blocking, evidence-free scaffolding from the responsive-audit plan so subsequent phases (manual matrix, authenticated overflow, strict cleanup) can cite concrete in-repo paths and a shared overflow helper rather than inline duplicates. Per the plan's one-primary-intent rule this PR is scope-bounded to scaffolding only — no feature-code edits, no fix-regressions. - .github/pull_request_template.md: four-checkbox responsive / strict-refactor review checklist (LAYOUT_BRAND tokens, no silent catch, i18n+…

  2754. Admin-debug i18n coverage + usePushNotifications scope · 4bbe6bc

    Three changes, one thread (P5 parity sweep): 1. adminDebugMessageKeys.ts: extend ADMIN_DEBUG_MESSAGE_KEYS_FLAT with the 8 ``admin.debug.webPushSelfTest.*`` keys actually rendered by DebugSettingsTab. The atomic test ``tests/atomic/i18n/adminDebugMessagesStaticData.test.ts`` now covers those keys against every locale bundle, closing a latent gap where a translator dropping one of them would only fail at runtime. 2. DebugSettingsTab.tsx: remove the 44-line CATEGORY_DEFAULTS constant. It was a dead English map that w…

  2755. Tenant-env-secret-guard pre-commit hook · f8e29e0

    Refuse commits that stage a merged .env.<mode> whose index diff adds a non-empty sensitive secret (ZITADEL_CLIENT_SECRET, ZITADEL_ADMIN_PASSWORD, NEXTAUTH_SECRET, VAPID_PRIVATE_KEY, MONGO_*PASSWORD, HARBOR_ADMIN_PASSWORD, INTERNAL_API_SECRET, BREVO_API_KEY, BREVO_SMTP_PASSWORD, CF_DNS_API_TOKEN, COOKIE_SECRET). Removing a secret or blanking a placeholder is not a leak and is intentionally allowed. Scope: - common/env_secret_guard.py: pure scanning library (DRY; reusable from CI, editor plugins, etc.). DEFAULT_SENS…

  2756. Remove ghost tenants; rename unit-delegation → test-unit-delegation · 4e3c31d

    The repository carried several tenant trees that were not created by any active Fleet code path and that ``fleet list-tenants`` mostly ignored: - ``app-tenant/tenants/ifeoma-dev/`` — config-only ghost, no manifest/state. - ``app-tenant/tenants/ifeoma-dev-fullstack-20260406-101646-804754/`` — disposable full-stack snapshot never auto-cleaned. - ``app-tenant/tenants/ifeoma-stage/`` — config + README, no manifest. - ``app-pipeline/ifeoma-dev/`` — leftover from the pre-``app-tenant`` layout. - ``app-tenant/tenants/ten…

  2757. Regression guard for Login v2 healthcheck + image-tag contract · 2266b2d

    Parse docker-compose.oidc.yml and assert: 1. zitadel-login-v2.healthcheck.test does NOT contain --spider; a half-read streaming response triggered TypeError: controller[kState].transformAlgorithm is not a function under Next.js 16 + Node 22, producing HTTP 503 on Login v2 subresources (vercel/next.js discussion #75995). 2. zitadel-login-v2.image interpolates ${ZITADEL_LOGIN_V2_IMAGE_TAG} — ensures the tag stays sourced from tenant env (ZitadelCoreVars) rather than a hardcoded ghcr.io tag that diverges across tenan…

  2758. Login v2 healthcheck consumes body; image tag via tenant env · 06eee83

    Root cause of the intermittent 503 on /ui/v2/login subresources and the "Could not get the context of the user" banner was the Docker healthcheck running wget --spider against a Next.js 16 streaming route. --spider closes the TCP connection as soon as headers arrive, leaving the stream half-read and triggering the Node TransformStream race TypeError: controller[kState].transformAlgorithm is not a function (vercel/next.js discussion #75995). At interval=10s this produced a continuous torrent of stream corruptions b…

  2759. Headless-chromium web-push stub + KB note · 173bbae

    Headless Chromium can't reach a real push messaging service, so pushManager.subscribe never resolved and web-push-settings-subscribe timed out on stage. Add installDeterministicWebPushStub (raw JS addInitScript) that overrides PushManager.subscribe/getSubscription with W3C-shaped in-memory objects and forces Notification permission to granted to survive cross-origin Zitadel redirects. Spec: retries=1 (cold stage sign-in), diagnostic console capture and a 30s waitForResponse window that surfaces inline feedback + c…

  2760. Sync OIDC fragments + web-push E2E · 66cb400

    Persist Zitadel OIDC client id/secret into all-mode merged env after provision (matches run_provision_and_update_env fragment refresh) and refresh PACKAGE_INDEX generated_at. Add Playwright spec web-push-settings-subscribe covering My Settings → Notifications → Push subscribe/unsubscribe against /api/push/subscriptions, plus a shared profile_settings_modal helper (openProfileSettingsFromYou, expandNotificationSettingsSection) for DRY modal navigation.

  2761. Prefer app-start / tenant-redeploy for OIDC fragment healing · 1301c4c

    Clarify that tenant-rebuild-app does not run Zitadel provision; document app-start and tenant-redeploy (without --skip-provision) as the paths that invoke run_provision_and_update_env to align oidc.json and .env.* with IdP.

  2762. Triage Zitadel Login v2 password 503; a11y SettingToggle · 1b0f323

    Document how to distinguish document vs subresource 503 on the Login v2 password URL, why loginName in the query string can still show the context banner, and how to pull APP_INFRA logs via target-stack-logs --plane app. Wire SettingToggle label/description to the Radix Switch (useId, aria-*) and bump web-client to 0.1.39.

  2763. Stage OAuth recovery evidence after tenant-redeploy + Playwright · 73e5255

    - PACKAGE_INDEX generated_at refresh from merge-env / fleet - KB: tenant-redeploy + fragment sync; logs clean; main-nav + public-edge OK

  2764. Sync OIDC client creds into secrets fragments after provision · 10fae31

    - merge_env overlays secrets/application over definition .env; provision only updated .env.* so stale oidc.json caused invalid_client at NextAuth callback - run_provision_and_update_env: resolve tenant root, persist id/secret to all modes via merge_application_secrets - provision_oidc_app: probe transport failure now raises (no fake probed_ok) - docs: TENANT_CREDENTIAL_CHANGE_TRIGGERS + fleet KB; tests for resolve/persist

  2765. OIDC fragment readme for Zitadel client secret drift · d4fe617

    - default_fragment_template(oidc): operator-facing _readme links ZITADEL_CLIENT_SECRET mismatch to invalid_client / OAUTH_CALLBACK_ERROR - KB: record post-rebuild /api/health 0.1.38 vs Playwright OAuthCallback evidence

  2766. Schedule match push on partial bulkWrite upserts · 1e937b4

    - Extract scheduleMatchPushForBulkUpsertIndices (DRY) for bulkWrite upsertedIds. - On MongoBulkWriteError with result.upsertedIds, notify first-materialised rows that still inserted before writeErrors (ordered:false partial success). - Add Vitest for partial MongoBulkWriteError; bump backend to 0.1.16.

  2767. Document OAuthCallback invalid_client triage (i18n + KB) · c9c0de1

    - Concatenate auth.errorPage.codes.OAuthCallback.operatorHint for OAuthCallback (en/de/fr/es/ar). - Fleet KB + tests README: evidence from web-client-stage logs (invalid_client invalid secret), correct compose service name for target-container-logs. - Bump web-client to 0.1.38. Operator must align ZITADEL_CLIENT_SECRET in tenant secrets with Zitadel, merge-env, rebuild.

  2768. Refresh ifeoma-tc PACKAGE_INDEX after fleet rebuild · 93ba5e3

    Fleet regenerated the table-of-contents timestamp and normalized YAML key ordering; no secret material.

  2769. Detect NextAuth errors on locale /auth/error path · 2d47266

    - admin_platform_session: treat /{locale}/auth/error like /api/auth/error; parse error_description; clearer final failure when OAuthCallback lands on App Router error page. - tests README: document OAuthCallback triage (secrets, redirect URIs, merge-env + rebuild). - Fleet KB: post-rebuild version verification via curl + tenant-live-health public-edge.

  2770. Extend openapi-fastify allowlist; document ifeoma-tc stage probes · 7d8d4e4

    - Allowlist Fastify-only paths: chat transcript export, end-connection, user block, internal e2e seed (until OpenAPI documents them). - KB: copy-paste tenant-live-health public-edge for ifeoma-tc + version check via stage /api/health + tenant-rebuild-app pointer.

  2771. SW update toast and clearer push permission copy · 2a53d1c

    - Add ServiceWorkerUpdatePrompt: listens for SW_READY_TO_ACTIVATE_EVENT and shows a persistent localised Sonner toast with Reload (deduped toast id). - Mount on locale layout and UnprefixedRouteShell; add ui.pwa.update* / reloadAction strings (en/de/fr/es/ar). - Expand pushErrorPermissionDenied copy with site-settings guidance in all locales. - Bump web-client to 0.1.37; document in AppProviders, primitives README, and fleet KB.

  2772. Rate-limit subscription mutations and document prune contract · 2bc7997

    - Add per-user pushSubscriptionMutationRateLimit (30/min, POST+DELETE) after auth on /api/push/subscriptions; export PUSH_SUBSCRIPTION_MUTATION_MAX_PER_WINDOW for tests. - Document 429 in OpenAPI; add Vitest for limiter and for WebPushNotifier 404/410 -> removeByEndpoint. - Map HTTP 429 in usePushNotifications to pushErrorSubscriptionRateLimited (all locales); bump backend 0.1.15 and web 0.1.36. - Refresh PushSubscriptionService JSDoc and fleet KB push notes.

  2773. Web Push on first materialised match row · e7d124c

    - MatchPushDispatcher: localised new-match payload, preferences.matchNotifications gating (default on), peer display name by profiles.profileId, /{locale}/discovery/list URL. - MatchStorage: after upsert insert (storeMatch upsertedCount, bulkWrite upsertedIds), schedule notifyMatchRowFirstMaterialized; failures logged, Mongo write unchanged. - Backend chat i18n strings for all five locales; tests for dispatcher + bulk dispatch wiring. - Fleet KB: document match-notification behaviour. Backend version 0.1.14. Evide…

  2774. Admin POST /api/admin/push/test and Debug self-check · 008c3ad

    - Platform admin route dispatches localised Web Push via AdminSelfTestPushService; 503 + WebPushNotConfigured when VAPID is absent; OpenAPI + generated client. - DRY: resolvePreferredLocaleForAuthUid (profiles.preferredLocale) shared by chat push. - Backend i18n: admin namespace (pushSelfTest copy) + track locales/**/*.json in git. - Admin → Debug: Send test push with Bearer fetch and inline success/error feedback; admin.debug.webPushSelfTest.* in all five message bundles. - Fleet KB: document operator self-test p…

  2775. Sonner outside overflow shell; Web Push rotation + VAPID route · 0c5073e

    - Mount Toaster as sibling of cosmic overflow shell; raise default z-index on Sonner. - Add GET /api/push/vapid-public-key (503 when unset); OpenAPI + zod + generated client. - BFF: treat vapid-public-key as public; pushSubscriptionApi attaches Bearer like other Fastify paths. - Service worker: pushsubscriptionchange re-subscribes via public VAPID GET and POSTs subscription with /api/auth/token Bearer; bump cache generation to v4. - Stage/prod web-client: bind-mount NODE_EXTRA_CA_CERTS so Node extra CA path resolv…

  2776. Cross-link Zitadel Traefik/IAM KB; mirror in AGENT-BEHAVIOUR §9 · 45e89d6

    - app-fleet-cli-commands: pointer to zitadel-traefik-and-iam-selfheal + whitelist vs PAT note - AGENT-BEHAVIOUR: non-transient Zitadel edge rollout + debug-sidecar probe hint

  2777. Two-step stage rollout; clarify Management 403 in E2E · 7767bb5

    - KB: tenant-redeploy for IAM self-heal plus app-infra-start-services oidc for Traefik labels - deleteTestUser: distinguish Traefik ip-whitelist 403 vs Zitadel IAM/PAT failures - Bump web-client to 0.1.33

  2778. Align healthz hooks with OpenAPI HealthzResponse · 0d3f298

    - Add healthzObservation mapper (API body + client observedAt ISO timestamp) - Remove invalid timestamp field; drop redundant try/catch in useHealthzQuery - Document GET /api/health in dev README; export mapper from hooks barrel - KB: preflight npm run build:direct before tenant-rebuild-web-client - Bump web-client to 0.1.32 - Regenerate ifeoma-tc PACKAGE_INDEX.yaml (Fleet merge during rebuild)

  2779. Show web client semver on Debug tab with i18n · fadf809

    - Surface WEB_CLIENT_APP_VERSION in DebugSettingsTab (matches GET /api/health) - Add admin.debug.buildInfo.* to all locales; extend adminDebugMessageKeys - Register fleet.automatedHint in canonical key list for parity tests - Document operator comparison in app-fleet-cli-commands KB - Bump web-client package to 0.1.31

  2780. Materialise connection statement i18n keys for legacy Mongo rows · 17f3fc5

    Root cause: GET /api/connection-statements omitted statementKey; ConnectionJourney called useTranslations with undefined → next-intl internal .split on undefined. - Shared resolver (web + backend) domain.seedConnectionStatements.<id>.statement - ConnectionStatementService always serializes statementKey; create persists it - OpenAPI + generated clients/zod require statementKey on list responses - Web 0.1.30, backend 0.1.11; Vitest coverage for resolver

  2781. - BFF-aligned issuer: verified Authorization Bearer [redacted].* returns 200 with the same token; malformed internal prefix returns 401 with message. · 687d65b

    - BFF-aligned issuer: verified Authorization Bearer [redacted].* returns 200 with the same token; malformed internal prefix returns 401 with message. - Web client 0.1.29; Vitest contract auth_token_route_internal_bearer. - DomainModule: reject BIND9 for staging and production (parametrized unit test). - app-fleet unit conftest: reset tenant selection via set_current_tenant(None) each test to fix session-file leak across test_fleet_ui_*. - Pipeline tests: Brevo mail inbound uses brevo.json fragment; traefik parity …

  2782. Show persistent inline feedback under the Push toggle (0.1.28) · 4dc4f97

    `sonner` toasts alone proved unreliable for the push-failure case on stage: the Toaster container mounted (the "Notifications alt+T" ARIA region is in the DOM) but the per-toast elements never rendered on Chromium when `PushManager.subscribe` rejected — reproducible across multiple deploys and independent of our wrapper styling. The user saw "nothing" because the only failure signal was a transient toast that never painted. Fix: in addition to the toast call, the settings section now keeps a persistent `role="stat…

  2783. Web-client: bump to 0.1.27 (sonner Toaster visibility fix) · 4a9f23d

  2784. Sonner Toaster uses dark+richColors defaults so toasts render · 68ee42e

    Follow-up to 65668cb3 which mounted `<Toaster />` globally. On stage the Toaster container showed up in the accessibility tree ("Notifications alt+T" region) but no toast ever became visible — not the push-error toasts and not the profile Save-Changes success toasts either. Root cause: the wrapper passed ``style={{ "--normal-bg": "var(--popover)", "--normal-text": "var(--popover-foreground)", ... }}`` onto the Toaster root, expecting sonner to inherit CSS variables into its per-toast elements. In practice sonner v…

  2785. Route /admin/v1 /v2beta externally + self-heal PAT IAM grants · 0669565

    Two regressions were blocking the admin/MFA Playwright specs against stage. Both are long-term architectural fixes that survive future Zitadel resets and dependency upgrades. ### 1. Traefik routing (docker-compose.oidc.yml) The web-client admin router tc-app-admin-stage uses PathPrefix(/admin/) at priority 50 to serve the locale-prefixed admin panel. Zitadel's admin API under /admin/v1 overlapped that prefix with a lower priority (30), so every /admin/v1/... call fell through to Next.js and was rewritten to /en/ad…

  2786. Mount global Toaster + discriminated-union push result so failures are actually visible · 65668cb

    Root cause of the user-reported "clicking Push Notifications does nothing" report on stage.trueconnection.app/en/you: 1. The entire app imports ``toast`` from ``sonner`` in ~15 places but NO ``<Toaster />`` container was mounted anywhere. Every single ``toast.error`` / ``toast.success`` call (not just push — also chat, profile, admin, ratings, …) silently enqueued into sonner's store with no visible surface. The push toggle is the feature where it hurt most because its failure path has no backup UI. 2. ``Notificat…

  2787. Drive onboarding gate in assertPostLoginJourneyProgress · 53b47fb

    Fresh magic-link registrations land on the mandatory onboarding gate at /{locale}/onboarding, which hides the bottom nav by design. The sister helper waitForAuthenticatedAppNav already calls ensureMandatoryOnboardingCompleteForShellE2e first (commit 7b146f9e), but assertPostLoginJourneyProgress — used by runRegistrationThroughBottomNav — still expected the bottom nav to render immediately post-login, so login-and-app-nav timed out for 60s waiting for a nav that can only mount once onboarding is submitted. Validate…

  2788. Merged env files materialize the full secret surface; tip revert does not erase git history. · 084e61f

    Merged env files materialize the full secret surface; tip revert does not erase git history. Aligns KB with operator security expectations.

  2789. Reject BIND9 DNS authority in staging · ef88da7

    DomainModule.execute now fails fast before package install when dns_providers.provider is bind9 and BootstrapContext.environment is staging, matching the contract enforced by unit tests. - Remove pytest.ini ignore for test_domain_module_dns_policy.py - Document policy in app-fleet-cli-commands KB

  2790. Document skip-worktree for merged tenant .env hygiene · 2ed7f81

    Operators who keep merge-env output on disk can use git update-index --skip-worktree locally; note pull conflicts and prefer checkout -- when done.

  2791. Persist merge-env output for stage (VAPID + Zitadel rotation) · aca68ec

    The previous commit (8ae0e842 feat(push): web push subscriptions, VAPID tenant env, ES2022 Intl.Segmenter) wrote the VAPID triple to the authoritative `secrets/application/stage/misc.json` fragment but did not re-materialise the downstream `.env.stage`, leaving `NEXT_PUBLIC_VAPID_PUBLIC_KEY` empty and the three backend keys absent from the deployed env bundle. Subsequent `fleet tenant-rebuild-web-client` runs (needed for unrelated refactors on v0.1.24 and v0.1.25) correctly re-ran `merge-env`, which pulled the alr…

  2792. Web-client: remove PROFILE_PEER_NO_DISPLAY_NAME sentinel, localise peer name fallback (v0.1.25) · be2a63e

    The deleted `src/lib/constants/profileDisplay.ts` exported a hardcoded English "No display name" string that was used both as a user-facing UI fallback **and** as an equality sentinel in `ConnectionManager` to decide `hasFriendlyName`. That double-duty is incompatible with localisation: the moment a translator substitutes "Aucun nom" / "Jemand" the sentinel check silently flips. This change separates the two concerns along the onion principle: - Domain layer (`transformToMatch`, `Match.name`): an empty string now …

  2793. Fleet+bff: cookie-less internal-bearer path for tenant-seed-mongodb (v0.1.24) · 66ddde5

    Close the 401 loop that blocked `fleet tenant-seed-mongodb --use-tenant-admin-credential` from reaching Fastify through the Next.js BFF: - app-pipeline/app-fleet/src/fleet_internal_bearer.py: Python minter mirrors the backend's `internal.<authUid>.<emailB64>.<sig>` contract so Fleet can auto-promote an ADMIN_EMAILS user to platform-admin without operator JWT handling. Byte-parity cross-checked against the Node reference via 13 unit tests. - app-pipeline/app-fleet/cli.py + cli/tenant + manager orchestration + runne…

  2794. Point operators at tenant-seed-mongodb for missing textKey/labelKey (v0.1.10) · a5130a1

    The live ifeoma-tc stage smoke surfaced `questions["q1_core_values"].textKey must be a non-empty locale message key — repair the Mongo document or run scripts/backfill-domain-ids.ts`. That remediation hint was wrong: `scripts/backfill-domain-ids.ts` only rewrites English category/value label tokens to snake_case domain ids, it does not restore a dropped `textKey` or option `labelKey`. The correct repair is to re-seed the packaged bank via `fleet tenant-seed-mongodb`, which POSTs the authoritative `default-question…

  2795. Extend question-bank-row-contract with JWT acquisition + stage repair recipe · fd767a1

    The prior runbook told operators what to do on /api/questions 422 but left the "how do I obtain a platform-admin JWT for --bearer-token-file" step implicit, so the next on-call would have to re-discover it. Adds: - Explicit confirmation that web-client v0.1.22's httpErrorFromResponse now preserves the Fastify envelope 'message' (no more [unknown] Unprocessable entity), so operators can read the failing row id straight out of the admin banner / errorLogger. - Two supported token sources — interactive (copy the Zita…

  2796. Document stage activation lessons + SW rolling-deploy self-healing · fbcadf4

    Two practical notes added next to the VAPID rollout section so the next operator activating Web Push on a new tenant does not rediscover them: - Three-piece wiring rule: ARG in the web-client Dockerfile, matching build.args in docker-compose-full.yml, and runtime VAPID_* env on every backend block. capabilities.webPush=true on the server-side route is NOT sufficient evidence that the client bundle has the key; grep the chunk for the public-key substring to confirm. - registerServiceWorker now calls registration.up…

  2797. Clarify that next-auth CLIENT_FETCH_ERROR at debug level is expected · 41dc125

    No runtime change. The stage smoke run logged `[next-auth][error][CLIENT_FETCH_ERROR]` entries during page transitions. Evidence from the browser console capture confirmed they arrive on `console.debug` (not `console.error`), which matches next-auth v4.24+'s intentional classification for aborted `/api/auth/session` fetches during SPA navigation and tab visibility changes (see next-auth PR #9345 and https://next-auth.js.org/errors#client_fetch_error). Adding suppression would be defensive code for a non-error. Ins…

  2798. Web-client: stop raising GL_INVALID_ENUM on /discovery universe renderer (v0.1.23) · 60a98dd

    `UniverseWebGLEngine.createStarProgram` called `gl.enable(0x8642)` to toggle `GL_PROGRAM_POINT_SIZE`. That capability is from desktop OpenGL only — it is not in the WebGL 2 enable-cap allow-list (Khronos WebGL 2.0 spec §5.14.3, which limits `enable`/`disable` to BLEND, CULL_FACE, DEPTH_TEST, DITHER, POLYGON_OFFSET_FILL, SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_COVERAGE, SCISSOR_TEST, STENCIL_TEST, RASTERIZER_DISCARD), so every universe page load logged: WebGL: INVALID_ENUM: enable: invalid capability without affecting ren…

  2799. Web-client: normalise same-origin HTTP failures to AppError subclasses (v0.1.22) · be94c93

    Fixes the `[unknown] Unprocessable entity` console spam on admin?section=system-data and every other tab that goes through `nextjsApiRequest`: - Introduce `lib/api/httpErrorFromResponse` — single source of truth mapping HTTP status codes to the canonical `AppError` family (ValidationError for 400/422, AuthError for 401, PermissionError for 403, NotFoundError for 404, TimeoutError for 408/504, ConflictError for 409, RateLimitError for 429, ApiError for everything else). Parses the Fastify-style `{ error, message }`…

  2800. Web-client: delete src/i18n/translate/ wrappers, drive all call sites via next-intl (v0.1.21) · a408dbc

    Final step of the mobile-localisation refactor. All ~170 call sites have been migrated to `useTranslations()` / `getTranslations()` in prior batches (v0.1.14-v0.1.20); this commit removes the deprecated custom translation layer entirely: - Delete `src/i18n/translate/` (AppT, useTranslate, formatIcu, paramCoercion, resolve, legacy requireTranslationLookupKey shim). - `getMessageByKey` / `tryGetMessageByKey` now live at `src/i18n/resolveMessage.ts`; DebugPanel updated accordingly. - `src/i18n/index.ts` barrel re-exp…

  2801. Backend VAPID_* runtime env + sw.js cache v3 to purge stale client bundles · 49f0cd4

    Follow-up for c27a821c: the backend VAPID_* additions I made to docker-compose-full.yml were lost in a subsequent auto-hook pass; without them the running backend container had no ``VAPID_PUBLIC_KEY`` / ``VAPID_PRIVATE_KEY`` / ``VAPID_SUBJECT``, so ``WebPushNotifier`` initialised in the "disabled" state on stage and no pushes would be sent even after tenant-rebuild-app. - app-pipeline/app-deployment/docker-compose-full.yml * Re-add ``VAPID_PUBLIC_KEY`` / ``VAPID_PRIVATE_KEY`` / ``VAPID_SUBJECT`` to ``x-backend-dev…

  2802. Move provider_surface to common.contracts; drop phase 1a quarantine · 8241987

    Moves the pure provider-surface module app-pipeline/app-tenant/contracts/targets/_provider_surface.py to its architecturally correct home app-pipeline/common/contracts/provider_surface.py Rationale (onion principle): the constants `PROVIDER_SURFACE_{VIRTUAL_LIBVIRT,HOSTING_API}`, the inference `infer_provider_surface`, the cross-field validator `validate_provider_surface_cross`, and the normalizer `normalize_provider_surface_value` are pure data + pure functions shared across the tenant, fleet, and hosting layers.…

  2803. Web-client: migrate [redacted] to next-intl (v0.1.20) · 4251618

    Batch 2 of the deletion of the custom `src/i18n/translate/` layer. All files under these feature and shared-component folders now call `next-intl`'s `useTranslations()` directly at the root namespace: - `src/features/chat/` — 24 components + 4 hooks + 4 utils (plus 2 atomic tests with minimal mock-type casts) - `src/features/connections/` — 6 components + 2 utils - `src/features/analytics/` — 5 components - `src/features/matching/` — 1 component - `src/features/ratings/` — 2 components - `src/features/device/` — 1…

  2804. Drain orphan-tests backlog (5 of 6 categories) · db564a2

    Implements missing production symbols that test-first orphan tests asserted against. No remaining collection-error orphans; full app-fleet unit suite runs 2046 passed / 0 failed. - platform_admin_remote: add _parse_merged_dotenv — strict KEY=VALUE parser that raises PlatformAdminConfigurationError on duplicate keys, malformed lines, or empty keys so mongosh role updates surface operator config bugs before touching the tenant database. - misc_cmds + cli.py: add tenant-domain-upsert and tenant-domain-remove CLI comm…

  2805. Wire NEXT_PUBLIC_VAPID_PUBLIC_KEY through Dockerfile ARG/ENV and backend VAPID_* env · c27a821

    The previous push-activation attempt on stage shipped backend v0.1.9 and web-client v0.1.19 with ``capabilities.webPush: true`` reported by the health route, yet the browser still threw ``pushErrorVapidNotConfigured``. Root cause: Next.js only inlines ``NEXT_PUBLIC_*`` into the client JS bundle **at build time**. The backend runtime env had the key, and the Next.js server-side route could read it, but the Dockerfile did not declare ``ARG NEXT_PUBLIC_VAPID_PUBLIC_KEY`` and the compose file did not forward the value…

  2806. Unblock run_tests phases uncovered by push-time CI · b5e682b

    A fresh local run of `python run_tests.py all` (the same batch `run_ci.py` phase 2 runs in the new push-time CI) surfaced several pre-existing broken tests and real code drift on HEAD. This change fixes the ones with a clear, contained root cause and documents the rest as open items so the CI workflow does not red-line silently. Fixes (each verified by re-running the relevant module batch): * app-hosting workload_providers.resolve — replace the broken `from app_tenant_root.contracts import infer_provider_surface` …

  2807. Web-client: migrate admin/profile/journey/discovery to next-intl (v0.1.19) · b3fec8e

    Batch 1 of the deletion of the custom `src/i18n/translate/` layer. All files under these four feature folders now call `next-intl`'s `useTranslations()` directly at the root namespace (full dot-path keys preserved): - `src/features/admin/` — 14 files (AdminPanel + tabs + generator) - `src/features/profile/` — 17 files (cards, sections, settings, hooks) - `src/features/journey/` — 12 files (screens, modals, questionMapper) - `src/features/discovery/` — 20 files (list + universe-webgl + utils) Pattern applied (match…

  2808. Web-client: migrate features/landing/* to next-intl useTranslations (v0.1.18) · 6125904

    Removes the custom `useTranslate` / `<AppT>` wrappers from all 15 landing page components and calls `next-intl`'s `useTranslations()` directly at the root namespace with full dot-path keys (for example `t("landing.cta.headline")`). Behaviour-preserving: no message keys touched, no props or component logic changed, strict missing-key policy still enforced by `StrictIntlClientProvider.getMessageFallback` (which throws `MissingMessageKeyError`). Scope: `src/features/landing/components/` CTASection, Comparison, DemoWa…

  2809. Document APP_INFRA vs HOST_INFRA networks; neutral dev domain example · d1d4e5e

    - Split external-network expectations: APP_INFRA defaults require traefik only; HOST_INFRA includes monitoring and therefore internal_net. - Domain resolver test uses synthetic tenant-dev/example inputs (no ifeoma-* coupling).

  2810. Warn against committing merged tenant .env secrets to git · d15bb6a

    Fleet merge-env materializes operator secrets into tracked tenant paths; document revert workflow so ZITADEL_CLIENT_SECRET, VAPID_*, and admin passwords never enter the public repo.

  2811. Implement enforce_managed_bind_domain_ip_preflight (close orphan test) · ff73866

    `app-fleet/tests/unit/test_managed_bind_domain_ip_preflight.py` (4 tests) was committed ahead of the implementation and failed collection on clean checkouts with `ImportError: cannot import name 'enforce_managed_bind_domain_ip_preflight' from 'src.manager.fleet._dns.policy'`. Implement the contract the tests describe. What it gates: When `dns_mode=managed_bind9`, every tenant domain row (both `public_ingress` and `internal_service_endpoint`) must carry a literal, parseable IPv4/IPv6 `ip_address`. The zone file is …

  2812. Capabilities.webPush on /api/health + HealthzResponse drift fix · c9fcebb

    Adds operator-visible instrumentation so Web Push / VAPID configuration is discoverable from a single HTTPS probe, and cleans up the long-standing contract drift between what the backend actually returns and what the OpenAPI / valibot schemas claimed. - 10_backend/src/routes/health.ts * GET /api/health now emits ``capabilities: { webPush }`` sourced from WebPushNotifier.isConfigured(). Flags never hide misconfiguration behind a silent ``true`` — a feature that should be on but is not wired surfaces as ``false`` so…

  2813. Landing marketing uses useTranslate + document secrets refresh CLI · f091c37

    - Replace raw next-intl useTranslations with useTranslate so keys pass requireTranslationLookupKey; keep t() strings (remove legacy AppT/defaultValue). - Hero aligned the same way. - KB: tenant-refresh-secrets-templates operator commands. - Bump web-client to 0.1.16.

  2814. Auto-heal Zitadel OIDC client-secret drift on every deploy · 1a41f8d

    Root cause of stage `invalid_client (invalid secret)` outages: the deploy pipeline short-circuited Zitadel provisioning when `ZITADEL_CLIENT_SECRET` was populated. When a secret rotated out-of-band (manual Management API, incident response, restore from backup), the tenant secrets store kept the stale value and every OAuth callback failed. Nothing re-verified that the stored secret was still what Zitadel had on file. Fix (three-layer, idempotent, non-invalidating): 1. `zitadel_provision.probe_oidc_client_secret` (…

  2815. Track ratchet baseline; quarantine phase 1a until resolve.py fix · d7ab576

    * `app-pipeline/tools/.compliance-baseline.json` generated via `python3 tools/check_compliance.py --update-baseline` (1165 violations across 378 file entries on current HEAD). Verified deterministic across three consecutive scans before capture. Ratchet confirmed green against the saved baseline ("No regressions — baseline check passed."). Future code-compliance regressions will now fail CI. * `.gitignore` adds a negation for the baseline so the repository-wide `*.json` exclusion does not silently drop it. * `.git…

  2816. Non-destructive secrets template checklist refresh + pushSubscriptions admin read · fcd59c1

    Closes the last gap in the Web Push rollout — operators pulling a code update that introduces a new default secret (for example the VAPID_* keys for browser push) now pick the keys up automatically on any tenant bind, instead of silently running with a stale local checklist. - common/tenant_application_secrets_template.py * refresh_fragment_application_secrets_template — non-destructive merge: adds missing default keys, refreshes the _readme doc string, and keeps every existing value (including operator-added keys…

  2817. Resolve Zitadel management URL for host-run Playwright · c4ba3b4

    - Skip Docker service hostnames (zitadel, zitadel-application) when picking Management API origin so public ZITADEL_ISSUER wins over in-cluster URLs. - Throw when all candidates are host-unreachable (remove silent E2E_BASE_URL fallback for management). - Export pickFirstE2eReachableManagementOrigin with Vitest coverage. - app-main-nav-all-tabs: describe-level retries for cold-login flake. - Document in tests/README.md and app-fleet-cli KB; bump web-client to 0.1.15.

  2818. Web-client: prep next-intl migration — relocate requireTranslationLookupKey, pilot rbac, drop formatIcu test-site (v0.1.14) · 70a805c

    Preparation step for deleting the custom `src/i18n/translate/` layer in favour of next-intl's `useTranslations()` directly: - Move `requireTranslationLookupKey` to `src/i18n/requireTranslationLookupKey.ts` (canonical). `src/i18n/translate/requireTranslationLookupKey.ts` becomes a deprecated re-export shim so `AppT` / `useTranslate` / the translate barrel keep compiling until the full call-site migration lands. - Repoint `StrictIntlClientProvider` and the atomic test to the new path. - Pilot migration: rewrite `src…

  2819. Typed push subscription API errors with locale messages · 8edba33

    Introduce PushSubscriptionApiError (operation, status, bodySnippet) in pushSubscriptionApi instead of English Error strings. usePushNotifications maps errors to profile.settings.notifications keys for save/remove HTTP failures and empty response bodies. Bump web-client to 0.1.13. Document client UX in app-fleet-cli KB.

  2820. Locale-aware push hook errors under profile.settings.notifications · b90bb03

    - Add pushErrorPermissionDenied, pushErrorVapidNotConfigured, pushErrorSubscriptionIncomplete, pushErrorTechnical (ICU detail) in all locale bundles; reuse pushUnsupported for unsupported-browser path. - usePushNotifications: useTranslate + useCallback helpers; wrap technical failures with pushErrorTechnical. - Bump web-client to 0.1.12. Tests: npm run validate:i18n (190), npm run test:atomic:offline (880).

  2821. The VAPID keypair generator and Fleet CLI command landed in fb51d064; this change rounds out the public-facing contract so operators and agents can discover and audit the new entr… · f50c425

    The VAPID keypair generator and Fleet CLI command landed in fb51d064; this change rounds out the public-facing contract so operators and agents can discover and audit the new entry point: - app-fleet/README.md: add tenant-generate-vapid-keys to the command table with the full operator flow (merge-env, tenant-rebuild-web-client, tenant-rebuild-app). - .cursor/kb/app-fleet-cli-commands.md: Web Push / VAPID section covering --mode, --subject, --force, --json semantics and the misc.json destination. - app-fleet/cli.py…

  2822. Track Fleet VAPID generator + push-subscription test fixtures · fb51d06

    Five files landed in the working tree alongside the recent `feat(push)` commits but were never staged, which would break a clean checkout and fail CI imports: * `app-pipeline/common/vapid_keypair.py` Pure NIST P-256 keypair generator for Web Push (RFC 8292). Raises on invalid subjects and on unexpected encoding lengths (no silent fallbacks). Reused by the Fleet CLI and by `common/tests/test_vapid_keypair.py` which asserts the shape contract (base64url, no padding, correct byte counts). * `app-pipeline/app-fleet/sr…

  2823. Document push-time GitHub Actions CI in runner overview · 04c06e4

    Adds §3.1 to PIPELINE-RUNNERS-OVERVIEW.mdc describing the four offline jobs in .github/workflows/ci.yml, their relationship to run_ci.py phases, the commands needed to reproduce CI locally, and what is deliberately left out (live E2E, Brevo, Playwright, fleet SSH health). Also records two known open items so future agents do not silently re-add these as gates before the underlying code is cleaned up: - Web-client npm run lint (126 errors, mostly react-hooks/refs in features/discovery/universe-webgl; needs a dedica…

  2824. Playwright skip Zitadel management when API URL is internal · ae6cffe

    Clarify EAI_AGAIN zitadel from ZITADEL_MANAGEMENT_API_URL on laptop; document E2E_ZITADEL_SKIP_MANAGEMENT_PROVISION=1 + public E2E_BASE_URL evidence for app-main-nav-all-tabs. Refresh Last reviewed cross-link.

  2825. Type-check backend and web-client before tests · 8c2639d

    Adds `tsc --noEmit` as a gate in both JS/TS jobs. Verified locally on HEAD (backend and web-client both compile cleanly). Runs before the vitest suite so a type regression fails fast with a readable tsc error instead of surfacing as an opaque test-runtime failure. Invoked via `npx tsc` so no `package.json` changes are needed (avoids touching module version numbers for a CI-only improvement).

  2826. Run offline test suites on every push and PR · 2865bab

    Adds .github/workflows/ci.yml with four parallel jobs covering the tests that do not require live infrastructure: - python-ci: runs app-pipeline/run_ci.py (architecture compliance + main-module unit tests). SKIP_SCHEMA=1 because schema drift is already owned by schema-contract.yml and is the only step needing Java. - backend-tests: installs app-source/10_backend + the app-contracts schema-tools deps (used by the pretest hook) and runs npm test. - simulation-worker-tests: vitest unit suite for the public-API exerci…

  2827. Playwright E2E base URL and internal IdP DNS pitfalls · 23ef210

    Document evidence: /api/health 404 when NEXTAUTH_URL is not the Next origin; getaddrinfo EAI_AGAIN zitadel when merged env uses Docker-only issuer hostname. Cross-link in Last reviewed line.

  2828. Web push subscriptions, VAPID tenant env, ES2022 Intl.Segmenter · 8ae0e84

    - web-client: service worker push/notificationclick handlers, pushSubscriptionApi, and device hooks wired to a real Web Push subscription lifecycle (bumps 0.1.10) - tenant: VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT wired through the env seed builder, env var groups, secrets template, and a dedicated vapid_derived_env module so NEXT_PUBLIC_VAPID_PUBLIC_KEY is exposed to the browser and private halves stay in misc.json - backend: tsconfig target/lib bumped to ES2022 + ES2022.Intl so ChatPushDispatcher can…

  2829. - Regenerate Zod from OpenAPI; add schema tool template and generator updates. · c5f1a02

    - Backend: web-push subscriptions and notifier, chat push dispatcher, Mongo helpers; wire push routes; sync generated validation schemas; bump to 0.1.6. - Web client: timezone bootstrap and API route, routing/bundle/SEO updates, locale E2E matrix; Vitest alias plus inline/ssr.noExternal for next-intl so validate:i18n and proxy tripwire resolve next/server under Next 16; bump to 0.1.9. - Pipeline: requirements and tenant PACKAGE_INDEX touch-ups. Tests: npm test (10_backend 297), npm run validate:i18n && npm run tes…

  2830. Chat lifecycle gates, transcript export, and connection routes · d4d68a8

    - ChatService: transcript vs messaging gates (peer invariant before stage checks), read watermarks on mark-read, bounded transcript export, retention purge, media upload ordering with storage rollback, transactional sendMessage(mediaId). - Routes: GET transcript-export, multipart Content-Type check, mute/media thread id resolution via conversations lookup, 409/400 mapping for stage and peer errors. - Connections: POST end-connection with session persist; persist after request/respond conversation; transition respo…

  2831. Locales contract, query caps, rate-limit buckets, connection transitions · 2be31df

    - Add lib/locales.ts as single source for AppLocale and Accept-Language narrowing; wire i18n, profile, discovery, and synthetic profile paths to normalizeStoredAppLocale. - Remove TranslationService; keep translation access via i18next helpers. - Restore ListConnectionsQuery and tighten GetConnectionStageQuery / GetMessagesQuery (cursor vs beforeCursor) with OpenAPI-aligned caps. - Rate limit: storageKeyPrefix for isolated counters; clearRateLimitStoreForTests for Vitest; chatMediaUploadRateLimit and connectionMut…

  2832. Align journey seed Fleet flags + web-client 0.1.6 · 6f1c55b

    Refresh AGENT-BEHAVIOUR (app-pipeline + application root) and KB index for optional --verify-admin-reads and --synthetic-bootstrap-json. Extend connection-bank-seed.md with copy-paste examples. Expand FleetPublicInterface.seed_mongodb_journey_banks docstring. Sync seeds README and runDualBankSeed module note; bump web-client package version for health probe parity. Record evidence in app-pipeline/todos.md.

  2833. Optional verify GET and synthetic bootstrap after journey seed · fc2900d

    Add --verify-admin-reads (GET /api/admin/questions after bulk POSTs) and --synthetic-bootstrap-json (POST synthetic bootstrap after bulks) to tenant-seed-mongodb and run_tenant_fleet_manager seed action. Dry-run validates synthetic JSON shape; verify is rejected with dry-run. Document live operator expectations in connection-bank-seed.md and CLI KB. Default journey-only seed unchanged; dual runner entrypoint imports unchanged per design.

  2834. Clarify forbidden locale narrowers + public route matrix assertion · d32c179

    Documentation-only touch-ups to two reference files: - `src/i18n/CONTRACT.md`: note that `isAppLocale` / `isProfileLocale` are also forbidden narrowers alongside `hasLocale` / `.includes + cast`, and that `tests/atomic/i18n/forbiddenLocaleNarrowers.test.ts` enforces it. Also calls out the `LocaleCookieWriteError` surface in `src/lib/i18n/next_locale_cookie_client.ts` so future edits know that non-2xx responses from `POST /api/i18n/locale` raise there. - `tests/README.md`: correct the public-route-matrix descriptio…

  2835. Tracked connection/journey bank seed scope and runner import · 0b019cc

    Add app-pipeline/docs/connection-bank-seed.md (Fleet vs UI vs out-of-scope). Link from KB index, app-fleet-cli-commands, and agent navigation rules. Clarify run_tenant_fleet_manager _entrypoint_paths dual import as two supported entry contexts; script and pytest verified.

  2836. Cover journey bank HTTP POST order and error paths · f4c3105

    Mock _post_json to assert connection-statements bulk precedes questions bulk, payload keys, and JourneyBankSeedError on non-2xx responses. docs(seeds): document Fleet tenant-seed-mongodb for operators; bump web-client to 0.1.5 (package.json / WEB_CLIENT_APP_VERSION build surface).

  2837. Forbid new Git branches unless the user requests them · a430eeb

    Record in pipeline, application-root, and app-source agent behaviour rules: routine work stays on the current branch (typically main).

  2838. Refresh localized UI text scanner baseline · 859ca00

  2839. Commit remaining workspace changes (infra, fleet, tenants, web) · 1a2130d

    Large sync: HA/edge TLS and infra probes, Tolgee stack removal, registry and tenant env updates, backend and web-client tests and docs, lifecycle report cleanup, and related pipeline constants.

  2840. Workflows, pipeline READMEs, KB playbooks, plans, contracts, deployment · f9929a5

    Add GitHub workflows; refresh app-pipeline README and test runbook; expand .cursor/kb operator playbooks; touch done plans and runners overview; add container mount schemas and app-contracts gitignore; deployment VM override, password ops, Zitadel redirect URI test; extend app-fleet CLI.

  2841. Move Cursor plans into done, tbd, and todo folders · 56919c9

    Relocate phase2g HA follower to done; sweep deferred infra plans to tbd; stage final acceptance plan to todo.

  2842. Restore vm_api, e2e tests, docs, and project rule · 3ef743f

    Resolve merge conflict by keeping incoming modifications for the app-hosting-vm scaffolding (vm_api management module, golden-image e2e test, README/TEST_PLAN/ARCHITECTURE docs, requirements) and the PROJECT_TRUECONNECTION project rule.

  2843. Auto-heal Zitadel OIDC app config on every provision run · e2b631d

    Closes the follow-up from `9f588f5f`: the Fleet provisioner (`zitadel_provision.provision_oidc_app`) now reconciles the two fields that drift on already-bootstrapped Zitadel instances, in one idempotent PUT against `/management/v1/projects/{P}/apps/{A}/oidc_config`: * `accessTokenType` -> `OIDC_TOKEN_TYPE_JWT`. Zitadel defaults new OIDC apps to `OIDC_TOKEN_TYPE_BEARER` (opaque), which the Fastify backend rejects with `Invalid Compact JWS` when validating Bearer tokens via JWKS (see `app-source/10_backend/src/lib/z…

  2844. Zitadel JWT access-token + admin-human recovery paths on stage/prod · bc0a33b

    - Document the `OIDC_TOKEN_TYPE_JWT` requirement for Zitadel OIDC apps and how to migrate already-bootstrapped tenants (Management API `oidc_config` upsert), since `start-from-init` only sets it on fresh DBs. - Document the `v2beta/users/human` flow for creating a tenant-named admin on an already-bootstrapped Zitadel where the `_ORG_HUMAN_*` env vars were ignored. Includes the `docker exec web-client ... node` transport template (same pattern used by the NextAuth adapter debug helpers) so operators bypass the `ip-…

  2845. Pass first-instance human admin env vars to Zitadel bootstrap · a524ceb

    Previously `docker-compose.oidc.yml` passed only the `ZITADEL_FIRSTINSTANCE_ORG_MACHINE_*` env vars through to the Zitadel container, so fresh tenant bootstraps fell back to Zitadel's generated default human admin (`zitadel-admin@zitadel.<ZITADEL_EXTERNALDOMAIN>`) instead of the tenant-configured `admin@<ZITADEL_EXTERNALDOMAIN>`. Playwright sign-in then failed with `Initial User not supported` / `User not found` on stage because the merged env expected the tenant-named admin to exist. Fix: map the five `ZITADEL_FI…

  2846. End-to-end authenticated shell on stage (cookie prefix, JWT access, JWKS discovery) · 9f588f5

    Drives the Playwright `app-main-nav-all-tabs` spec to green on stage after the OIDC internal-URL / Traefik routing fixes landed in `9d8afd04`, `fb3488e8` and `be1059c3`. Four root causes were blocking the authenticated shell, each confirmed by remote evidence and fixed at the layer where it originated: 1. Session cookie prefix mismatch in Next.js server routes. `getToken({ req, secret })` auto-detects `useSecureCookies` from `request.url`, which inside the web-client container is the internal URL (`http://web-clie…

  2847. Test commit staged only · fec5fed

  2848. Drop default port from Zitadel Host override so ID-token iss matches discovery · 9d8afd0

    Root cause of stage NextAuth `OAuthCallback` error after OAuth login succeeded (evidence from web-client stderr with `NEXTAUTH_DEBUG=true`): ❌ [auth] NextAuth OAUTH_CALLBACK_ERROR technicalDetails.message: "unexpected iss value, expected https://stage.trueconnection.app, got: https://stage.trueconnection.app:443" The `zitadel-headers` Traefik middleware rewrites `Host` and `X-Forwarded-Host` for every request to the Zitadel container. With `ZITADEL_EXTERNALPORT=443`, the middleware was appending `:443` to both hea…

  2849. Remove Traefik Buffer middleware from all Next.js routers · 404bd44

    Follow-up to fb3488e8 (tc-auth-stage `tls=true`) and #11568 triage: The `request-body-limit@file` middleware uses Traefik's Buffer transport (`vulcand/oxy/buffer`), which has a known upstream bug (traefik/traefik#11568): it fails with `no data ready` on empty-body chunked HTTP 302 responses and returns a bare HTTP 500 at the edge. Next.js standalone routinely emits `302` with `Transfer-Encoding: chunked` and no Content-Length (NextAuth redirects, locale negotiation, `next.config.ts` redirects, Server Action redire…

  2850. Zitadel OIDC internal URL targets Zitadel container, not Traefik · be1059c

    Root cause of stage Playwright OAuth failure (`?error=OAuthSignin` redirected by NextAuth core): the merged env shipped `ZITADEL_ISSUER_INTERNAL=http://traefik:80`, but every Traefik router for Zitadel (`zitadel-public`, `zitadel-management`, `zitadel-login-v2`, ...) is declared `tls=true` in `app-pipeline/app-infra/services/oidc/docker-compose.oidc.yml`. With `tls=true`, those routers match only on the TLS-enabled `websecure` entrypoint, so HTTP requests on port 80 fall through with a 404 and `openid-client` disc…

  2851. Route /api/auth/* on stage so NextAuth signin stops returning 500 · fb3488e

    Root cause: `tc-auth-stage` router had no `tls=*` label, so on the `websecure` entrypoint HTTPS requests for /api/auth/* fell through to the catch-all `tc-app-stage` router. That router applies `request-body-limit@file` (Traefik Buffer middleware) which trips upstream bug traefik/traefik#11568: empty-body chunked 302 responses (Next.js `/api/auth/signin`) yield `vulcand/oxy/buffer: no data ready` and a bare `HTTP 500 Internal Server Error` (21 bytes, no CSP, no Server header) at the edge — while the upstream conta…

  2852. Internal Zitadel OIDC discovery + NextAuth route diagnostics · c0cbe06

    - When ZITADEL_ISSUER_INTERNAL is set, use it for OpenID discovery with Host from ZITADEL_ISSUER so Traefik routes to Zitadel; invalid internal URL throws AuthError. - NextAuth catch-all: force-dynamic, runtime nodejs, structured logs for uncaught errors and HTTP 5xx responses (NEXTAUTH_ROUTE_* JSON lines for container logs). - Add resolveNextAuthCatchAllSegmentsForGuards helper and Vitest coverage. - Fleet KB: remote rebuild rsyncs operator app-source; Zitadel internal issuer; NEXTAUTH_DEBUG triage for /api/auth …

  2853. Skip Zitadel admin lifecycle on stage; surface OAuth/403 errors · a971a16

    - loginZitadelUserAndLand: E2E_ZITADEL_SKIP_MANAGEMENT_PROVISION skips delete/create; resolveAdminHumanPasswordForE2E reads tenant ZITADEL_* passwords; email fallback only when not skipping; fail fast on /api/auth/error with OAuth hints. - createTestUser: explicit 403 message with skip-env guidance. - deleteTestUser: throw on 401/403 search (invalid PAT); docstring no longer claims silent success. - tests README + app-fleet KB: stage main-nav env pattern. Evidence: tenant-live-health stage full-stack OK; main-nav …

  2854. Resolve PAT from tenant secrets; drop invalid NODE_EXTRA_CA_CERTS · 02ed385

    - getZitadelPatToken reads …/customers/<c>/<p>/secrets/admin-pat.token when the merged env path is under app-tenant/tenants (Fleet materialized PAT). - Playwright config clears NODE_EXTRA_CA_CERTS if the path is missing locally (stops Node TLS spam when operator env copies VM paths). - Document PAT/TLS/magic-link vs EmailSignin in tests/README.md. - Vitest: unset_node_extra_ca_certs.test.ts.

  2855. Detect EmailSignin via signIn result url; stabilize E2E selectors · bee8159

    - Add shared nextauth_email_signin_result (HTTP JSON + SignInResponse) so Auth.js responses that only set url=/api/auth/error?error=EmailSignin are treated as failures; LoginForm now shows translated errors instead of stalling on email step. - AuthProvider signInWithEmail uses resolveNextAuthEmailSignInFailureCode before ok check. - Playwright: stable data-testid for email input/submit + card steps; parse POST body with nextAuthEmailSignInFailureFromHttpJsonBody for fast diagnostics. - E2E: extend magic-link sessi…

  2856. Clarify stage /you 502 path (Traefik → Fastify, not Next BFF) · 5329883

    - gatewayErrorUi: document tc-api-* routing vs handleApiProxy - KB: triage for GET /api/profile 502 and Retry behavior

  2857. Pass IANA timeZone into NextIntlClientProvider (SSR) · ce3258f

    use-intl production invokes onError(ENVIRONMENT_FALLBACK) when useTranslations runs on the server without timeZone; StrictIntlClientProvider rethrows onError, then next-intl's minified hook wrapper surfaces new Error(undefined) — matching stage digest 781469748 (source-mapped to useTranslate → useTranslations). Resolve timeZone from Intl.DateTimeFormat().resolvedOptions().timeZone in app/layout.tsx and thread through StrictIntlClientProvider. Evidence: .next source map column map; use-intl dist/esm/production/reac…

  2858. Stage sign-in digest triage + MongoClient prod cache note · 83fdda7

  2859. Cache MongoClient promise in production · 8d2a880

    NextAuth adapter and JWT paths call getMongoClientPromise repeatedly; only caching the connect promise in non-production spawned parallel connects and socket timeouts (GetUserByEmailError) under load. KB: extend email-token Playwright triage with adapter pool reuse note.

  2860. Redirect legacy site.webmanifest; improve E2E health diagnostics · 73921f4

    - next.config: permanent redirect /site.webmanifest → /manifest.webmanifest (canonical App Router handler). - e2e_health_stack: record same-origin HTTP 500 response URLs before asserting console is clean. - mandatory_onboarding_shell_e2e: fail fast when profile load error surface is visible (onboarding.errorLoadTitle). - KB: tenant-live-health uses --profile only; Playwright email-token/mongo triage; manifest alias probe. Evidence: curl stage /site.webmanifest → 308 Location /manifest.webmanifest; Playwright app-h…

  2861. Unblock Docker build; tolgee optional in infra registry · d6d8430

    - Export ConnectionDocument; implement ChatService.mergeAndPersistChatSessionFromConnection using mergeServerAuthorityIntoSession + saveChatSession. - Add CHAT_MESSAGE_RETENTION_MAX_AGE_DAYS to strict env schema (optional positive int). - Declare @fastify/multipart dependency; map multipart file-too-large via FST_REQ_FILE_TOO_LARGE. - InfraServiceRegistry: tolgee is APP_INFRA optional (next-intl bundles are product i18n). - KB: Tolgee decommission / optional semantics; Fleet CLI last-reviewed note. Evidence: local…

  2862. Index Fleet Mongo journey seed; link runDualBankSeed to Fleet CLI · 6ef9a46

    Pipeline KB table row points to app-fleet-cli-commands and README (tracked paths only). runDualBankSeed module header documents tenant-seed-mongodb / runner for operators. Evidence: dry-run OK for ifeoma-tc --profile stage (CLI + runner); pytest test_mongo_journey_banks_seed.py x4.

  2863. Mongo journey banks seed CLI and tenant runner · a43fd12

    Add fleet tenant-seed-mongodb (merge-env, packaged JSON, admin bulk POSTs) and run_tenant_fleet_manager --action seed-mongodb-journey-banks with explicit bearer token and fail-fast flag validation. Document operator entry points in KB, README, runners overview, and agent navigation; extend question-bank contract playbook. Tests: mongo_journey_banks_seed dry-run/path checks and runner argparse guards. Fix runner _entrypoint_paths import for package-mode pytest.

  2864. Sync question bank KB and i18n parity table row · 5e5f7f5

    Document web-client parseQuestionBankRows + translation key boundary in question-bank-row-contract.md. Extend AGENT-BEHAVIOUR Where to look to cite messagesFullLocaleParity alongside ICU placeholder parity.

  2865. Web-client Docker build args + remote build log excerpt · c19b9f1

    - docker-compose: pass NEXT_PUBLIC_SITE_URL, NEXTAUTH_URL, and NEXT_SERVER_ACTIONS_ENCRYPTION_KEY as web-client stage/prod build args so Dockerfile ENV matches merge-env (fixes next build metadataBase Invalid URL). - metadata: derive server base URL via resolvePublicSiteUrl (explicit prod error). - package-lock: sync @tanstack/react-virtual + virtual-core for npm ci in Docker. - _start_app_ops: append SSH sudo tail of /tmp/tc-web-client-build.log on remote web-client compose build failure; unit test + Fleet KB not…

  2866. Version-control src/lib for reproducible builds · b20267b

    Most of app-source/20_web-client/src/lib was missing from git while a small subset was tracked, so NextAuth and its Mongo/mail/utils dependencies could not be resolved in a clean checkout. Track the full lib subtree (auth/nextauth, API client, mail, mongodb adapter, debug, profile, bff proxy, etc.). Auth: when resolvePlatformRoleFromMongo throws, jwt_callback now assigns platformRole via bootstrapPlatformRoleFromEmail and logs the degraded mode explicitly so ADMIN_EMAILS admins are not forced to user on Mongo outa…

  2867. Ship PWA icons and skip intl for root file-shaped paths · dfc134b

    Root cause: linked /icon-192.png, /icon-512.png, and /favicon.ico were missing from public/, so Next matched app/[locale] and assertAppLocale threw InvalidLocaleError. Add generated PNG icons and a favicon, export isFileExtensionShapedRootSegment from the i18n routing barrel, and passthrough those URLs in the proxy before locale negotiation. Document the pipeline in CONTRACT.md and public/README; add Vitest coverage.

  2868. Add bank-contract strings for en/de and align journey Question type · 1976760

    The web-client question bank contract UI references journey and admin message keys; English and German bundles were missing them while other locales already carried the strings. Re-export the canonical Question model from lib/types in journey types. Refresh Fleet KB with a web-client messages parity gate and last-reviewed note.

  2869. - Remove invalid mode= kwarg from _refresh_pat_from_target (helpers_outcomes). · 383c5f9

    - Implement rebuild_web_client and rebuild_app_services in app-deployment: web-only vs full backend+web compose paths (_start_app_ops). - Document selective rebuild entrypoints in app-fleet-cli-commands KB. Remote web-client build may still fail on target (npm/build); Fleet now reaches compose instead of missing-attribute or missing-function errors.

  2870. External_dns preflight ignores internal_service_endpoint rows · 37a39bc

    enforce_dns_mode_alignment compared every domain ip_address to the ingress IP; internal.trueconnection.app rows use loopback by design and caused false mismatches. Only public_ingress domains participate in the WAN alignment check. Document in app-fleet-cli-commands KB; add unit coverage.

  2871. Un-ignore 10_backend src/lib; document in Fleet KB + rules · 4688161

    Root .gitignore lib/ matched Fastify shared modules under app-source/10_backend/src/lib/. Add negated paths mirroring 20_web-client. Document in app-fleet-cli-commands Convention table and AGENT_BEHAVIOUR memorize bullet so agents use normal git add.

  2872. Reconcile platform admin role with ADMIN_EMAILS · f7197f8

    Email-keyed profiles could keep platformRole=user while ADMIN_EMAILS listed the mailbox (e.g. stage E2E admin after NextAuth email-token sign-in), so AppNav never showed Admin. Add effectivePlatformRoleForProfileEmail: promote listed mailboxes to admin; keep stored admin when the mailbox is not in the list (Mongo ops grant). Apply in NextAuth JWT Mongo resolution, profile bootstrap, and Fastify ProfileService / platformRbac. Extend Vitest for stale-user promotion.

  2873. Harden i18n keys and question bank API contract · fa203a5

    Validate translation lookup keys before next-intl to avoid MISSING_MESSAGE internal split errors when the bank row omits textKey or option labelKey. Add QuestionBankRowContractError and parseQuestionBankRows at GET boundaries (journey getQuestions, admin list/get/create/update) so reflection and admin surfaces show localized bank_contract_violation or admin banner copy. Harden StrictIntlClientProvider getMessageFallback for invalid keys; chain service worker cache.put errors into console.warn. Tests: requireTransl…

  2874. I18n(web-client): add bank contract strings to es, fr, ar · 9585c2c

    Mirror admin.questions.errors.bankRowContract and journey.reflectionPhase errorTitleBankContract / errorMsgBankContract so full locale parity and messageKeysReferencedInSource checks pass alongside en and de.

  2875. KB and runners referenced this Fleet operation, but cli.py had no subcommand and misc_cmds lacked the helpers tested by test_sync_operator_browser_hosts.py. · 3036b71

    KB and runners referenced this Fleet operation, but cli.py had no subcommand and misc_cmds lacked the helpers tested by test_sync_operator_browser_hosts.py. Add src.manager.operator_browser_hosts (apex hostname from merged env, dns_zones from infra.json, managed domain tuple, run_tenant_stack_operator_hosts_sync using materialize_env + resolve_deployment_targets + LocalBrowserHostMappingSpec). Expose FleetPublicInterface.sync_operator_browser_hosts; wire misc_cmds handler and argparse (--dry-run, --skip, --no-dns-…

  2876. Strict tenant manifest validation in canonicalize_tenant_path · b16cd76

    Raise RuntimeError when manifest.json exists but JSON is invalid, the top-level value is not an object, or tenant_id is missing/blank — removes silent return of the shadow path for corrupt manifests. Document Playwright net::ERR_NAME_NOT_RESOLVED (operator must resolve NEXTAUTH_URL host, e.g. sync-operator-browser-hosts). Re-enable tests/unit/test_cli_canonicalize_tenant_path.py (drop pytest --ignore). Tests: pytest tests/unit/ (1997 passed, 2 skipped).

  2877. Wire tenant rebuild CLI to pipeline and public interface · 9e9a2f1

    Expose rebuild_web_client and rebuild_app_services through orchestration.pipeline, FleetManager (with topology preflight), and FleetPublicInterface. Add fleet tenant-rebuild-web-client and tenant-rebuild-app subcommands with handlers in misc_cmds. Fix rebuild flows to call resolve_remote_start_app_target_for_start_app with its real signature (removed invalid kwargs). Align dev TLS env toggle in rebuild_app_services with DEV constant. Document commands in README, cli KB, and cli module index; enable unit tests by r…

  2878. get_pat_for_app_registration no longer imports PatResultData for dict-shaped read_pat payloads (fixes unit tests and headless CI without app_infra_root). · b329d48

    get_pat_for_app_registration no longer imports PatResultData for dict-shaped read_pat payloads (fixes unit tests and headless CI without app_infra_root). Treat whitespace-only tenant admin-pat.token as missing. After a successful infra read, save_pat is required; OSError is wrapped as RuntimeError with prefix persist Zitadel PAT. Remove pytest --ignore for test_get_pat_for_app_registration_persist.py (4 tests). KB: document PAT resolution + persist for E2E/tooling. Evidence: pytest tests/unit/ — 1986 passed, 2 ski…

  2879. Server-resolve (pages) shell copy; inject connection status labels · 7578caf

    Split authenticated `(pages)` layout into a Server Component that loads `AppPagesShellUiCopy` (getTranslations after setRequestLocale) and `AppPagesLayoutClient` so loading/onboarding surfaces never call useTranslations on the client-retry path. Resolve `app.redirecting` on the server for `/{locale}/auth/` and use a tiny client redirect stub. Require `copy` on `ConnectionStatusIndicator` (ui.connectionStatus.*); pages shell passes server-resolved strings; Discovery, Analytics, and Admin pass labels from their exis…

  2880. Server-resolve locale shell copy to avoid intl client-retry 500 · 3df81e7

    Sign-in and locale shells could hit Next.js client retry without NextIntlClientProvider, surfacing useTranslations errors (documented for auth.errorPage). Resolve slow-request overlay, PWA hint, and login form copy on the server after setRequestLocale and pass props into client components. Add loadLoginFormUiCopy for auth.login strings. Evidence: GET /en/auth/sign-in returns 200 with local dev; npm run check:translations and npx tsc --noEmit pass. Full app-main-nav Playwright still needs E2E_ZITADEL_PAT or a live …

  2881. Note PACKAGE_INDEX.yaml refresh after merge-env · 6236120

  2882. Guest SSH probe, package index, strict merge_ssh_key · ae933ed

    - Track vm_guest check, SSH conn resolution, guest_ssh_probe, platform admin errors, and PACKAGE_INDEX writer; compose TenantPackageGuidePart on FleetManager. - merge_env refreshes PACKAGE_INDEX.yaml when the fleet root contains app-tenant (skips synthetic FleetManager(tmp_path) trees). - merge_ssh_key / merge_ssh_key_typed: require existing key file and valid host / vm.config structure; add ProvisioningConfigurationError module. - infra_sync_provisioning: only merge_ssh_key_typed when provisioning key exists. - p…

  2883. Track TargetConfig.provider_surface unit tests · ddc8986

    Keeps provider_surface inference and cross-field validation covered in CI; depends on tests._target_test_helpers.ensure_tenant_module().

  2884. Track domain_network_binding + re-export from contracts · d7c3c09

    The tenant DomainConfig and fleet tests import common.contracts.domain_network_binding; the module existed only as an untracked workspace file. Add it to git and export constants from common.contracts.__init__. KB: document that app-infra Traefik/Zitadel templates stay neutral in git (operator CIDRs and stage domains belong on-target via merge-env / sync, not commits). Also reverted local app-infra drift (Traefik sourceRange, ACME block, Zitadel ExternalDomain) to match the repository defaults.

  2885. Tenant CLI package + restore tenant create request contracts · 34ffbbb

    - Route app-fleet/cli.py through src.cli.tenant.tenant_cmds; remove duplicate src/cli/tenant_cmds.py; document tenant package and KB row. - Centralize TC_* path/profile helpers in src.cli._utils; reconcile cmds use merge_env without unsupported kwargs; misc_cmds exposes run_tenant_live_health_suite. - Track tenant_create_request_workflow and YAML-aware TenantCreateRequest loading. - Restore TenantCreateRequest fleet fields (public DNS, traefik CIDRs, application_secrets) with strict mode/stem validation and flat-v…

  2886. Onboarding gate, rate-limit assertions, and fleet DNS KB · 7b146f9

    - Document app-infra-start external DNS mismatch in dev-tenant-fleet-diagnostics. - Add rateLimitErrorUi constants; extend gateway_error_page_assertions with assertNoBlockingAppErrorSurfacesVisible and throwIfBlockingAppErrorSurfaceVisible. - waitForAuthenticatedAppNav: complete mandatory onboarding, stabilize nav after poll, and reuse shared bottom-nav locator. - Extract e2eBottomAppNavLocator for root-class or legacy navigation landmark. - Onboarding submit: data-testid onboarding-submit for stable E2E. - app-ma…

  2887. Tenant-live-health manifest path vs tolgee runtime · dc40238

    - Document HOST-INFRA failure when --tenant points at a directory without manifest.json (not a Fleet tenant package). - Evidence: tenant-live-health on partial ifeoma-dev path (exit 1, stderr); ifeoma-tc infra-gate reaches APP-INFRA and fails only on tolgee not running.

  2888. JSON import attribute for en locale helper on Node 20+ · b7939b7

    Playwright loads tests/e2e/helpers as native ESM; Node requires an explicit JSON import attribute (import ... with { type: "json" }) for messages/en.json. Evidence: prior playwright run failed with a TypeError about import attributes; after the change, playwright exits 0 and app-main-nav-all-tabs is skipped only when adminE2ePrereqsMet() is false (missing E2E base URL / merged env). Document the contract in tests/README.md.

  2889. Discovery, connections, chat, and shell alignment · f9e1891

    Evidence: npx tsc --noEmit; npm run check:translations; npm run test:atomic:offline (803 tests); npm run build (20_web-client). - Discovery: universe layout/positioning, stage badge chrome, RevealHeader, peer routing, WebGL engine touchpoints, constants and message keys. - Connections: client API and hooks, connection-stage polling, stage helpers/validation, detail profile resolution, match typing. - Chat: media/messages/moderation barrels, container/system/private mode, handlers, transformToMatch; chat-sync inbou…

  2890. Wire gender and orbVisuals through OpenAPI and POST /api/profile · a9e7549

    Evidence: npx tsc --noEmit; npm run check:translations; npm run test:atomic:offline (803 tests); npm run build (20_web-client); npm test -- tests/routes/profile- (10_backend). - OpenAPI: add ProfileGender, OrbVisuals; extend ProfilePublic and UpdateProfileRequest; add ar to preferredLocale enums where missing. - Fastify profile routes: persist validated gender and orbVisuals; return them on GET/POST using safeParse-based shaping for stored Mongo blobs. - Web client: build partial updateProfile bodies so omitted ke…

  2891. Fleet ensure-env path and infra-gate tolgee follow-up · 4960373

    - Document full tenant path for ensure-env and distinguish template gaps from APP-INFRA runtime failures (e.g. tolgee not running). - Add ensure-env one-liner to app-fleet-cli-commands quick reference with gitignore note for secrets/.

  2892. Localize private chat + reveal modals; refresh UI baseline · 8d6cf44

    - PrivateChatRequest: useTranslate for all copy; peerName from displayName or peerFallback ICU; design-system hero/well/dot chrome. - RevealIdentityInfo: useTranslate + shared chat-messaging-surfaces-brand helpers; backdrop via Tailwind scrim. - RequestMode passes otherUserName for accurate peer strings. - Regenerate localizedUiTextScanner.baseline.json (16 entries). - KB: monorepo Fleet CLI path + infra-gate mongo secrets template remediation. Verified: tsc --noEmit, npm run test:atomic:offline, npm run check:tra…

  2893. Restore atomic gate — i18n gaps, SW v2, tolgee proxy class · 9721e42

    - Add chat.privateChatRequest, revealIdentityInfo, and discovery.universe.view.peerTooltipViewProfile strings across en/de/fr/es/ar (static bundle tests). - Replace public/sw.js with locale-safe PWA caching (navigate + locale bypass, v2 cache names, ACTIVE_CACHES). - Export tolgee as excluded API segment; orb purple blend weights; design-system severity disc export. - Discovery adapter: require finite matchPercentage, map sharedValues to core when values.core empty. - Fix Vitest/E2E imports (seed paths, translateN…

  2894. Remove bottom-nav data-testid from production UI · c9eb85f

    Route href contract stays in appNavBottomNavModel; shell scoping uses APP_BOTTOM_NAV_ROOT_CLASS (app-nav-tab-classes) with globals.css nav.tc-app-bottom-nav. Playwright uses class + roles + en bundle copy; logout uses sign-out aria label. Add app.nav.bottomNavLandmark for the nav landmark across locales. Evidence: npm run build; test:atomic:offline nav contract; check:translations.

  2895. Correct the Convention table: --profile and --mode are independent; CLI errors if TC_FLEET_MODE/--mode is unset. · 960178e

    Correct the Convention table: --profile and --mode are independent; CLI errors if TC_FLEET_MODE/--mode is unset. Align examples and Last reviewed note with fleet tenant-live-health --help and 2026-04-21 evidence (ifeoma-tc stage infra-gate).

  2896. Bottom-nav test id parity (TS vs globals.css) · bc8fc78

    Document that APP_BOTTOM_NAV_TEST_ID must match plain-CSS attribute selectors; annotate globals.css, appNavBottomNavModel, button-brand preset, Fleet KB, and pipeline E2E registration doc. Evidence: npm run check:translations (19), test:atomic:offline (801); tenant-live-health infra-gate ifeoma-tc stage OK.

  2897. Use appNavBottomNavModel test ids in shell helpers + main-nav spec · 298831f

    Add APP_BOTTOM_NAV_LOGOUT_TEST_ID; wire AppNav logout button. app_shell_navigation uses APP_BOTTOM_NAV_TEST_ID, appBottomNavLinkTestId, logout id; clickAppNavLink throws on unknown English tab labels. app-main-nav-all-tabs imports the same helpers. AGENT-BEHAVIOUR: require model constants in Playwright nav helpers. Evidence: npm run test:atomic:offline (801), npm run build; tenant-live-health infra-gate OK.

  2898. Track optional orb Playwright specs + align docs with admin prereqs · f53fe03

    Add orb-visual-smoke, orb-journey-markers-authenticated, and orb-connection-orbs-authenticated (opt-in env flags). Align file headers, expect messages, and tests/README with adminE2ePrereqsMet (PAT optional). Fleet KB: orb Playwright paragraph, appNavBottomNav Vitest pointer, Last reviewed. Evidence: playwright orb-visual-smoke vs ifeoma-tc stage env (passed); npm run test:atomic:offline (801); tenant-live-health infra-gate OK.

  2899. DRY bottom-nav route specs + nav Vitest contract · 60f1754

    Extract appNavBottomNavModel (href rows, container + link test ids) and wire AppNav useMemo from it. Add tests/atomic/nav/appNavBottomNavRoutesContract.test.ts. Correct admin Playwright skip hints: PAT is optional (magic-link path); document in app-main-nav-all-tabs and admin-panel-sections. AGENT-BEHAVIOUR bullet for nav model + skip text accuracy. Evidence: npm run test:atomic:offline (801 tests), npm run build.

  2900. App-health-stack E2E recipe, clarify shell nav admin skip, link Vitest · f6957c7

    - Fleet KB: Playwright app-health-stack + Last reviewed (matrix, switch, health-stack, target-stack-logs tail note). - app_shell_navigation: document e2eLogWarn + explicit admin skip on stale /admin. - AuthErrorPageCopyProvider module doc: pointer to authErrorPageCopy Vitest. Evidence: playwright app-health-stack passed vs ifeoma-tc stage env; target-stack-logs tail (scanner InvalidLocaleError only); npm run test:atomic:offline 798.

  2901. Link authErrorPageCopy Vitest + KB locale-switch + full-stack evidence · 151f94b

    - JSDoc @see tests/atomic/auth/authErrorPageCopy.test.ts and CONTRACT path rule. - Fleet KB: Playwright locale-public-routes-switch recipe; Last reviewed notes matrix + switch green on ifeoma-tc stage env and tenant-live-health full-stack OK. Evidence: npm run test:atomic:offline (798); playwright locale-public-routes-switch passed; tenant-live-health full-stack ifeoma-tc stage OK.

  2902. Document E2E_MERGED_ENV_PATH + HTTPS ignore for the public path matrix without Zitadel PAT. · b890eb3

    Document E2E_MERGED_ENV_PATH + HTTPS ignore for the public path matrix without Zitadel PAT. Record agent evidence: matrix passed vs ifeoma-tc stage env; tenant-live-health public-edge OK.

  2903. Document non-throwing adminE2ePrereqsMet + Vitest path · 1bc7345

  2904. Make adminE2ePrereqsMet non-throwing for Playwright skip predicates · 0ecf281

    adminE2ePrereqsMet used getE2EBaseUrl(), which throws when E2E env is unset, so test.skip(!adminE2ePrereqsMet()) crashed instead of skipping. Use resolveE2EBaseUrlSync and narrow try/catch only for resolveAdminEmail when tenant auth hints are missing. Add Vitest contract tests/atomic/e2e/admin_e2e_prereqs_met.test.ts. Document target-stack-logs --scan InvalidLocaleError scanner noise in Fleet KB. Evidence: npm run test:atomic:offline (798 tests); playwright app-main-nav-all-tabs and admin-panel-sections (ui) with …

  2905. Track former tests/atomic/lib suites under topic dirs · 3ba08c0

    The root .gitignore lib/ rule matches tests/atomic/lib/, so those Vitest files were never committed. Move them to tests/atomic/debug, browser, design-system, utils, profile, errors, and infra. Refresh CONTRACT, Fleet KB, and AGENT-BEHAVIOUR with the path rule. Evidence: npm run test:atomic:offline (796 tests), npm run build; Fleet tenant-live-health ifeoma-tc --profile stage --mode stage --suite infra-gate OK.

  2906. Point CONTRACT at tracked authErrorPageCopy Vitest path · 426846c

    Keeps the locale contract aligned with repo .gitignore for tests/atomic/lib/.

  2907. Note tests/atomic/lib gitignore for web-client Vitest paths · ff20691

    Explain why auth error page copy tests live under tests/atomic/auth/. Refresh Last reviewed line with this fact. Evidence: npm run build (20_web-client) succeeded after KB edit.

  2908. Track auth error page copy tests outside ignored lib path · 60ee036

    Place Vitest contract tests under tests/atomic/auth/ because .gitignore ignores tests/**/lib/. Update AGENT-BEHAVIOUR to reference the new path. Evidence: npm run test:atomic:offline (796 tests passed).

  2909. Professional dev-auth warnings + Fleet KB web-client i18n gate · b5656bd

    - Replace emoji-prefixed development auth bypass console warnings with explicit bracket-tagged messages in AuthProvider (no behaviour change). - Append a focused Fleet KB note: post-change checks for root layout / next-intl / Auth (workstation build + landing probes; tenant-rebuild-web-client + tenant-live-health + web-client log strings). Update Last reviewed stamp. Tests: npm run test:atomic:offline — 791 passed; app_shell_navigation_url — 4 passed.

  2910. Feed auth.errorPage copy without useTranslations in AuthProvider · 677908b

    Next-intl can surface “NextIntlClientProvider context was not found” for `useTranslations` inside `AuthProvider` when a server segment fails first and React retries the client boundary. Sign-in error strings are a small, stable slice of the same `getMessages()` payload, so extract `auth.errorPage` on the server and pass it through `AuthErrorPageCopyProvider` + strict dot-path lookup (throws on missing keys; `{name}` interpolation only). Evidence: - `npm run test:atomic:offline` — 791 tests passed. - `npm run build…

  2911. Add missing lib/rbac sources for AppNav and admin guards · 5733020

    The committed tree referenced `@/lib/rbac/*` from `AppNav`, admin layout, and API routes, but the `src/lib/rbac/` module was never tracked—fresh clones and CI could not resolve those imports. - Add platform role constants, Mongo-backed resolver, session hook, server assert helper, and client `RequireRole` guard (copy uses `ui.*` message keys). - Resolve admin redirect locale via `tryParseAppLocale` (single choke point). Tests: `npm run test:atomic:offline` (791 tests) all passed after these adds. Note: first cold …

  2912. Restructure i18n (errors, routing, bundle, provider, translate) · 39c07b5

    Restructure `src/i18n/` per the agreed plan: split routing and bundle loading, move landing JSON to `bundle/overlays/<locale>/landing.json`, unify `MissingMessageKeyError` under `errors/types.ts`, rename `localisation/` → `translate/`, move `StrictIntlClientProvider` to `provider/`, add public `src/i18n/index.ts` and overlay README, remove dead entrypoints (`config.ts`, `server.ts`, legacy per-namespace JSON, duplicate validators), and rewire next-intl plugin + Dockerfile COPY + pipeline `PATH_WEB_CLIENT_LOCALE_OV…

  2913. Refresh AGENT-BEHAVIOUR Where to look (fleet, Zitadel, question bank) · f447195

    - Add reflection question bank row pointing to question-bank-row-contract.md (422 / textKey). - Align Fleet CLI, dev diagnostics, and memorize bullets with current KB and CLI surface.

  2914. Validate question bank rows before JSON; 422 on serialize failure · ba155c9

    - Assert textKey and option labelKeys in QuestionService.serializeQuestionDocument so API never emits undefined keys (prevents next-intl t(undefined) in admin UI). - Centralize Fastify 422/500 mapping in questionBankSerializationHttp.tryReplyQuestionBankSerializationFailure. - GET /api/admin/questions, GET /api/admin/questions/:id, GET /api/questions use the helper. - Add Playwright app-main-nav-all-tabs.spec (admin E2E) for bottom nav + question bank. - Document operator flow in app-pipeline/.cursor/kb/question-b…

  2915. Refresh agent rules and tenant diagnostics KB · 35e56f2

    - Document multi-host tenants (infra_services per profile) and tenant-live-health --profile requirement - Expand Fleet CLI quick reference (OpenAPI refresh, public-edge 404/500 triage, web client checks) - Add dev-tenant symptom rows, Playwright/e2e seed note, and presigned upload CORS context

  2916. Dev-tenant diagnostics + chore(web): SpaceBackground uses LANDING_SPACE_BG_DEEP_HEX · 4ef11d5

    - dev-tenant-fleet-diagnostics: scope, translation gate, design-token cross-links, hex888ToRgbaCssWithAlphaByte note (Fleet CLI ref unchanged). - SpaceBackground: CSS fallback uses LANDING_SPACE_BG_DEEP_HEX (manifest / cosmic shell), replacing literal #0a0118. Validated: npx tsc --noEmit; npm run check:translations; npm run test:atomic:offline (661). Fleet: print-loopback-health-probe --mode dev --tenant ifeoma-dev.

  2917. Hex888ToRgbaCssWithAlphaByte; replace hex+alpha string concat · d042ac9

    Add hex888ToRgbaCssWithAlphaByte in color-brand (exported via @/design-system) to map validated #RRGGBB + alpha byte 0-255 to CSS rgba(), replacing `${hex}30` / `${hex}80` hacks. Refactor RatingCard, NetworkVisualization peer glow, UniversePreview dot halo, profileDataNormalizer orb glow, createOrbGlow (styles.ts), and generateOrbGradient (coreValueColors). Invalid hex surfaces via requireHex888 (throws; no silent tint). Tests: tests/atomic/design-system/hex888ToRgbaCssWithAlphaByte.test.ts Validation: npx tsc --n…

  2918. Document FULL=1 verify-stack for dev reachability gate · a549cb0

  2919. Ensure_fleet_on_path before src.manager in reachability runner · 8bc2a1f

    verify-stack with FULL=1 invokes run_dev_service_reachability_verification.py with PYTHONPATH=. only; top-level imports from src.manager ran before ensure_fleet_on_path(), causing ModuleNotFoundError: src.manager. Call ensure_fleet_on_path() immediately after _runner_utils import, document contract in module docstring, merge reachability_verification_conjunct_failures import, drop redundant call in main(). Validated: pytest app-fleet/tests/unit/test_dev_service_reachability_verification.py; manual run --tenant-id …

  2920. Clarify dev-tenant KB path + record dev sweep evidence · ab73c5d

    - AGENT-BEHAVIOUR Where to look: use app-pipeline/.cursor/kb/dev-tenant-fleet-diagnostics.md - todos.md: 2026-04-13 closure (loopback, public-edge, pytest x46, verify-stack, atomics 512)

  2921. Universe star pass disk sync + dev sweep evidence · f2b7fd2

    - discovery-universe-view.md: rendering table row for star VP + diskAngleRad - todos.md: closure row with fleet public_edge + atomic offline (512 tests)

  2922. ConnectionJourney i18n + typed bank failures · 7b68cc0

    - ConnectionPhaseBankFailure + resolveConnectionPhaseBankFailureUi (no English substring matching) - journey.connectionPhase.* in en/de/fr/es/ar (errors, loading, intro) - Tests: message static data + resolver unit tests - KB playbook and todo-notes Wave 4

  2923. Always compose disk rotation in star backdrop VP · 34bd6cf

    R_y(0) is identity; removes special-case branch. docs: index discovery-universe-scene-debug-issues.md in app-pipeline KB

  2924. Sync star backdrop with universe disk spin · c8e530e

    Left-drag updates diskAngleRef for GPU peers and Canvas2D; the star/nebula pass used a backdrop VP that ignored that angle, so sky and chart drifted. - Compose proj * view * R_y(diskAngle) in buildUniverseStarBackdropViewProjection - Thread diskAngleRad through UniverseWebGLEngine.draw / drawStarPass - Document in discovery-universe-scene-debug-issues.md; extend Vitest coverage

  2925. I18n(web): chats peer display name fallback for missing discovery name · a4faf52

    - chats.page.peerDisplayNameFallback in en/de/fr/es/ar + message key inventory - ChatsPageClient peerNameByAuthUid uses t() with [discoveryData, t] - KB + todo-notes Wave 4 Chats subsection

  2926. Chats list uses ViewerSynergyInput, no generator profile stub · b1242e4

    - transformToMatch: narrow second arg to ViewerSynergyInput (interests/values.core) - ChatsPageClient: map useProfile() to viewerForSynergy; single file header - docs: chat utils README, app-pipeline KB + todo-notes Wave 4 slice

  2927. Module docstring for brand-glass Radix Select · 56fc91b

    Explains linkage to SURFACE_BRAND and globals.css violet-night classes.

  2928. Brand violet-night glass for Radix Select surfaces · 07eeaa0

    Add .surface-brand-glass-select-trigger and .surface-brand-glass-select-content in globals.css (blur, gradients, accent rgb(167 139 250), depth shadow) so profile and app selects match modal/peer-hover glass instead of flat white/5. Extend SURFACE_BRAND with glassSelectContent; glassSelectTrigger now references the trigger class plus violet focus ring tokens. Validated: npm run test:atomic:offline (507 tests). Dev tenant: tenant-live-health --suite infra-gate for ifeoma-dev returned infra_gate.ok true.

  2929. Wave 4 You hub slice note + playbook link in todo-notes · 793fda2

  2930. You hub modal tokens, parallax batching, stricter profile/select · af33251

    - Add MODAL_BRAND design tokens (gradient scrim, single glass blur, opaque chrome) - BaseModal: i18n close control; exhaustive modal width; fix JSDoc example - YouScreen: rAF parallax, reduced-motion path; gate settings on matching profile - UserProfileMenu: GetProfileResponse + default orb accent from design system - SettingsSection: opacity-only expand animation - SelectItem: throw on invalid value (fail fast) - Profile types: optional values/orbVisuals on Profile - KB: you-hub playbook under app-pipeline/.curso…

  2931. Align main app column width with /you (contentMedium) · 16d3cd0

    - Use LayoutGrid width=medium for chats, connections, discovery list mode, analytics, onboarding, auth sign-in/error, chat/connection shells, grounding. - LoginForm card uses max-w-full so column width follows parent grid. - Localize ConsentRequestScreen; extend props for ChatView/ConnectionManager. - Document contentMedium vs shellConstrained; refresh i18n UI scanner baseline. Universe discovery map remains full-bleed.

  2932. Record dev tenant public-edge ok + atomic 503 re-verify (2026-04-13) · 2b83fd4

  2933. Align virtualization KB with shipped Discovery and Chat virtualizers · 4a94eea

    - Extend virtualization-long-lists-notes with Phase B/C evidence paths - Point list-virtual-brand and design-system README @ tracked KB (app-pipeline) - Mirror evidence row in app-pipeline/todos.md

  2934. Add virtualization KB to web shell layout navigation row · b5e289f

  2935. Link app shell layout nav to virtualization KB notes · b16da3a

  2936. Track virtualization list tokens and admin list cleanup status · 68d4858

  2937. These components were never imported by AdminPanel or routes (grep in app-source). · dff90f5

    Operator profile browsing remains UserProfilesTab; journey keeps its own ProfileDetailModal. Drop adminProfileRowEstimatePx from VIRTUAL_LIST_BRAND; update design-system docs and feature matrix. KB notes the removal for fleet/product agents. Tests: npm run test:atomic:offline (503). Fleet: tenant-live-health infra-gate ifeoma-dev.

  2938. Assert more admin tab headings from messages/en.json · 4e19099

    Add visible-heading checks for infrastructure, system-data, simulation-bots, and user-profiles; document in dev-tenant KB. Tests: npm run test:atomic:offline (503). Fleet: tenant-live-health infra-gate ifeoma-dev.

  2939. Align admin Playwright spec with messages/en.json · ee54525

    Add enLocaleRegex for ICU-shaped strings; extend admin-panel-sections with locale-key lookups, Questions section smoke, and profile modal assertions. Atomic test covers regex helper; KB notes E2E English bundle alignment. Tests: npm run test:atomic:offline (503). Fleet: tenant-live-health infra-gate ifeoma-dev.

  2940. Localize Super Admin question bank tab (admin.questions.*) · fafebfa

    Wire QuestionManagementTab and QuestionFormModal to next-intl via useTranslate; add ICU-backed alerts, confirms, filters, table, modal, and dual-bank seed copy. formatDualBankSeedSummary now requires a translator and reads admin.questions.seedResult.* so seed alerts are locale-aware. Extend runDualBankSeed tests with en.json tEn helper. Document admin.questions in dev-tenant-fleet-diagnostics KB. Tests: npm run test:atomic:offline (501). Fleet: tenant-live-health --suite infra-gate ifeoma-dev.

  2941. Localize Match management admin tab · 50376dd

    Add admin.matchManagement.* across en/de/fr/es/ar with canonical key list, static parity test, and localized recalc storage warnings. MatchManagementTab uses useTranslate; Mongo/API path literals stay in code tags. KB: document namespace. Verified: npm run test:atomic:offline; tenant-live-health --suite infra-gate ifeoma-dev exit 0.

  2942. Localize Simulation bots and Profile generator admin tabs · 7e2b749

    Add admin.simulationBots.* and admin.profileGenerator.* across en/de/fr/es/ar with key lists, static parity tests, and i18nSameAsEnPolicy entries for API-aligned field identifiers. SimulationBotsTab parses JSON with localized error messages; ProfileGeneratorTab, GeneratorConfig, and ProfilePreview use useTranslate. Document namespaces in dev-tenant-fleet-diagnostics.md. Verified: npm run test:atomic:offline; tenant-live-health --suite infra-gate ifeoma-dev exit 0.

  2943. Localize Admin AnalyticsDashboard (platform metrics) · 9b56f36

    - Add admin.analyticsDashboard.* in en/de/fr/es/ar (KPIs, journey phases, maturity band labels, data-quality tiles, user counts ICU). - AnalyticsDashboard: useTranslate, export AnalyticsData type, document maturity bucket ids; map stages to locale keys; replace unsafe dynamic Tailwind color classes with fixed bar maps. - Keys file + static parity test; KB cross-link for System Data analytics. Validated: npm run test:atomic:offline (497). Fleet: tenant-live-health --suite infra-gate --tenant ifeoma-dev --profile de…

  2944. Localize Super Admin System Data tab · 07fde7a

    - Add admin.systemData.* bundles (en/de/fr/es/ar) for headers, analytics, bulk upload, export, danger zone, format guide, and parse errors (ICU). - Refactor SystemDataTab: useTranslate, typed upload banner state, JSON parse split from shape validation, AdminProfile cast for bulk upload API. - Reuse admin.userProfiles.refresh, keepMyProfile, clearAll, and clearConfirm* keys for DRY destructive flow and analytics refresh. - Remove redundant export alert; errors surface via handleError (toast). Validated: npm run tes…

  2945. Localize Admin Panel shell (title, nav, section labels) · f42ccd2

    - Replace ADMIN_SECTION_CONFIG.label with labelKey (admin.sections.*); AdminPanel uses AppT/useTranslate. - Add admin.panel.* and admin.sections.* in en/de/fr/es/ar; adminPanelMessageKeys + static parity test. - Playwright admin E2E resolves English strings via messages/en.json (en_locale_message) including infrastructure Refresh. Validated: npm run test:atomic:offline (495). Fleet: tenant-live-health --suite infra-gate --tenant ifeoma-dev --profile dev (ok).

  2946. Note admin.infrastructure locale keys vs Fleet infra-gate evidence · cdac979

  2947. Localize Super Admin Infrastructure tab and Chat Management · 2c5ab8e

    - Add admin.infrastructure.* message bundles (en/de/fr/es/ar) with stable endpoint ids for probe row titles, status badges, system info segments, and chat reset flows. - Refactor InfrastructureTab: useTranslate + AppT, INITIAL_ENDPOINTS with InfrastructureEndpointId, ICU health summary and latency formatting. - Refactor ChatManagementSection: outcome discriminated union + t() so locale switches stay consistent; document BFF/Mongo behavior in file header. - Add adminInfrastructureMessageKeys + static parity test; e…

  2948. Note shipped virtual list surfaces in README · 33ca687

  2949. Virtualized chat transcript + chat.messagesEmpty locale keys · ba8f15b

    - ChatMessagesArea: useVirtualizer, LIST_SCROLL_BRAND.region, near-bottom scrollToIndex; measureElement rows - Add chat.messagesEmpty.{title,bodyPrivate,bodyAnonymous} in all locales; extend CHAT_MESSAGE_KEYS_FLAT - Track chat i18n key catalog (chatMessageKeys.ts); note list-virtual-brand wiring - Tests: npm run test:atomic:offline (493 pass); Fleet ifeoma-dev infra-gate OK Note: .cursor/plans/virtualization-long-lists.plan.md is gitignored locally; mirror status in plan or design-system README if needed.

  2950. Localize Admin User Profiles (admin.userProfiles.*) · 72b249e

    - Wire UserProfilesTab + ProfileDetailsModal + confirm/prompt/alert to AppT and useTranslate - Add adminUserProfilesMessageKeys + static bundle test; fr: tableActions as Opérations (policy) - KB: clarify User Profiles admin UI vs Fleet SSH/Mongo operations - Tests: npm run test:atomic:offline (493 pass); Fleet ifeoma-dev infra-gate OK

  2951. Localize Admin Debug tab (admin.debug.*) · f1cc2a5

    - Wire DebugSettingsTab to AppT and nested admin.debug keys in all locales - Add adminDebugMessageKeys + static parity test; allowlist symbol-heavy affects lines - Document keys in lib/debug README; cross-link browser debug vs Fleet in dev-tenant KB - Tests: npm run test:atomic:offline (pass); Fleet: tenant-live-health --suite infra-gate ifeoma-dev OK

  2952. Clarify AppNav testid scheme vs translated labels · aeeb914

  2953. Localize AppNav labels via app.nav.* message keys · acf12d2

    - Add app.nav tab + logout strings to en/de/fr/es/ar; extend appShellMessageKeys parity test - AppNav: useTranslate, stable data-testid ids (you|journey|explore|chat|admin), aria-label for sign out - Regenerate localized UI scanner baseline Tests: npm run test:atomic:offline (491 passed) Fleet: tenant-live-health --suite infra-gate ifeoma-dev ok

  2954. Allowlist localized UI scanner baseline in .gitignore · 571d5d2

    Negate *.json ignore so localizedUiTextScanner.baseline.json can be updated without git add -f.

  2955. LAYOUT_BRAND shell (S1), LayoutGrid tiers, guard + baseline · 5342588

    - Add design-system layout-brand.ts, surface/button/index exports, README Layout section - Shell uses max-w-6xl + gutters; discovery list uses listWide + gutterX + @container - Refactor LayoutGrid (standaloneGutter); migrate analytics, admin, connections, journey hub - globals.css @theme --width-layout-* aligned with TS; atomic shellMaxWidthLiterals test - Playwright public viewport smoke for /landing; track localized UI scanner baseline (-f) npm run test:atomic:offline: 162 files / 491 tests passed Fleet evidence…

  2956. Link app shell layout (LAYOUT_BRAND) to debug KB and agent navigation · fcd277d

    - Clarify in lib/debug README that Debug toggles do not change column CSS; point to LAYOUT_BRAND and Fleet diagnostics. - Index web shell layout in app-pipeline KB README; note in dev-tenant-fleet-diagnostics when triage is CSS vs infra. - Add Where-to-look rows in application and app-pipeline AGENT_BEHAVIOUR for LAYOUT_BRAND and shellMaxWidthLiterals guard.

  2957. I18n discovery list toggle and universe zoom controls · b022542

    - ListViewToggle: wire aria-labels and tooltips to discovery.page.* keys; mark client - UniverseViewControls: discovery.universe.controls.* + canonical keys file + static-data test - Add discoveryPageMessageKeys flat list for Discovery page chrome

  2958. Expose actionLabelKey from useConnectionValidation · 96f4d73

    Consumers can use t(actionLabelKey) with connections.stageAction.*; actionLabel kept as legacy English. Docstring example updated.

  2959. I18n for connection-stage CTAs on discovery list cards · 91a8b79

    Add connections.stageAction.* keys and getConnectionActionLabelKey() mirroring getConnectionActionLabel; DiscoveryListProfileCard uses t(key). Parity test ties English bundle strings to legacy helper.

  2960. Tighten discovery list layout, contrast, and i18n · dc37ea6

    - Filters: responsive grid (min/max/stage/sort), compact inputs and padding - List: localized results header and empty states; denser list shell - Cards: emerald match badge for readability; anonymous peers show Member + stage badges via keys - Stage badges: labelKey + t() (list, universe sidebar, hover tooltip) - Universe: Scene coords button copy moved to messages (scanner) - discoveryCardDisplay: name-or-null + match percent value for i18n formatting

  2961. ProfileEditForm uses explicit locale/gender without silent defaults · 0ac6b5e

    Align the profile page edit form with ProfileInformationSection and useProfileSettings: null preferredLocale/gender show placeholder options; save is blocked with the same i18n toast until both are set. Removes hidden defaults to en/prefer_not_to_say.

  2962. Link verify-stack to web-client npm run test:atomic:offline gate · 5bdff64

    Clarify that Fleet verify-stack exercises live tenant E2E while Vitest offline suite runs on the workstation; both are used for dev-tenant quality bars.

  2963. Explicit locale/gender in settings without silent API defaults · ce9d233

    - useProfileSettings: prefer preferredLocale/gender from GET snapshot; null until loaded; no ?? en / ?? prefer_not_to_say on load. - ProfileInformationSection: placeholder selects when null; save disabled + toast if save attempted without both set. - i18n: profile.settings.errors.identityRequired + placeholder keys (en/de/fr/es/ar). - KB: profile-ui-data-lifecycle settings identity note. Tests: npm run test:atomic:offline (486). verify-stack ifeoma-dev dev: all passed.

  2964. Avoid double locale segment with next-intl router · ec60683

    useRouter from @/navigation already prefixes locale; withLocale() + replace() produced /en/en/onboarding and similar. Use locale-less ROUTES.* and router.replace(path, { locale }) when switching locale. - Pages layout + onboarding submit + LocaleFromProfileRedirect - Document withLocale vs intl router in appPaths and profile-ui KB

  2965. Landing readiness uses hero CTA (Begin Your Journey) · 8e7a456

    Fleet verify-stack failed: live /en/landing HTML did not include 'Welcome to' while the primary CTA 'Begin Your Journey' (landing.hero.ctaBeginJourney) was present. - Export LANDING_HERO_READY_REGEX from e2e_health_stack; use in fetchPublicLandingWhenReady, app-health-stack, app-http-routing, app_shell_navigation. - Document triage in dev-tenant-fleet-diagnostics.md. Verified: npm run test:atomic:offline (486), verify-stack ifeoma-dev dev (all steps pass).

  2966. Profile settings shell and user profile menu copy · 7d98df5

    Wire ProfileSettings and UserProfileMenu through useTranslate with profile.settings.shell.*, shared profile_save/profile_cancel/editForm.saving, and profile.userProfileMenu.* for modal headings. Extend PROFILE_UI_MESSAGE_KEYS_FLAT and profile-ui-data-lifecycle KB. Negate root lib/ ignore for web-client src/lib.

  2967. ProfileInformationSection uses messages; KB dev tenant vs onboarding · 7f6bf99

    - ProfileInformationSection: t() for section title + reuse profile.editForm copy for name/email (localizedUiTextScanner + parity). - messages: profile.settings.information.sectionTitle (en/de/fr/es/ar). - profileUiMessageKeys: register sectionTitle. - dev-tenant-fleet-diagnostics: clarify product onboarding vs Fleet probes. Evidence: tenant-live-health --suite full-stack exit 0 (ifeoma-dev); npm run test: atomic:offline 486/486 pass.

  2968. I18n loading strings, debug logs for onboarding/locale · 29626db

    - .gitignore: allow web-client messages/*.json (locale bundles). - Add app.loading to all locales; appShellMessageKeys; PagesLayout uses t(). - PagesLayout + LocaleFromProfileRedirect: useDebugLog (api category) for redirect telemetry; respects Admin Debug + DebugProvider. - KB: profile-ui-data-lifecycle §1.1 onboarding; index + AGENT-BEHAVIOUR row; lib/debug README table entry. - Force-add src/lib paths that were ignored by blanket lib/ rule.

  2969. Add universe_test.html scene test harness · f5dbdd4

    - WebGL universe demo with UniverseParamsApi, panel/export parity guard, meteor shader tuning (glow scale, staggered random trajectories), and default param snapshot + U.defaults sync.

  2970. Pipeline and app: fleet orchestration, contracts, infra, tenant, and backend updates · 4ece257

    - Refine app-fleet CLI, health probes, verify stack, merge-env redeploy, and related tests - Update OpenAPI/contracts codegen (remove legacy zodios client artifacts), compose and deployment - app-hosting, app-infra, and tenant seeding/validation changes - Backend: chat, connections, matching, discovery, and service-layer updates - Cursor rules and docs aligned with current behaviour

  2971. Error payloads, journey hub, matching admin, and agent docs · fc49782

    - Backend: consistent internal error responses, auth/RBAC and route handlers across API surfaces; lazy Mongo collection access in admin/question services; match recalculation and synthetic profile contract alignment. - Web: You/journey hub and navigation; AuthSessionLoading; error diagnostics tests; admin debug and loading/error primitives; discovery and journey updates; remove legacy breadcrumb components. - Contracts: OpenAPI and generated types/clients for admin and journey flows. - Docs: AGENT_BEHAVIOUR (globa…

  2972. Fleet tenant edge probes, stack verify alias, and profile/matching UX · 2b4b884

    Fleet (app-fleet): - Add verify-tenant-stack (alias verify-dev-tenant-stack), tenant-targets/target-show, tenant-edge-evidence, and shared run_public_edge_probe + public_edge_http - tenant_targets_summary on FleetManager; multi-service docker compose logs; optional PHASE0_PYTEST for non-dev profiles; tests and README updates app-hosting: compose logs accept multiple service tokens from space-separated service Contracts + app: OpenAPI/profile journey fields, generated types, backend profile route and tests; journey…

  2973. Connection statements API, journey UI, fleet PAT/sync and OpenAPI refresh · cdf76af

    - Backend: connection statement routes and service; tests and helpers - Web client: journey hub/how-it-works, connection statement picks, generated API - Fleet: PAT sync after infra, verify-dev-stack CLI, tenant/tests and hosting tweaks - Contracts: OpenAPI and regenerated TS/Zod clients; build/deploy/infra touch-ups - Remove verify_dev_tenant_stack.sh; default questions and docs updates

  2974. Fleet diagnostics, contracts sync, remove app-monitor and shell shims · ce912c2

    - Remove app-monitor tree; drop application/tools operator wrappers in favor of Fleet CLI - Add operator upstream/compose/mongo helpers, tenant-live-health probes, schema E2E wiring - Regenerate OpenAPI-derived schemas and web/backend generated clients - Backend: vitest runner shim, tsx watch exclude generated zod, admin route touch-ups - Web client: admin API, journey/YouScreen and E2E navigation helpers, seed bank test alignment - Update cursor rules, pipeline docs, and todos.md rolling evidence

  2975. Match diagnostics, synthetic profiles, fleet CLI, and contract sync · 088ba99

    - Backend: admin match diagnostics, synthetic profile lifecycle, match version, journey/profile route tests; OpenAPI-aligned admin routes - Web client: admin match management UI, discovery hints, journey constants, synthetic generator, generated API models - Pipeline: app-contracts/OpenAPI and zod generation; fleet infra reachability, execution context warnings, zitadel provision tests; tenant env updates - Docs/rules: layer trace rule, agent behaviour updates, discovery docs - Tests: atomic/e2e helpers and new co…

  2976. Point docs/tools at archived plans; infra and test README tweaks · 5032880

    - Update references from .cursor/plans/ to .cursor/plans/done/ for the matching/privacy index and API 502 runbook (rules, KB-adjacent docs, pipeline todos, tools shell headers). - Web tests README: move Playwright npm rows into the command table; clarify E2E_ADMIN_DESTRUCTIVE / admin panel scope. - Traefik: DEBUG log level; adjust forwarded-headers trust CIDR. - Zitadel sample config: ExternalDomain set to trueconnection.local for local stack alignment.

  2977. Discovery privacy tiers, connections, and contract sync · 4ea75ee

    Backend: tiered discovery (mapper + DiscoveryQueryService refactor), match recalculation scheduler after profile writes, connection transitions with ConnectionTransitionError, chat-gate route tests, discovery fixtures and expanded service/route tests. Web: discovery card/peer-routing helpers, tier-aware filters, legacy ListView safe match%, connection detail and chat flow updates, E2E nav helper, Playwright trace script. Contracts/OpenAPI: admin question models and connection stage fields; regenerated app-contract…

  2978. Discovery matches, admin API split, platform admin fleet, auth hardening · 0f7d647

    Discovery and matching: - Bulk match pipeline uses counterpart profileId UUID; enrichment via MatchCalculationService - Flat match docs and indexes documented; DiscoveryQueryService and filter UX fixes - Profile generator quadrant slugs; migration and empty-state copy for list/universe Backend admin: - Split admin routes (profiles/questions); QuestionService and bulk profile normalization - OpenAPI and generated clients updated; path allowlist adjusted Web admin and auth: - Admin panel layout; remove DataManagemen…

  2979. Admin locale routes, auth/error fixes, E2E context parity · 0a279e9

    - Localized admin under [locale]/admin; AdminPanel aligns with app shell and ?section= URLs; ThemeTab and RBAC-aligned RequireAdmin/admin routes. - Next.js 16 auth/error server page + AuthErrorPageClient; intl-safe navigation and ErrorPage/SignIn wiring. - Landing/AppProviders pointer-events and scroll; robots/proxy updates; compose and tenant env tweaks. - Backend admin route refactor + requirePlatformAdmin middleware; ProfileService adjustments and tests. - Playwright: fresh BrowserContext uses same baseURL/igno…

  2980. Brevo integration and login working · 9f41c42

    - Wire Brevo transactional mail: probes, E2E helpers, sender/from alignment, SMTP docs and BREVO_IMPLEMENTATION.md - Web client: LoginForm, auth E2E routes (mail-delivery-trace, mongo-ping), Playwright projects (ui vs integration) - Vitest layout: atomic tests under ui, integration, infra; new Brevo/mail atomic coverage - Pipeline: constants_env, pytest autouse Brevo probe hooks, fleet registration preserve-stack and misc CLI - start_app: remove orphan fixed-name backend/web-client containers before compose up - T…

  2981. Locale auth routing, contracts, edge TLS, and design reference · 69775ab

    - Move app pages and auth under [locale]; add i18n routing, Tolgee proxy, LocalePreferenceSync, connection profile resolution, and proxy matcher - Backend: auth/profile/users routes, ProfileService, TranslationService, AuthService; OpenAPI and generated client types - Pipeline: edge TLS behavior, env serialization, Harbor labels, Zitadel OIDC, tenant env, deployment compose; fleet/infra tests and docs - Add FigmaDesign-TrueConnection reference tree and cursor rules for profile identity and Figma UX alignment - Web…

  2982. Sign-in registration flow, preserve-stack --debug; Hero CTA; todos · a3f4891

    - Playwright: open /auth/sign-in with journey redirect; ensureAuthSignInEmailCaptureVisible navigates to sign-in when the email field is missing (landing uses Begin Your Journey). - Recorded create-user spec aligned; nextauth_email_signin_http comment updated. - run_e2e_registration_preserve_stack.py: --debug for headed Playwright Inspector; no subprocess timeout in debug mode. - Hero: single primary CTA; remove extra grid (Google sign-in, store modals) from hero section. - todos.md: registration HTML mail templat…

  2983. Sync workspace — admin auth route, env serialization, fleet/deploy, docs · c9c9d02

    - Web: move session admin check to GET /api/auth/admin/check (Traefik tc-auth + Next proxy) - Pipeline: merged .env dotenv quoting (Traefik Host() backticks, spaced JVM opts); parse_env_file symmetry - Tools: verify-api-upstream-health, check-traefik-infra-sanity; todos.md API502 + dev hardening evidence - App-fleet: deploy/orchestration layout refactor; CLI and docs updates - Contracts: OpenAPI/schema generation and workflow - Misc: cursor rules, plans, application docs

  2984. App-pipeline: fleet CLI under src/cli, manager API layout, plans and docs sync · 2cbf471

    - Relocate fleet CLI command modules from app-fleet/cli_commands to app-fleet/src/cli; cli.py imports src.cli.*; update unit tests and path helpers - Consolidate FleetPublicInterface, contract_loader, infra ops under app-fleet/src/manager; adjust fleet package imports and re-exports - Move completed Cursor plans to .cursor/plans/done; remove duplicate plan copies - Update MODULE_BOUNDARIES, runners/runbooks, compliance paths, and related references - Include accompanying changes across app-deployment, app-fleet, a…

  2985. App-pipeline: finalize stage stack rebuild hardening and registry tunnel refactor · 337a35f

    This commit consolidates the stage stack verification and ACME production-certificate workflow updates while introducing the registry push tunnel and remote execution package refactor to stabilize end-to-end deployment operations.

  2986. App-pipeline: harden stage TLS and registration verification loop · 0d411c3

    Consolidate stage ACME and preserve-stack workflow fixes across fleet orchestration, Traefik/Harbor compose labels, runner behavior, and supporting tests/docs so stage reachability and registration E2E can be validated deterministically under rate-limit and trust edge cases.

  2987. Materialize remote self-signed Traefik TLS artifacts · 45c89b0

    Ensure remote app-infra sync creates self-signed cert/key files and tls.yml for Traefik when ACME is disabled, so stage preserve-stack registration does not fail on Traefik default certificates.

  2988. App-pipeline: finalize fleet orchestration and stage verification hardening · af87979

    Align FleetManager lifecycle handling, stage stack verification gates, and supporting docs/tests so tenant-state-driven operations remain deterministic across VM, infra, and TLS/Harbor workflows.

  2989. App-pipeline: fleet, deployment, contracts, rules, and test layout updates · 7d1b16f

    - Fleet manager, UI actions, CLI, provisioning, and infra orchestration - Deployment (start_app, Zitadel, remote helpers, compose) - app-contracts schema tools and generated artifacts - Cursor rules and plan archive; remove tracked .env.deploy - Test package layout and pytest config adjustments across modules

  2990. Consolidate fleet UI architecture migration and multi-target pipeline updates · 1ffecca

    Unifies fleet UI into the new package structure and aligns deployment, infra, tenant, and test workflows with the latest multi-target and contract-driven execution model across app-pipeline.

  2991. Add app monitor module and web client task list · b689b80

    Track the new app-monitor files and TODO documentation so the latest local project updates are versioned and shareable.

  2992. Remove debug instrumentation from compact bar and fix plan formatting · 0a80fb7

  2993. Resolve hosting provisioning test failures — dict-to-dataclass migration · d59ce08

    Fix 8 failing tests and sweep 11 files for dict-vs-dataclass consistency across the app-hosting test suite (+10 passing tests, 1828 total). Root causes addressed: - Mock method mismatch: rollback tests set execute_command but production calls execute_sudo (test_02_security, test_04_email) - Patch on wrong module: wait_for_harbor_api patched on manager module instead of _harbor_api where it is actually called (test_harbor) - Missing I/O mocks: wait_for_ssh_port, connect_with_key/password made real connections causi…

  2994. Remove stale generated schema and client files · ed1dcea

  2995. Include remaining schema update and test report log · 731cbdb

  2996. Multi-target infrastructure, mesh networking, harbor registry, and comprehensive test coverage · c30ddc2

    - Add multi-target infra orchestration with execution plans and deploy hooks - Implement VPN mesh networking with WireGuard key manager and IPAM - Add Harbor proxy-cache registry service replacing simple registry compose - Extend fleet UI with mesh/harbor commands, service assignment actions - Add infra service registry and typed contracts (common/contracts) - Refactor env seeder with mode helpers; extend tenant state for services - Update provisioning contracts, storage operations, and cloud-init verification - A…

  2997. Major pipeline overhaul — orchestrators, domains, fleet manager, and multi-target architecture · fb70c8a

    Comprehensive refactoring across the app-pipeline and app-source modules: - Refactored orchestrators (analytics, backend, compliance, deployment, development, devops, flow_analysis, quality, testing, web) with typed interfaces and dataclasses - Removed deprecated infrastructure orchestrator and flow analysis renderers - Updated domain modules (code_analysis, flow_analysis, security, statistics, testing) with consolidated operations and improved type safety - Enhanced fleet manager with multi-target deployment, dep…

  2998. Track app-source cursor config · 6c2a065

  2999. Migrate workflows to python APIs · 1ee0b86

    Replace legacy shell workflows with Python runners using package APIs, update fleet/infra tooling, and refresh related docs and tests.

  3000. Ignore qcow2 images · b867355

    Remove large qcow2 artifacts from tracking and prevent future commits.

  3001. Update workflows and test automation · 30fab1d

    Consolidate infra/test workflow updates, add new automation and clean up generated artifacts.

  3002. Merge pull: resolve conflicts after upstream refactor (vm_api → host_api) · f1be4fc

    - README: keep upstream HostManagementInterface/Path.cwd() example, drop duplicate config/connection section - Accept upstream deletions: TEST_PLAN_TASKS.md, vm_api/ARCHITECTURE.md, vm_api/management.py - Keep local changes: PROJECT_TRUECONNECTION.MDC, requirements.txt, test_golden_image_workflow.py

  3003. Add Docker installation with repository setup and automatic user group assignment · 1bb0e77

    - Add setup_docker_repository atomic function for Docker official repository setup - Add install_docker atomic function with automatic repository setup - Enhance install_packages to detect and handle 'docker' package specially - Add Debian support (detects OS and uses correct repository URL) - Automatically start and enable Docker service after installation - Automatically add user to docker group for non-sudo Docker usage - Add Docker version verification after installation - Export new functions from host_api/os…

  3004. Restructure VM API architecture and add comprehensive test suite · dae7227

    - Refactored interface/ directory to vm_api/operations/ for better organization - Added comprehensive test infrastructure (pytest.ini, tests/ with e2e, unit, integration) - Added requirements.txt for Python dependencies - Removed legacy tools and scripts (moved functionality to vm_api/) - Updated README.md with new architecture - Added TEST_PLAN_TASKS.md for test planning - Added vm_api.py as main entry point - Restructured vm_api/ with proper separation of concerns (operations/, state/, utils/, config/) - Removed…

  3005. Initial commit: TrueConnection application with deployment, hosting, and source modules · 37f51a4

← Back to the landing page