feat: complete verifiable birth-time rectification flow

This commit is contained in:
Jesse_Chen
2026-07-21 22:16:18 +08:00
parent eb8ed8bee4
commit bfc6870614
117 changed files with 6215 additions and 1038 deletions
+10
View File
@@ -122,8 +122,18 @@ The replayable public-case manifest currently contains 10 events: 5 career and 5
Prevention: add a new domain only after its public cases satisfy the same source/replay contract; never substitute loosely sourced celebrity notes or absence of a match for a negative conclusion.
## ERR-083 | Duplicate Supabase migration versions skipped required schema | resolved 2026-07-19
Four migration pairs reused the same timestamp prefix, while Supabase records that prefix as the migration identity. The remote ledger therefore recorded only one file from each pair: `chart_profiles`, `synastry_reports`, and part of the profile recovery contract were absent even though their SQL files existed locally. Dynamic birth-time migrations were also still pending after the application branch was merged.
Prevention: `tests/test_supabase_migration_versions.py` requires every migration prefix to be unique. Preserve already-recorded versions, move skipped SQL into later uniquely numbered repair migrations, run `supabase db push --linked --dry-run`, and verify the remote migration ledger plus live schema before deploying dependent application code.
## Fragment Sweep Command Set
## ERR-086 | Steve Jobs jyotishganit artifacts used non-San-Francisco coordinates | mitigated 2026-07-21
The jyotishganit Shadbala and field-comparison artifacts labelled the public case as San Francisco while using `37.3382, -122.0383`, unlike the canonical parity runner input `37.7749, -122.4194`. The affected artifacts are invalidated and production tuning remains blocked. Probe defaults now use the canonical coordinates; regeneration is still blocked in the active project virtualenv because `skyfield` is unavailable.
Prevention: hash only normalized calculation-bearing input, require the location label and canonical coordinates to share one input contract, and reject an oracle artifact when its canonical input hash differs from the comparison packet.
## ERR-084 | Pre-work fragment test assumes zero candidates despite current audited candidates | active 2026-07-19
`scripts/pre_work_check.py` reported `fragment_audit.candidate_count=2` on 2026-07-19 and reports `3` in the 2026-07-20 run, while `tests/test_preflight_fragment_scan.py` requires exactly zero. The pre-work command therefore cannot be reported green until the candidates are classified or the test is updated to validate the reviewed state rather than a hard-coded count.
@@ -19,6 +19,33 @@ the tested deployment SHA.
| ISSUE-BT-004 | Choosing `都不符合` surfaced the same raw English pattern error. | verified-local | The actual orchestrator treats `都不符合` as a normal direction change; Task 12 E2E advances the durable turn and preserves the single fee; client maps terminal 502/non-JSON failures to stable Chinese copy. | Authenticated production `都不符合` action followed by reload/resume, tied to the deployed SHA. |
| ISSUE-BT-005 | Initialization used generic broad-year choices and lost the rich card/chat rectification analysis. | verified-local | Task 9 onboarding soft gate; v3 narrative grounding rejects broad-year questionnaires; Task 12 asserts candidate boundary, D1/D9/D10 layers, three domain rationales, free text, and year/month event request; PG14 proves future background persists without scoring and the legacy suite imports old unfinished work once with `migration_waived`. | Authenticated synthetic first-turn snapshot and one legacy import smoke tied to the deployed SHA. |
## Initial production diagnosis (preserved)
The original issue record captured these causes before implementation:
- Chat deletion lacked both an authenticated `DELETE` grant and an owner-only
RLS policy.
- `startNewChat()` created only a chat session; the birth profile and
rectification case were account-scoped, so a new chat could not start an
explicit re-rectification while preserving the active chart.
- `dynamic-choice-v2` emitted `request_candidate_confirmation`, but the client
sent the legacy `confirm_guided_candidate` mutation, which rejected dynamic
cases and left them in `confirming` without applying the candidate.
- The reported `都不符合` failure coincided with a deployment replacement in
which Caddy returned HTTP 502 while Docker could not resolve the temporarily
unavailable `web` service.
- WebKit can represent a non-JSON parse failure as a `DOMException` named
`SyntaxError`; the old transport recognized JavaScript `SyntaxError` only and
could expose `The string did not match the expected pattern.` instead of
stable Chinese product copy.
The original closure checklist required owner-only deletion, explicit
account-level re-rectification, atomic idempotent candidate confirmation,
deployment availability or bounded retry behavior, stable localized WebKit
errors, and authenticated end-to-end coverage for `都不符合`, confirmation,
re-rectification, and deletion. The table above maps each requirement to the
implemented local evidence and the remaining production proof.
## Release decision
All five issues remain `verified-local` until the production closure artifacts