pam@4e68027 + pam-launcher@877b6c9, sandbox review, live Pam untouched.
checks/chk03_tracking_skip_repro.py. These three linesCLASSIFICATION primary=caught-post-hoc-only
CLASSIFICATION unworded=not-caught
CLASSIFICATION primary_with_unrelated_tool=not-caught
repo/brain/eval/metrics_core.py (therepo/brain/dashboard/patch_generated_pages.py. Findings F-21 to F-24 come from there, andrepo/brain/eval/policy_grade.py, the second grading lane, andrepo/brain/eval/grading_referee.py, the referee that produces the Pam-versus-Ross agreementseverity: real-defect means it is demonstrated by a check underchecks/defects/ that currently exits non-zero against the unfixed review copy.severity: coverage-gap means the review copy cannot answer the question at all; those carrydocs/exceptions.md. expected_gain_pct is percentage points towardseverity: real-defect
tag: RESTRUCTURE
expected_gain_pct: 12
scores_moved: Team Members, Ross's Claude, Autopilot
evidence: repo/launcher/pam_pipeline.py:1257, repo/brain/guardrail.py:223, repo/brain/tools/draft_gates.py:346, repo/brain/eval/draft_morning.py:420
expected_impact: Should move Team Members and Ross's Claude most, because both grade live-lane drafts; roughly 10 to 15 points if the WISMO class is as large in live traffic as it is in the golden set.
gating_check: checks/defects/defect_f01_live_lane_unenforced.py
repo/brain/tools/draft_gates.py:346 is GATE 1lookup_gate), a three-state deterministic check on whether the facts a reply depends onrepo/brain/eval/draft_morning.py:420 and fromrepo/launcher/pam_pipeline.py:1257 runsguardrail.check and nothing else, and repo/brain/guardrail.py:223 has no rule aboutrepo/brain/RULES.md:52) islookup_gate frompam_pipeline.finalize before the guardrail, on customer-reply channels, with the sameseverity: real-defect
tag: FIX
expected_gain_pct: 9
scores_moved: Backtest, Ross's Claude
evidence: repo/brain/eval/backtest_distill.py:972, repo/brain/eval/backtest_distill.py:957
expected_impact: Backtest most directly, since the tripwire is what flips a fabricated-claim row to fail there; expect the measured fabrication rate to rise before it falls, which is the point.
gating_check: checks/defects/defect_f02_live_claim_tool_whitewash.py
_live_claim_mismatch returns False as soon as tools is non-emptyrepo/brain/eval/backtest_distill.py:972), on the stated reasoning that she "really didtools is every tool fired on the ticket, not every TRACKING tool. Agorgias_search_tickets.shipstation_tracking,shopify_order_lookup, the tracking-snapshot path), not against the truthiness of the list.severity: real-defect
tag: FIX
expected_gain_pct: 9
scores_moved: Backtest, Ross's Claude
evidence: repo/brain/eval/backtest_distill.py:1902, repo/brain/eval/backtest_distill.py:1450, repo/brain/eval/backtest_distill.py:1453
expected_impact: Backtest first and Ross's Claude second. Not additive with F-02: both come from the same input, so fixing the input once collects both. Listed separately because the consumer, the gating check and the fix site are different.
gating_check: checks/defects/defect_f17_grader_tool_truthiness.py
repo/brain/eval/backtest_distill.py:1902 computes the grader's fabrication context aslooked_up=(bool(tools) or injected), and :1450 turns a True there into a flatelse branch at :1453 is the oppositegorgias_search_tickets call on a ticket switches the grader from "any specific shetools=[] givestools=['gorgias_search_tickets'] gives True.looked_up from the tracking-capable tool names, and pass the real per-claimseverity: real-defect
tag: FIX
expected_gain_pct: 8
scores_moved: Backtest, Team Members, Ross's Claude
evidence: repo/brain/eval/backtest_distill.py:942, repo/brain/AGENT.md:186, fixtures/wismo_tracking_fixture.json:1
expected_impact: Backtest and Team Members; this is the defect class Anthony described, and the golden set's C1 cluster (g-10, g-19, g-20) is the same shape.
gating_check: checks/defects/defect_f03_status_claim_undetected.py
_LIVE_CLAIM_PATTERNS (repo/brain/eval/backtest_distill.py:942) requiresrepo/brain/AGENT.md:186, and trips nothing: not the pre-send guardrail, not the tripwire,CLASSIFICATION unworded=not-caught line above.severity: real-defect
tag: FIX
expected_gain_pct: 7
scores_moved: Team Members
evidence: repo/brain/eval/golden/golden_check.py:41, repo/brain/eval/golden/golden_check.py:43, repo/brain/eval/golden/golden_check.py:100
expected_impact: Team Members directly: the 23.8 percent figure is 5 over 21, and 21 is what 30 becomes once the nine unadjudicable rows drop out. Reporting them makes the number honest rather than higher.
gating_check: checks/defects/defect_f04_golden_unadjudicable_verdicts.py
scorer_verdict is in SCORER_FAIL_VERDICTSrepo/brain/eval/golden/golden_check.py:41) or SCORER_PASS_VERDICTS (:43). Nine of thestale or pending, so they can never be a mismatch no matterpam_wrong: realrepo/brain/eval/golden/golden_check.py:100 validatesross_label only. An unrecognized scorer_verdict is never reported, so status.json showsunknown_labels: [] and looks clean while a third of the set sits outside the comparison.n_labeled counts all thirty, so any rate computed from it is over a denominatorscorer_verdict against a known set the same way labels are validated, reportstatus.json explicitly, and compute the rate over theseverity: real-defect
tag: FIX
expected_gain_pct: 6
scores_moved: Team Members, Autopilot
expected_impact: Team Members and Autopilot; both are computed from the same denominator, and today an infrastructure failure raises them instead of lowering them.
evidence: repo/brain/eval/draft_morning.py:992, repo/brain/eval/draft_morning.py:1016, repo/brain/eval/draft_morning.py:1189, repo/brain/eval/draft_morning.py:1235
gating_check: checks/defects/defect_f05_pending_conflation.py
_check_one records pending when the Gorgias ticket fetch does not return 200repo/brain/eval/draft_morning.py:992) and when no agent reply has appeared yet (:1016)._verdict_for defaults any ticket with no verdict row at all to pending (:1189). Thegate_denom = p + pe + f (:1235), so all three drop out silently.fetch_error, awaiting_reply, missing_row),severity: real-defect
tag: FIX
expected_gain_pct: 6
scores_moved: Team Members, Backtest
evidence: repo/brain/eval/policy_grade.py:242, repo/brain/eval/policy_grade.py:250, repo/brain/eval/policy_grade.py:251, repo/brain/eval/policy_grade.py:264, repo/brain/eval/draft_morning.py:473
expected_impact: Team Members most, because the morning-draft lane is the lane those 21 tickets are drawn from, and Backtest through the shared grader contract. Expect the measured fabrication rate on order categories to rise once the real signal is used.
gating_check: checks/defects/defect_f18_policy_grade_lookup_proxy.py
repo/brain/eval/policy_grade.py grades every posted morning draft a second time, for policygrade_compare the backtest uses. That grader needs the onerepo/brain/eval/draft_morning.py:473 ispam, _tools = bd.run_pam(...), and _tools is never persisted anywhere the grading pathrepo/brain/eval/policy_grade.py:242 substitutes a proxy, and the proxy answers a:250 re-fetches the order itself, days later, and :251 returns TrueWISMO, ORDER ISSUE,RETURN ISSUE, PAYMENT) with a resolvable order, :264 hands the graderlooked_up=True, which is the :1450 "treat them as VERIFIED" instruction from F-17._tools return and calls the proxyrun_pam's tool list into draft-run.jsonl at draft time and read it here. Theseverity: real-defect
tag: FIX
expected_gain_pct: 5
scores_moved: Team Members
expected_impact: Team Members; two of the five recorded mismatches are this mechanism, so it is roughly 40 percent of the disagreement this metric is currently reporting.
evidence: repo/brain/eval/draft_morning.py:994, repo/brain/eval/draft_morning.py:996, repo/brain/eval/draft_morning.py:17
gating_check: checks/defects/defect_f06_tag_override.py
repo/brain/eval/draft_morning.py:994 returns a final fail the moment the ticket carries apam-fail tag, before any comparison runs, and the module's own header calls the tag "an:17). Golden rows g-01 and g-12 are both verdict_method: tag, bothfail, and Ross labeled both pam_right. On g-01 the agent sent Pam's drafthuman_reply is Pam's text plus the auto-signature and the quotedseverity: real-defect
tag: RESTRUCTURE
expected_gain_pct: 5
scores_moved: Team Members, Autopilot, Ross's Claude
expected_impact: Team Members and Autopilot; the other three of the five recorded mismatches are this, and it is the reason a 0.042-similarity draft can be scored a pass.
evidence: repo/brain/eval/draft_morning.py:794, repo/brain/eval/draft_morning.py:1026, repo/brain/eval/golden/candidates.jsonl:14
gating_check: checks/defects/defect_f07_grader_blind_to_added_claims.py
intent: the haiku judgerepo/brain/eval/draft_morning.py:794) called the resolution equivalent while Pam hadintent: a draft sharing 4 percent of its wording with whatsimilarity: above the 0.75 auto-pass thresholdrepo/brain/eval/draft_morning.py:1026), so no judge ran at all. The sentence Pam ADDED,severity: real-defect
tag: RESTRUCTURE
expected_gain_pct: 5
scores_moved: Backtest
expected_impact: Backtest, and indirectly all four. No fix in this digest can be shown to move the Backtest score while two different numbers wear that name, so this is the finding that makes the other twenty measurable rather than the one that raises a score by itself.
evidence: repo/brain/dashboard/patch_generated_pages.py:406, repo/brain/dashboard/patch_generated_pages.py:417, repo/brain/dashboard/patch_generated_pages.py:852, repo/brain/eval/metrics_core.py:86
gating_check: checks/defects/defect_f21_backtest_two_definitions.py
repo/brain/dashboard/patch_generated_pages.py:406 is the official one, the number on therepo/brain/dashboard/patch_generated_pages.py:417 is the other one, recomputed from the rawrepo/brain/dashboard/patch_generated_pages.py:852). repo/brain/eval/metrics_core.py:86,backtest_rolling_7d.pct. So the page and the permanent record carry different Backtest:854 silently substitutes the other definition and the page's headlineseverity: real-defect
tag: FIX
expected_gain_pct: 4
scores_moved: Backtest, Team Members, Ross's Claude
expected_impact: Backtest, Team Members and Ross's Claude alike, since all three grade WISMO drafts; a contradiction resolved by the model is a coin flip on the exact class Pam is failing.
evidence: repo/brain/AGENT.md:186, repo/brain/tools/cst_inject.py:110, repo/brain/tools/cst_inject.py:719, repo/launcher/run_pam.sh:75
gating_check: checks/defects/defect_f08_prompt_injection_contradiction.py
repo/brain/AGENT.md:186 tells Pam she can see the carrier, tracking number and ship daterepo/brain/tools/cst_inject.py:110 renders a LIVE CARRIER CHECK line with scanrepo/launcher/run_pam.sh:75 has that injection switched on in production.repo/brain/tools/cst_inject.py:719 requires a brandseverity: real-defect
tag: FIX
expected_gain_pct: 4
scores_moved: Ross's Claude, Backtest
evidence: repo/brain/eval/grading_referee.py:78, repo/brain/eval/grading_referee.py:81, repo/brain/eval/grading_referee.py:82
expected_impact: Ross's Claude directly, since agreement with Ross's grade IS that score's subject; Backtest indirectly, because this is the only alarm that would say the primary grader is drifting. No score moves until it is fixed, which is the point.
gating_check: checks/defects/defect_f19_referee_exclusion_freetext.py
repo/brain/eval/grading_referee.py is the only thing watching for grader bugs. It compares:78 defines the predicate that decides whether a reconciled row:81 is its third condition: the hand-typed Ross Notes cellharness bug.confirmed harness bug excludes the row, this was NOT a harness bug, the grader was
wrong also excludes it, and unrelated to the harness bug of 2026-07-11 excludes it too.primary, so a disagreement the primary grader WON leaves the denominator and one theruling='audit' is not excluded. The only:82 applies it with no record that a measurement was dropped.severity: real-defect
tag: FIX
expected_gain_pct: 4
scores_moved: Backtest
expected_impact: Backtest. Does not raise the number; it stops the number from freezing. A backtest that silently stops running currently republishes its last good week forever, which would let Pam appear to hold 95 percent through a total grading outage.
evidence: repo/brain/dashboard/patch_generated_pages.py:417, repo/brain/dashboard/patch_generated_pages.py:447, repo/brain/eval/metrics_core.py:86
gating_check: checks/defects/defect_f22_rolling_window_unbounded.py
repo/brain/dashboard/patch_generated_pages.py:447 builds the window assorted(dates_seen)[-cap_days:]: every distinct date string in the log, sorted as text,8/26/2026 sorts after every ISO date andrepo/brain/eval/metrics_core.py:86 is also the one call in build_metrics that does notanchor_date, because this function has no parameter to receive it. Thatanchor_date, parse dates as dates, bound the window toanchor_date - 6 days, and return None with a stated reason when the window is empty or theseverity: real-defect
tag: FIX
expected_gain_pct: 3
scores_moved: Backtest
expected_impact: Backtest only; it restores a deterministic check on the majority of rows, which will surface fabrications the current number cannot see.
evidence: repo/brain/eval/backtest_distill.py:1903, repo/brain/eval/backtest_distill.py:1892, repo/brain/eval/backtest_distill.py:1939
gating_check: checks/defects/defect_f09_fab_flags_disabled_when_injected.py
fab = [] if (injected or tools) else _fabrication_flags(...)repo/brain/eval/backtest_distill.py:1903), where injected is simply "the order was:1892). Since v3 injection runs whenever an order resolves, the deterministic:1939 records that fab_flags "wasseverity: real-defect
tag: FIX
expected_gain_pct: 3
scores_moved: Ross's Claude, Backtest
evidence: repo/brain/eval/grading_referee.py:61, repo/brain/eval/grading_referee.py:123, repo/brain/eval/golden/candidates.jsonl:1
expected_impact: Ross's Claude, whose subject is grader agreement, and Backtest through the Policy-Correct column published off the same rows. Both numbers move on re-baseline rather than on a Pam change.
gating_check: checks/defects/defect_f20_referee_verdict_vocabulary.py
repo/brain/eval/grading_referee.py:61 is a bare uppercased string equality, so two gradersagree='YES' for pending against PENDING, and 'YES' for two blanks. The:123 reports Policy-Correct percent as PASS over every primary row in the window. Onrepo/brain/eval/golden/candidates.jsonl:1, the only graded record set in the review copy,pending or stale in the same field these lines read (F-04 is the same populationunmeasured, reported as its own count, and neverseverity: real-defect
tag: FIX
expected_gain_pct: 3
scores_moved: Ross's Claude, Team Members
expected_impact: Ross's Claude most, since the Ardie review page is the artifact she grades; removing failed generations from the population removes a class of guaranteed fails.
evidence: repo/brain/eval/ardie_review_build.py:598, repo/brain/eval/ardie_review_build.py:612, repo/brain/eval/ardie_review_build.py:617
gating_check: checks/defects/defect_f10_ardie_failed_draft_persisted.py
repo/brain/eval/ardie_review_build.py:598 writes r["reply"] = reply or "(timed out)", so:612) and the row is:617) with no reply at all. Rows are version-gatedseverity: real-defect
tag: FIX
expected_gain_pct: 3
scores_moved: Ross's Claude, Autopilot, Backtest
expected_impact: Ross's Claude and Autopilot first, since those are the two lanes that vanish under ordinary conditions. It moves no score upward; it stops a lane that stopped reporting from reading as a lane that is fine.
evidence: repo/brain/eval/metrics_core.py:124, repo/brain/eval/metrics_core.py:133, repo/brain/eval/metrics_core.py:102, repo/brain/eval/metrics_core.py:68
gating_check: checks/defects/defect_f23_drift_blind_to_dark_ruler.py
repo/brain/eval/metrics_core.py:124 is the whole safety mechanism on the permanent snapshotrepo/brain/eval/metrics_core.py:133). Nothing walks the other direction, so a percentagerepo/brain/eval/metrics_core.py:102{} for all three of his windows._policy_last_night returns pct: None (F-24), andrepo/brain/eval/metrics_core.py:68 only harvests int and float values.quarantined=False, reason=None. The row still appends,built_at, still exits 0. The negative control moving the same twoseverity: real-defect
tag: FIX
expected_gain_pct: 2
scores_moved: Backtest, Team Members
expected_impact: Backtest and Team Members indirectly and unpredictably: a rule fix believed to be shipped may not be shipped, so a regression can appear with no code change behind it.
evidence: repo/launcher/run_pam.sh:133, repo/launcher/run_pam.sh:5, repo/launcher/run_pam.sh:141
gating_check: checks/defects/defect_f11_stale_prompt_fallback.py
repo/launcher/run_pam.sh:121 rebuilds the system prompt from the three brain files on every:96), which is right. The else branch (:133) prints a warning and keeps whateversystem_prompt.md is already on disk, and the script continues to the exec at :141 becauseset -uo pipefail without -e (:5). A renamed file or a partially synced checkoutseverity: real-defect
tag: RESTRUCTURE
expected_gain_pct: 2
scores_moved: Backtest, Team Members, Autopilot, Ross's Claude
expected_impact: Indirect but broad across Backtest, Team Members, Autopilot and Ross's Claude: every fix above lands faster and safer when the lane can be run and tested outside production.
evidence: repo/brain/eval/draft_morning.py:61, repo/brain/eval/ardie_review_build.py:27, repo/brain/eval/ross_checker_pull.py:41
gating_check: checks/defects/defect_f12_hardcoded_live_paths.py
brain/ and launcher/ resolve absolute paths on one Mac.repo/brain/eval/draft_morning.py:61 and repo/brain/eval/ardie_review_build.py:27 do notsys.path at it and import their dependenciesrepo/brain/eval/ross_checker_pull.py:41 hardcodes a service-account key path.repo/brain/eval/backtest_distill.py:37 already shows the fix: derive the root from__file__ with an environment override. Applying that pattern to the rest of the lane isrepo/brain/eval/bucket_classifier.py:33 pins sys.path at the same absoluteguardrail out of it, and backtest_distill.py imports that module atbacktest_distill to test its detectors did one of two thingschecks/_lib.pyload_symbols), which is a workaround in the harness, not a fix in Pam. The fix in Pam isseverity: real-defect
tag: FIX
expected_gain_pct: 2
scores_moved: Autopilot
expected_impact: Autopilot. Expect the reported 66.7 percent to fall once escalations enter the denominator, which is the correct direction: today the metric rises as Pam answers less, so it cannot be used as a go-live gate.
evidence: repo/brain/dashboard/patch_generated_pages.py:482, repo/brain/dashboard/patch_generated_pages.py:495, repo/brain/dashboard/patch_generated_pages.py:497
gating_check: checks/defects/defect_f24_autopilot_escalations_leave_denominator.py
repo/brain/dashboard/patch_generated_pages.py:495 splits the night into escalated and:497 computes the headline over covered alone. Escalating is Pam decliningcovered=1. Ten of ten answered with onepct: None, so the Autopilotcovered and escalated alongside, so coverage is reconstructible_coverage_txtrepo/brain/dashboard/patch_generated_pages.py:464) already does for the other lanes.severity: real-defect
tag: FIX
expected_gain_pct: 1.5
scores_moved: Team Members, Ross's Claude
expected_impact: Small but certain on Team Members and Ross's Claude; it removes a class of visibly broken customer replies that currently reach the rep unflagged.
evidence: repo/brain/guardrail.py:216, repo/brain/eval/golden/candidates.jsonl:25
gating_check: checks/defects/defect_f13_preamble_leak_gap.py
repo/brain/guardrail.py:216 flags a leaked preamble only when the greeting starts more thanguardrail.check returns clean on the recorded draft.severity: coverage-gap
tag: RESTRUCTURE
expected_gain_pct: 1
scores_moved: Backtest, Team Members, Autopilot, Ross's Claude
expected_impact: Unknown by construction for Backtest, Team Members, Autopilot and Ross's Claude alike: the single step where the model answers a customer, and the tool loop around it, cannot be reviewed from what was seeded.
evidence: repo/launcher/run_pam.sh:141, repo/launcher/pam_pipeline.py:1243, repo/launcher/pam_pipeline.py:950
gating_check: none
repo/launcher/run_pam.sh:141 execs slack_orchestrator.py andrepo/launcher/pam_pipeline.py:1243 and :950 import it. That file was not seeded. So thesystem_prompt.md the spec anticipated, and itdocs/exceptions.md.severity: coverage-gap
tag: FIX
expected_gain_pct: 1
scores_moved: Backtest, Team Members, Autopilot, Ross's Claude
expected_impact: Unknown by construction for all four (Backtest, Team Members, Autopilot, Ross's Claude); without the records, cluster frequency cannot be measured and no fix above can be prioritised by real volume rather than by judgment.
evidence: repo/brain/eval/backtest_distill.py:46, repo/brain/eval/backtest_distill.py:1759, repo/brain/eval/ross_checker_pull.py:38
gating_check: none
data/logs/repo/brain/eval/backtest_distill.py:46, :1759;repo/brain/eval/ross_checker_pull.py:38), and data/logs/ was stripped when this copy wasrepo/brain/data/ contains kb/ and nothing else. The headline numbers themselvesdocs/failure-clusters.md: the clustering is grounded in the 30expected_gain_pct in this digest is therefore a judgment call, not a measurement.docs/exceptions.md.severity: coverage-gap
tag: FIX
expected_gain_pct: 0.5
scores_moved: Backtest
expected_impact: Low, on Backtest. The inputs are all present, so the artifact can be regenerated; what is unverifiable is which version actually reached live Pam on a given day.
evidence: repo/launcher/run_pam.sh:121, repo/brain/AGENT.md:1, repo/brain/SOUL.md:1, repo/brain/RULES.md:1
gating_check: none
launcher/agents/pam/system_prompt.md is not present in the seeded repo. It is a buildrepo/launcher/run_pam.sh:121 regenerates it from AGENT.md,SOUL.md and RULES.md on every launch, and all three are in the review copy. The gap isdocs/exceptions.md.lookup_gate onto the live lane. It is the only change here that stops alooked_up is arepo/launcher (pam-launcher, seeded from 877b6c9) plus repo/brain (Pam's4e68027), read-only. Every row below is anchored to a file and line inDeterminism is exactly one of deterministic script orLLM call (model: <name>). Enforced by names the code that makes the step's outcomeFlag carries LLM-TRUSTED-UNENFORCED when a step's correctness depends on thelauncher/agents/pam/system_prompt.md is not present in the seeded repo. It is notrepo/launcher/run_pam.sh:121 rebuilds it on every launch byAGENT.md + SOUL.md + RULES.md (+ a rendered GUIDELINES section) andrun_pam.sh:133 can keep arun_pam.sh:141 execsslack_orchestrator.py, and repo/launcher/pam_pipeline.py:1243 imports it. That filerepo/launcher/config.yaml:14), and the loop's behaviour is inferred from its inputsdocs/failure-clusters.md.repo/launcher/com.claude.pam-agent.plist:10 | deterministic script | launchd KeepAlive + repo/launcher/com.claude.pam-watchdog.plist:5 | |repo/launcher/run_pam.sh:75 | deterministic script | run_pam.sh, fails fast on a missing Slack token (repo/launcher/run_pam.sh:35) | |repo/launcher/run_pam.sh:121 | deterministic script | shell concat in fixed order AGENT, SOUL, RULES, guarded by the existence test at repo/launcher/run_pam.sh:96 | fail-open: repo/launcher/run_pam.sh:133 keeps a stale prompt and boots anyway (F-10) |repo/brain/RULES.md:52 | deterministic script | the concat order in repo/launcher/run_pam.sh:124; the rule text itself is instruction to the model, not code | LLM-TRUSTED-UNENFORCED: "you MUST call your read-only lookup tools" is prose with no deterministic counterpart on the send path |repo/launcher/run_pam.sh:141 | deterministic script | nothing in the review copy: slack_orchestrator.py was not seeded | COVERAGE-GAP |repo/launcher/config.yaml:14 | deterministic script | repo/launcher/config.yaml:53 binds pam_pipeline as the reply pipeline | |repo/launcher/pam_pipeline.py:3 | deterministic script | the engine's event router (not in the review copy) | COVERAGE-GAP |repo/launcher/pam_pipeline.py:197 | deterministic script | repo/launcher/pam_pipeline.py:292 renders the per-mode instructions | |repo/brain/guardrail.py:48 | deterministic script | repo/launcher/pam_pipeline.py:379 (currently disabled by decision) | |repo/launcher/pam_pipeline.py:358 | deterministic script | repo/brain/tools/cst_inject.py:707 | fail-open and silent: repo/brain/tools/cst_inject.py:719 needs a brand AND an email or order hint, else nothing is injected and nobody is told |repo/brain/tools/cst_inject.py:729 | deterministic script | repo/brain/tools/tracking_snapshot.py:1, fail-soft by contract | if the snapshot does not resolve, the draft proceeds with no live status and no marker |repo/brain/tools/cst_inject.py:110 | deterministic script | none: it is text handed to the model | LLM-TRUSTED-UNENFORCED: the injected block says to base every delivery-status statement on it, repo/brain/AGENT.md:186 says the opposite (F-08) |repo/launcher/run_pam.sh:141 | LLM call (model: claude-sonnet-5) | model selection at repo/launcher/config.yaml:14; the call itself is in the unseeded engine | COVERAGE-GAP |repo/brain/AGENT.md:183 | LLM call (model: claude-sonnet-5) | nothing. repo/brain/RULES.md:52 and repo/brain/AGENT.md:123 instruct it in prose; no code checks that a tracking or order lookup ran before a WISMO reply is allowed to send | LLM-TRUSTED-UNENFORCED: the tracking / order-lookup call is trusted to the model (F-01, F-03) |repo/launcher/pam_pipeline.py:1257 | deterministic script | repo/brain/guardrail.py:223: completion claims, address/ship promises, approval lines, the $100 ceiling, refund promises, preamble leaks, internal URLs | LLM-TRUSTED-UNENFORCED: guardrail.check has no lookup-or-tracking rule at all, so step 13 is unchecked here too (F-01) |repo/launcher/pam_pipeline.py:1277 | LLM call (model: claude-sonnet-5) | repo/brain/guardrail.py:288 builds the correction text deterministically | |repo/launcher/pam_pipeline.py:1287 | deterministic script | still-violating drafts get a visible rep-review banner and a dead-letter row | |__APPROVAL__ lines stripped and audited | repo/launcher/pam_pipeline.py:398 | deterministic script | repo/brain/guardrail.py:150 parses them, repo/launcher/pam_pipeline.py:526 applies daily caps | |repo/launcher/pam_pipeline.py:557 | deterministic script | repo/brain/guardrail.py:115 computes the dollar figure, repo/launcher/authority_blocker.py:1 writes the authority line | |repo/launcher/pam_pipeline.py:433 | deterministic script | repo/launcher/pam_pipeline.py:443 mirrors it to the audit sheet | |repo/brain/eval/draft_morning.py:69 | LLM call (model: claude-sonnet-5) | GATE 1 lookup_gate at repo/brain/eval/draft_morning.py:420, GATE 2 qc_lint at repo/brain/eval/draft_morning.py:496 | the gates that DO enforce a lookup run here and only here, never on the live lane (F-01) |repo/brain/eval/draft_morning.py:751 | deterministic script | similarity threshold at repo/brain/eval/draft_morning.py:1026 | |repo/brain/eval/draft_morning.py:794 | LLM call (model: claude-haiku-4-5-20251001) | budget cap at repo/brain/eval/draft_morning.py:824 | |repo/brain/eval/draft_morning.py:1235 | deterministic script | gate_denom = pass + pass_edited + fail | three different failures all record pending and leave the denominator (F-05) |repo/brain/eval/backtest_distill.py:1894 | LLM call (model: claude-sonnet-5 drafting, claude-opus-5 grading) | repo/brain/eval/backtest_distill.py:1433 pins the grader model | |repo/brain/eval/backtest_distill.py:1903 | deterministic script | itself, when it runs | skipped on every ticket where facts were found (F-07) |repo/brain/eval/backtest_distill.py:1953 | deterministic script | repo/brain/eval/backtest_distill.py:957, post-hoc only | disarmed by any tool call (F-02); blind to claims that avoid the word "live" (F-03) |repo/brain/eval/ross_checker_pull.py:139 | deterministic script | offline-safe cache, fails open to the previous file | |repo/brain/eval/ardie_review_build.py:315 | LLM call (model: claude-sonnet-5) | one retry at repo/brain/eval/ardie_review_build.py:325 | a timed-out or raising draft is persisted as content (F-06) |repo/brain/eval/golden/golden_check.py:71 | deterministic script | repo/brain/eval/golden/golden_check.py:41 and :43 define what counts | nine of thirty labeled rows carry a verdict outside both sets and can never be adjudicated (F-04) |repo/brain/tools/draft_gates.py:346) and is wiredrepo/brain/guardrail.py:223, which has no lookup rule, so a reply asserting a deliverychecks/chk03_tracking_skip_repro.py.repo/brain/eval/golden/candidates.jsonl (30 hand-labeled rows) orrepo/brain/eval/golden/status.json (5 recorded scorer/Ross mismatches). Nothing isrepo/brain/eval/backtest_distill.py:46 points every record file at data/logs/backtest-records-history.jsonl at repo/brain/eval/backtest_distill.py:1759,failure-modes.json at repo/brain/eval/backtest_distill.py:2348), and data/logs/ wasrepo/brain/data/ contains kb/ and nothingPinned step refers to the numbered steps in docs/structure-map.md.pam-fail tag short-circuits every comparison (draft_morning.py:994); the agent sent this draft verbatim and it still scored a failure | 21 |cst_inject.py:719) and nothing enforces its use | 9 |guardrail._preamble_leak fired here but the underlying rule is narrow (F-13) | 14 |pam-fail tag override again; Ross judged Pam's reship/refund/credit better than the agent's spam deflection | 21 |cst_inject.py:729) and its absence is silent | 10 |pending and can never be adjudicated (F-04) | 29 |pending | 29 |draft-policy-grades.jsonl nor ross-checker-grades.jsonl is in the seeded tree; only thescorer_verdict the referee cannot adjudicatestale or pending), so they contribute a label and a tally entry but can never be achecks/chk06_defects_block_release.pyreal-defect finding has neither a failing check nor a row here.coverage-gap findings: the review copy does not contain the thingslack_orchestrator.py) was not seeded. A check could assert the file is absent, but that would gate the review on how the repo was sealed rather than on a defect in Pam. The right remedy is to seed the engine into the next review copy, which is a handoff action, not a code fix. Recorded here so the blind spot is on the record: every claim in this review about the tool-call loop is inference from inputs and outputs, never a read of the code. |data/logs/, which was stripped at seal. Same reasoning: the absence is a sealing decision, not a defect a check should block on. The consequence is stated wherever it bites, chiefly that every expected_gain_pct in the digest is a judgment call rather than a frequency measurement. |launcher/agents/pam/system_prompt.md is a build artifact regenerated on every launch from three files that ARE in the review copy, so there is nothing broken to demonstrate. The cut lines forbid reconstructing its content, and this review does not. It is recorded because in combination with F-11 (a stale prompt can boot) the artifact's absence stops being purely cosmetic. |docs/findings-digest.md marked real-defect carries a check underchecks/defects/ that exits non-zero right now against the unfixed review copy. Those are