StockPlusAll issues

Issue 01

428 insider transactions. Six of them were someone buying.

Behzod Halil··7 min read

Key takeaways

  • Of 428 insider transactions filed in the 30 days to 6 September 2026, 6 were open-market purchases. 198 were sales, 91 were option exercises and 73 were shares withheld to pay tax.
  • 41 congressional stock disclosures landed in the same window. Apple was named by three separate members, Alphabet and Procter & Gamble by two each.
  • Across 249 rows of the 28 August House Clerk snapshot, the median gap from trade to filing was 19 days, and no row was late under either STOCK Act deadline.
  • The 45-day deadline is rarely the binding one. The rule is the earlier of 45 days from the trade or 30 days from the member being notified, and the median member filed 6 days after being notified.
  • On the build side: 107 pull requests merged, version 0.0.7 cut, and a 20-second keepalive was found to be closing every Android price connection it was meant to hold open.

Four hundred and twenty-eight insider transactions were filed in the thirty days to this Sunday. Six of them were someone spending their own money to buy shares.

That gap is the whole reason this letter exists. A count of filings looks like a signal right up to the moment you ask what it is counting, and most weeks the answer is that it is counting paperwork. This issue walks the two datasets StockPlus reads, says what was in them, and then says what changed in the app that reads them.

What the insider filings actually contained

Every row here is a Form 4 filed with the SEC in the thirty days ending 6 September 2026. Form 4 carries a one-letter transaction code, and the code is the entire story:

CodeWhat it meansRows
SSale198
MExercise of an option or other derivative91
FShares handed back to cover the tax bill73
CConversion of a derivative security27
AGrant, award or other acquisition from the issuer22
GGift9
POpen-market purchase6
IDiscretionary transaction2
428 Form 4 transactions, 30 days to 6 September 2026. Source: StockPlus production data.

Six purchases. They came to about $2.4m between them, against 198 sales. The three biggest categories after selling are not trades at all in any meaningful sense: an M is an executive exercising options they were granted years ago, an F is shares going straight back to the company to settle the tax on a vesting event, and an A is the company handing over stock as pay.

This matters because of how the number usually gets reported. A tracker that treats option exercises and company grants as buying would report 119 insider buys in this window rather than 6. It is not a rounding error, it is a different claim. StockPlus counts P, and only P, as a purchase. If you want the long version of why, the Form 4 guide goes code by code.

None of this is a recommendation, and an open-market purchase is not a prediction. Executives buy for reasons that have nothing to do with the next quarter, and six rows is far too few to draw a conclusion from. It is a description of what was filed.

Congress: 41 disclosures, and Apple three times

Forty-one congressional stock transactions were disclosed in the same thirty-day window. Most tickers appeared once. Three did not:

Three members reaching for the same megacap in one month is a coincidence worth naming and not much more. Megacaps dominate this dataset generally: across the 330 ticker rows in the House Clerk snapshot, Amazon appears 12 times, Alphabet 11, Nvidia 10, Microsoft and Apple 9 each. The reason to print a crosscut anyway is that it is the one shape a single filing cannot have, and it is the shape the app is built to surface.

Whose account was it

A periodic transaction report names an owner, and the owner is frequently not the member. Of the 41 disclosures, 19 were filed against a joint account and 7 against a spouse. The remaining 15 carry no owner code at all in the source document, so they cannot be attributed either way without guessing.

Reporting those 26 as “the congressman bought” is the most common error in this dataset, and collapsing joint and spouse into one bucket is the second most common. They are separate codes because they describe different things.

The filing lag, measured over 249 rows

Filing lag is the number every congressional tracker quotes and almost nobody sources. Here it is computed from the House Clerk snapshot dated 28 August 2026, 250 rows, of which 1 was dropped because its dates cannot be true in the order given:

IntervalMedianMeanLongest
Trade to notification6 days9.3 days36 days
Notification to filing6 days9.7 days30 days
Trade to filing19 days18.9 days44 days
249 rows, House Clerk snapshot of 28 August 2026.

Ninety-seven of those rows were filed within 15 days of the trade, 113 between 16 and 30 days, and 39 between 31 and 45. None took longer than 45 days, and none missed either statutory deadline.

That last point needs the rule stated properly, because the popular version of it is wrong. The STOCK Act deadline is not 45 days. It is the earlier of 45 days after the transaction or 30 days after the member is notified of it. The median member in this snapshot was notified 6 days after the trade and filed 6 days after that. Copy that describes members filing at the forty-five-day buzzer is describing a ceiling nobody in this data was near.

The longer version of this study, with the full distribution and the survivorship caveat that comes with it, is at congressional disclosure lag. The live filings are on the congress trades page.

What we shipped

107 pull requests merged between 30 August and 6 September, and version 0.0.7 went out. Three of those are worth writing down, and all three are the same kind of bug as the insider count above: a number that looked fine until someone asked what it was counting.

The keepalive was doing the killing

The app holds a websocket open for live prices and sent a ping down it every 20 seconds to stop the connection going idle. On Android that ping was closing the socket. The HTTP engine the Android build uses can write text, binary and close frames and nothing else, so the ping fell through to an unsupported-frame branch, which threw, which ran the cleanup that closes the connection.

Production logs for 5 and 6 September measure it exactly: 368 connections, a median lifetime of 20.1 seconds, and 334 of them closed with the engine’s own internal-error reason. The keepalive killed the connection it existed to keep alive, on a 20-second timer, on every Android device.

The reported symptom was not “prices stop updating”. It was a burst of authentication failures, which turned out to be downstream: every reconnect redoes the handshake, so once the access token expired the whole watchlist reconnected with the dead token at the same instant and a routine token refresh looked like a session collapse. Nothing was wrong with the login path. Pings now happen at the transport layer, which is the only layer that can send one.

Every lifecycle email had been failing

The email job reported 0 candidates, 0 sent and looked like a quiet week. It was not quiet. The provider was rejecting every message with a 403, because the sending key was authorised for one domain and the app was sending from another. Mail now goes from the domain the key actually covers, and the welcome email goes out on signup rather than whenever the next daily pass happened to run.

A missing value rendered as a confident answer

Every search row in the app carried a market-session badge, and every one of them read “Closed”, around the clock, including while the market was open. The same instrument opened from those results said “Pre-market, opens 9:30 AM ET” at the same moment, which is how it was caught.

Search rows never carry a session at all. A session is a fact about the market, not about a row, so the field was simply absent. The helper that turns that field into a badge compared the absent value against the string open, got false, and fell through to its else branch, which was Closed. Nothing was broken enough to throw. The function was asked a question it had no data to answer, and gave a confident wrong answer instead of no answer.

It now returns nothing when there is no signal, and the callers hide the badge rather than pick a default. That is the same correction as counting only Pas a purchase: the honest output for “we do not know” is silence, not the most plausible-looking value.

Next week

The quarterly institutional filings are one quarter behind: the newest data we hold is 2026 Q1, and the 2026 Q2 deadline passed on 14 August. Catching that up is the next job, and it is the sort of gap that is worth stating out loud rather than papering over with a number that looks current.

StockPlus is a filings tracker. Everything above describes public documents that were filed with the SEC and the House Clerk. It is not investment advice, not a recommendation, and not a claim about what any security will do next.

Try it before you decide.

Free to start, no card required. One AI briefing each morning, a live watchlist, and alerts that actually matter.