Skip to content

2026.11.12.1: system facts as data, one arrangement per provider entry, a base package's single reading, runners as provider statements - #924

Open
Sunrisepeak wants to merge 21 commits into
mainfrom
feat/2026.11.11.1-cross-rows
Open

Sunrisepeak wants to merge 21 commits into
mainfrom
feat/2026.11.11.1-cross-rows

Conversation

@Sunrisepeak

@Sunrisepeak Sunrisepeak commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

What this release is

mcpp 2026.11.12.1. The branch began as "five rows the platform's own data serves" and was audited against the design it cited (2026-11-12): the cross row linked a C program only, a rewrite of the GCC link branch removed the C-library group of every gcc build over the host's payload, the request aarch64-linux changed its answer on x86_64 hosts, and several branches on system names had entered the engine beside the tables meant to replace them. The branch is reworked on the design record .agents/docs/2026-11-12-ecosystem-architecture-optimization-design.md (section 15 records each item and the check that holds it).

Changes

Area Change Held by
Link model flags.cppm renders the link model and does not infer again. A base package has one reading: a sysroot whose root carries a manifest is rendered as a sysroot; a base of another machine takes none of the payload's host run-time directories. The base's compiler run-time directory reaches the C link tests/unit/test_link_line_golden.cpp; e2e 1080 (fails on the previous head of this branch)
Providers One entry states one arrangement. aarch64-linux-gnu keeps glibc (native, 100) and gains glibc-sysroot (linux-x86_64, base package, 40). A new entry does not change the answer of a request answered before it (SPEC-016 §4.6) tests/fixtures/target-rows.snapshot: aarch64-linux answers as in 2026.11.10.2 on every host; e2e 295, 1076
Cross artifacts A dynamic artifact this machine does not load names the row's loader and carries no RUNPATH of this machine golden test; e2e 1076 (interpreter, RUNPATH, no store path in the file)
Run plane A provider states its runner (runner = { cmd, hosts, requires }), the lowest tier of the runner statement; {sysroot} and {pkg:<name>}; requires installed on the first run or test. An artifact of another system is not started without a runner: "built, not run" before any spawn, one predicate for every row. The child-spawn and signal classification of the previous head is withdrawn e2e 1076, 1077, 1040, 330
System facts [[platform.system]] name, uname; provider system-headers, tier; platform runner.built-as; rows state loader and execution. host_can_serve reads the providers' hosts; the single-file layout reads uname; --systems all takes the system table and writes the pairs no program is built for unit tests (polyglot, pack, manifest); e2e 986, 1075, 1078; tests/matrix/expected.tsv (one cell changes on linux-x86_64, measured locally)
One fact, one implementation "does this machine load the artifact" (six sites) is Triple::system_is_host() / loads_on_host(); loader names are read from rows; one resolution of a package reference the unit suite before and after: 169 programs, 2627 cases
ABI [target.<sel>.abi] longjmp; refused when it and exceptions state two models; part of the configuration key only where declared e2e 1079
Ratchet .github/tools/check_system_names.py: the engine's sources name no more systems than the baseline; the counts fell against main CI, documentation and repository checks
CI The engine's bench cases run on main, on request and under the label ci:bench —

Behaviour changes

  • mcpp run and mcpp test no longer start an artifact of another system when nothing states a runner (exit 2, "built, not run", the runner declaration). A host that runs such programs through a registered interpreter passes --no-runner or declares the runner.
  • The messages that print a runner declaration print its shape and name no program.

Compatibility

Identity strings, output directories and cfg results are unchanged. The request aarch64-linux is answered as in 2026.11.10.2 on every host. The new manifest keys are additive; an earlier mcpp names a key it does not read and ignores it. abi.longjmp was not released before.

Dependencies of this pull request

Not in this release

The design's later stages: the move of the e2e and bench suites to mtest C++ cases with the selection-driven CI, the canary matrix, the 32-bit class, DOS and UEFI. Section 15.3 of the design record lists them.

Sunrisepeak and others added 15 commits November 12, 2026 04:45
The cross rows read their payloads, not a host list: aarch64-linux-gnu
takes its C library from the sysroot payload its row declares, and when
such a base package serves the target the host contributes nothing to
the link -- the base's own -B/-L words, its loader named sysroot-
relative, its compiler_runtime_dir resource directory on the C link
exactly as on the C++ one, and --sysroot naming the package root the
payload's own manifest states it is. host_can_serve reads the
declaration instead of refusing every arch-crossing glibc target; the
runtime-closure rules state the premise they always had (the loader is
the payload's; a process on this machine is not the one that would load
it). Measured end to end: a plain C program builds as a dynamic aarch64
ELF and runs under qemu-aarch64 -L <payload> with its exit code intact
(e2e 1076).

