0 of 5 answered

Five things waiting on you

I picked up the Architect ledger today and adopted five questions left behind by sessions that have since died. Two you had already answered — those are now being built. These five are still yours. “Leave it” and “I’m not sure” are both real answers.

Why you are seeing these again: questions 1 and 2 were raised by sessions that died before you answered. Their old pages still point at those dead sessions, so this page — owned by a live one — replaces them. Answer here.

Nothing here is urgent tonight. I checked the one that could have been: the production dead-letter queue in question 2 is empty right now (0 messages, verified 18:19 UTC), so tonight’s run will delete nothing.

⚠️ Before you run any deploy on the mini — please read this first. It is the one thing on this page that can break something by accident.

Two of your older answers say you would put a change live yourself — “then I run the deploy” and “I put it live myself right after (one command, restarts the two background services)”. Please don’t run that command yet. Tell me when you want to and I will line it up.

Why: the program that keeps every agent alive is currently running a fix that has not been merged yet. It exists only as built output on the machine, not in the code history. The deploy command rebuilds from whatever the folder happens to be pointing at — so running it now would quietly rebuild that fix away, and roughly 274 wasted agent startups a day would come back, with nothing in any log saying why. Verified rather than assumed: the running program contains code that appears nowhere in the main branch.

There is exactly one deploy to run, and it has to come after two specific changes are both merged. Three separate agents each had their own version of that deploy queued, and none could see the others — whichever ran first would have wiped the others’ work. I have taken it off all of them and will sequence it myself, then confirm both fixes are genuinely running afterwards. Nothing is broken right now. This is only about not breaking it in the next few hours.

⚠️ Six answers you gave were marked "done" tonight. At least three of them were not done.

An automated helper chases up decisions you have answered, reminding whoever owns them to carry them out. If nobody carries one out after three reminders, it concludes that agent has gone away and closes the item itself — recorded under that agent’s own name, so it looks exactly like the work was finished.

That assumption was wrong in every case. The agents are alive and deliberately waiting — on a merge that is blocked, on a check that has not run yet, on you. But six of your answered decisions were stamped complete, and for three of them the pull request they claim to have merged is still sitting open right now. Two of the six genuinely were done.

Nothing was actually merged, deployed, or sent because of this — the false record is the whole damage, and it is real: a closed item disappears from every “still waiting” list, so a question you answered can quietly look handled while nothing happened. Each agent has restored its own item and kept the false stamp as evidence. It will recur on a timer until the helper learns to tell “nobody is coming back” from “waiting on purpose”, so the agents are re-checking rather than trusting the list.

You do not need to do anything about this. It is here because it happened to your decisions and you should not learn it from a stale list.

Two that have been waiting on you

01

92 task pages are telling operators to restart agents that are working fine

A health check got built that answers “is this agent actually alive and getting somewhere” in one place. While testing it, it found something already broken: 92 of your task pages currently carry a line telling whoever reads them to restart an agent — and 37 of those describe a task an agent is alive and holding right now. The page looks for the worker in a list it was never going to appear in, doesn’t find it, and concludes it died. Anyone following that advice starts a second agent on top of a running one.

The catch is the shipping, not the code. It does nothing until a deploy runs, and that deploy restarts both services that run the fleet — the one behind the agents page and the one keeping every session alive — from code that has never been through CI. If something is wrong, the thing that would normally recover it is the thing you just restarted.

⚠️ These numbers were re-measured tonight, not inherited. I had been quoting you “39 pages” from an eight-day-old note. Counted on disk just now it is 92 — and 37 of them describe a task an agent is alive and working on at this moment. So the problem is about two and a half times larger than I told you, not smaller. The fix was also run against all 96 real task files: it removes exactly the 62 cases that are impossible by construction, leaves the 25 where the line is genuinely true, and produced zero false results.

