Skip to content

2026.9.29.1: install configures once per scope, --reconfig, and progress that belongs to the renderer - #633

Merged
Sunrisepeak merged 3 commits into
mainfrom
feat/install-config-trigger-2026.9.29.1
Sep 28, 2026
Merged

Sunrisepeak merged 3 commits into
mainfrom
feat/install-config-trigger-2026.9.29.1

Conversation

@speak-agent

Copy link
Copy Markdown
Collaborator

2026.9.29.1. Closes #629, closes #632 (§1, §3 via openxlings/xim-pkgindex#903, §4; §2 left as is by decision). Consumes libxpkg 0.0.59 (openxlings/libxpkg#44, closes libxpkg#43; published to mcpp-index in mcpplibs/mcpp-index#485).

Plan and review record: .agents/docs/2026-09-29-install-config-trigger-and-output-plan.md. Release notes: .agents/docs/2026-09-29-release-2026.9.29.1-notes.md.

Install configures once per scope (#632 §1)

A payload in the store is a home fact; having run its config() is a fact about one scope. Each scope's .xlings.json now records configured: {"<ns>:<name>@<version>": <revision>} (top-level, next to workspace). xim::configured_verdict — asked by the planner and by the installer — leaves a present payload alone only when the record names the recipe's current revision and every ledger entry the payload owns is claimed by the scope's installed[]. No record means "configure" (old homes migrate on their next install).

  • An install whose whole closure is configured returns after the report, the activation and one routing-table rebuild, and prints how to configure again. --reconfig (interface: "reconfig": true, protocol 1.4) runs config for the whole plan, as before.
  • A revision bump reinstalls the shared payload in one scope; every other scope's record then names the old revision and reconfigures on its next install. remove and a superseded unbind take the record with the binding.
  • Each node that did something prints [i/n] installed|configured <coord>; the interface gets progress phase configure.
  • SubosRuntimeUnknown's remedy now says --reconfig (glibc's config is what records the runtime).

Routing-table rebuild (B2)

Deferring the rebuild to the end of the plan was rejected: later hooks in one plan run earlier nodes' commands by name (musl-gcc → patchelf, media-crawler → uv, mcpp-vscode-clangd → mcpp, claude-llm → claude) and gcc's config calls <bindir>/gcc-specs-config by path. Measured instead: a rebuild spent ~0.08 s of its ~0.16 s re-parsing the 3.6 MB home config to read knownProjects, and in project scope rewrote it to move lastSeen. known_projects() now follows the file's size/mtime and takes the list from the parses that already happen; register_known_project writes at most once a day.

