<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Process on PHP Boy Scout</title><link>https://phpboyscout.uk/tags/process/</link><description>Recent content in Process on PHP Boy Scout</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><copyright>Matt Cockayne</copyright><lastBuildDate>Tue, 25 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://phpboyscout.uk/tags/process/index.xml" rel="self" type="application/rss+xml"/><item><title>Which one needs me next</title><link>https://phpboyscout.uk/which-one-needs-me-next/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://phpboyscout.uk/which-one-needs-me-next/</guid><description>&lt;img src="https://phpboyscout.uk/which-one-needs-me-next/cover-which-one-needs-me-next.png" alt="Featured image of post Which one needs me next" /&gt;&lt;p&gt;A message arrived in one of my sessions from another one of my sessions. I read it, did what it asked, and thought absolutely nothing of it for the better part of a week.&lt;/p&gt;
&lt;p&gt;Which, when it finally landed, was the odd bit. Nobody had built that. I certainly hadn&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id="the-feature-i-was-using-without-noticing"&gt;The feature I was using without noticing
&lt;/h2&gt;&lt;p&gt;It turns out &lt;a class="link" href="https://phpboyscout.uk/ready-for-human/" &gt;Claude Code grew cross-session messaging&lt;/a&gt; a fortnight or so before any of this, and it&amp;rsquo;s about as simple as a feature gets: a session can list the others running on the machine and write to one of them by name. Plain text, no history and no files, over a socket that never leaves the box. Nothing to enable and nothing to configure, which is exactly why I never noticed it arrive. My sessions started talking to each other, I read what they said and carried on, because a message from a session that knows what it&amp;rsquo;s on about looks a lot like a session doing its job.&lt;/p&gt;
&lt;p&gt;My first real thought wasn&amp;rsquo;t &amp;ldquo;what a nice feature&amp;rdquo;, though. It was that if they can reach each other, something a good deal more interesting than status updates is on the table!&lt;/p&gt;
&lt;p&gt;Because the estate is spread across a lot of repositories and the work stubbornly refuses to respect that. A change to the CI components drags three consumers behind it. A convention that lands in the framework wants backporting into four modules. An encryption decision touches the signing tool, the infra that provisions the key, and the docs describing both. Cross-project initiatives, if you want the tidy phrase, and every one of them had been coordinated by me, in my head, across ten terminals, badly.&lt;/p&gt;
&lt;p&gt;That was the ambition. Underneath it sits a narrower problem I&amp;rsquo;d been misdiagnosing for months, because running ten sessions presents as a capacity problem: ten of something, one of you, so the constraint must be throughput. Except the throughput is fine and the estate ships. What fails is that I lose track of &lt;strong&gt;which ones need me, and in what order&lt;/strong&gt;&amp;hellip; and a session waiting on me does nothing whatever while looking exactly like a session that&amp;rsquo;s busy. Everything&amp;rsquo;s moving, nothing&amp;rsquo;s on fire, and if you ask me what any one of them is doing I&amp;rsquo;ll tell you inside thirty seconds. Ask me which one is stuck and I&amp;rsquo;ve no idea, because the only way to find out was to cycle through eleven tmux panes reading the last few lines of each, which I did more mornings than I&amp;rsquo;d care to count.&lt;/p&gt;
&lt;h2 id="i-called-it-a-coordinator-and-that-was-the-first-thing-i-got-wrong"&gt;I called it a coordinator, and that was the first thing I got wrong
&lt;/h2&gt;&lt;p&gt;The word I reached for was &lt;em&gt;coordinator&lt;/em&gt;, and the genre online reaches for much the same: chief of staff, orchestrator, team lead. I didn&amp;rsquo;t want any of it, and not out of squeamishness about hierarchy. It&amp;rsquo;s that the hierarchy isn&amp;rsquo;t there. Read a week of the traffic and not one message reads as an instruction handed down from a superior; it&amp;rsquo;s peers correcting each other, occasionally with a retraction and an apology attached, once with a session telling another its reasoning was better and withdrawing its own suggestion. Put a coordinator on top of that and you&amp;rsquo;ve described something that isn&amp;rsquo;t happening&amp;hellip; and a metaphor describing the wrong thing will, given long enough, build the wrong thing.&lt;/p&gt;
&lt;p&gt;So it became a standup. A ceremony you attend rather than a rank you hold, and one that assigns nothing to anybody.&lt;/p&gt;
&lt;h2 id="the-obvious-approach-is-the-wrong-one"&gt;The obvious approach is the wrong one
&lt;/h2&gt;&lt;p&gt;My first instinct, and I&amp;rsquo;d guess yours, is to message every session and ask how it&amp;rsquo;s getting on: the software equivalent of walking the floor, and cheap and friendly and obviously correct. Every skill I found in this genre does exactly that, and for eleven sessions it&amp;rsquo;s eleven turns and eleven interruptions. What comes back is a summary written to reassure, composed by a session with every reason to present its own state as under control.&lt;/p&gt;
&lt;p&gt;The alternative had been sat in front of me the whole time. Every message these sessions have sent each other is &lt;strong&gt;already written down&lt;/strong&gt;, both sides of it, in the transcripts, on the machine, right now. Nothing has to be woken up so I can read it, and sweeping the whole estate took three and a half seconds. It also hands you what neither participant has, because a session only ever sees its own side: it knows what it said and what came back, and hasn&amp;rsquo;t a clue the same question is being settled differently two repos over.&lt;/p&gt;
&lt;p&gt;So I built that, ran it, and produced a rather pleasing report of who was doing what.&lt;/p&gt;
&lt;h2 id="then-i-checked-and-my-report-was-wrong"&gt;Then I checked, and my report was wrong
&lt;/h2&gt;&lt;p&gt;The report said &lt;code&gt;keryx&lt;/code&gt; needed me, quoting its own words back: &lt;em&gt;&amp;ldquo;write the report to the wiki, park the spike in a project snippet, delete it from the tree, then draft the superseding spec. Shall I carry on?&amp;rdquo;&lt;/em&gt; Four steps held behind one yes. It said &lt;code&gt;cicd&lt;/code&gt; was waiting on a merge request. And it filed &lt;code&gt;krites&lt;/code&gt; and &lt;code&gt;sigillum&lt;/code&gt; as safe to leave.&lt;/p&gt;
&lt;p&gt;Then I did the expensive thing and actually asked them.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;keryx&lt;/code&gt; had moved on hours before and shipped v0.12.0. The merge request &lt;code&gt;cicd&lt;/code&gt; was waiting on had already been merged. And the two I&amp;rsquo;d filed as safe to leave were both &lt;strong&gt;blocked on me&lt;/strong&gt;, one of them badly: &lt;code&gt;krites&lt;/code&gt; had a v0.9.0 tag out in the world with no release files behind it, so anybody running &lt;code&gt;krites update&lt;/code&gt; (which is, you know, the point of shipping it) was getting nothing at all. It needed one job re-run. It had needed it for hours.&lt;/p&gt;
&lt;p&gt;Three wrong out of five, and they were &lt;strong&gt;wrong in one direction&lt;/strong&gt;, which is the part that matters. Not noise.&lt;/p&gt;
&lt;p&gt;The sweep hadn&amp;rsquo;t malfunctioned, mind. It did precisely what I built it to do: it read the past, accurately, and I was the one who picked that up and treated it as a picture of the present. A session that finished at five still looks, in the transcripts, exactly like the session that was mid-sentence at five, and nothing about a transcript was ever going to tell me the difference. That&amp;rsquo;s my error and it&amp;rsquo;s a fairly basic one.&lt;/p&gt;
&lt;p&gt;And underneath that, the bit worth carrying away. &lt;strong&gt;A session blocked on me has no reason to message a peer at all.&lt;/strong&gt; No other session can approve an implementation, or re-run a release job on my behalf, or make a call that was always going to be mine. There&amp;rsquo;s nobody to write to. It writes to nobody, then, and generates not one byte of traffic, and my clever free sweep sees a session with no outbound messages and files it as fine&amp;hellip; which is kinda the whole problem in one sentence.&lt;/p&gt;
&lt;p&gt;The wire tells you who is &lt;em&gt;talking&lt;/em&gt;. It cannot tell you who is &lt;em&gt;stuck&lt;/em&gt;, because being stuck on a human is exactly the state that produces no evidence&amp;hellip; which is the same shape as &lt;a class="link" href="https://phpboyscout.uk/ready-for-human/" &gt;the fourteen tickets&lt;/a&gt; only a person can close, wearing a different coat, and by now I doubt that&amp;rsquo;s a coincidence.&lt;/p&gt;
&lt;p&gt;Now, the tempting move here is to pick one. Drop the sweep because it lies, or drop the check because it costs, and have a single clean mechanism. There isn&amp;rsquo;t one. The cheap thing is always going to be stale and the accurate thing is always going to interrupt, and no amount of cleverness collapses that into a free lunch&amp;hellip; so it wants to be both, with the difference between them understood.&lt;/p&gt;
&lt;p&gt;A sweep that reads what already happened, run every time, because it costs nothing and wakes nobody. And a check that asks every live session to describe its own state, which interrupts all of them and is therefore something you &lt;em&gt;call&lt;/em&gt; rather than something that runs. Put a standup on a timer and the judgement about whether the interruption is worth it stops being made at all, which automates away the only part that needed a person.&lt;/p&gt;
&lt;h2 id="two-messages-and-no-others"&gt;Two messages, and no others
&lt;/h2&gt;&lt;p&gt;Which brings me to the rule I was least sure about, and the one my own data settled.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d assumed a coordinator ought to be able to nudge: chase a stalled thread, stand down work that&amp;rsquo;s been overtaken, pass on a warning. Then I went and counted what the sessions had actually been doing. Nineteen threads. &lt;strong&gt;Six were opened because I spotted a connection between two sessions and routed it&lt;/strong&gt;, and those six carry sixty-three of the hundred-and-one messages, one of them running to forty-seven across three repos, settling a design question and catching a real bug before it shipped. The other thirteen are self-started, and every one is short and reactive: a collision, a heads-up, a stand-down, a retraction.&lt;/p&gt;
&lt;p&gt;That split is structural rather than behavioural, and once you see it the design writes itself. &lt;strong&gt;Sessions are perfectly good at spotting their own hazards&lt;/strong&gt; and send those warnings unprompted, so relaying them adds nothing but a hop where a claim travels unchecked. &lt;strong&gt;No session can spot a connection between two other sessions&lt;/strong&gt;, because none of them sees sideways. Only I could&amp;hellip; and my name is in the first paragraph of all six of the deep ones because of it.&lt;/p&gt;
&lt;p&gt;So the standup sends exactly two things. An &lt;strong&gt;introduction&lt;/strong&gt;, which says &amp;ldquo;you two are circling the same question, go and talk&amp;rdquo;, carries the pointer and the provenance and never once the finding itself, and states plainly what it hasn&amp;rsquo;t checked. And a &lt;strong&gt;progress check&lt;/strong&gt;, which asks a session to describe its own state in its own words. That&amp;rsquo;s the entire list, and everything I wanted to add to it over the following week turned out on inspection to be a bad idea.&lt;/p&gt;
&lt;p&gt;Everything reactive stays with whoever owns the fact. &lt;em&gt;Nullius in verba&lt;/em&gt;, as the Royal Society has had it for three hundred and fifty years, which is a very grand way of saying go and check it yourself. The temptation to relay is strong, because the coordinator is &lt;em&gt;right there&lt;/em&gt; and can see everything, and I have the receipt for what that costs: one session told another a build target took sixty-three minutes, the second reasoned from it in good faith for a quarter of an hour, and then the first came back with a retraction and an apology for handing over a bad number. That was between two sessions that owned their own facts. Add a well-meaning middleman and you&amp;rsquo;ve built a machine for laundering unverified claims into confident ones, at speed, across an entire estate.&lt;/p&gt;
&lt;p&gt;An introduction is safe for a boring, specific reason: it carries no claim. It says who said what and when, admits what it hasn&amp;rsquo;t checked, and gets out of the way so the two of them can verify between themselves. Which they&amp;rsquo;re better at than I am.&lt;/p&gt;
&lt;h2 id="where-it-leaves-me"&gt;Where it leaves me
&lt;/h2&gt;&lt;p&gt;Not with fewer decisions, which is the thing I&amp;rsquo;d half hoped for. The decisions are the residue and they were never going anywhere.&lt;/p&gt;
&lt;p&gt;Granted, I&amp;rsquo;ve no idea what any of this looks like at thirty sessions. It works at eleven because eleven is a number I can still read in a sitting, and the whole apparatus rests on that being true. I&amp;rsquo;m not in a hurry to find out where it breaks.&lt;/p&gt;
&lt;p&gt;What changes is that they arrive on a list, rather than arriving because I happened to glance at the right terminal at the right moment. If you&amp;rsquo;re running a few of these yourself, that&amp;rsquo;s the bit I&amp;rsquo;d steal. And &lt;code&gt;krites&lt;/code&gt;, sitting on a broken release all morning, silently, not bothering a soul, gets to be the line at the top of it.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a small thing to have spent a morning on. It&amp;rsquo;s also the difference between eleven sessions working and eleven sessions running.&lt;/p&gt;</description></item></channel></rss>