Build a component this server has never built

"Not built here" was the one state nothing could clear. With no recorded
commit a component was not stale, so Update built nothing, so no build
ever wrote a record -- the card said it, and Pull, Update and the
project's own button all did nothing about it, for ever. Worst for a
server component, which the output check beside this one skips by
design, having no APK to look for: that is why ai-app's backend sat
there saying it after an Update that otherwise worked.

Measured on a two-component fixture rather than argued. Before:
/prepare answers `components: []` and the freshness is unchanged
afterwards. After: the same call reports `step: "building"`, the card
reads `current`, and `builtFrom` is on disk.

So `nothing_built` asks the record as well as the output. The cost is
one rebuild per component on a machine whose records were lost, which
was the objection when this was written the other way round -- and is
the right price now that the state is visible on the card. It is
self-clearing: the first build writes the record and the question is
never asked again.

That leaves NotBuiltHere meaning exactly one thing, a component with no
build command, where nothing was ever going to measure anything and no
button would change it. Quiet and unflagged, as against NeverBuilt,
which is flagged and has a Build beside it. One word had been covering
both.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
irisandClaude Opus 5 committed 2026-09-02 23:49:36 -04:00
1 parent ce1f02b98f
commit 663626345a
2 files changed
+137 -26

No files matched your search

+28
View File
@@ -587,6 +587,34 @@ mutable at runtime from the phone.
differ in nothing but the label and the old one said "Pulling and
building" for all three.
- **"This server has never built it" is something to build, not
something to sit on** -- and getting that backwards made it the one
state nothing could clear. `component_is_stale` treated a missing
`built_from` as no evidence of staleness, so Update built nothing, so
no build ever wrote the record: a card reading "not built here" with
Pull, Update and the project's own button all doing nothing about it,
for ever. Worst for a `Server`, which the output check beside it
deliberately skips (it has no APK to look for), so nothing else could
rescue it. Measured on a two-component fixture rather than argued:
`/prepare` answered `components: []` and the freshness was unchanged
afterwards; with the fix the same call reports `step: "building"` and
the card reads `current`.
So `nothing_built` now asks the record as well as the output, and the
cost is one rebuild per component on a machine whose records were lost
-- which was the objection when it was written the other way, and is
the right price now that the state is *visible*. It is self-clearing:
the first build writes the record and the question is never asked
again.
Which leaves `NotBuiltHere` meaning exactly one thing: a component with
**no build command**, where nothing here was ever going to measure
anything and no button would change it. That is the whole difference
between it and `NeverBuilt` -- one is actionable and flagged, the other
is quiet, and they were one word covering both.
`nothing_built` takes the record map rather than reading it: a `lock()`
temporary inside a call's argument list stays held for the whole call,
and a test helper doing exactly that deadlocked the moment anything
under it wanted the same lock.
- **Freshness says *which* answer it is, and only three of them read as
out of date.** `Freshness` was `current | behind | unknown`, and the
card drew unknown as nothing at all -- so a component this server had