Repository navigation
Update: one lazurio update brings content, builds and Lazurio itself up to date; Open synchronizes its module (DEV-6656, root 0212) - #622
Conversation
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113993c to
76a6a11
Compare
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
76a6a11 to
18e4671
Compare
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
18e4671 to
4d51db0
Compare
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4d51db0 to
12f233b
Compare
…s fetched (DEV-6682, F62) lazurio update's tools part (#622) now makes the Bun the moved modules pin available before any build, and its lines reach the page. Each pin is a row named Bun after the modules and before Lazurio: "Stahuje se verze 1.4.3" / "Fetching version 1.4.3" while it is made available, "Stažena verze 1.4.3" / "Version 1.4.3 fetched" once it is, or a finding in plain words: not fetched now (offline, or not tried after that), a download that failed its check, no room on the disk, or not prepared. A Bun that was there already and the tools part as a whole have no row; no code or path is shown. The preview's scripted run pins a Bun for Deals, and a headless Chrome check of the page shows the Bun row fetching while Deals waits and fetched before Deals builds. F47's addendum of 2026-10-24 names the rows and the tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12f233b to
3dcee08
Compare
…s fetched (DEV-6682, F62) lazurio update's tools part (#622) now makes the Bun the moved modules pin available before any build, and its lines reach the page. Each pin is a row named Bun after the modules and before Lazurio: "Stahuje se verze 1.4.3" / "Fetching version 1.4.3" while it is made available, "Stažena verze 1.4.3" / "Version 1.4.3 fetched" once it is, or a finding in plain words: not fetched now (offline, or not tried after that), a download that failed its check, no room on the disk, or not prepared. A Bun that was there already and the tools part as a whole have no row; no code or path is shown. The preview's scripted run pins a Bun for Deals, and a headless Chrome check of the page shows the Bun row fetching while Deals waits and fetched before Deals builds. F47's addendum of 2026-10-24 names the rows and the tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agentrozjedemeai
left a comment
There was a problem hiding this comment.
CHANGES_REQUESTED on 3dcee08. In src/modules/module-operations.ts:2262, runtimePins converts every readPinnedBun failure into null. A moved app with an unreadable, missing, invalid or unsupported package.json therefore contributes no pin and no tools failure item, although the update contract says pins that cannot be read produce one failed tools-part item. The next build may fail, but an unopened app has no build item either, so the update can appear clean while pre-warm silently skipped its declaration. Let the read failure propagate to updateEverything’s tools catch (or collect and report it explicitly), retaining null only for a successfully read package with no pin; add a real runtimePins test for a malformed/unreadable package. Independent focused checks on the stacked head: static checks passed; update-everything 14/14, module-built 24/24, bun-runtime 11 pass/1 opt-in skip, launchpad-update 3/3. Tests used Bun 1.4.4 on macOS; repository pins 1.4.2. No merge/release performed.
…up to date; Open synchronizes its module Root decision 0212 points 3, 4, 5 and 7 (plan DEV-6656), decision F9's second amendment of 2026-10-24. Plain `lazurio update` now runs one composition (`updateEverything`): the content (`syncContent` for every Organization the Environment holds), the builds of what changed (`refreshBuilt`: every built app with a build state whose checkout moved past its build, built and swapped in through F58), a seam for the tools modules declare (DEV-6682) and Lazurio itself last, because its activation restarts the Launchpad. Each part keeps its core, lock and outcome; one that fails never stops the next. `--json` keeps the product's answer and adds `items`, one per repository, built app and the product; the exit status stays the product's. `--version`, `--check` and the pill stay Lazurio only. The installed Launchpad runs the same composition as a job for Nová karta's Aktualizovat (`POST`/`GET /api/update/everything`, behind the existing admission; a click while one runs joins it), with Lazurio last through the pill's own action (`updateNow`). After a person's Start or Open, or the gateway's `ensure` of a navigation, the module's checkout is synchronized in the background (`createOpenSync`): once per module in 5 minutes, never for a checkout or root the last round left blocked, never before the answer; the build watcher builds and swaps. Tests: tests/update-everything.test.ts, the new cases in tests/module-built.test.ts (real git and builds through the CLI and the Launchpad's run) and tests/launchpad-update.test.ts. Docs: update.md, content-sync.md, F9's second amendment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…em reasons stay out of the update's error contexts CI on #622: the compiled product's update test reads the exact answer of `lazurio update --json` where no Folder is known, and the guard of the recover prompt finds every `reason:` literal in src/update as an error context id. Without a Folder the command is now Lazurio's alone, with no `items` (as the docs already said), and the items' reasons are typed constants of the composition (`contentNotRun`, `partFailed`, `productNotInstalled`), not context literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The DEV-6682 thread and this plan agreed on the order sync → tools → builds, so that a build never runs before the Bun its module pins is there. The tools part is still a seam with nothing in it; it now sits between content and builds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pin (DEV-6682) The tests come before the implementation, with #626's seams and no network: the resolver a start uses with Bun's installer as a fake, and on the real consumer (real git, real builds) a module whose published commit pins a Bun the cache does not hold. They fix the semantics agreed with the DEV-6682 thread. A pin not cached is fetched after content and before the build that needs it, and only for the module checkouts this run fast-forwarded. Offline, the first runtime-unavailable ends the pre-warm and the pins after it are not-fetched, never tried. Every other refusal is an item with its reason and the pre-warm goes on; a download that did not verify is a warning. The user's own Bun is not fetched. The update never fails because of tools. The CLI's JSON now lists the user's own Bun as a cached tools item, and a build whose pinned Bun could not be fetched is built again by a later update. These tests fail until the next two commits land. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…before any build (DEV-6682, F62 point 9) The tools part was a no-op seam. It now reads the Bun each app of the module checkouts the content part fast-forwarded in this run pins (runtimePins in the module core, from the commits it brought, each pin once) and makes it available with prewarmModuleRuntimes and the module core's own resolver, the one its builds use. It runs after content and before builds, one pin at a time, each pin a fetching step and then an item with part "tools": cached (the user's Bun or the runtime cache had it), fetched, refused with the reason a start would give (warning: true for runtime-integrity-failed), or not-fetched after the first runtime-unavailable, which ends the pre-warm for the run. It never fails the update; the exit status stays the product's. Nothing moved, nothing is read. Apps whose checkout did not move are not pre-warmed, even with a build state whose pin is not cached: a pin changes only with a commit, and each build resolves its own pin through the same resolver before its script runs (F62 point 6). The CLI prints a line per pinned Bun fetched or not; the Launchpad's Aktualizovat job runs the same part with its own resolver. docs/update.md, F9's second amendment (point 7, alternatives, tests, risks) and F62 point 9 say the tools part is real now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t be fetched (F62 point 7) refreshBuilt was written before decision F62 and skipped every checkout whose last build failed. Since #626 the builder builds such a checkout again when what failed may pass by itself (runtime-unavailable, runtime-disk-full), and so does the background sweep; refreshBuilt now agrees with it. Without this, an update after an offline one answered the old runtime-unavailable failure instead of building the app now that the registry answers. A failed build script still waits for an explicit build. The real-consumer test of the tools part covers it: offline the build fails for its runtime, and the next run, with nothing new to fast-forward, builds it with its pinned Bun. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…un answers from the disk (DEV-6682 decisions, F62 point 9) The DEV-6682 thread approved the tools part and decided its two open points. First, one run gets one answer about the network. The pre-warm's first runtime-unavailable, and no other reason, is held in memory for the rest of that run and handed to its builds (refreshBuilt's registryUnavailable). A build whose pinned Bun is neither the user's nor in the runtime cache then refuses at once with runtime-unavailable after a local lookup, and the next run builds it. A pin that is there builds as always. A person's start, Open or build outside the run, and the sweep, still ask the registry themselves. Second, after the stop each remaining pin is looked up without the network, so a Bun the user or the cache already has is cached, not not-fetched. The lookup is the resolver's own: fetch: false reads the user's Bun and the cache as they are, without the version's exclusion (a fetch under way elsewhere is not waited for), and refuses runtime-unavailable otherwise. Before, an offline update waited for the registry again in every build whose pin it had not fetched, up to the fetch bound each on a network that drops packets. Tests: the lookup in bun-runtime (never the installer, no wait for a held exclusion); the offline pre-warm with cached and not-fetched pins after the stop; the run's answer reaching its builds by runtime-unavailable alone and never the next run; and on real git and builds, no second attempt by the run's build, a person's build still asking, a later run building, and a cached pin building under the offline answer. F62 point 9 gains one sentence; F9's second amendment point 7, alternatives, tests and risks, and docs/update.md follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…art a failed item, never silently clean The review of #622 on 3dcee08 found that runtimePins turned every readPinnedBun failure into "no pin". A moved app whose package.json was missing, unreadable or pinned something other than an exact Bun added no pin and no item, although F9's second amendment point 7 says pins that cannot be read are one failed item of the part. An app nobody opened has no build item either, so the update looked clean while the pre-warm had skipped its declaration. runtimePins now answers the pins it read and how many it could not: every app the module declares is read, only a package that was read and pins nothing adds nothing, and a moved module the catalog does not declare counts too. The composition pre-warms the pins that were read, then sets the one failed tools item. The CLI says which part it was and that a start or build of those apps names the reason. Tests: a real runtimePins on the module core (a pin read once, a package without one, a pin that is not an exact Bun, a package.json that is gone, a moved path not declared), and the composition pre-warming the readable pins before the failed item. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3dcee08 to
2b3eefe
Compare
…s fetched (DEV-6682, F62) lazurio update's tools part (#622) now makes the Bun the moved modules pin available before any build, and its lines reach the page. Each pin is a row named Bun after the modules and before Lazurio: "Stahuje se verze 1.4.3" / "Fetching version 1.4.3" while it is made available, "Stažena verze 1.4.3" / "Version 1.4.3 fetched" once it is, or a finding in plain words: not fetched now (offline, or not tried after that), a download that failed its check, no room on the disk, or not prepared. A Bun that was there already and the tools part as a whole have no row; no code or path is shown. The preview's scripted run pins a Bun for Deals, and a headless Chrome check of the page shows the Bun row fetching while Deals waits and fetched before Deals builds. F47's addendum of 2026-10-24 names the rows and the tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#622's review fix makes the tools part's pins an answer with how many could not be read ({ pins, unreadable }). The preview's scripted run of Aktualizovat follows it, so the script typechecks again; the page and its rows are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thank you for the review on 3dcee08 (#622 (review)). The finding is a real defect, a contradiction between the code and F9's second amendment point 7, and it is fixed in 2b3eefe. That is the reviewed head's commits plus the fix, rebased onto main 0cfd5b9, which changes only CI workflows (#640):
On the Bun version: my local runs used Bun 1.4.2, the repository's pin; CI uses the same pin. #624 is rebased onto 2b3eefe with its two reviewed patches unchanged ( |
agentrozjedemeai
left a comment
There was a problem hiding this comment.
@immakermatty APPROVED on 2b3eefe. The previous pin-read blocker is fixed: runtimePins distinguishes a successfully read package without a pin from missing/invalid/unreadable declarations and unknown moved modules; updateEverything pre-warms readable pins before reporting one failed tools item. The reviewed commits are patch-equivalent after the CI-only rebase (range-diff). In a clean detached checkout, check:static passed, the focused 10-file suite passed (106 pass, 1 opt-in network skip), and git diff --check passed. Local runner Bun 1.4.4; the repository pins 1.4.2 and exact-head CI is green. This approves #622 only. The stacked #624 UI needs a separate correction for display of the new tools failure. No merge or release.
… finding, never a clean update The review of #624 on 1a829e8 found that the page dropped every tools line without a pin, the tools part's one failed item among them. #622 emits that item when the pins of the moved modules cannot all be read. A moved app nobody opened has no build line either, so the run looked clean: only Lazurio, up to date. The page now reads that item and shows one more Bun row after the pins' rows: "U některých aplikací se nepodařilo zjistit, jakou verzi potřebují" / "For some apps, the version they need could not be determined". It names no pin or path and shows no code. Other tools lines without a pin are still left out. A regression test feeds the real job answer, the composition with an unreadable pin through createUpdateJobs, serialized as the route sends it, through parseUpdateJob and updateView; it fails without this change. The preview's scripted run includes one unreadable pin, and a headless Chrome check shows the finding. F47's addendum says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s fetched (DEV-6682, F62) lazurio update's tools part (#622) now makes the Bun the moved modules pin available before any build, and its lines reach the page. Each pin is a row named Bun after the modules and before Lazurio: "Stahuje se verze 1.4.3" / "Fetching version 1.4.3" while it is made available, "Stažena verze 1.4.3" / "Version 1.4.3 fetched" once it is, or a finding in plain words: not fetched now (offline, or not tried after that), a download that failed its check, no room on the disk, or not prepared. A Bun that was there already and the tools part as a whole have no row; no code or path is shown. The preview's scripted run pins a Bun for Deals, and a headless Chrome check of the page shows the Bun row fetching while Deals waits and fetched before Deals builds. F47's addendum of 2026-10-24 names the rows and the tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#622's review fix makes the tools part's pins an answer with how many could not be read ({ pins, unreadable }). The preview's scripted run of Aktualizovat follows it, so the script typechecks again; the page and its rows are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… finding, never a clean update The review of #624 on 1a829e8 found that the page dropped every tools line without a pin, the tools part's one failed item among them. #622 emits that item when the pins of the moved modules cannot all be read. A moved app nobody opened has no build line either, so the run looked clean: only Lazurio, up to date. The page now reads that item and shows one more Bun row after the pins' rows: "U některých aplikací se nepodařilo zjistit, jakou verzi potřebují" / "For some apps, the version they need could not be determined". It names no pin or path and shows no code. Other tools lines without a pin are still left out. A regression test feeds the real job answer, the composition with an unreadable pin through createUpdateJobs, serialized as the route sends it, through parseUpdateJob and updateView; it fails without this change. The preview's scripted run includes one unreadable pin, and a headless Chrome check shows the finding. F47's addendum says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er module (DEV-6656, root 0212 point 7) (#624) Root decision 0212 point 7. Nová karta's Aktualizovat runs `lazurio update`, the one composition of #622, and shows its progress per module: - content per Organization; - the Bun each moved App pins (fetching, fetched, offline, integrity, disk, and one finding when some pins could not be read); - builds; - Lazurio itself last. A Bun that was already there has no row. The page shows no codes or paths. Agents keep Modules current with `lazurio update`; the button is optional. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Based on
mainat0cfd5b9a(#620, #626, #636, #629, #637, #640 and v0.1.11 are merged). Target: Platform v0.1.12; it goes into the next v0.1.12 candidate, which runs the canary. Plan DEV-6656; root decision 0212 (HumanAndMachines/Lazurio#625, in review), points 3, 4, 5 and 7. The tools part is DEV-6682's pre-warm (decision F62 point 9), with the semantics agreed with that thread. #624 (Nová karta's Aktualizovat) stacks on this branch.DEV-6682's verdict (2026-10-25)
The DEV-6682 thread approved the tools part (
f7503f78and the F62 point 7 fixdc3bca54, the same patches it read as3f777c34and12f233b0before the rebases) and #624's texts. It also decided both open points, implemented in73f94efb, under these conditions:runtime-unavailable, held in memory for thatlazurio updaterun, never kept across runs. A build in the same run whose pin is neither in the cache nor the user's Bun refuses at once withruntime-unavailable; the next run builds it (F62 point 7 and therefreshBuiltfix). A pin in the cache or the user's Bun builds normally, after a local lookup only. A person's Open or start outside the run is not affected and still asks the registry.cached; otherwise the pin isnot-fetched.Review round 1
3dcee084(Update: one lazurio update brings content, builds and Lazurio itself up to date; Open synchronizes its module (DEV-6656, root 0212) #622 (review)): CHANGES_REQUESTED.runtimePinsturned every failure to read a pin into "no pin", so a moved app with a missing, unreadable or invalid package.json added no pin and no item, contrary to point 7's "pins that cannot be read are onefaileditem".2b3eefe7.runtimePinsanswers{ pins, unreadable }: every declared app is read, only a package that was read and pins nothing adds nothing, and a moved module the catalog does not declare counts too. The composition pre-warms the readable pins, then sets the onefailedtools item. There is a realruntimePinstest on the module core. Reply: Update: one lazurio update brings content, builds and Lazurio itself up to date; Open synchronizes its module (DEV-6656, root 0212) #622 (comment)abdbefe2for its UI diff; its new head needs a new review.Why
Root decision 0212 point 3: one
lazurio update, with the same meaning on a computer and on an Environment, brings everything the user owns up to date, and agents run it before every task. Point 4: besides the Launchpad's hourly round (#620), the Open of a module synchronizes that module in the background. Until nowlazurio updatechanged only the product, and content reached an Environment only through the hourly round or an explicitlazurio organization sync. Since #626 an App's pinned Bun is its runtime (F62); a module's new commit can pin a Bun the runtime cache does not hold yet, and its build should not be the first to wait for it.What changes
src/update/everything.ts,updateEverything), in this order:syncContentfor every Organization the Environment holds, waiting up to 2 minutes for another content operation;refreshBuilt(new insrc/modules/module-operations.ts) builds every built app with a build state whose checkout moved past its build, in the foreground, and swaps it in (decision F58's refresh). It gives an app nobody opened no first build, and it does not build a commit whose build failed again, unless what failed may pass by itself (its pinned Bun could not be fetched, F62 point 7, as the builder and the sweep already do);performUpdate), last, because its activation restarts the Launchpad.runtimePins(module core) reads, from the catalog and each app's package as the content left them, thepackageManagerof every app the fast-forwarded module checkouts declare, each pin once, and counts the ones it cannot read. A root, a data mount or a module that did not move adds none; nothing moved, nothing is read.prewarmModuleRuntimeswith the module core's own resolver (resolveBun:createModuleBunResolver({ home, userBun, path, tmpdir }), the one its builds use, so they share fetches under way and the cache). One call per pin, so each pin is afetchingstep and then an item as soon as it is known.part: "tools",packageManager):cached(the user's own Bun or the runtime cache had it; nothing fetched),fetched,refusedwith the reason a start would give (warning: trueforruntime-integrity-failed), ornot-fetched.runtime-unavailableends the fetches for the run: that pin isrefused. Each pin after it is looked up without the network (the resolver's newfetch: false):cachedwhen the user's Bun or the cache has it, otherwisenot-fetched, never tried.runtime-unavailable, and no other reason, is held in memory for the rest of the run and handed to its builds (refreshBuilt(onProgress, { registryUnavailable })). A build of that run whose pin is neither the user's Bun nor in the cache answersfailedwithruntime-unavailableat once, after a local lookup, and the next run builds it; a pin that is there builds as always. Builds outside the run (a person's start, Open or build, the Launchpad's sweep) are never told and ask the registry themselves.faileditem, after the pins that were read are pre-warmed. Only a package that was read and pins nothing adds nothing.lazurio update --jsonkeeps the product's answer (updated/up-to-date/errorwith every existing key) and addsitems, one per repository, pinned Bun, built app and the product. The human output adds lines for what moved, a content summary, each Bun fetched or not (Warning:first for one that did not verify; nothing for one that was there), what was built, then the product's lines as before.--version,--checkand the pill stay Lazurio only.POST /api/update/everything(202{job, joined}; a click while one runs joins it) andGET /api/update/everything(the newest run with each line's step, then its answer), behind the existing admission. Lazurio goes last through the pill's own action (updateNow: a check, then the existingapply, whose unit outlives the restart). It is not offered on a public Environment.src/content/open-sync.ts). After the Launchpad answered a Start or Open, or the gateway'sensureof a navigation,syncContent({organization, repository})runs for that module in the background. It runs at most once per module in 5 minutes, never for a checkout or root the last round left blocked, and never before the answer. The F58 watcher then builds and swaps.SyncProgresscarriesto(the remote's commit) onfetchingandfast-forwarding, for the progress lines.docs/update.md(section "Onelazurio update", the tools part included),docs/content-sync.md(the new callers),docs/decisions.md(F9's second amendment of 2026-10-24 with point 7 on the tools part, alternatives, tests and risks; F62 point 9 now points to it).What stays
--versionare unchanged. The existing update tests pass unchanged.src/modules/bun-runtime.ts(Modules: the Bun an App pins is its runtime, resolved for every path that runs its code (F62, #618) #626) gains onlyfetch: falseon the resolver's input: the user's Bun or the cache as it is, read without the version's exclusion, otherwiseruntime-unavailableat once. Every other caller resolves as before.lazurio updatebefore tasks) are another PR.Decisions to confirm in review
Verified
2b3eefe7: green:check (ubuntu-24.04),static checks,tests (1/2),tests (2/2),scope(the macOS check and Macroscope are skipped by the workflow).bun run check:static(lint, typecheck,check:public,build:proof,smoke:proof) passes on802456f6.2b3eefe7is the same patches onmain0cfd5b9a, which changes only CI workflows; lint and typecheck pass there andpr:preflightreportsready_to_push.tests/update-everything.test.tstests/module-built.test.tstests/bun-runtime.test.tstests/launchpad-update.test.tstests/content-sync.test.tstests/recover-prompt.test.tstests/module-bun-runtime.test.tstests/update-cli.test.tstests/launchpad-routes.test.tstests/launchpad-buddy.test.ts, one run on802456f6: 106 pass, 1 skip (the opt-inLAZURIO_TEST_NETWORK=1case), 0 fail. All with a fake installer, no network.tests/update-everything.test.ts, with the real resolver and a fake installer:runtime-unavailable; after it a pin the cache or the user's Bun has iscached, the restnot-fetched, one attempt at the registry only;runtime-unavailablealone (not by a full disk), and never in the next run; nothing moved, no answer;faileditem after the readable ones are pre-warmed;tests/bun-runtime.test.ts: the lookup without the network (fetch: false): the user's Bun or the cache, otherwiseruntime-unavailableat once, never the installer, no wait for a version's exclusion held by another fetch, nothing written.tests/module-built.test.ts, a realruntimePinson the module core: a pin read once, a package without one,npm@10.0.0, a package.json that is gone, and a moved path that is not declared.tests/module-built.test.ts, on real git and real builds, with the fake installer:bun@1.4.99is fast-forwarded, its Bun fetched by the tools part before the build began, and the build ran with exactly that Bun;runtime-unavailablewith no second attempt (the installer is asked once in that run, and no build begins); the old build keeps serving;buildoutside the run still asks the registry and records its failure;Reverting the build gate or the
refreshBuiltalignment makes this test fail (checked for both). The CLI test now lists the user's own Bun as acachedtools item.tests/update-everything.test.ts: the order and each line's steps; a failing product keeping the content's answers, and the reverse; the busy wait; the job a second start joins; the Open (exactly that module, debounced, never blocking, never for a blocked checkout or root); the catalog mapping.tests/module-built.test.ts:lazurio update --jsonfast-forwards a module behind and lists every item with Lazurio last, and the Launchpad swaps the new build in; a failing Lazurio still answers the content; the Launchpad's own run builds and swaps at once, does not build a failed commit again, and gives an app nobody opened no first build.tests/launchpad-update.test.ts: the routes behind admission, a joined second click, Lazurio last through the pill;updateNowwhen nothing is newer and when the check fails.Risks
lazurio updatefor its minutes.Commits
5e897479,affb6a36,95aa4c85: the composition, the Open, the JSON without a Folder, and the order content → tools → builds.7d2d2fe0: contract tests for the tools part.f7503f78: the tools part (DEV-6682 OK).dc3bca54:refreshBuiltbuilds again a build whose pinned Bun could not be fetched (F62 point 7; DEV-6682 OK).73f94efb: DEV-6682's two decisions: one answer about the network per run, and a lookup without the network after the stop.2b3eefe7: review round 1, pins that cannot be read make the tools part afaileditem.The rebases onto
d60e5119,ba769965and0cfd5b9ahad no conflicts;git range-diffshows every commit unchanged.Follow-up PR (stacked on this one): #624, Nová karta's Aktualizovat button with progress per module and the Bun rows.
🤖 Generated with Claude Code
Note
Add content synchronization and compose
lazurio updatefrom content, builds, and product updateorganization syncCLI command in cli.ts and sync.ts.lazurio updatenow composes content sync, built-app refresh, and Lazurio update as ordered parts, continuing after a failed part;--versionupdates stay product-only. Adds a Launchpad update-everything job endpoint in server.ts and part orchestration in everything.ts.doctoras a newcontent-synccheck, and shown as localized blocked notes in Launchpad module status views.lazurio updatenow performs content and build work before the product update, and the Launchpad sweep fast-forwards clean primary checkouts before building; dirty checkouts block sync and rebuilds rather than being touched.Macroscope summarized 76a6a11.