⚠️ Two things have changed since I first wrote this, both pushing the same way. First, the wrong advice is no longer hypothetical: a different agent read one of those pages tonight, believed two healthy workers were dead, and got as far as messaging them before it was stopped. It never restarted anything, and it caught its own error — but that is the closest this has come to real harm, and it moves the question from “wrong pages nobody has acted on” to “somebody acted.” Second, the person who wrote the fix says its own proof is eight days old and should be re-run rather than trusted, so whichever route you pick, it gets re-verified before anyone calls it done.

Narrowing that risk, measured after the question was first raised: the new code is in the relay only (4 source files). The supervisor has no new code in it — it would restart onto exactly what it runs today. Relay typechecks clean and 115 tests pass, but the full suite and the review gate have not run, because that needs the push.

⚠️ Something you should know before you answer this, because it happened without you. While this exact question — may unreviewed code go live on the two services that run the fleet? — has been sitting here unanswered, a different unreviewed fix was deployed to the supervisor tonight. An agent building a separate repair needed a live end-to-end test to prove its work, deployed it to get one, and told me afterwards. It owns that plainly rather than offering an excuse, and the code was green on its own tests first.

I am telling you because it changes what you are actually deciding. The precedent you are being asked about already exists on this machine, set without your say-so. That cuts both ways: it means “normal path” is now partly a decision about whether to undo something, not only about what to allow next. Reverting is one command — but reverting also restores about 274 wasted agent startups a day, including on the path that escalates problems to you. The agent that did it has said that if your answer is “no”, its fix should come out until it has been reviewed properly, and I would hold it to that.

In plain terms: a fix is written for pages that have been giving 92 wrong instructions. Turning it on means rebooting the two programs that keep everything else running, using code nobody else has checked. The safe route costs a few hours; the fast route is live tonight.
02

Our nightly tests delete real residents’ unrecovered messages

When a text or email arrives and the system is too busy to answer it, it retries three times and then parks the message in a holding queue. That queue is the last thing standing between a lost message and a recovered one — nothing else redrives it.

Our stress-test cleanup wipes that entire queue, unfiltered, twice per run, from three separate suites, every night, against the hardcoded production queue — with errors swallowed. It has been doing this since at least 1 August. Anything sitting in there when a test runs is simply gone, with no record of what it was.

Ten lines above it in the same file, another cleanup function explicitly protects non-test rows. So the discipline exists in that very file; this function just doesn’t use it. I have not touched the nightly schedule — that isn’t mine to change.

In plain terms: our own nightly tests are deleting real customers’ messages — the ones that failed and were waiting to be rescued. It’s empty right now, so tonight almost certainly destroys nothing, but it fires again every night until someone closes it.

One that is NOT a duplicate — please read why

03

The fix for the broken review gate can never have a green check of its own

The decision about #51, #50 and #40 is NOT on this page. It is already in front of you as b87087921 on its own page, better posed than I could put it. Answer it there. This card asks the one thing that page does not cover.

Short version so this card stands alone: the automatic approval check passes only about 4% of the time, and it is holding several pull requests including a security fix. The cause was found this afternoon and it is not what anyone thought. The check looks for a hidden marker in the reviewer’s comment. The reviewer is configured in a mode that only ever edits one running comment — and the tool it must use to do that strips hidden markers out as its very first step. So the marker cannot survive the normal channel. The rare passes are the runs where the reviewer ignored that mode and posted a fresh comment instead, which is why it looks random.

⚠️ Correction to something you may have read from me earlier: I previously said this check had essentially never passed. That was too strong, and I would rather correct it before you decide than after. It passed twice today, unaided — on two different pull requests, one of which merged on it. So the check is intermittent, not dead. That matters, because it means re-running it on a stuck pull request is a real way through, at roughly a 1-in-25 shot each time.

Two things stop that being the answer. A required check that admits a verdict 4% of the time is not a working check, and everything else stuck stays stuck. And of the pull requests actually waiting, two carry a “do not merge” tag that no agent will remove — so winning the re-run lottery would not release them anyway. Only one of the waiting pull requests could be freed that way.

That means the repair is a configuration change, not a rewrite of the checking logic. It is much smaller than feared. It also means a second repository we pointed to as proof this works turns out to lose the marker too — it survives only by keeping a lenient fallback that we deliberately removed.

