The recommendation byline is read off the record — it said "Fable recommends", and Fable never saw it

The Decisions tab's recommended option now names the session that suggested it. A hard-coded model name was false on every card, and with a ladder that falls through Fable → Astra → human, any single name would be wrong again next week.

10 Sept 2026 · branch fix/decisions-rec-provenance · captured against propflow-stage · at 559f3057f1

Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.

1 · BEFORE — origin/main: "Fable recommends" over a pick Fable never made

A real open question on the live ledger, raised by a session called holiday-policy. Its recommended option carries the flag Fable recommends. Nothing produced that attribution: rec is the --rec string the raising session wrote about its own preferred option, the relay forwards no model verdict of any kind, and the only model evidence blocked ever stores on a row is a receipt saying the model declined to choose. The label was asserted by the component, not read from the record.

The footer on the same card already says who raised it — the flag and the footer disagreed about the source of the recommendation, and the flag was the one that was wrong.

Asserted in the captured DOMFABLE RECOMMENDS · Ask the two offices what they do · holiday-policy. The false byline is on screen beside the raiser's own name, so the contradiction is in the capture, not inferred.

BEFORE — origin/main: "Fable recommends" over a pick Fable never made
Before: the option flag names a model that never saw the question Provenance. Captured from commit 61d0f2b05d plus uncommitted changes, read from the worktree the server was started from (/Users/miniclaw/code/PropFlow/propflowai) — the server could not report its own commit, so this is the weaker of the two sources. That commit is already merged into origin/main.

2 · AFTER — the same question: "Suggested by holiday-policy"

Same row, same ledger, same relay. The flag now reads what the record says: the raiser's session label (falling back to its short session id — the same identity the footer's raised by prints, so the two can no longer disagree). The name is kept out of the uppercase so a session slug stays legible.

No model is named because the record names none. That is not a placeholder for a better label: a card can only say Astra recommends · medium confidence truthfully once the ledger row carries a recommendation-provenance field, the relay forwards it and publicBlock narrows it. Until every link exists, the pure helper behind this flag has no branch that can produce a model name — deliberately, because a branch fed by a fixture is exactly what produced the label above.

Asserted in the captured DOMSUGGESTED BY · holiday-policy · Ask the two offices what they do. The byline names the raiser, and the raiser's name matches the footer.

AFTER — the same question: "Suggested by holiday-policy"
After: the option flag names the session that made the suggestion

3 · A multi-question block: the byline reaches every question through the stepper

The questions of a multi-question block carry their own rec but no identity of their own; the byline comes from the block's raiser, threaded through the stepper to each question's options. Here the block was raised by portfolio-arch, and its first question's recommended option says so.

Asserted in the captured DOMSUGGESTED BY · portfolio-arch. The stepper path — the one every earlier More-details test went through, and the one an ordinary block once diverged from — carries the same byline.

A multi-question block: the byline reaches every question through the stepper
A question inside a multi-question block, bylined to the block's raiser

What the capture cannot show

The blocked CLI renders its own decision page with the same label; that surface is fixed separately (gera-propflow/local-bin#109) and is not in these captures. And no capture can show a model's real opinion on these questions, because on this path none reaches the browser — which is the finding.

PropFlow Docs