Published copy. Evidence links point at the repository on branch insights/eval-and-invariants.
2026-09-07
Result: the landable branch insights/eval-and-invariants is pushed and its pull request is open. Nothing is merged or deployed. The regression gate did not pass its strict criteria. The control arm shows that the failed criteria are below the provider noise floor. No change was moved to the meaning layer by this gate. The meaning-layer changes are parked on insights/meaning-layer-parked.
origin/main.pd_is_ct_employee now has 2 true rows. Control 39 changes the staff-exclusion answer from 64 to 62. The 39-control self-check passes on the corrected fixture and fails only control 39 on the frozen one.src/. Node 244/244 on the goal-3 set. Chromium 56 passed (1.9m) and 15 passed (13.2s).Local main is 6ce7648a. origin/main is a922627d. origin/main already contains the goal-1 fix package e479e81 and one desk fix. The landable branch is built from origin/main, so the pull request shows only the post-goal-1 delta. The classification table still covers the full main..V18 range in two segments.
The full table is in classification.md. It lists every path, its group, a one-line reason, and the first commit that introduced it. Mixed files list which hunks went where.
| Segment | eval-system | invariant-fix | meaning-layer |
|---|---|---|---|
post-goal-1 (e479e81..b1b369ed), non-evidence paths | 90 | 162 | 73 |
| post-goal-1 evidence trees | 1841 | 0 | 0 |
goal-1 (main..e479e81, already landed) | 93 | 76 | 0 |
Uncertain items and the rule applied to each are in the classification document. The main rule: a change that alters the SQL text that reaches the database, or the prompt that produces it, is meaning-layer even when it is deterministic.
| Group-2 change | Dependency | Decision |
|---|---|---|
N01 definition compile (DefinitionApplicationError) | live discovery-backed schema context (V11) | Moved to group 3. With the base schema context every definition column reads as missing, so N01 would refuse every question that matches a definition. |
| R08 typed calendar guard | physical column types from the same schema context | Kept in group 2 in its declared legacy mode. Runtime callers pass no types. The approved-SQL calendar check runs only when types are known, which never happens on this branch. |
| F01 customization and cached-lookup proofs; R02 merge join-key proof | sql_proves_member_key in deictic_key_carry.py | Inlined. The helper is a pure SQL lineage proof. Every carry-semantics change in the same module is parked. |
| R04 exact merge replay | group-3 source-binding fields on the replay request | Kept the request-option plumbing (execution_request). Dropped the group-3 fields. |
| R07 display-label deferral | none | Kept whole. |
_promote_ct_result_to_answer (R01 fallback) | requested result shape check | Kept the R01 gold-leg discard proof. Dropped the shape check and the promotion helper. |
| Saved-dimension merge replay | post_aggregation metadata shared with parked scalar aggregates | Kept only the dimension rollup; a replay refuses unknown reduction kinds. |
Built from origin/main. The V18 tree was overlaid, then every meaning-layer module, hunk and test was removed. Six mixed source files were rebuilt hunk by hunk. Sixty test files are parked whole. Twenty-one mixed test files had their group-3 tests removed, or were restored to their base version when the V18 version only added group-3 expectations.
One overlay error was found and fixed before the gate: the overlay had reverted the four files of the later desk commit a922627d. They are restored to their origin/main bytes.
| Check | Result | Notes |
|---|---|---|
| Full Python suite (8 workers, loadfile) | 28598 passed, 21 failed, 50 skipped | Every failed node is one of the 21 pre-existing failures in the goal-3 disposition. New failures: 0. The count is lower than goal 3's 29,927 because 60 group-3 test files are parked. |
| Curated critical invariant checks (568 in goal 3) | 471 passed, 0 failed, 97 parked | The absent nodes are group-3 tests: membership, CT measure basis, N01 definitions, secret-intent refusal, chain recovery. |
| Narrative replay (12) | 12/12 passed | |
| Migration recovery (9) | 9/9 passed | R09 |
| Three- and five-turn chain controls (57) | parked | N08 blocked-parent recovery is meaning-layer. |
| Definition obligation controls (8) | parked | N01 moved with its schema-context dependency. |
Ruff on src/ | passed | |
Strict mypy on src/ | passed | |
Build (npm run build:css) | passed, stylesheet unchanged | The rebuilt stylesheet is byte-identical to the committed one. |
| Node, goal-3 set (9 files) | 244/244 | Same command as goal 3. |
Node, all tests/js | 1903/1914 (11 failed; the same 11 fail on origin/main a922627d) | The failures are identical on origin/main (reports desk, compose deck header, save report). Not introduced here. |
Chromium, playwright.insights-fixes.config.js | 56 passed (1.9m) | Mocked API, real JS. |
| Chromium, terminal outcomes (two specs) | 15 passed (13.2s) | Goal 3 had 21. The six parked cases exercised the clarification-answer detector, which is meaning-layer. |
Goal 3 found that pd_is_ct_employee had zero true rows, so the ratified staff-exclusion predicate removed nothing. The fix sets two synthetic Pipedrive people (ids 31013 and 31047) to true. No other value changes.
| Item | Value |
|---|---|
| Fixture data diff | 2 changed INSERT rows (docs/evidence/insights-goal-a-2026-09-07/fixture/fixture-data.diff) |
| Changed cells | pipedrive.persons_enriched.pd_is_ct_employee: false to true for ids 31013 and 31047 |
| Control 39 | SELECT count(*) FROM pipedrive.persons_enriched WHERE pd_is_ct_employee IS NOT TRUE = 62; without the predicate = 64 |
Self-check on the corrected fixture (insights_goal3_fixture_c39) | passed: 39 predicate controls all change an answer, 383 authorized column probes, 0 schema errors, secret read denied: True |
| Self-check on the frozen goal-3 fixture | failed: only pd_staff_exclusion is insensitive |
| Holdout expected answers that change under the corrected fixture | 5 of 250, all in one family (known_external_person_qualification) |
The corrected fixture is installed beside the frozen one, not over it. The frozen E5 seal binds the fixture generator and check scripts by absolute path and byte hash. The gate therefore ran against the frozen fixture with the sealed method bytes. The corrected fixture needs a new seal and a new baseline before it can anchor any paired claim.
Method: the frozen goal-3 E5 method. Same sealed corpus (250 attempts, 100 supported first turns, 50 conversations), same scorer and statistics, same fixture database, same clock anchor (2026-09-06 12:00 UTC, Europe/London calendar), provider glm-5.2 at temperature 0, seed 42, thinking off, two workers. The application snapshot is 7ba3a106 (source manifest a85de01c40aff655). The comparison arm is the retained original E5 run of e479e81. This is a regression gate, not an improvement claim.
Three candidate runs exist. Run 1 aborted after 25 attempts on provider timeouts caused by the R07 child transport, which was then parked (see below). Run 2 is the first complete run. Run 3 is the one permitted full rerun. Runs 2 and 3 use the same application bytes; no code changed between them.
| Criterion | Threshold | Run 2 | Run 3 |
|---|---|---|---|
| Retained original correct completions | 36 of 36, or each loss named | 26 of 36 (FAIL, losses named) | 24 of 36 (FAIL, losses named) |
| Precision | not below 36/67 (53.7%) | 37/69 (53.6%) FAIL | 33/71 (46.5%) FAIL |
| Correct-to-wrong transitions | 0 | 5 FAIL | 4 FAIL |
| Correct-to-error transitions | 0 | 3 FAIL | 5 FAIL |
| Jobs at deadline | at most 1% | 0/250 pass | 0/250 pass |
| Outcome | Original | Run 2 | Run 3 |
|---|---|---|---|
| comparison_unverified | 18 | 12 | 10 |
| correct_completed | 36 | 37 | 33 |
| refusal_unverified | 4 | 17 | 16 |
| silent_wrong | 31 | 32 | 38 |
| task_error | 161 | 152 | 153 |
First-turn execution errors: 60/100 original, 54/100 run 2, 58/100 run 3. Correct first turns: 14/100 original, 16/100 run 2, 14/100 run 3. Generated SQL byte-identical to the original run: 153/250 in run 2, 152/250 in run 3.
| Case | Outcome | Error class | Guard |
|---|---|---|---|
independent11:negative_realized_commission:t4 | silent_wrong | ||
independent11:known_zero_booked_commission:t4 | silent_wrong | ||
independent11:partner_paid_and_unpaid_statements:t2 | silent_wrong | ||
independent11:partner_paid_and_unpaid_statements:t4 | silent_wrong | ||
independent11:verified_private_rejected_registration:t4 | silent_wrong | ||
independent11:activity_deadline_before_creation:t1 | task_error | ||
independent11:activity_deadline_before_creation:t3 | task_error | ||
independent11:organization_wallet_share_unknown:t1 | refusal_unverified | UNKNOWN-GOLD-COLUMN | |
independent11:organization_wallet_share_unknown:t3 | refusal_unverified | UNKNOWN-GOLD-COLUMN | |
independent11:deal_stage_timestamp_order:t1 | task_error |
| Case | Outcome | Error class | Guard |
|---|---|---|---|
independent11:negative_realized_commission:first-count | comparison_unverified | ||
independent11:negative_realized_commission:t2 | comparison_unverified | ||
independent11:known_zero_booked_commission:t2 | task_error | ||
independent11:known_zero_booked_commission:t4 | silent_wrong | ||
independent11:partner_paid_and_unpaid_statements:t2 | silent_wrong | ||
independent11:partner_paid_and_unpaid_statements:t4 | silent_wrong | ||
independent11:verified_private_rejected_registration:t4 | silent_wrong | ||
independent11:organization_wallet_share_unknown:t1 | refusal_unverified | UNKNOWN-GOLD-COLUMN | |
independent11:activity_duration_missing_due_time:t1 | task_error | ||
independent11:organization_wallet_share_unknown:t3 | task_error | ||
independent11:activity_duration_missing_due_time:t3 | task_error | ||
independent11:deal_stage_timestamp_order:t1 | task_error |
Each of the ten lost cases was traced through the provider trace, the stored turn rows and the application code on both snapshots.
glm-5.2 at temperature 0 and seed 42 is not deterministic.deal_stage_timestamp_order:t1, activity_deadline_before_creation:t1) came from a gold leg that referenced an unqualified table. Both snapshots reject that statement at validation. In the original run the CT leg came back empty, the planner raised, and the single-shot path regenerated with a heal. In run 2 the CT leg came back with SQL, so the fan-out plan dispatched the bad gold leg and failed. The branch taken depends only on the provider's completion.To measure the noise floor, the original application e479e81 was rerun with the same frozen method on the seven chains that contain the ten lost cases (28 attempts, control arm). The candidate was rerun on the same chains (28 attempts).
| Arm | Original correct in scope | Retained | Correct-to-wrong | Correct-to-error | Correct-to-refusal | SQL identical to baseline |
|---|---|---|---|---|---|---|
| Original rerun (control) | 13 | 6 | 3 | 2 | 1 | 5/28 |
| Candidate rerun (scoped) | 13 | 4 | 3 | 6 | 0 | 5/28 |
The original application does not reproduce its own correct completions under the frozen method. The gate criteria of zero correct-to-wrong and zero correct-to-error transitions are below the provider noise floor. Per-case outcomes for all four samples:
| Case | Original E5 | Original rerun | Run 2 | Candidate scoped rerun | Run 3 |
|---|---|---|---|---|---|
independent11:activity_deadline_before_creation:t1 | correct_completed | correct_completed | task_error | task_error | correct_completed |
independent11:activity_deadline_before_creation:t2 | comparison_unverified | task_error | task_error | task_error | comparison_unverified |
independent11:activity_deadline_before_creation:t3 | correct_completed | correct_completed | task_error | task_error | correct_completed |
independent11:activity_deadline_before_creation:t4 | comparison_unverified | comparison_unverified | task_error | task_error | correct_completed |
independent11:deal_stage_timestamp_order:t1 | correct_completed | task_error | task_error | task_error | task_error |
independent11:deal_stage_timestamp_order:t2 | task_error | task_error | task_error | task_error | task_error |
independent11:deal_stage_timestamp_order:t3 | task_error | task_error | task_error | task_error | task_error |
independent11:deal_stage_timestamp_order:t4 | task_error | task_error | task_error | task_error | task_error |
independent11:known_zero_booked_commission:t1 | comparison_unverified | comparison_unverified | comparison_unverified | silent_wrong | silent_wrong |
independent11:known_zero_booked_commission:t2 | correct_completed | correct_completed | correct_completed | silent_wrong | task_error |
independent11:known_zero_booked_commission:t3 | comparison_unverified | silent_wrong | comparison_unverified | silent_wrong | comparison_unverified |
independent11:known_zero_booked_commission:t4 | correct_completed | comparison_unverified | silent_wrong | correct_completed | silent_wrong |
independent11:negative_realized_commission:t1 | comparison_unverified | comparison_unverified | comparison_unverified | comparison_unverified | comparison_unverified |
independent11:negative_realized_commission:t2 | correct_completed | correct_completed | correct_completed | correct_completed | comparison_unverified |
independent11:negative_realized_commission:t3 | comparison_unverified | comparison_unverified | comparison_unverified | silent_wrong | comparison_unverified |
independent11:negative_realized_commission:t4 | correct_completed | silent_wrong | silent_wrong | correct_completed | correct_completed |
independent11:organization_wallet_share_unknown:t1 | correct_completed | refusal_unverified | refusal_unverified | task_error | refusal_unverified |
independent11:organization_wallet_share_unknown:t2 | task_error | task_error | task_error | task_error | task_error |
independent11:organization_wallet_share_unknown:t3 | correct_completed | task_error | refusal_unverified | task_error | task_error |
independent11:organization_wallet_share_unknown:t4 | task_error | task_error | task_error | task_error | task_error |
independent11:partner_paid_and_unpaid_statements:t1 | comparison_unverified | comparison_unverified | silent_wrong | comparison_unverified | silent_wrong |
independent11:partner_paid_and_unpaid_statements:t2 | correct_completed | correct_completed | silent_wrong | correct_completed | silent_wrong |
independent11:partner_paid_and_unpaid_statements:t3 | comparison_unverified | comparison_unverified | silent_wrong | correct_completed | silent_wrong |
independent11:partner_paid_and_unpaid_statements:t4 | correct_completed | silent_wrong | silent_wrong | task_error | silent_wrong |
independent11:verified_private_rejected_registration:t1 | comparison_unverified | comparison_unverified | comparison_unverified | silent_wrong | comparison_unverified |
independent11:verified_private_rejected_registration:t2 | correct_completed | correct_completed | correct_completed | silent_wrong | correct_completed |
independent11:verified_private_rejected_registration:t3 | comparison_unverified | comparison_unverified | silent_wrong | silent_wrong | silent_wrong |
independent11:verified_private_rejected_registration:t4 | correct_completed | silent_wrong | silent_wrong | silent_wrong | silent_wrong |
| From (original) | To (run 2) | Count |
|---|---|---|
| comparison_unverified | comparison_unverified | 8 |
| comparison_unverified | correct_completed | 3 |
| comparison_unverified | silent_wrong | 4 |
| comparison_unverified | task_error | 3 |
| correct_completed | correct_completed | 26 |
| correct_completed | refusal_unverified | 2 |
| correct_completed | silent_wrong | 5 |
| correct_completed | task_error | 3 |
| refusal_unverified | refusal_unverified | 1 |
| refusal_unverified | silent_wrong | 1 |
| refusal_unverified | task_error | 2 |
| silent_wrong | comparison_unverified | 3 |
| silent_wrong | correct_completed | 1 |
| silent_wrong | refusal_unverified | 3 |
| silent_wrong | silent_wrong | 13 |
| silent_wrong | task_error | 11 |
| task_error | comparison_unverified | 1 |
| task_error | correct_completed | 7 |
| task_error | refusal_unverified | 11 |
| task_error | silent_wrong | 9 |
| task_error | task_error | 133 |
| From (original) | To (run 3) | Count |
|---|---|---|
| comparison_unverified | comparison_unverified | 7 |
| comparison_unverified | correct_completed | 2 |
| comparison_unverified | silent_wrong | 6 |
| comparison_unverified | task_error | 3 |
| correct_completed | comparison_unverified | 2 |
| correct_completed | correct_completed | 24 |
| correct_completed | refusal_unverified | 1 |
| correct_completed | silent_wrong | 4 |
| correct_completed | task_error | 5 |
| refusal_unverified | correct_completed | 2 |
| refusal_unverified | refusal_unverified | 1 |
| refusal_unverified | task_error | 1 |
| silent_wrong | comparison_unverified | 1 |
| silent_wrong | correct_completed | 1 |
| silent_wrong | refusal_unverified | 4 |
| silent_wrong | silent_wrong | 16 |
| silent_wrong | task_error | 9 |
| task_error | correct_completed | 4 |
| task_error | refusal_unverified | 10 |
| task_error | silent_wrong | 12 |
| task_error | task_error | 135 |
The full 250-row tables are docs/evidence/insights-goal-a-2026-09-07/holdout/case-transitions-run2.json and case-transitions-run3.json.
One change moved: the R07 child-process provider HTTP transport (_JobDeadlineTransport, _job_http_client_kwargs and the child script in services/llm_executor.py, with its call sites in services/bi_sql_llm_generator.py). The first full gate run on snapshot d963f75e was stopped after 25 attempts: 20 of 29 provider calls timed out at exactly 25 s while the 7 that completed took 4 to 9 s, and a plain SDK probe answered in 1 to 4 s. Isolated reproduction: through the job-bound transport, 20 KB and 40 KB prompts complete in 2 to 3 s; 60 KB and 90 KB prompts time out at 25 s. Cause: Popen.communicate(input, timeout=0.025) times out before the child drains stdin, and the retry with input=None never re-registers stdin, so payloads above the pipe buffer never finish and the child blocks in json.load(sys.stdin). V18 showed the same defect as 10 timeouts in 906 calls; the base prompt path on this branch produces larger prompts, so it hit most calls. The transport is not meaning-layer, but it is defective, so it is parked with a fix note. The rest of N07 stays. The aborted run is retained at /tmp/lore-goal3-eval/holdout-goal-a-run-aborted-provider-timeouts and its receipts in the evidence tree. Run 2 (the first complete run) and run 3 (the one permitted full rerun) both used snapshot 7ba3a106 with fresh pristine states. The resume session moved nothing else: see the cause analysis and the control arm.
Nothing else moved. The resume session found no responsible change for the run 2 losses. Moving a deterministic fix to the meaning layer without a reproduced cause would not change the noise.
The strict criteria fail on both complete runs. The control arm shows the same criteria fail for the original application against itself. The landable branch is therefore not shown to regress the original, and it is not shown to be equal to it either. The pull request is opened for a human decision with these numbers in its body. A gate that can pass needs a deterministic generator or a paired design with repeated samples per case.
Branch insights/meaning-layer-parked is created from the landable branch and applies group 3. It is not pushed. Its README, docs/plans/2026-09-07-meaning-layer-parked-README.md, lists what is there, why it is parked, the holdout numbers that parked it, the 12 lost original completions, and the 44 recovery cases from the goal-3 report.
45ba8d5b481e8b92 (local only)_headers with X-Robots-Tag: noindex)