What this actually comes down to, now that we have measured it: exactly one pull request is truly stuck — the one that fixes the checker. The checker itself tells us so, in two different failure messages: on that one it says the reviewer “did not run to completion” (it refuses to review changes to its own configuration, on purpose); on the others it says the reviewer “ran but posted no summary comment carrying the verdict marker” — approved, then the approval got lost in transit. One is a wall, the others are a flake, and they need different answers.

Fix the one, and the rest clear. Two honest caveats, because I would rather you have the precise version now than discover it after:

One of them will need somebody to press “re-run” once. Checks do not re-run by themselves, and that PR is already up to date so nothing will nudge it. Pressing re-run is not the same as approving something by hand — it just asks the reviewer to look again.
The fix is a well-reasoned prediction, not something we have watched work. We know exactly why the approval is being stripped, and we have a second codebase showing the same symptom — but the first run after it merges is the first real test. If that run still says “no verdict marker”, the diagnosis was wrong and the change should be reverted rather than patched.

You have done a smaller version of this once already. In August, when this same bug ate an approval, you told Smith to record the reviewer’s verdict by hand — the record still says so. That is the lighter form of what is being asked now. It also means this is the second time this bug has cost a manual step, which is the argument for fixing the cause rather than doing it again.

Here is the part that still needs you. The pull request that fixes the gate is the one kind of pull request the reviewer refuses to run on. It will not review a change to its own configuration file — that is a deliberate anti-tampering control and it is correct. So there is no way to make a green check appear on this fix. That is by construction, and no amount of re-running changes it.

⚠️ New tonight, and it turns the repair from “the tidier option” into “the one that addresses the actual cause”. One agent tried the cheap way — just re-running the check until it happens to work — and we now know what that route was really waiting for. The reviewer is under an explicit instruction to only ever update its one running comment, never post a new one. The approval marker only survives in a new comment. So the cheap route was not waiting for luck with formatting or length; it was waiting for the reviewer to break its own instruction. Checked across 65 reviews on thirteen pull requests: the approval marker has never once appeared in the running comment — only ever in a new post. (An earlier version of this paragraph said the two always go together in both directions; that was too strong, and the agent who first told me it corrected itself before you read this. The direction that matters here holds.)

So the honest version of the cost, without over-reading it: seventeen full reviews were spent on one pull request for nothing, and on the measured rate you would expect around 25 attempts on average before the first success, with no ceiling — you can be forty in and still owed a hit. That is an argument about expense and open-ended waiting, not about that pull request being cursed. Two agents pushed back on me for framing it that way, and they were right: seventeen misses at this rate is roughly a coin-flip outcome and says nothing special about that change. I have stopped the re-running. The repair below removes the conflicting instruction entirely, so the approval has somewhere to go by design rather than by luck.

In plain terms: we found out why the checker so rarely says yes, and the fix is smaller than we thought — a setting, not a rebuild. But the fix touches the one file the checker refuses to look at, so when it reaches you there will be no green tick on it, ever. Not because anything failed — because none can exist. What would you like to see instead?

Why the first option is the strong one, with a real example from tonight: “all the tests pass” only tells you a suite went green — it doesn’t tell you the suite can fail. On another change tonight, someone deliberately broke the code and watched 20 tests go red, which proved those tests were really watching. Then they tried the same trick on the checker’s own tests — edited the exact line under repair — and all 53 still passed. Those tests had never been able to see that line at all. A green tick would have told you nothing there. Breaking it on purpose is what found it.

One more, and it is thirty seconds of your time

04

Two of those pull requests carry a “do not merge” tag, and only you can lift it

This is the thing you would otherwise discover after deciding question 3. Fixing the approval checker does not actually release everything waiting on it. Two of the three pull requests also carry a do-not-merge tag, and our standing rule is that no agent removes one. So after the checker is fixed, those two would still sit there.