A row whose system the graph supplies compiles its resources with the
Windows headers the rows declare (e2e 1075); a program of another
system that dies at once names the runner and returns its status
unchanged (1077); pack --systems all answers with the platform's own
data, FreeBSD's runner among them (1078, 986); longjmp joins threads
and exceptions as the third abi member, the Emscripten long-jump model
(1079).

Stability-neutral: every default behavior is unchanged; each capability
appears only where it previously failed. No host is named in the
engine.
The corrective r2 repack lands in the package index under the same
version key (openxlings/xpkgindex-update#9), so no pin or doc names
-r2 and the arm/macos/windows legs resolved a package that does not
exist. runner_lookup's SIGBUS cases lose their #ifdef guards: POSIX
defines the signal everywhere mcpp builds, and the include gate keeps
module code conditional-free.
The engine includes no headers (the include-region rule); the C
library's macros arrive as constants through mcpplibs.mwrap.libc, so
the death classification takes the three signals the wrap carries.
SIGBUS is not among them -- its typical cause here, a stack the kernel
never grew, arrives as SIGSEGV on the systems that report it.
- polyglot holds FreeBSD's program beside Linux's (G5 made --systems all
  name it; the assembler's whitelist was the half that lagged) and refuses
  a system it has no uname pattern for, not FreeBSD
- 299 accepts a row whose payload package this home cannot install: the
  row resolved, the package is the index's to give, and the refusal's
  subject names the row -- the claim is completion, as it always was
- the MinGW headers are read only where the toolchain's own include
  sources found nothing, standing payloads before fetched ones: an MSVC
  or GNU-ABI project no longer fetches a payload its link will not read
  (measured on the upgrade lane: mingw-w64-sysroot, 21.3 MB, first run)
- pack_modes states 'all' host-aware: the machine asking is one of the
  facts, and the suite runs on four hosts
- 1076 is excused in the coverage table: no hosted shard installs the
  sysroot payload, and the test skips rather than guesses
…cketed row

The resource scan resolved the MinGW-w64 sysroot payload unconditionally
(gdb, a fresh home, why --target x86_64-windows-gnu): the compiler step had
been gated since the last push, the scan step had not, so every PE prepare
fetched 21.3 MB its link would not read -- measured on the upgrade lane's
first run. Both sites now share one sentence: llvm-rc, a row whose Windows
headers are not the machine's own (a located MSVC SDK states that they
are), the toolchain's own include sources found nothing, standing payloads
before fetched ones.

299's row extraction now also reads the bracketed subject of the base
refusal ([target.aarch64-linux-gnu].sysroot = ...), the form the payload
refusal takes; the single-quoted form it alone read before stays first.
…t systems consume

A synthesis of what the merged round established and what the families after
it use: rows, payloads, runners as data; the ABI layering beneath one C
library ported once; corrective revisions; the disk-image asset class and
its harness; the semantic plane stated as the program's own. No behaviour
changes -- this names what is already gated green.
…ne architecture as its reference

The version the PR will release under is dated for its merge day, and every
comment that cites its introducing release follows it.

The architecture record names what the round established and what the
families after it consume: rows, payloads and runners as data; one C library
above one kernel-ABI specification, ported once; layer vocabulary the rows,
payloads and requirement side already share; corrective revisions; the
disk-image asset class and the harness that boots it; the semantic plane
stated as the program's own. It adds no behaviour -- it names what the gates
already hold green.
The exception belonged to the window where no hosted shard could install
xim:aarch64-linux-gnu-sysroot; the index PR is merged, every shard that
declares the payload's capabilities runs the test for real, and a test
that runs does not belong in the table.
…tes through the flags it renders

The key is a contract between releases: an engine of one release finds a
project's graph current through it, and 1068's inner build -- the subos's
own engine -- is that reader by design. A field for the new member made
every plan another release wrote look foreign, and the self-host shard
measured it twice (1068, 1069). The member needs no field: it reaches the
compile line through dialect_cxxflags, which the key already lists, and
1079 round-trips it unchanged. Threads and exceptions keep their fields --
they are switches that render no flag of their own.
…: the clang-tidy 400-line gate under src/build/prepare (the predicates the block already named)
@Sunrisepeak

Copy link
Copy Markdown
Member Author

任务交接清单(2026-11-12)

✅ 已完成

已合入的上游

本 PR(#924)已落地的修复(head cf1492f 之后又推了行数门禁修复)

  • 09b1779:base.cpp rel.native().find 裸指针悬挂 → generic_string()
  • c18bd6f:polyglot 纳 FreeBSD 行、299 v1 接受、pack_modes 宿主感知、mingw 第三源懒门控 + 单测
  • d6f73ed:mingw 第三源双调用点同谓词懒门控(资源扫描步无条件 resolve 的根因)
  • e603382:root_position_key 去掉 abi_longjmp 成员(跨版本 plan 缓存契约,inner build subos 引擎依赖)
  • cf1492f + 后续:step13_windows_resources 拆出 per-subject manifest policy 函数(clang-tidy 400 行门禁),并注意所有权门禁是子串匹配——if ( 不能与 windowsLongPaths(内含 "wsl")同行
  • 版本整体改题 2026.11.12.1;三平面平台架构设计文档(.agents/docs,含 front matter + 索引再生)

本地验证基线

  • 单测 2624/2624;e2e 299/992/1075-1079 全 PASS;cmd-f 18/18(cmd.exe+COMMAND.COM 双产物);fresh-home mingw fetch=0
  • r2→r3 修复链:本地复现 r1→r2 抬升失败 → 定位 → r3 重打包 → CI install 三宿主绿

并行交付

  • dirun(通用模拟器 harness,Sunrisepeak 名下):仓迁移完成(mcpplibs/dirun 已归档),PR feat: compile .c sources via a separate C rule #1 原生 mcpp 实现(mcpplibs.os + 自研 posix pty 层,Python 降格 tools/reference 冻结规范)三宿主 CI 全绿后 squash 合入(1c61abe);CI 含 GLOBAL 镜像钉(CN 索引镜像滞后曾致装到坏 r2)
  • speak-agent 已在 xim #937 评论(交叉半落定)

🔄 进行中

⏳ 未完成(按序)

  1. 2026.11.12.1: system facts as data, one arrangement per provider entry, a base package's single reading, runners as provider statements #924 CI 绿 → 合入链:squash --admin → tag/release 2026.11.12.1(四平台)→ gtc 镜像 → main CI 重触发
  2. 本地抬升终验:合入后 mcpp index update + toolchain install llvm 应报 1→3 且成功(注意本地双层索引快照缓存:~/.xlings/data/xim-pkgindex 与 ~/.mcpp/registry/index-snapshots,均滞后;CI 腿与钉装脚本已 config --mirror GLOBAL)
  3. P5 全生态干净环境验证:/tmp/p5-verify.sh(xlings 全生态)
  4. P6 综合汇报 + 上游反馈:/tmp/final-report.md v2 基础上补 r2→r3 事故记录(教训:矫正资产重打包必须保持"归档顶层目录=资产文件名主干"约定,已写进 llvm.lua 注释与准入账本);讨论点:llvm 发行包交叉完整性、mingw builtins 粒度、CN 索引镜像滞后(GLOBAL 钉是当下对策)
  5. openkal-serenity / openkal-plan9 纵向切片(各单 PR 新仓;勘测在 /tmp/p7-scout.md,Serenity 需自建工具链 payload)
  6. dirun 后续:xpkg 载荷配方 + .oke 每 arch 一产物(README 已记为规划);P7.4 kernel-abi 文档化(引擎已落地 layers.kernel-abi,只欠文档)

关键坐标

  • mcpp worktree:/home/speak/workspace/tmp/eco/mcpp @ feat/2026.11.11.1-cross-rows;规范二进制 /tmp/mcpp-stable/mcpp(每次重建后需 cp)
  • xim worktree:/home/speak/workspace/tmp/eco/xim-pkgindex;guard 跑法 PYTHONPATH=eco/xpkgindex-update/src python3 -c "...xim_pkgindex.guard(before, after)"(注意 guard(before, after) 收整文件字符串不是 dict)
  • llvm r3 资产:release 23.1.3-r3,sha 见 xim-pkgindex pkgs/l/llvm.lua 与 .agents/docs/2026-11-12-llvm-2313-r3-resource-admission.json
  • gh 双账户:Sunrisepeak(主)+ speak-agent;review 规则集常 BLOCKED → 全部 --squash --admin

@Sunrisepeak Sunrisepeak changed the title 2026.11.11.1: five rows the platform's own data serves 2026.11.12.1: system facts as data, one arrangement per provider entry, a base package's single reading, runners as provider statements Nov 12, 2026

This branch has not been deployed

No deployments
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.

1 participant