Skip to content

Venue pipeline integration review — 2026-09-07

Status: Active · Branch: integrate/venue-pipeline-20260907 (main 427024f7 + codex/venue-pipeline-20260906 at 2394990f, 13 commits, 923 files)

Claude's independent integration of the Codex venue worktree, per the closeout handoff (venue-closure-2026-09-07.md). Nothing here is merged to main yet, and no hosted migration, Edge deploy or OTA was performed.

Merge and conflict resolution

Seven conflicts, exactly the set Codex's merge preview named.

FileResolution
venue-finder-browse-list.tsxUnion — Codex's viewport callback (onVisibleVenueIdsChange) + main's SCROLL_CONTENT.list inset
venue-search-results-list.tsxCodex's rewrite (curated groups + certification proof) + main's SCROLL_CONTENT import; the inset use had auto-merged
directory-venue-detail-screen.tsxMain's hero-canon structure kept; Codex's ownership action, courts onEdit, handleReport, VenueContributionLinks re-applied; the retired correction modal / report sheet imports dropped as Codex intended
docs/README.md, current-project-state.mdRegenerated after the merge
docs/history/rebuild-log.mdUnion, both histories retained (Claude's entries first)
docs/workflows/multi-agent-operating-model.mdCodex's version of the coordination notice

Two follow-up fixes the merge itself required:

  • venue-contribution-links.tsx used HairlineList, which main retired under the divider law (e2774b95); ported to RowList (ListRow peers are spacing-only).
  • create-club-screen.tsx crossed the 600-line size gate (608) with Codex's venue-viewport hook; four comment blocks compressed, now 596.
  • Six Codex files carried middle-dot joins (@twomore/no-middle-dot-join, owner ruling 2026-09-06): enumerations became comma lists (테니스장, 연습장), joined distinct facts became label: value or comma-separated accessibility labels — 18 sites in i18n/{ko,en}/venue-contributions.ts, contribution-changes.tsx, contribution-row.tsx, fact-confirmation-picker.tsx, claim-history.tsx.
  • Six of Codex's script tests rendered main's real components against a @twomore/ui stub that predates main's layout constants: the stubs now carry SCROLL_CONTENT, CONTENT_INSET and SEAM, and the detail-screen fixture carries the trust summary main's screen reads (showSources = state.trust.total > 0). Likewise venue-search-takeover.test.tsx's Jest mock gained HAIRLINE/SEAM/SCROLL_CONTENT. Test intent unchanged.

Verification on the merged tree

  • yarn typecheck: green.
  • yarn check (docs, cycles, sizes, migration lint, typecheck, every Jest workspace, 786 script cases, 205 queue cases) and yarn lint:strict: green after the fixes above.
  • pgTAP (supabase db reset + supabase test db, local stack, migrations 00001–00631): fails, and the same failures reproduce from Codex's own worktree, so they pre-date the merge:
FileFailuresCause
venue_refresh_ledger.test.sql5 / 37Counts whole-table rows (prepare creates one protected job per venue expects 4, gets 7); migration 00382_owner_venue_corrections.sql inserts three real venues (스포타임 · 코오롱스포렉스 · 대치유수지) with six observations, so any count not scoped to the test's own IDs is off by those
venue_refresh_apply.test.sql1 / 48Same — expects 0 observations before application, finds the six from 00382
venue_maintenance_raw.test.sql1 / 41Same
venue_refresh_outcomes.test.sqlabortsINSERT … SELECT 'old_source', to_jsonb(o) FROM venue_source_observations assumes exactly one observation exists; six rows violate the temp table's primary key
venue_owner_claim_integration.test.sqlabortsprivate.venue_owner_history_guard() raises invalid owner history redaction time during anonymize_withdrawn_profiles() — a guard/redaction ordering fault, not fixture pollution
venue_owner_claim_authenticated_finish.test.sql, venue_owner_claim_ledger.test.sql2 / 23, 3 / 39 in the worktree run onlyOrder- or time-dependent; not yet diagnosed

Seeding is not the variable: the failures are identical with --no-seed. CI's pgTAP job (supabase db start then supabase test db) applies the same migrations, so these would fail there too. Codex's handoff cites yarn check receipts but no supabase test db receipt; the pgTAP claims in the earlier audit docs were not reproducible on this machine.

pgTAP closed (same day)

All seven files fixed in supabase/tests/ only; no migration changed. Full suite: Result: PASS, 116 files, 2,934 tests.

  • The four count-based venue tests now delete the three 00382/00383 curated venues (by import_hash) inside their own transaction, and venue_refresh_outcomes scopes its observation snapshot to its own venue.
  • The owner-claim integration abort did not reproduce once the fixture pollution was gone; the redaction stamp is a fresh clock_timestamp() per call and OLD.redacted_at IS NULL short-circuits the guard, so no guard defect.
  • venue_owner_claim_authenticated_finish, venue_owner_claim_ledger and venue_contribution_ledger failed deterministically on PostgreSQL 17.6, which attaches an English HINT to plain grant-denial errors; the test helpers had relied on "no hint" to separate those from the codebase's domain errors (SQLSTATE 42501 + snake_case hint). The helpers now trust only hints matching the identifier convention. This is the likely reason Codex's environment reported green: an older Postgres carries no such hint.

Merged and released (same day, owner: "let's do what we can to merge")

  • Merged to main at 67314279; pgTAP fixes and the 00601 deferral followed at fae9f6bf and 146fe66d.
  • Migrations: the hosted ledger stopped at 00598. supabase db push applied 00599 and 00600, then 00601 failed closed at its whole-cohort preflight: 서운체육공원테니스장 (fa3c4d7d), one of the two KSPO duplicates the migration merges, had gained a kakao witness (17558027), a telephone and source_count 2 on 2026-09-05 18:15 UTC — after Codex's snapshot. Verified row by row through the data API (six of seven rows still match byte for byte). Per the closeout's own release rule the seven-row repair is deferred: 00601 now installs the recovery table and function but no longer executes the cohort; a later migration binds a fresh, re-reviewed cohort to the current baseline. The second push applied 00601–00631. Ledger and local chain agree at 00631.
  • Edge functions: corroborate-venues, enrich-venues, ingest-venues, search-venues, venue-maintenance (verify_jwt false per config), export-user-data deployed to llhvhhpbjnnrfwcczizc.
  • OTA: preview channel published from 146fe66d; both release guards passed (clean tree, no native-sensitive change since the 6d5c3f05 baseline).
  • Still to prove on the released environment (handoff §Release boundary): submission, review and restart; court identity retention; closure and reopening; owner certification and revocation; the operator prepare-capture-apply-retry path; and the account-queue upgrade behavior (one-time cold-start cache clear). Browser, device, real authentication and live provider results remain distinct from the local fixtures.

Markdown remains the source of truth. Run yarn docs:check before handoff.