Output (A1–A3, #629)

Tests

  • New e2e: E2E-125 install_configured_record_test.sh (C1–C8; C1 fails on 2026.9.28.2), E2E-126 index_build_output_test.sh (B1 fails on 2026.9.28.2). E2E-123 P2 updated: index artifact draws no frame, blank line after the last frame, --ui-mode cli draws none.
  • New unit: ConfiguredVerdict.*; ProgressOutput.* moved from the removed palette predicate to ui::capabilities_of.
  • mcpp test all suites pass locally; the non-tarball e2e manifest run locally with XLINGS_TEST_MIRROR=CN.

…ess that belongs to the renderer

Closes #629. Closes #632 (§1, §4; §3 through openxlings/xim-pkgindex#903;
§2 unchanged by decision). Consumes libxpkg 0.0.59 (openxlings/libxpkg#44,
closing libxpkg#43).

Install configures once per scope (#632 §1)
- A payload in the store is a HOME fact; having run its config() is a fact
  about ONE scope. Each scope's .xlings.json records
  `configured: {"<ns>:<name>@<version>": <revision>}`, a top-level sibling of
  `workspace` (an older client reads every `workspace` key as a target).
- xim::configured_verdict, asked by the planner and the installer: a present
  payload is left alone only when the record names the recipe's current
  revision AND every ledger entry the payload owns is claimed by the scope's
  installed[]. No record means configure -- old homes migrate on their next
  install.
- A closure that is configured throughout does the report, the activation and
  one routing-table rebuild, and says how to configure again. `--reconfig`
  (interface `reconfig`, protocol 1.4) runs config for the whole plan.
- A revision bump reaches every scope: the scope that reinstalls the payload
  records the new revision, every other scope's record names the old one.
  uninstall (detach and delete) and a superseded unbind erase the record.
- Each node that did something prints `  [i/n] installed|configured <coord>`;
  the interface gets `progress` phase `configure`.
- The privileged-env notice is printed for a new or changed declaration only
  (#632 §4). SubosRuntimeUnknown's remedy says `--reconfig`.

Routing-table rebuild
- Kept per node: later hooks of one plan run earlier nodes' commands by name
  (musl-gcc -> patchelf, gcc config -> <bindir>/gcc-specs-config, ...).
  Measured instead where a rebuild spent its time: re-parsing the 3.6 MB home
  config to read `knownProjects`, and in project scope rewriting it for
  `lastSeen`. known_projects() now follows the file's size/mtime and takes the
  list from the parses that already happen; register_known_project writes at
  most once a day.

Output (#629)
- An index build script's io.write/print reach xlings through libxpkg's
  BuildOutput, not fd 1: one `[index] built <ns> (<n> files)` line, the
  script's other lines passed on, the interface's index_rebuild events
  unchanged (parse_bracketed_step moved to xim::index, one implementation).
- index:* downloads draw no frames; a finished progress block ends with a
  blank line; the renderer asks the frontend's capability, so `--ui-mode cli`
  means no bars (palette::cursor_rewrite_allowed, the second answerer, is
  gone); `self update` runs its children with `--ui-mode cli`.

Tests: E2E-125 install_configured_record_test.sh (C1 fails on 2026.9.28.2),
E2E-126 index_build_output_test.sh (B1 fails on 2026.9.28.2), E2E-123 P2
extended; unit ConfiguredVerdict.*, ProgressOutput.* rewritten on
ui::capabilities_of. Docs: interface spec 1.4, AGENTS.md, quick-start,
xlings-usage skill, plan and release notes under .agents/docs/.
libxpkg 0.0.59 is the first xpkg release this repository resolves through
the mcpplibs index rather than from a warm payload cache, and that index
requires mcpp >= 2026.9.18.3 (E0006): the pinned 2026.8.8.4 cannot read it,
so `mcpplibs.xpkg@0.0.59` reported as not found on every cold runner.

- .xlings.json: mcpp 2026.8.8.4 -> 2026.9.28.3 (the index's `latest`,
  present for linux, macosx and windows).
- XIM_PKGINDEX_REF -> 7b9bf43 in all six workflows that pin it, the first
  xim-pkgindex commit carrying that mcpp version.
- mcpp.lock: the xpkg entry's hash as mcpp 2026.9.28.3 computes it; every
  other entry already matched that mcpp.

Built and unit-tested locally with mcpp 2026.9.28.3: 56/56 suites.
…uild)

`forceGlobal ? " -g" : ""` is a `const char*`; under `import std`, libc++
(llvm 20.1.7) deduced a wide format string for log::println with that
argument and commands.cpp failed to compile on macOS. The argument is a
std::string now, and so is the per-node verb. Reproduced and verified on
Linux with `mcpp build --toolchain llvm@20.1.7`: fails before, builds after.
@Sunrisepeak
Sunrisepeak merged commit a63412f into main Sep 28, 2026
9 checks passed
@speak-agent
speak-agent deleted the feat/install-config-trigger-2026.9.29.1 branch September 28, 2026 19:32
Sunrisepeak pushed a commit that referenced this pull request Sep 28, 2026
The release notes gain the two changes CI asked for (mcpp 2026.9.28.3 with
the index ref that carries it; a libc++ log argument) and §4: publication
checked by full download against GitHub, GitCode and the sidecars, the
libxpkg 0.0.59 chain, the released binary in an isolated home, and the real
home through `self update` and a sandboxed subos -- no-op install 0.72 s,
`--reconfig`, update into a file with no CR/ESC, the libxpkg#43 probe, g++ and
an mcpp build. The plan's implementation record names #633 and #904.

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants