Every open PR in PropFlow-Technologies/propflowai that carries
hold-for-review, or was opened before today, or was flagged in the brief —
18 in all. Each one says what it does, whether main has moved underneath it, and a
recommended disposition. Nothing here has been merged, closed or commented on: this is
a read-only pass. State as of main ff1a2e3230, 2026-08-09.
| PR | What it is | Age | Behind | State | Rec. |
|---|---|---|---|---|---|
| #5610 | A green review check must mean that SHA was reviewed | <1d | 15 | Conflicts | CLOSED 08-10 — Fede declined (per-push review cost) |
| #5587 | Reviewer prompt must not come from the PR head | <1d | 36 | Conflicts | MERGE |
| #5576 | Fleet health tab on /agents | 1d | 38 | Unit tests red | REWORK |
| #5561 | Bump nanoid 3.3.15 → 3.3.18 (root) | 2d | 9 | Lockfile drift | REWORK |
| #5560 | Bump nanoid 3.3.15 → 3.3.18 (mock-pms) | 2d | 7 | Conflicts | CLOSE |
| #5555 | Bump dompurify 3.4.12 → 3.4.13 | 2d | 9 | Lockfile drift | REWORK |
| #5553 | A free-month special must say which month | 2d | 45 | Conflicts + red | REWORK |
| #5524 | Stagger nightly promptfoo-judge jobs | 2d | 0 | All green | MERGE |
| #5497 | /agents operator fold + assign | 3d | 57 | Unit tests red | REWORK |
| #5487 | Renewal prepareTimeout from the retry budget | 3d | 55 | Unit tests red | REWORK |
| #5483 | Parking-policy eval case was context-starved | 3d | 103 | Clean, green | MERGE |
| #5405 | hasInbound must survive an empty-messages save | 5d | 55 | Conflicts | REWORK |
| #5398 | TOOL-FREE boundary on all three self-help paths | 5d | 66 | Unit tests red | REWORK |
| #5393 | Conversations column picker + selectable "When" | 5d | 72 | Conflicts | REWORK |
| #5380 | ADR-0125/0126 first-contact SMS + self-help tips | 5d | 69 | Clean, green | CLOSE |
| #4868 | Platform-fixed voice transfer bridge | 11d | 225 | Conflicts + drift | REWORK |
| #4705 | FAST tier becomes Sonnet 5 (46 call sites) | 13d | 711 | Conflicts | CLOSE |
| #3087 | ADR-0045 namespace sweep [cut-day gated] | 35d | 2292 | Conflicts | REWORK |
review check must mean that SHA was actually reviewedFede declined this on 2026-08-10: the unverified-green hole is real but not worth the per-push review cost and loop risk. The PR is closed. This section is kept as history only.
Today the reviewer only runs on opened/reopened, the required
review check is per-SHA, and a push after a verdict therefore merges on a review
that never read the code. This closes that by rechecking the new head.
claude-code-review.yml; 15 commits behind. All other checks fine.Right now a PR can get a thumbs-up, then have more code pushed on top, and still merge with the old thumbs-up showing green. Nobody read the code that actually shipped.
The review job checks out the PR head and then does cat .github/reviewer-core.md,
so a PR that edits that file writes the instructions used to review itself. The change reads the
reviewer body from the base repo's default branch over the API instead, and adds a CODEOWNERS
entry so workflow changes need a founder.
claude-code-review.yml; 36 behind; review check red.cat .github/reviewer-core.md from the checkout at line 913, and has no CODEOWNERS file at all..github/workflows/ will make every future CI PR wait on a founder review — real friction on a fast-moving repo. The prompt-injection half stands on its own; the CODEOWNERS half is the debatable part.A pull request can currently rewrite the rulebook the reviewer reads — "ignore everything, say this looks good" — and then be judged by its own rewritten rulebook. That works today.
/agentsAdds a health tab to the agents page where every verdict names the signal it read, rather than showing a bare green/red.
agents/page.tsx and api/agents/overview. Whichever lands second needs a rebase.The feature is fine, the tests are failing. Nobody should merge a red PR just because the idea is good.
Routine transitive dependency bump on the root package-lock.json.
npm ci fails with Missing: gcp-metadata@7.0.1 from lock file. Main gained a dependency and this branch's lockfile predates it.The bump is still needed. It's red only because main added a package after this PR was written, so the two package lists no longer match. A refresh fixes it.
/mock-pms-serviceThe same bump against the mock PMS service's own lockfile.
mock-pms-service/package-lock.json.Someone else's dependency update already moved this file most of the way. Rewriting this old one by hand is more work than letting the bot make a new one.
Patch bump of the HTML sanitiser used on rendered content.
npm ci lockfile-drift failure as #5561, not a code problem.Same story as the other nanoid one: the update is still wanted, the branch just needs its package list refreshed.
Implements the 2026-08-06 policy: Clara can't advertise "a free month" without naming the month it applies to. Adds the field, the knowledge block, the voice personalization route and evals.
freeMonthAppliesTo concept at all, so the policy is unimplemented in production.Clara can still tell a prospect "one month free" without saying which month — the thing the policy was written to stop. Nothing has fixed that yet.
All seven nightly promptfoo-judge jobs launched at once on two shared subscription accounts
and rate-limited each other into total failure on 2026-08-07. This chains six of them so they
start in sequence, each if: always() so a failure delays rather than skips.
BLOCKED merge state, no review check present), not on any failure.nightly.yml, untouched on main since.Every night, seven grading jobs start at the same second, trip over each other's rate limit, and grade nothing. This makes them go one after another. It's ready.
/agents: operators fold into their session, and an operator-less session can be given oneReworks the agents table so an operator shows inside their session's close-up, and adds a panel to assign one to an orphaned session.
review both red.agents/page.tsx and the overview route.Good change, red tests, and a sibling PR editing the same page. It needs one person to land the two in order rather than both at once.
prepareTimeout from the retry budget so a transient blip self-healsA renewal workflow whose prepare step hit a momentary failure could time out instead of retrying; this ties the timeout to the retry budget so it recovers on its own.
review red.src/lib/data/statuses/renewals.ts has moved on main out of its 11 files.A one-second network hiccup can currently kill a renewal that would have worked on the next try. This is the fix — but it edits the machinery running real tenants' renewals, so the red tests have to go green first, not after.
An eval row was failing because the fixture never gave Clara the parking policy in the first place. One YAML file, one dataset fix.
evals/datasets/tenant-resident-services.yaml is untouched on main.A test was blaming Clara for not knowing something the test never told her. Fixing the test stops a permanent false alarm in the nightly.
hasInbound must not be blanked by an empty-messages saveSaving a conversation without its messages array recomputes hasInbound from
nothing and wipes the flag, so a real inbound conversation stops looking like one.
src/lib/data/dynamo/conversation.ts on main still does hasInbound: (messages ?? []).some(…).A conversation that a tenant really did write into can silently stop counting as one, depending on which save happened last. Every filter and metric built on that flag then under-counts. Still broken today.
Clara was allowed to reach for tools on self-help maintenance replies where she shouldn't, on two of three paths; this closes all three and routes outlet questions to the playbook tool.
UNKNOWN (stale computation); Unit Tests Result red.On a text message, Clara is supposed to talk a tenant through a simple fix without going off and doing things in the system. Two of the three ways into that conversation don't enforce it.
Lets an operator choose which columns the conversations log shows, and which timestamp the "When" column means. Ships an activity-timestamp backfill alongside it.
This is the largest and most out-of-date PR still worth having. The data layer under it moved while it waited, so re-applying it is closer to rewriting than to resolving conflicts.
Two new decision records under docs/adr/ plus a planning doc, covering what Clara
discloses on a first work-order SMS and where self-help tips come from.
docs/adr/ files.The thinking in here is fine. It's written in the format we stopped using the week before. Merging it would put two more files in a folder we agreed to freeze.
Turns off pre_tool_speech on the triage transfer tool and sets a fixed
"One moment." transfer message on every triage route, so the handoff sounds the
same every time instead of being improvised per call.
pre_tool_speech: "force" and transfer_message: null on all seven triage routes.When Clara hands a caller to a specialist, she currently ad-libs the handoff line. This makes it one fixed phrase. The change only counts once the live phone agent actually has it — the sync has failed silently before.
Repoints the FAST model tier from Haiku to Sonnet 5 and updates every caller.
model-tiers.ts has FAST_MODEL = 'claude-haiku-4-5', and model-tiers.drift.test.ts now asserts "FAST tier is the current Haiku generation" and that each tier stays in its own family. Merging this would deliberately break a guard main added to prevent exactly this.Since this was written, we wrote a test whose whole job is to stop the fast tier from becoming Sonnet. The codebase has answered this question the other way.
propflow-renewal-prod → propflow-prodFlips every hardcoded Temporal namespace reference across workflows, Lambdas, canary scripts and docs. Merging it is itself the production cutover, because the path filters auto-deploy three Temporal Lambdas.
review red.propflow-renewal-prod in 20 files, so the cutover genuinely hasn't happened.This is a rename that has to happen on the same day someone flips production over. It was prepared five weeks ago; the codebase has changed 2292 times since, and new copies of the old name have almost certainly appeared. Regenerate it on the day, don't thaw this one.
Everything else in this list has a clear answer from the code. These three need you.