feat: complete 20-track kernel roadmap (P2P ops, POSIX, HRPC, CI, docs)
- Add optional Holepunch clone lag gate (holepunch-freshness-gate.json, verify-holepunch-clone-freshness.mjs) and wire into pretest/docs. - Extend stock ctx.bareOsHrpcRequest with disk.os replication routes; bump hrpc_allowlist_sketch proc to schema 2 with stockRoutes list. - Security posture: blindRelayAudit; hyper_multisig_trust_pointer schema 2 + vault multisig continuity env; login/unlock audit hook. - Syscalls schema 9 alignment (JSON schema, compatibility matrix, conformance matrix clock_gettime); boot budget telemetry schema 2 in metrics_live. - Coreutils hostname -s/--short man/options; rebuild kernel bins/man. - POSIX + P2P dashboard section in docs/README; handbook/DOCUMENTATION/ release-checklist/OTA/KERNEL_CONTRACT/PEAR-RUN and related reference updates. - verify-boot-policy-extension-signer-pins: scan kernel init fragments. Note: vendor drift section removed from kernel/lib/bare/README.md (intentional).
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* CI: ensure booter wires ctx API semver and protocol stock feature mask.
|
||||
* Stock symbol lists: packages/bare-os-protocol/lib/stock-booter-capability-contract.json
|
||||
*/
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
@@ -18,12 +19,22 @@ const bitsPath = path.join(
|
||||
root,
|
||||
'packages/bare-os-protocol/lib/kernel-feature-bits.js'
|
||||
)
|
||||
const contractPath = path.join(
|
||||
root,
|
||||
'packages/bare-os-protocol/lib/stock-booter-capability-contract.json'
|
||||
)
|
||||
|
||||
function read(p) {
|
||||
return fs.readFileSync(p, 'utf8')
|
||||
}
|
||||
|
||||
function main() {
|
||||
const contract = JSON.parse(read(contractPath))
|
||||
if (contract.schema !== 1) {
|
||||
console.error('stock-booter-capability-contract.json: unsupported schema')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const ctxSrc = read(ctxApiPath)
|
||||
const verMatch = ctxSrc.match(
|
||||
/export const BARE_OS_CTX_API_VERSION = '([^']+)'/
|
||||
@@ -34,128 +45,28 @@ function main() {
|
||||
}
|
||||
|
||||
const idx = read(indexPath)
|
||||
if (!idx.includes('bareOsCtxApiVersion: BARE_OS_CTX_API_VERSION')) {
|
||||
console.error(
|
||||
'index.js should assign bareOsCtxApiVersion from BARE_OS_CTX_API_VERSION'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_PRIMARY')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_PRIMARY')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_EXTENDED_SEEDING_PLATFORM')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_EXTENDED_SEEDING_PLATFORM')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_RLIMITS_DELEGATES_SHELL')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_RLIMITS_DELEGATES_SHELL')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('bareOsAdvertisedKernelCapabilityWords')) {
|
||||
console.error('index.js should expose bareOsAdvertisedKernelCapabilityWords (wire v2)')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('bareOsSeedKernelCapabilityWords')) {
|
||||
console.error('index.js should expose bareOsSeedKernelCapabilityWords (wire v2)')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('KERNEL_CAPABILITY_SEED_STRICT_ROWS')) {
|
||||
console.error('index.js should define KERNEL_CAPABILITY_SEED_STRICT_ROWS for seed strict checks')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_REPLICATION_OPERATOR_SURFACE')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_REPLICATION_OPERATOR_SURFACE')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_CORESTORE_HRPC')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_CORESTORE_HRPC')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_RUNTIME_PROTO_MUX')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_RUNTIME_PROTO_MUX')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_MODULE_CRYPTO_STAGING')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_MODULE_CRYPTO_STAGING')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_INSPECT_LOGGER_TLS')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_INSPECT_LOGGER_TLS')
|
||||
process.exit(1)
|
||||
}
|
||||
if (!idx.includes('BARE_OS_KERNEL_FEATURES_STOCK_WORD_HYPERCORE_PACK_HRPC_LIFECYCLE')) {
|
||||
console.error('index.js should reference BARE_OS_KERNEL_FEATURES_STOCK_WORD_HYPERCORE_PACK_HRPC_LIFECYCLE')
|
||||
process.exit(1)
|
||||
const reqIdx = Array.isArray(contract.requiredIndexSubstrings)
|
||||
? contract.requiredIndexSubstrings
|
||||
: []
|
||||
for (const s of reqIdx) {
|
||||
if (!idx.includes(s)) {
|
||||
console.error('index.js should include substring:', s)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
const bitsSrc = read(bitsPath)
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_PRIMARY')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_PRIMARY'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_EXTENDED_SEEDING_PLATFORM')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_EXTENDED_SEEDING_PLATFORM'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_RLIMITS_DELEGATES_SHELL')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_RLIMITS_DELEGATES_SHELL'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_OFFLINE_NET_EXTENSIONS')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_OFFLINE_NET_EXTENSIONS'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_HOST_TRANSPORT_DELEGATES')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_HOST_TRANSPORT_DELEGATES'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_REPLICATION_OPERATOR_SURFACE')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_REPLICATION_OPERATOR_SURFACE'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_CORESTORE_HRPC')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_CORESTORE_HRPC'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_RUNTIME_PROTO_MUX')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_RUNTIME_PROTO_MUX'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_MODULE_CRYPTO_STAGING')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_BARE_MODULE_CRYPTO_STAGING'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_INSPECT_LOGGER_TLS')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_PEAR_INSPECT_LOGGER_TLS'
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
if (!bitsSrc.includes('export const BARE_OS_KERNEL_FEATURES_STOCK_WORD_HYPERCORE_PACK_HRPC_LIFECYCLE')) {
|
||||
console.error(
|
||||
'kernel-feature-bits.js missing BARE_OS_KERNEL_FEATURES_STOCK_WORD_HYPERCORE_PACK_HRPC_LIFECYCLE'
|
||||
)
|
||||
process.exit(1)
|
||||
const reqBits = Array.isArray(contract.requiredBitsExports)
|
||||
? contract.requiredBitsExports
|
||||
: []
|
||||
for (const name of reqBits) {
|
||||
const needle = `export const ${name}`
|
||||
if (!bitsSrc.includes(needle)) {
|
||||
console.error('kernel-feature-bits.js missing', name)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
const docMatch = bitsSrc.match(
|
||||
/export const BARE_OS_KERNEL_FEATURE_BITS_DOC = (\d+)/
|
||||
)
|
||||
@@ -163,8 +74,14 @@ function main() {
|
||||
console.error('Could not parse BARE_OS_KERNEL_FEATURE_BITS_DOC')
|
||||
process.exit(1)
|
||||
}
|
||||
if (docMatch[1] !== '15') {
|
||||
console.error('Expected BARE_OS_KERNEL_FEATURE_BITS_DOC = 15')
|
||||
const wantDoc = String(contract.expectedFeatureBitsDoc ?? '')
|
||||
if (!wantDoc || docMatch[1] !== wantDoc) {
|
||||
console.error(
|
||||
'Expected BARE_OS_KERNEL_FEATURE_BITS_DOC =',
|
||||
wantDoc,
|
||||
'got',
|
||||
docMatch[1]
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
@@ -209,6 +126,8 @@ function main() {
|
||||
verMatch[1],
|
||||
'| bits doc',
|
||||
docMatch[1],
|
||||
'| contract',
|
||||
path.relative(root, contractPath),
|
||||
'OK'
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user