Implement the 20-task Bare OS POSIX + P2P roadmap: holepunch lockfile drift

reporting and audit:holepunch-clones docs; placeholder baseline automation;
maintainer kernel-image sync script; protomux schema coupling in protocol
tests; disk.os RPC hints (replication_operator_sketch, hyperblobs/blind v3);
union/mirror VFS + warm-cache selective eviction tests; extension resolver
coverage; curl/wget fall through PATH when BARE_OS_DELEGATE_ALLOW excludes
delegates (kernel-runner) with handbook/ctx docs; socket contract / Wasm /
boot budget strict path / hrpc allowlist tests; subprocess bridge meta;
shell until gate + tar stat metadata; POSIX profile triplet pretest verifier;
regenerate kernel bundle, seeder parity, and audit artifacts as needed.

Covers KERNEL_CONTRACT, POSIX_DECLARED_PROFILE, handbook, developer-guide,
scripts/README, and related reference docs.
This commit is contained in:
Raven Scott
2026-04-05 02:21:07 -04:00
parent 7f4279d315
commit ae6f1cf8ac
44 changed files with 1404 additions and 422 deletions
+1 -1
View File
@@ -39,7 +39,7 @@ Files in this directory are **read from disk by the seeder** (or copied into `pa
**Host boot perf:** when **`BARE_OS_BOOT_PERF_DETAIL=1`**, the stock booter logs **`bare_stdlib_merge_ns`** after **`maybeMergeBareFromDrive`** (monotonic **`hrtime`** delta in nanoseconds) alongside guest **`boot-perf.json`** stages.
Pear bundles use the **vendored** tree under `packages/bare-os-seeder/kernel/`; keep it in sync by running the same builds before `pear stage`. **`npm test`** runs **`scripts/verify-kernel-seeder-parity.mjs`**, **`scripts/verify-ctx-api-feature-bits.mjs`**, and **`scripts/validate-example-schemas.mjs`** (after **`bare-os-coreutils`** and **`bare-os-bare-libs`** builds) so the two trees match byte-for-byte, ctx semver / feature words stay wired, example JSON matches **[`docs/schemas/`](../docs/schemas/)**, and every **`kernel/bin/*`** file contains the **`BARE_OS_BIN_API`** pragma (coreutils **`runtime.js`** and hand-written stubs such as **`systemctl`** / **`journalctl`**).
Pear bundles use the **vendored** tree under `packages/bare-os-seeder/kernel/`; keep it in sync by running the same builds before `pear stage`. Use **`npm run maintainer:kernel-image`** from the repo root for coreutils + bare-libs + init bundle + extensions index + parity verify (then **`rsync -a --delete kernel/ packages/bare-os-seeder/kernel/`** if the verifier reports drift). **`npm test`** runs **`scripts/verify-kernel-seeder-parity.mjs`**, **`scripts/verify-ctx-api-feature-bits.mjs`**, and **`scripts/validate-example-schemas.mjs`** (after **`bare-os-coreutils`** and **`bare-os-bare-libs`** builds) so the two trees match byte-for-byte, ctx semver / feature words stay wired, example JSON matches **[`docs/schemas/`](../docs/schemas/)**, and every **`kernel/bin/*`** file contains the **`BARE_OS_BIN_API`** pragma (coreutils **`runtime.js`** and hand-written stubs such as **`systemctl`** / **`journalctl`**).
Optional **system** image examples: **`etc/bare-os/boot.allow.example`** (copy to **`boot.allow`** when using host **`BARE_OS_BOOT_ALLOWLIST=1`**), **`etc/bare-os/boot.policy.example.json`** (install as **`boot.policy.json`** when using **`BARE_OS_BOOT_POLICY=1`**; v2 fields **`maxExecLineDepth`**, **`denyEnvKeys`**, **`requireProcNodes`**; v3 **`requireKernelCapabilitiesExtendedSeedingPlatform`**, **`requireKernelCapabilitiesRlimitsDelegatesShell`**, **`allowedPearIpcChannels`**, **`denyVfsPrefixes`**, **`maxInitdRestartsPerUnit`**; v4 **`requireKernelCapabilitiesOfflineNetExtensions`**, **`denyExecLineBuiltins`**, **`allowedCtxMethods`**; v9 **`requireKernelCapabilitiesBareModuleCryptoStaging`**, **`requirePearRuntimeRange`**, **`denyBareModuleSpecifierPatterns`**, **`requireBareCryptoMin`**, **`denyKernelSyscalls`**, **`requirePearIpcMin`**, **`extensionSignerPinsV2`**, **`offlineLkgManifestMaxAgeSec`**, **`bootPhasesRequireProcIndexMinSchema`**; v10 **`requireKernelCapabilitiesPearInspectLoggerTls`**, **`requireBareBootMin`**, **`bootPhasesRequireLifecycleMinSchema`**, **`extensionSignerPinsV3`**, …; JSON Schema: [`docs/schemas/boot.policy.schema.json`](../docs/schemas/boot.policy.schema.json)), **`etc/bare-os/kernel.extensions.registry.example.json`** (shape for **`/proc/bare_os/extensions.json`** schema 7), **`etc/bare-os/boot-trace-line.example.json`** and **`etc/bare-os/telemetry-ndjson.example.json`** (shape checks for CI), **`etc/bare-os/rc.profile.full`** (sample full profile referenced from **`profile`**), **`etc/bare-os/crontab.example`** (system-wide cron lines merged ahead of user **`~/.crontab`**), **`etc/bare-os/timers/*.timer.example`** (copy to **`~/.config/bare-os/timers/*.timer`** for **`OnCalendar=`**, **`EveryMs=`**, or **`OnInactiveSec=`** jobs). **`kernel.ext.d`** scripts register into **`/proc/bare_os/extensions.json`** when the booter provides **`ctx.bareOsRegisterKernelExtensionRecord`**.
+36 -2
View File
@@ -86,6 +86,7 @@ async function invokeCtxBootHooks(ctx, ev) {
* BARE_OS_KERNEL_STARTUP_CLASS: `critical` | `system` | `interactive` | `deferred` (default **interactive**); exposed as **`ctx.bareOsKernelStartupClass`** for extensions/initd.
* BARE_OS_BOOT_BUDGET_MS_COLD: optional cold-boot wall-time warning threshold (ms) after **`bareOsPublishBootReady`**.
* BARE_OS_BOOT_BUDGET_MS_BARE_STDLIB: optional wall-time budget (ms) for booter **`ctx.bare`** drive merge + host resolve (**`BARE_OS_BOOT_BARE_STDLIB_RESOLUTION_MS`**, set by the stock booter); guest logs and **`boot-perf.json`** when exceeded.
* BARE_OS_BOOT_BUDGET_STRICT=1 with **BARE_OS_BOOT_POLICY_STRICT**: exit via **`bareOsRequestBooterExit(1)`** when either budget is exceeded (after **`boot-transaction.ndjson`** row **`bootBudgetViolation`** when journaling is on).
* BARE_OS_BOOT_CAPABILITY_CONTRACT_DEBUG=1: log capability-contract merge diagnostics (strict builds).
* BARE_OS_BOOT_EXT_RESOLUTION_TRACE=1 with **BARE_OS_BOOT_POLICY_STRICT**: write **`/run/bare-os/kernel-ext-resolution.json`** (extension load order / cycle ids).
* BARE_OS_BOOT_RC_RESOLUTION_TRACE=1 with **BARE_OS_BOOT_POLICY_STRICT**: write **`/run/bare-os/rc-d-resolution.json`** and **`/run/bare-os/kernel-d-resolution.json`** (lexicographic execution order after filters).
@@ -3501,6 +3502,14 @@ async function start(ctx) {
}
}
{
const budgetStrict =
ctx.env?.BARE_OS_BOOT_BUDGET_STRICT === '1' ||
ctx.env?.BARE_OS_BOOT_BUDGET_STRICT === 'true'
const polStrict =
ctx.env?.BARE_OS_BOOT_POLICY_STRICT === '1' ||
ctx.env?.BARE_OS_BOOT_POLICY_STRICT === 'true'
let coldExceeded = false
let stdlibExceeded = false
const budget = Number.parseInt(
String(ctx.env?.BARE_OS_BOOT_BUDGET_MS_COLD || ''),
10
@@ -3508,6 +3517,7 @@ async function start(ctx) {
if (Number.isFinite(budget) && budget > 0) {
const wall = Date.now() - bootT0
if (wall > budget) {
coldExceeded = true
bootStructuredLog(
ctx,
'error',
@@ -3521,8 +3531,6 @@ async function start(ctx) {
}
}
}
}
{
const sb = Number.parseInt(
String(ctx.env?.BARE_OS_BOOT_BUDGET_MS_BARE_STDLIB || ''),
10
@@ -3533,6 +3541,7 @@ async function start(ctx) {
10
)
if (Number.isFinite(sw) && sw > sb) {
stdlibExceeded = true
bootStructuredLog(
ctx,
'error',
@@ -3546,6 +3555,31 @@ async function start(ctx) {
}
}
}
if (coldExceeded || stdlibExceeded) {
await maybeAppendBootTransactionJournal(ctx, {
phase: 'boot.budget',
stage: 'boot.budget',
bootStage: 'budget',
ms: 0,
ok: false,
bootBudgetViolation: true,
bootBudgetSchemaVersion: 1,
coldBudgetExceeded: coldExceeded,
bareStdlibBudgetExceeded: stdlibExceeded,
transactionState: BARE_OS_BOOT_TXN_STATE.STAGE_COMMITTED
})
}
if (budgetStrict && polStrict && (coldExceeded || stdlibExceeded)) {
bootStructuredLog(
ctx,
'error',
'bootBudgetStrictAbort',
'[boot] BARE_OS_BOOT_BUDGET_STRICT with BARE_OS_BOOT_POLICY_STRICT: exiting after budget violation'
)
if (typeof ctx.bareOsRequestBooterExit === 'function')
ctx.bareOsRequestBooterExit(1)
return
}
}
while (true) {
const line = await readLine('')
+186 -186
View File
@@ -25,12 +25,6 @@
"compactEncoding"
]
},
{
"path": "/lib/bare/bundles/protomux.js",
"keys": [
"protomux"
]
},
{
"path": "/lib/bare/bundles/bareUrl.js",
"keys": [
@@ -38,9 +32,9 @@
]
},
{
"path": "/lib/bare/bundles/bareEncoding.js",
"path": "/lib/bare/bundles/protomux.js",
"keys": [
"bareEncoding"
"protomux"
]
},
{
@@ -49,6 +43,12 @@
"barePath"
]
},
{
"path": "/lib/bare/bundles/bareEncoding.js",
"keys": [
"bareEncoding"
]
},
{
"path": "/lib/bare/bundles/bareEvents.js",
"keys": [
@@ -68,9 +68,9 @@
]
},
{
"path": "/lib/bare/bundles/bareReadline.js",
"path": "/lib/bare/bundles/bareAnsiEscapes.js",
"keys": [
"bareReadline"
"bareAnsiEscapes"
]
},
{
@@ -79,24 +79,18 @@
"bareAddonResolve"
]
},
{
"path": "/lib/bare/bundles/bareReadline.js",
"keys": [
"bareReadline"
]
},
{
"path": "/lib/bare/bundles/bareCrypto.js",
"keys": [
"bareCrypto"
]
},
{
"path": "/lib/bare/bundles/bareAnsiEscapes.js",
"keys": [
"bareAnsiEscapes"
]
},
{
"path": "/lib/bare/bundles/bareAsyncHooks.js",
"keys": [
"bareAsyncHooks"
]
},
{
"path": "/lib/bare/bundles/bareAppKit.js",
"keys": [
@@ -104,9 +98,9 @@
]
},
{
"path": "/lib/bare/bundles/fetch.js",
"path": "/lib/bare/bundles/bareAssert.js",
"keys": [
"fetch"
"bareAssert"
]
},
{
@@ -116,9 +110,15 @@
]
},
{
"path": "/lib/bare/bundles/bareAssert.js",
"path": "/lib/bare/bundles/fetch.js",
"keys": [
"bareAssert"
"fetch"
]
},
{
"path": "/lib/bare/bundles/bareAsyncHooks.js",
"keys": [
"bareAsyncHooks"
]
},
{
@@ -139,12 +139,6 @@
"bareBundleCompile"
]
},
{
"path": "/lib/bare/bundles/bareBundle.js",
"keys": [
"bareBundle"
]
},
{
"path": "/lib/bare/bundles/bareBuffer.js",
"keys": [
@@ -152,9 +146,9 @@
]
},
{
"path": "/lib/bare/bundles/bareBluetoothApple.js",
"path": "/lib/bare/bundles/bareBundle.js",
"keys": [
"bareBluetoothApple"
"bareBundle"
]
},
{
@@ -164,9 +158,9 @@
]
},
{
"path": "/lib/bare/bundles/bareConsole.js",
"path": "/lib/bare/bundles/bareBluetoothApple.js",
"keys": [
"bareConsole"
"bareBluetoothApple"
]
},
{
@@ -175,6 +169,18 @@
"bareBoot"
]
},
{
"path": "/lib/bare/bundles/bareConsole.js",
"keys": [
"bareConsole"
]
},
{
"path": "/lib/bare/bundles/bareDaemon.js",
"keys": [
"bareDaemon"
]
},
{
"path": "/lib/bare/bundles/bareBundleId.js",
"keys": [
@@ -200,9 +206,9 @@
]
},
{
"path": "/lib/bare/bundles/bareDaemon.js",
"path": "/lib/bare/bundles/bareDns.js",
"keys": [
"bareDaemon"
"bareDns"
]
},
{
@@ -211,12 +217,6 @@
"bareDiagnosticsChannel"
]
},
{
"path": "/lib/bare/bundles/bareDns.js",
"keys": [
"bareDns"
]
},
{
"path": "/lib/bare/bundles/bareEnv.js",
"keys": [
@@ -253,24 +253,30 @@
"bareCov"
]
},
{
"path": "/lib/bare/bundles/bareGif.js",
"keys": [
"bareGif"
]
},
{
"path": "/lib/bare/bundles/bareFormat.js",
"keys": [
"bareFormat"
]
},
{
"path": "/lib/bare/bundles/bareGif.js",
"keys": [
"bareGif"
]
},
{
"path": "/lib/bare/bundles/bareFormData.js",
"keys": [
"bareFormData"
]
},
{
"path": "/lib/bare/bundles/bareFileLogger.js",
"keys": [
"bareFileLogger"
]
},
{
"path": "/lib/bare/bundles/bareHeif.js",
"keys": [
@@ -289,24 +295,18 @@
"bareFs"
]
},
{
"path": "/lib/bare/bundles/bareGtk.js",
"keys": [
"bareGtk"
]
},
{
"path": "/lib/bare/bundles/bareFileLogger.js",
"keys": [
"bareFileLogger"
]
},
{
"path": "/lib/bare/bundles/bareHttpParser.js",
"keys": [
"bareHttpParser"
]
},
{
"path": "/lib/bare/bundles/bareGtk.js",
"keys": [
"bareGtk"
]
},
{
"path": "/lib/bare/bundles/bareIco.js",
"keys": [
@@ -319,18 +319,18 @@
"bareImageResample"
]
},
{
"path": "/lib/bare/bundles/bareHttp1.js",
"keys": [
"bareHttp1"
]
},
{
"path": "/lib/bare/bundles/bareInspect.js",
"keys": [
"bareInspect"
]
},
{
"path": "/lib/bare/bundles/bareHttp1.js",
"keys": [
"bareHttp1"
]
},
{
"path": "/lib/bare/bundles/bareHttps.js",
"keys": [
@@ -343,42 +343,36 @@
"bareJpeg"
]
},
{
"path": "/lib/bare/bundles/bareIntl.js",
"keys": [
"bareIntl"
]
},
{
"path": "/lib/bare/bundles/bareIpc.js",
"keys": [
"bareIpc"
]
},
{
"path": "/lib/bare/bundles/bareLogger.js",
"keys": [
"bareLogger"
]
},
{
"path": "/lib/bare/bundles/bareLink.js",
"keys": [
"bareLink"
]
},
{
"path": "/lib/bare/bundles/bareInspector.js",
"keys": [
"bareInspector"
]
},
{
"path": "/lib/bare/bundles/bareLief.js",
"keys": [
"bareLief"
]
},
{
"path": "/lib/bare/bundles/bareIntl.js",
"keys": [
"bareIntl"
]
},
{
"path": "/lib/bare/bundles/bareLogger.js",
"keys": [
"bareLogger"
]
},
{
"path": "/lib/bare/bundles/bareInspector.js",
"keys": [
"bareInspector"
]
},
{
"path": "/lib/bare/bundles/bareMake.js",
"keys": [
@@ -386,9 +380,15 @@
]
},
{
"path": "/lib/bare/bundles/bareModuleResolve.js",
"path": "/lib/bare/bundles/bareLink.js",
"keys": [
"bareModuleResolve"
"bareLink"
]
},
{
"path": "/lib/bare/bundles/bareModule.js",
"keys": [
"bareModule"
]
},
{
@@ -397,6 +397,18 @@
"bareModuleLexer"
]
},
{
"path": "/lib/bare/bundles/bareModuleResolve.js",
"keys": [
"bareModuleResolve"
]
},
{
"path": "/lib/bare/bundles/bareMedia.js",
"keys": [
"bareMedia"
]
},
{
"path": "/lib/bare/bundles/bareModuleTraverse.js",
"keys": [
@@ -404,9 +416,9 @@
]
},
{
"path": "/lib/bare/bundles/bareModule.js",
"path": "/lib/bare/bundles/bareNdk.js",
"keys": [
"bareModule"
"bareNdk"
]
},
{
@@ -422,15 +434,9 @@
]
},
{
"path": "/lib/bare/bundles/bareNdk.js",
"path": "/lib/bare/bundles/bareNet.js",
"keys": [
"bareNdk"
]
},
{
"path": "/lib/bare/bundles/bareDev.js",
"keys": [
"bareDev"
"bareNet"
]
},
{
@@ -445,24 +451,6 @@
"bareOs"
]
},
{
"path": "/lib/bare/bundles/bareNet.js",
"keys": [
"bareNet"
]
},
{
"path": "/lib/bare/bundles/bareMedia.js",
"keys": [
"bareMedia"
]
},
{
"path": "/lib/bare/bundles/barePng.js",
"keys": [
"barePng"
]
},
{
"path": "/lib/bare/bundles/barePack.js",
"keys": [
@@ -481,6 +469,18 @@
"barePackDrive"
]
},
{
"path": "/lib/bare/bundles/barePng.js",
"keys": [
"barePng"
]
},
{
"path": "/lib/bare/bundles/barePrebuild.js",
"keys": [
"barePrebuild"
]
},
{
"path": "/lib/bare/bundles/barePipe.js",
"keys": [
@@ -488,9 +488,9 @@
]
},
{
"path": "/lib/bare/bundles/bareNodeRuntime.js",
"path": "/lib/bare/bundles/bareQuerystring.js",
"keys": [
"bareNodeRuntime"
"bareQuerystring"
]
},
{
@@ -500,9 +500,9 @@
]
},
{
"path": "/lib/bare/bundles/bareQuerystring.js",
"path": "/lib/bare/bundles/bareProcess.js",
"keys": [
"bareQuerystring"
"bareProcess"
]
},
{
@@ -518,15 +518,15 @@
]
},
{
"path": "/lib/bare/bundles/barePrebuild.js",
"path": "/lib/bare/bundles/bareNodeRuntime.js",
"keys": [
"barePrebuild"
"bareNodeRuntime"
]
},
{
"path": "/lib/bare/bundles/bareProcess.js",
"path": "/lib/bare/bundles/bareDev.js",
"keys": [
"bareProcess"
"bareDev"
]
},
{
@@ -535,12 +535,6 @@
"bareRuntime"
]
},
{
"path": "/lib/bare/bundles/bareRpc.js",
"keys": [
"bareRpc"
]
},
{
"path": "/lib/bare/bundles/barePromClient.js",
"keys": [
@@ -548,9 +542,15 @@
]
},
{
"path": "/lib/bare/bundles/bareSemver.js",
"path": "/lib/bare/bundles/bareRpc.js",
"keys": [
"bareSemver"
"bareRpc"
]
},
{
"path": "/lib/bare/bundles/bareSdl.js",
"keys": [
"bareSdl"
]
},
{
@@ -560,9 +560,9 @@
]
},
{
"path": "/lib/bare/bundles/bareSdl.js",
"path": "/lib/bare/bundles/bareSemver.js",
"keys": [
"bareSdl"
"bareSemver"
]
},
{
@@ -577,6 +577,12 @@
"bareSignals"
]
},
{
"path": "/lib/bare/bundles/bareSidecar.js",
"keys": [
"bareSidecar"
]
},
{
"path": "/lib/bare/bundles/bareStringDecoder.js",
"keys": [
@@ -589,12 +595,6 @@
"bareStream"
]
},
{
"path": "/lib/bare/bundles/bareSidecar.js",
"keys": [
"bareSidecar"
]
},
{
"path": "/lib/bare/bundles/bareStorage.js",
"keys": [
@@ -608,9 +608,9 @@
]
},
{
"path": "/lib/bare/bundles/bareSystemLogger.js",
"path": "/lib/bare/bundles/bareStdio.js",
"keys": [
"bareSystemLogger"
"bareStdio"
]
},
{
@@ -620,9 +620,9 @@
]
},
{
"path": "/lib/bare/bundles/bareStdio.js",
"path": "/lib/bare/bundles/bareSystemLogger.js",
"keys": [
"bareStdio"
"bareSystemLogger"
]
},
{
@@ -643,12 +643,6 @@
"bareSubprocess"
]
},
{
"path": "/lib/bare/bundles/bareTcp.js",
"keys": [
"bareTcp"
]
},
{
"path": "/lib/bare/bundles/bareThread.js",
"keys": [
@@ -656,9 +650,9 @@
]
},
{
"path": "/lib/bare/bundles/bareTimers.js",
"path": "/lib/bare/bundles/bareTcp.js",
"keys": [
"bareTimers"
"bareTcp"
]
},
{
@@ -668,15 +662,15 @@
]
},
{
"path": "/lib/bare/bundles/bareType.js",
"path": "/lib/bare/bundles/bareTimers.js",
"keys": [
"bareType"
"bareTimers"
]
},
{
"path": "/lib/bare/bundles/bareUiKit.js",
"path": "/lib/bare/bundles/bareType.js",
"keys": [
"bareUiKit"
"bareType"
]
},
{
@@ -692,15 +686,9 @@
]
},
{
"path": "/lib/bare/bundles/bareUnionBundle.js",
"path": "/lib/bare/bundles/bareUiKit.js",
"keys": [
"bareUnionBundle"
]
},
{
"path": "/lib/bare/bundles/bareV8.js",
"keys": [
"bareV8"
"bareUiKit"
]
},
{
@@ -710,9 +698,9 @@
]
},
{
"path": "/lib/bare/bundles/bareWalkHandles.js",
"path": "/lib/bare/bundles/bareV8.js",
"keys": [
"bareWalkHandles"
"bareV8"
]
},
{
@@ -722,15 +710,15 @@
]
},
{
"path": "/lib/bare/bundles/bareWebp.js",
"path": "/lib/bare/bundles/bareWalkHandles.js",
"keys": [
"bareWebp"
"bareWalkHandles"
]
},
{
"path": "/lib/bare/bundles/bareWhich.js",
"path": "/lib/bare/bundles/bareUnionBundle.js",
"keys": [
"bareWhich"
"bareUnionBundle"
]
},
{
@@ -739,6 +727,12 @@
"bareWebKit"
]
},
{
"path": "/lib/bare/bundles/bareV8ToIstanbul.js",
"keys": [
"bareV8ToIstanbul"
]
},
{
"path": "/lib/bare/bundles/bareWebKitGtk.js",
"keys": [
@@ -752,15 +746,15 @@
]
},
{
"path": "/lib/bare/bundles/bareV8ToIstanbul.js",
"path": "/lib/bare/bundles/bareWebp.js",
"keys": [
"bareV8ToIstanbul"
"bareWebp"
]
},
{
"path": "/lib/bare/bundles/bareWinUi.js",
"path": "/lib/bare/bundles/bareWhich.js",
"keys": [
"bareWinUi"
"bareWhich"
]
},
{
@@ -770,15 +764,15 @@
]
},
{
"path": "/lib/bare/bundles/bareZlib.js",
"path": "/lib/bare/bundles/bareWinUi.js",
"keys": [
"bareZlib"
"bareWinUi"
]
},
{
"path": "/lib/bare/bundles/bareZmq.js",
"path": "/lib/bare/bundles/bareZlib.js",
"keys": [
"bareZmq"
"bareZlib"
]
},
{
@@ -792,6 +786,12 @@
"keys": [
"bareWorker"
]
},
{
"path": "/lib/bare/bundles/bareZmq.js",
"keys": [
"bareZmq"
]
}
],
"bundleStats": {
@@ -1595,8 +1595,8 @@
],
"bundleProvenance": {
"schemaVersion": 1,
"generatedAt": "2026-04-05T06:07:30.836Z",
"gitCommit": "ebee9576c8e7ad247c71fbe2a0478dcf644edfa8",
"generatedAt": "2026-04-05T06:20:46.518Z",
"gitCommit": "7f4279d315b4c6f13ddab76bedf5d24b7ca3fe40",
"nodeVersion": "v22.22.0",
"bundleTier": "all",
"normativeManifest": "packages/bare-os-booter/lib/bare-module-manifest.json",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"schema": 1,
"atMs": 1775369250127,
"atMs": 1775370045811,
"commands": [
"arch",
"awk",
+36 -2
View File
@@ -35,6 +35,7 @@
* BARE_OS_KERNEL_STARTUP_CLASS: `critical` | `system` | `interactive` | `deferred` (default **interactive**); exposed as **`ctx.bareOsKernelStartupClass`** for extensions/initd.
* BARE_OS_BOOT_BUDGET_MS_COLD: optional cold-boot wall-time warning threshold (ms) after **`bareOsPublishBootReady`**.
* BARE_OS_BOOT_BUDGET_MS_BARE_STDLIB: optional wall-time budget (ms) for booter **`ctx.bare`** drive merge + host resolve (**`BARE_OS_BOOT_BARE_STDLIB_RESOLUTION_MS`**, set by the stock booter); guest logs and **`boot-perf.json`** when exceeded.
* BARE_OS_BOOT_BUDGET_STRICT=1 with **BARE_OS_BOOT_POLICY_STRICT**: exit via **`bareOsRequestBooterExit(1)`** when either budget is exceeded (after **`boot-transaction.ndjson`** row **`bootBudgetViolation`** when journaling is on).
* BARE_OS_BOOT_CAPABILITY_CONTRACT_DEBUG=1: log capability-contract merge diagnostics (strict builds).
* BARE_OS_BOOT_EXT_RESOLUTION_TRACE=1 with **BARE_OS_BOOT_POLICY_STRICT**: write **`/run/bare-os/kernel-ext-resolution.json`** (extension load order / cycle ids).
* BARE_OS_BOOT_RC_RESOLUTION_TRACE=1 with **BARE_OS_BOOT_POLICY_STRICT**: write **`/run/bare-os/rc-d-resolution.json`** and **`/run/bare-os/kernel-d-resolution.json`** (lexicographic execution order after filters).
@@ -3450,6 +3451,14 @@ async function start(ctx) {
}
}
{
const budgetStrict =
ctx.env?.BARE_OS_BOOT_BUDGET_STRICT === '1' ||
ctx.env?.BARE_OS_BOOT_BUDGET_STRICT === 'true'
const polStrict =
ctx.env?.BARE_OS_BOOT_POLICY_STRICT === '1' ||
ctx.env?.BARE_OS_BOOT_POLICY_STRICT === 'true'
let coldExceeded = false
let stdlibExceeded = false
const budget = Number.parseInt(
String(ctx.env?.BARE_OS_BOOT_BUDGET_MS_COLD || ''),
10
@@ -3457,6 +3466,7 @@ async function start(ctx) {
if (Number.isFinite(budget) && budget > 0) {
const wall = Date.now() - bootT0
if (wall > budget) {
coldExceeded = true
bootStructuredLog(
ctx,
'error',
@@ -3470,8 +3480,6 @@ async function start(ctx) {
}
}
}
}
{
const sb = Number.parseInt(
String(ctx.env?.BARE_OS_BOOT_BUDGET_MS_BARE_STDLIB || ''),
10
@@ -3482,6 +3490,7 @@ async function start(ctx) {
10
)
if (Number.isFinite(sw) && sw > sb) {
stdlibExceeded = true
bootStructuredLog(
ctx,
'error',
@@ -3495,6 +3504,31 @@ async function start(ctx) {
}
}
}
if (coldExceeded || stdlibExceeded) {
await maybeAppendBootTransactionJournal(ctx, {
phase: 'boot.budget',
stage: 'boot.budget',
bootStage: 'budget',
ms: 0,
ok: false,
bootBudgetViolation: true,
bootBudgetSchemaVersion: 1,
coldBudgetExceeded: coldExceeded,
bareStdlibBudgetExceeded: stdlibExceeded,
transactionState: BARE_OS_BOOT_TXN_STATE.STAGE_COMMITTED
})
}
if (budgetStrict && polStrict && (coldExceeded || stdlibExceeded)) {
bootStructuredLog(
ctx,
'error',
'bootBudgetStrictAbort',
'[boot] BARE_OS_BOOT_BUDGET_STRICT with BARE_OS_BOOT_POLICY_STRICT: exiting after budget violation'
)
if (typeof ctx.bareOsRequestBooterExit === 'function')
ctx.bareOsRequestBooterExit(1)
return
}
}
while (true) {
const line = await readLine('')
File diff suppressed because one or more lines are too long