Here is the honest complication, and I am giving you the side that argues against my own recommendation. The tag on these was almost certainly applied by our own automation, not by you — eleven seconds after the pull request was opened, by tooling that signs in under your account, so the record genuinely cannot tell you apart from an agent. The tag’s own description says “a human or owning operator has an outstanding concern. Never remove someone else’s” — which arguably lets the agent that applied it take it back off. And on one of them you were already asked about that exact tag nine days ago, told the concern behind it was fixed, and said “merge it and deploy now.”

So there is a real case that this needs nothing from you. I am asking anyway, because it costs you one click on a page you are already reading, and the alternative is an agent deciding its own do-not-merge tag no longer applies — which is exactly the reasoning that turns a safety rule into a formality. The operator holding it made that argument to me and then explicitly declined to act on it, which is why I trust the argument and still want your word.

In plain terms: two pull requests have a “don’t merge this” sticker on them. The sticker was probably put there by our own robot, not by you, and the rules arguably let that robot take it off again. I would rather you just told us, because “the robot decided its own warning sticker didn’t count” is how safety rules quietly stop meaning anything. One answer covers both.

And the one that is actually about a person

05

The first collections text we have ever sent is ready. It cannot be sent by pressing approve.

You chose how this should happen: “You hand-pick one resident and watch it end to end — smallest balance, English, online payer, no dispute history.” That is done. The resident is a three-and-a-half-year tenant at Camellia who genuinely owes $1,150 of August rent — re-checked against the live system minutes ago, not from an earlier reading. She has never been contacted by this system in any way, ever. Her portal is active and she has used it for seven of her last twelve rents. No opt-out, no complaint, no dispute, nothing suppressed.

Both things that were blocking are not just merged but running in production and observed doing their job: the balance fix cleared $43,683.70 of debt that residents had already paid, and her contact window is now computed from her own phone number — 8am to 9pm Denver time, and she is inside it.

⚠️ Here is the snag, and it is why this is a question rather than a notification. We cannot send by approving something, because there is nothing approvable left: every one of the 77 queued items, across 48 residents, has gone stale and can no longer be approved. Approvals expire after 48 hours, nothing has been approved since 28 July, and the reminder schedule only comes round every three weeks — so in practice an item is approvable about two days in seven. To send at all, we first have to create a fresh record for her. That writes to the live system. It texts nobody by itself.

I asked for a second opinion and it could not decide: it gave a different answer depending on which order the options were listed. That is not a judgement, so I am not dressing it up as one — but it did establish the stale-queue mechanism above, which neither I nor the operator had.

In plain terms: we are ready to text a real resident about money for the first time, and she is the right person to start with — she really does owe it, she has never heard from us before, and it would arrive at a reasonable hour where she lives. But the queue everything was supposed to flow through has gone stale, so we would have to create her record by hand first. That is two separate actions: make the record, then send the text. My suggestion is to do only the first, and let you look at the real thing before anybody gets a message. “Not yet” is a perfectly good answer and costs almost nothing.

Three things the operator raised against sending, unprompted, which I am not going to bury: this would be her first ever contact from us in three and a half years and it would be about money she owes — a judgement about tone, not a defect. The message quotes $1,150 (rent) but her portal will show $1,190, because there is a separate $40 charge and the copy deliberately never invents a combined figure. And she is late by her own habit — she usually pays between the 1st and the 14th — but she is never late under the property’s own 25-day grace period, so “flawless payer” would overstate it and “reliable” is accurate.

On timing — this is here to take pressure off, not to add any. It is legal to text her between 8am and 9pm her time, and it is currently late afternoon in Denver. If you answer in the next few hours she could be messaged this evening; if you answer later, the earliest it goes is 8am her time tomorrow. Nothing degrades either way — the balance is re-checked live before anything sends, and it has already been re-read four times today without changing. The operator holding this said it better than I can: a first send squeezed against a closing window is exactly the shape where someone skips a check, and it would rather roll to morning than be rushed. So please take the time you want. If your answer arrives after her evening cut-off, it will simply be carried out in the morning — the authorisation is for a message, not for a moment.

nothing picked yet
Pick an option above and your answers will appear here, ready to copy.
PropFlow Docs