Skip to content

2026.10.16.1: the provider port, indices in mcpp's home, upstreams, the system home, filesystems and long paths - #811

Merged
Sunrisepeak merged 17 commits into
mainfrom
release/2026.10.16.1
Oct 16, 2026
Merged

Sunrisepeak merged 17 commits into
mainfrom
release/2026.10.16.1

Conversation

@Sunrisepeak

@Sunrisepeak Sunrisepeak commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

mcpp 2026.10.16.1. Implements .agents/docs/2026-10-16-xlings-provider-port-and-shared-store-design.md (the mcpp side; the xlings side is openxlings/xlings#676, released as 2026.10.16.1 and bundled here). Fixes #809.

The provider port

  • Every use of xlings goes through one port, mcpp.provider. Only the adapter under src/provider/xlings/ names xlings' commands, protocol and store layout; the composition root mcpp.provider.select chooses it. .github/tools/check_provider_boundary.py checks the boundary in CI.
  • Payloads are written by the provider alone. mcpp no longer patches a toolchain's ELF headers, rewrites specs or clang .cfg, writes .mcpp_ok / .mcpp-fixup.json, or copies payloads from ~/.xlings; a build states what a payload lacks on its own command lines.
  • The handshake: every xlings source is asked what it is (xlings interface --version); one that cannot serve this mcpp gives way to the bundled xlings, with a note.

Ownership, place and refresh

  • The data and payloads of each index mcpp serves live in mcpp's home: <MCPP_HOME>/indices/<name>, <MCPP_HOME>/xpkgs (a project's under <project>/.mcpp). The provider's own indexes stay under registry/.
  • An owned index is refreshed into a staging directory, judged against its min_mcpp there, and exchanged with the copy in use only when this mcpp can read it.
  • A home from an earlier mcpp keeps working: its index data moves once; payloads under registry/data/xpkgs stay and are still found.

Reuse and the system home

  • [xlings] upstream = [...] (user configuration, else the system configuration /etc/mcpp/config.toml / %ProgramData%\mcpp\config.toml): a payload of the same identity is linked from an upstream, never copied or written. An upstream must belong to the user or to the system; another user's home is refused.
  • mcpp self store dedupe [--apply] replaces the home's own copies with links.
  • mcpp --system maintains the machine's system home (self init|doctor|store, toolchain install|remove|default, index update); every other command, and a caller without write access, is refused.
  • [xlings] home names a home mcpp made; a home it did not make is refused with a pointer to upstream.

Filesystems and Windows long paths

  • Scaffold publication and index swaps use what the filesystem holding them measures (atomic no-replace rename, exchange, hard and symbolic links), so NFSv3, SMB, FAT and FUSE homes work (renameat2(RENAME_NOREPLACE) 在 NFS 上返回 EINVAL,导致 subos 条目无法发布 #809). A CI job builds and runs a project on an NFSv3 export.
  • windows_long_paths (target and [test] keys) writes longPathAware into a PE application manifest; mcpp.exe declares it. With long paths off and a long MCPP_HOME, the path budget is reported as a degradation. mcpp self doctor states the home, its upstreams, its filesystem and the long-path setting.

Documentation

New docs/25 (en/zh) on the home, its indices and its store; docs/91 §4, docs/11, docs/09, docs/04, SPEC-001 1.6, SPEC-004, SPEC-006 v0.8 updated; CHANGELOG 2026.10.16.1.

Verification

All 65 CI checks pass on the final head (Linux, aarch64, macOS, Windows, e2e shards, openkal, target matrix, fresh installs, NFSv3). mcpp-plugins CI built and ran against this branch (38895101589). Found and fixed on the way: a package of mcpp's indices is looked for in every store of the home; the runtime is pinned after its payload is installed, so the provider's loader links exist; a toolchain whose runtime cannot be installed is refused naming xim:glibc@<v>; fs_caps' alias of std::filesystem no longer shadows the mcpp::platform::fs namespace (GCC 16 crashed reading both).

Unit tests for the port, the owned index, the trust check, the manifest key and the resources; e2e 914 (upstream linked, never written; trust; doctor; dedupe; a home mcpp did not make), 915 (system home), 916 (a home from before), 917 (a long home on Windows), plus the existing suites with stub xlings answering the handshake. Locally against xlings 2026.10.16.1: upstream reuse, dedupe, --system, and the e2e suites listed pass.

Co-authored-by: speak-agent 248744407+speak-agent@users.noreply.github.com

Sunrisepeak and others added 17 commits October 16, 2026 10:24
…them (#809)

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ider/xlings, callers through mcpp.provider.select; payloads written by no one but their provider

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Callers ask the port (mcpp.provider.select) for layouts, payloads, the
home's store and its legacy directories; the legacy-directory reader moves
under the adapter. .github/tools/check_provider_boundary.py refuses, in
src/ outside the adapter and the composition root, an import of the
adapter, a spelling of the provider's layout in code, and a payload
canonicalised or removed; the docs job runs it and its fixtures.

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…eams with a trust boundary; --system; windows_long_paths; the handshake

- An index mcpp serves keeps its data in <home>/indices/<name> and its
  payloads in <home>/xpkgs (a project's in <project>/.mcpp); a home from
  before has its index moved once and its installed payloads still found.
- A refresh fetches each owned index into a staging directory (xlings
  sync_index), judges it against index.toml's floor, and exchanges it in;
  mcpp.pm.index_snapshot's backup and rollback are gone.
- [xlings] upstream (user config, else /etc/mcpp/config.toml): homes of this
  user or of the system only; written into the registry as xlings upstreams.
  `mcpp self store dedupe [--apply]` links what an upstream has the same of.
- `--system` maintains the machine's system home (/var/lib/mcpp): the
  maintenance commands only, write access checked, umask 022, held locked.
- windows_long_paths (target and [test] keys): longPathAware in the
  application manifest; a host tool's default; mcpp.exe declares it.
- Every xlings source passes the handshake; one that cannot serve this mcpp
  gives way to the bundled one.

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…r shows the home, its upstreams, its filesystem and Windows long paths; the Windows path budget

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…are never written (91, SPEC-006 v0.8, SPEC-001 1.6); windows_long_paths; tools follow the adapter's path

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…lse positive avoided

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ex's store, is looked for in the home (legacy store); e2e: the owned index's place, stub xlings answer the handshake and stage a refresh, no marker is written into a payload

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…ome is maintained with --system and read by users (915); a home from before keeps working (916); a fresh home adopts its owned index too

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…, run, doctor); e2e: a long home on Windows (917); the isolated homes inherit the store of mcpp's indices

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…am; design record of what was implemented

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
)

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…es_of); a home an earlier mcpp made (its index named mcpp-index) stays usable as [xlings] home

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…re of the home (its index's, then the provider home's)

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…atform::fs is a namespace; GCC 16 crashed reading both); e2e 32, 33 link the mcpplibs index where mcpp keeps it

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
… there, naming xim:glibc@<v> (no fixup remains to report it later)

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
…he provider's links to it are made again then (a toolchain's loader is <registry>/abi; installing glibc alone does not make it)

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

Development

Successfully merging this pull request may close these issues.

renameat2(RENAME_NOREPLACE) 在 NFS 上返回 EINVAL,导致 subos 条目无法发布

1 participant