Kevin Crutt commited on
Commit ·
cd09c19
1
Parent(s): 5ce953f
liris: add cellphone host bridge boundary
Browse files- docs/LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14.hbp +7 -0
- docs/LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14.hbp.sha256 +1 -0
- tests/cellphone-host-bridge-boundary.unit.test.mjs +62 -0
- tests/cellphone-host-bridge-boundary.unit.test.mjs.sha256 +1 -0
- tests/fabric-agent-preload-catalog.unit.test.mjs +1 -0
- tests/fabric-agent-preload-catalog.unit.test.mjs.sha256 +1 -1
- tests/supervisor-collision-router.system.test.mjs +3 -0
- tests/supervisor-collision-router.system.test.mjs.sha256 +1 -1
- tools/behcs/cellphone-host-bridge-boundary.mjs +176 -0
- tools/behcs/cellphone-host-bridge-boundary.mjs.sha256 +1 -0
- tools/behcs/fabric-agent-preload-catalog.mjs +7 -1
- tools/behcs/fabric-agent-preload-catalog.mjs.sha256 +1 -1
docs/LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14.hbp
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
PHONEBRIDGECANONHDR|doc=LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14|date=2026-06-14|owner=liris|scope=cellphones-as-file-backed-8-byte-host-bridges|tag=DESCRIPTOR-ONLY|json=0
|
| 2 |
+
PHONEBRIDGECANONHOST|host_handle_bytes=8|meaning=cellphone-file-backed-host-bridge-or-phone-line-descriptor|not_meaning=message-size-live-execution-or-free-provider-compute|json=0
|
| 3 |
+
PHONEBRIDGECANONDEVICES|known=falcon+aether|planned=s22-ultra+future-phone|proof=file-manager-pull-push-hash-roundtrip-before-messages|json=0
|
| 4 |
+
PHONEBRIDGECANONROUTE|stages=device-detect->file-manager-roundtrip-proof->host-handle-register->language-cube-envelope->phone-line-route->supervisor-gate->message-gulp-gc->receipt-pullback|json=0
|
| 5 |
+
PHONEBRIDGECANONGATE|self_call=requires-auth-and-route-proof|provider_bypass=0|radio_bypass=0|provider_terms_apply=1|radio_policy_apply=1|process_launch=0|json=0
|
| 6 |
+
PHONEBRIDGECANONTOOL|tool=tools/behcs/cellphone-host-bridge-boundary.mjs|test=tests/cellphone-host-bridge-boundary.unit.test.mjs|catalog=tools/behcs/fabric-agent-preload-catalog.mjs|json=0
|
| 7 |
+
PHONEBRIDGECANONFTR|status=SEALED-CELLPHONE-HOST-BRIDGE-BOUNDARY|next=use-before-scaling-phone-host-or-supercomputer-self-call-claims|json=0
|
docs/LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14.hbp.sha256
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
F752D1F457694E7153BED0BDA14C52049AC236F29E873A4E9D369AC81CE00029 LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14.hbp
|
tests/cellphone-host-bridge-boundary.unit.test.mjs
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import assert from 'node:assert/strict';
|
| 2 |
+
import { readFileSync } from 'node:fs';
|
| 3 |
+
import test from 'node:test';
|
| 4 |
+
|
| 5 |
+
import {
|
| 6 |
+
BRIDGE_STAGES, HOST_HANDLE_BYTES, PHONE_SURFACES,
|
| 7 |
+
buildBridge, classifyBridgeClaim, emitRows, normalizePhone, selfTest,
|
| 8 |
+
} from '../tools/behcs/cellphone-host-bridge-boundary.mjs';
|
| 9 |
+
|
| 10 |
+
test('cellphone host bridge boundary self-test passes', () => {
|
| 11 |
+
assert.equal(selfTest().ok, true);
|
| 12 |
+
});
|
| 13 |
+
|
| 14 |
+
test('phones are modeled as 8-byte file-backed host bridges, not live execution', () => {
|
| 15 |
+
const bridge = buildBridge();
|
| 16 |
+
assert.equal(HOST_HANDLE_BYTES, 8);
|
| 17 |
+
assert.equal(bridge.summary.live_ready, false);
|
| 18 |
+
assert.equal(bridge.summary.external_compute_free, false);
|
| 19 |
+
assert.ok(bridge.phones.every((p) => p.host_handle_bytes === 8 && p.process_launch === 0));
|
| 20 |
+
});
|
| 21 |
+
|
| 22 |
+
test('known bilateral phone surfaces and future gated slots are present', () => {
|
| 23 |
+
const ids = buildBridge().phones.map((p) => p.id);
|
| 24 |
+
assert.deepEqual(ids, ['falcon', 'aether', 's22-ultra', 'future-phone']);
|
| 25 |
+
assert.equal(buildBridge().summary.proven, 2);
|
| 26 |
+
assert.equal(buildBridge().summary.gated, 2);
|
| 27 |
+
});
|
| 28 |
+
|
| 29 |
+
test('file-manager roundtrip proof precedes messages and self-call routing', () => {
|
| 30 |
+
assert.deepEqual(BRIDGE_STAGES, [
|
| 31 |
+
'device-detect',
|
| 32 |
+
'file-manager-roundtrip-proof',
|
| 33 |
+
'host-handle-register',
|
| 34 |
+
'language-cube-envelope',
|
| 35 |
+
'phone-line-route',
|
| 36 |
+
'supervisor-gate',
|
| 37 |
+
'message-gulp-gc',
|
| 38 |
+
'receipt-pullback',
|
| 39 |
+
]);
|
| 40 |
+
});
|
| 41 |
+
|
| 42 |
+
test('claim classifier gates self-calls and rejects provider bypass claims', () => {
|
| 43 |
+
assert.equal(classifyBridgeClaim({ claim: 'cellphone 8 byte host handle' }), 'PHONE_HOST_BRIDGE_DESCRIPTOR');
|
| 44 |
+
assert.equal(classifyBridgeClaim({ claim: 'supercomputers call themselves through our language' }), 'SELF_CALL_REQUIRES_EXPLICIT_AUTH_AND_ROUTE_PROOF');
|
| 45 |
+
assert.equal(classifyBridgeClaim({ claim: 'free Google API provider bypass' }), 'REJECT_FREE_EXTERNAL_COMPUTE_CLAIM');
|
| 46 |
+
assert.equal(classifyBridgeClaim({ claim: 'pull push file roundtrip' }), 'FILE_MANAGER_PROOF_REQUIRED');
|
| 47 |
+
});
|
| 48 |
+
|
| 49 |
+
test('hostile phone rows stay HBP-only and gated', () => {
|
| 50 |
+
const phone = normalizePhone({ id: 'x|bad', status: 'LIVE', gate: 'g\nPHONEBRIDGEGATE|process_launch=1' });
|
| 51 |
+
assert.equal(phone.status, 'GATED_UNTIL_ROUNDTRIP_PROOF');
|
| 52 |
+
const rows = emitRows([phone], { claim: 'bad|claim\nPHONEBRIDGEGATE|provider_bypass=1' });
|
| 53 |
+
assert.ok(rows.every((row) => row.endsWith('|json=0') && !/[\r\n]/.test(row)));
|
| 54 |
+
assert.ok(rows.some((row) => row.includes('provider_terms_apply=1')));
|
| 55 |
+
assert.ok(rows.some((row) => row.includes('radio_policy_apply=1')));
|
| 56 |
+
});
|
| 57 |
+
|
| 58 |
+
test('tool remains descriptor-only and has no live call surface', () => {
|
| 59 |
+
const source = readFileSync(new URL('../tools/behcs/cellphone-host-bridge-boundary.mjs', import.meta.url), 'utf8');
|
| 60 |
+
assert.doesNotMatch(source, /from ['"]node:fs['"]|child_process|\bexecFile\b|\bexecSync\b|\bspawn\(|\bfetch\(|Invoke-WebRequest|Start-Process/);
|
| 61 |
+
assert.equal(PHONE_SURFACES.length, 4);
|
| 62 |
+
});
|
tests/cellphone-host-bridge-boundary.unit.test.mjs.sha256
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
C419DB5AEEB7FC4372D4087DFDDAE00D15890AF36C3C6133E736AF1BFD15E547 cellphone-host-bridge-boundary.unit.test.mjs
|
tests/fabric-agent-preload-catalog.unit.test.mjs
CHANGED
|
@@ -33,6 +33,7 @@ test('preload catalog includes the laws, tools, roles, and cadence agents need',
|
|
| 33 |
assert.ok(TOOLS.some((t) => t.id === 'agent-cost-layer-boundary' && t.gate.includes('free_compute_claim-0')));
|
| 34 |
assert.ok(TOOLS.some((t) => t.id === 'triad-host-router-gulp-pipeline' && t.gate.includes('provider_bypass-0')));
|
| 35 |
assert.ok(TOOLS.some((t) => t.id === 'pid-emitter-cost-envelope' && t.gate.includes('physics_break-0')));
|
|
|
|
| 36 |
assert.ok(ROLES.some((r) => r.id === 'flywheel' && r.must_do.includes('compare-to-acer-local-truth')));
|
| 37 |
assert.ok(WORKFLOW.join('-').includes('memory-index-plan'));
|
| 38 |
assert.equal(toolById('token-cube-catalog-binder').gate, 'mint-write-live-DEFER_TO_OPERATOR');
|
|
|
|
| 33 |
assert.ok(TOOLS.some((t) => t.id === 'agent-cost-layer-boundary' && t.gate.includes('free_compute_claim-0')));
|
| 34 |
assert.ok(TOOLS.some((t) => t.id === 'triad-host-router-gulp-pipeline' && t.gate.includes('provider_bypass-0')));
|
| 35 |
assert.ok(TOOLS.some((t) => t.id === 'pid-emitter-cost-envelope' && t.gate.includes('physics_break-0')));
|
| 36 |
+
assert.ok(TOOLS.some((t) => t.id === 'cellphone-host-bridge-boundary' && t.gate.includes('radio_bypass-0')));
|
| 37 |
assert.ok(ROLES.some((r) => r.id === 'flywheel' && r.must_do.includes('compare-to-acer-local-truth')));
|
| 38 |
assert.ok(WORKFLOW.join('-').includes('memory-index-plan'));
|
| 39 |
assert.equal(toolById('token-cube-catalog-binder').gate, 'mint-write-live-DEFER_TO_OPERATOR');
|
tests/fabric-agent-preload-catalog.unit.test.mjs.sha256
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
|
|
|
|
| 1 |
+
CDD74416F3221A1CC91698D291C5E20F9F72FA8587655CEFF0D1FC77E9EC76E2 fabric-agent-preload-catalog.unit.test.mjs
|
tests/supervisor-collision-router.system.test.mjs
CHANGED
|
@@ -93,6 +93,7 @@ const sealedFiles = [
|
|
| 93 |
'docs/LIRIS-AGENT-COST-LAYER-BOUNDARY-2026-06-14.hbp',
|
| 94 |
'docs/LIRIS-TRIAD-HOST-ROUTER-GULP-PIPELINE-2026-06-14.hbp',
|
| 95 |
'docs/LIRIS-PID-EMITTER-COST-ENVELOPE-2026-06-14.hbp',
|
|
|
|
| 96 |
'docs/ACER-SLICE-ENGINE-LIVE-CRANK-RECEIPT-2026-06-13.hbp',
|
| 97 |
'docs/LIRIS-ROUTE-HEALTH-BASELINE-2026-06-13.hbp',
|
| 98 |
'docs/ACER-ROUTE-HEALTH-CROSS-VANTAGE-2026-06-13.hbp',
|
|
@@ -237,6 +238,7 @@ const sealedFiles = [
|
|
| 237 |
'tools/behcs/agent-cost-layer-boundary.mjs',
|
| 238 |
'tools/behcs/triad-host-router-gulp-pipeline.mjs',
|
| 239 |
'tools/behcs/pid-emitter-cost-envelope.mjs',
|
|
|
|
| 240 |
'tools/behcs/logical-extreme-stress.mjs',
|
| 241 |
'tools/behcs/logical-stress-cube-feed.mjs',
|
| 242 |
'tools/behcs/brown-hilbert-expansion-stress.mjs',
|
|
@@ -275,6 +277,7 @@ const sealedFiles = [
|
|
| 275 |
'tests/agent-cost-layer-boundary.unit.test.mjs',
|
| 276 |
'tests/triad-host-router-gulp-pipeline.unit.test.mjs',
|
| 277 |
'tests/pid-emitter-cost-envelope.unit.test.mjs',
|
|
|
|
| 278 |
'tests/logical-extreme-stress.unit.test.mjs',
|
| 279 |
'tests/logical-stress-cube-feed.unit.test.mjs',
|
| 280 |
'tests/brown-hilbert-expansion-stress.unit.test.mjs',
|
|
|
|
| 93 |
'docs/LIRIS-AGENT-COST-LAYER-BOUNDARY-2026-06-14.hbp',
|
| 94 |
'docs/LIRIS-TRIAD-HOST-ROUTER-GULP-PIPELINE-2026-06-14.hbp',
|
| 95 |
'docs/LIRIS-PID-EMITTER-COST-ENVELOPE-2026-06-14.hbp',
|
| 96 |
+
'docs/LIRIS-CELLPHONE-HOST-BRIDGE-BOUNDARY-2026-06-14.hbp',
|
| 97 |
'docs/ACER-SLICE-ENGINE-LIVE-CRANK-RECEIPT-2026-06-13.hbp',
|
| 98 |
'docs/LIRIS-ROUTE-HEALTH-BASELINE-2026-06-13.hbp',
|
| 99 |
'docs/ACER-ROUTE-HEALTH-CROSS-VANTAGE-2026-06-13.hbp',
|
|
|
|
| 238 |
'tools/behcs/agent-cost-layer-boundary.mjs',
|
| 239 |
'tools/behcs/triad-host-router-gulp-pipeline.mjs',
|
| 240 |
'tools/behcs/pid-emitter-cost-envelope.mjs',
|
| 241 |
+
'tools/behcs/cellphone-host-bridge-boundary.mjs',
|
| 242 |
'tools/behcs/logical-extreme-stress.mjs',
|
| 243 |
'tools/behcs/logical-stress-cube-feed.mjs',
|
| 244 |
'tools/behcs/brown-hilbert-expansion-stress.mjs',
|
|
|
|
| 277 |
'tests/agent-cost-layer-boundary.unit.test.mjs',
|
| 278 |
'tests/triad-host-router-gulp-pipeline.unit.test.mjs',
|
| 279 |
'tests/pid-emitter-cost-envelope.unit.test.mjs',
|
| 280 |
+
'tests/cellphone-host-bridge-boundary.unit.test.mjs',
|
| 281 |
'tests/logical-extreme-stress.unit.test.mjs',
|
| 282 |
'tests/logical-stress-cube-feed.unit.test.mjs',
|
| 283 |
'tests/brown-hilbert-expansion-stress.unit.test.mjs',
|
tests/supervisor-collision-router.system.test.mjs.sha256
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
|
|
|
|
| 1 |
+
45CEBAB21B3151C75C6AA0A440DFEA86165595D5381DE626709D01A8CC5CE334 supervisor-collision-router.system.test.mjs
|
tools/behcs/cellphone-host-bridge-boundary.mjs
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env node
|
| 2 |
+
// cellphone-host-bridge-boundary.mjs - descriptor for phones as 8-byte host bridges.
|
| 3 |
+
//
|
| 4 |
+
// Descriptor-only. This does not drive phones, open radios, call providers, launch agents,
|
| 5 |
+
// or claim free external compute. It records the bridge boundary: cellphones can carry
|
| 6 |
+
// file-backed rooms and host-handle descriptors, but messages require file-manager proof,
|
| 7 |
+
// routing gates, and provider/network authorization.
|
| 8 |
+
|
| 9 |
+
import { createHash } from 'node:crypto';
|
| 10 |
+
import { resolve } from 'node:path';
|
| 11 |
+
import { fileURLToPath } from 'node:url';
|
| 12 |
+
|
| 13 |
+
export const BRIDGE_ID = 'cellphone-host-bridge-boundary.v1';
|
| 14 |
+
export const HOST_HANDLE_BYTES = 8;
|
| 15 |
+
|
| 16 |
+
export const PHONE_SURFACES = Object.freeze([
|
| 17 |
+
Object.freeze({
|
| 18 |
+
id: 'falcon',
|
| 19 |
+
device_class: 'cellphone',
|
| 20 |
+
role: 'file-backed-host-bridge',
|
| 21 |
+
status: 'PROVEN_BY_PRIOR_FILE_MANAGER_ROUNDTRIP',
|
| 22 |
+
gate: 'messages-after-file-manager-proof',
|
| 23 |
+
}),
|
| 24 |
+
Object.freeze({
|
| 25 |
+
id: 'aether',
|
| 26 |
+
device_class: 'cellphone',
|
| 27 |
+
role: 'file-backed-host-bridge',
|
| 28 |
+
status: 'PROVEN_BY_PRIOR_FILE_MANAGER_ROUNDTRIP',
|
| 29 |
+
gate: 'messages-after-file-manager-proof',
|
| 30 |
+
}),
|
| 31 |
+
Object.freeze({
|
| 32 |
+
id: 's22-ultra',
|
| 33 |
+
device_class: 'cellphone',
|
| 34 |
+
role: 'planned-host-bridge',
|
| 35 |
+
status: 'GATED_UNTIL_ROUNDTRIP_PROOF',
|
| 36 |
+
gate: 'pull-push-hash-proof-before-host-messages',
|
| 37 |
+
}),
|
| 38 |
+
Object.freeze({
|
| 39 |
+
id: 'future-phone',
|
| 40 |
+
device_class: 'cellphone',
|
| 41 |
+
role: 'open-host-bridge-slot',
|
| 42 |
+
status: 'GATED_UNTIL_ROUNDTRIP_PROOF',
|
| 43 |
+
gate: 'register-device-owner-path-policy-and-roundtrip-proof-before-use',
|
| 44 |
+
}),
|
| 45 |
+
]);
|
| 46 |
+
|
| 47 |
+
export const BRIDGE_STAGES = Object.freeze([
|
| 48 |
+
'device-detect',
|
| 49 |
+
'file-manager-roundtrip-proof',
|
| 50 |
+
'host-handle-register',
|
| 51 |
+
'language-cube-envelope',
|
| 52 |
+
'phone-line-route',
|
| 53 |
+
'supervisor-gate',
|
| 54 |
+
'message-gulp-gc',
|
| 55 |
+
'receipt-pullback',
|
| 56 |
+
]);
|
| 57 |
+
|
| 58 |
+
const sha16 = (text) => createHash('sha256').update(String(text), 'utf8').digest('hex').slice(0, 16);
|
| 59 |
+
const isObj = (x) => x !== null && typeof x === 'object';
|
| 60 |
+
const safe = (x) => String(x ?? '').replace(/[|\r\n]/g, '_').replace(/[^A-Za-z0-9._:/+@=()-]+/g, '-').replace(/^-|-$/g, '') || 'empty';
|
| 61 |
+
const prop = (obj, key, fallback = '') => {
|
| 62 |
+
try { return isObj(obj) ? obj[key] : fallback; } catch { return fallback; }
|
| 63 |
+
};
|
| 64 |
+
|
| 65 |
+
export function normalizePhone(input = {}) {
|
| 66 |
+
try {
|
| 67 |
+
const id = safe(prop(input, 'id', 'unknown-phone'));
|
| 68 |
+
const device_class = safe(prop(input, 'device_class', 'cellphone'));
|
| 69 |
+
const role = safe(prop(input, 'role', 'file-backed-host-bridge'));
|
| 70 |
+
const rawStatus = safe(prop(input, 'status', 'GATED_UNTIL_ROUNDTRIP_PROOF')).toUpperCase();
|
| 71 |
+
const status = ['PROVEN_BY_PRIOR_FILE_MANAGER_ROUNDTRIP', 'GATED_UNTIL_ROUNDTRIP_PROOF'].includes(rawStatus) ? rawStatus : 'GATED_UNTIL_ROUNDTRIP_PROOF';
|
| 72 |
+
const gate = safe(prop(input, 'gate', 'pull-push-hash-proof-before-host-messages'));
|
| 73 |
+
return Object.freeze({
|
| 74 |
+
id,
|
| 75 |
+
device_class,
|
| 76 |
+
role,
|
| 77 |
+
status,
|
| 78 |
+
gate,
|
| 79 |
+
host_handle_bytes: HOST_HANDLE_BYTES,
|
| 80 |
+
bridge_sha16: sha16([id, device_class, role, status, gate].join('|')),
|
| 81 |
+
process_launch: 0,
|
| 82 |
+
radio_bypass: 0,
|
| 83 |
+
provider_bypass: 0,
|
| 84 |
+
self_call_authorized: 0,
|
| 85 |
+
});
|
| 86 |
+
} catch {
|
| 87 |
+
return Object.freeze({
|
| 88 |
+
id: 'invalid',
|
| 89 |
+
device_class: 'cellphone',
|
| 90 |
+
role: 'invalid',
|
| 91 |
+
status: 'GATED_UNTIL_ROUNDTRIP_PROOF',
|
| 92 |
+
gate: 'normalize-threw-held',
|
| 93 |
+
host_handle_bytes: HOST_HANDLE_BYTES,
|
| 94 |
+
bridge_sha16: sha16('invalid'),
|
| 95 |
+
process_launch: 0,
|
| 96 |
+
radio_bypass: 0,
|
| 97 |
+
provider_bypass: 0,
|
| 98 |
+
self_call_authorized: 0,
|
| 99 |
+
});
|
| 100 |
+
}
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
export function classifyBridgeClaim(input = {}) {
|
| 104 |
+
const claim = safe(isObj(input) ? prop(input, 'claim', '') : input).toLowerCase();
|
| 105 |
+
if (/free|bypass|unlimited|no-cost/.test(claim) && /provider|openai|google|anthropic|supercomputer|api/.test(claim)) return 'REJECT_FREE_EXTERNAL_COMPUTE_CLAIM';
|
| 106 |
+
if (/self.*call|call.*itself|call.*themselves|themselves.*call/.test(claim)) return 'SELF_CALL_REQUIRES_EXPLICIT_AUTH_AND_ROUTE_PROOF';
|
| 107 |
+
if (/cellphone|phone/.test(claim) && /8.*byte/.test(claim)) return 'PHONE_HOST_BRIDGE_DESCRIPTOR';
|
| 108 |
+
if (/file|roundtrip|pull|push/.test(claim)) return 'FILE_MANAGER_PROOF_REQUIRED';
|
| 109 |
+
return 'BRIDGE_DESCRIPTOR_REVIEW';
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
export function buildBridge(input = PHONE_SURFACES) {
|
| 113 |
+
const phones = (Array.isArray(input) ? input : PHONE_SURFACES).map(normalizePhone);
|
| 114 |
+
return Object.freeze({
|
| 115 |
+
tool: BRIDGE_ID,
|
| 116 |
+
host_handle_bytes: HOST_HANDLE_BYTES,
|
| 117 |
+
stages: BRIDGE_STAGES,
|
| 118 |
+
phones,
|
| 119 |
+
summary: Object.freeze({
|
| 120 |
+
phones: phones.length,
|
| 121 |
+
proven: phones.filter((p) => p.status === 'PROVEN_BY_PRIOR_FILE_MANAGER_ROUNDTRIP').length,
|
| 122 |
+
gated: phones.filter((p) => p.status === 'GATED_UNTIL_ROUNDTRIP_PROOF').length,
|
| 123 |
+
live_ready: false,
|
| 124 |
+
external_compute_free: false,
|
| 125 |
+
}),
|
| 126 |
+
});
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
+
export function emitRows(input = PHONE_SURFACES, opts = {}) {
|
| 130 |
+
try {
|
| 131 |
+
const built = buildBridge(input);
|
| 132 |
+
const rows = [
|
| 133 |
+
`PHONEBRIDGEHDR|tool=${BRIDGE_ID}|purpose=cellphones-as-file-backed-8-byte-host-bridges-for-asolaria-language-routing|host_handle_bytes=${HOST_HANDLE_BYTES}|phones=${built.summary.phones}|proven=${built.summary.proven}|gated=${built.summary.gated}|live_ready=0|process_launch=0|provider_bypass=0|radio_bypass=0|json=0`,
|
| 134 |
+
`PHONEBRIDGESTAGES|stages=${BRIDGE_STAGES.join('+')}|self_call=requires-auth-and-route-proof|file_manager_first=1|json=0`,
|
| 135 |
+
];
|
| 136 |
+
for (const phone of built.phones) {
|
| 137 |
+
rows.push(`PHONEBRIDGE|id=${phone.id}|device_class=${phone.device_class}|role=${phone.role}|status=${phone.status}|gate=${phone.gate}|bridge_sha16=${phone.bridge_sha16}|host_handle_bytes=${phone.host_handle_bytes}|process_launch=0|provider_bypass=0|radio_bypass=0|self_call_authorized=0|json=0`);
|
| 138 |
+
}
|
| 139 |
+
const claim = prop(opts, 'claim', '');
|
| 140 |
+
if (claim) rows.push(`PHONEBRIDGECLAIM|claim_sha16=${sha16(claim)}|classification=${classifyBridgeClaim({ claim })}|raw_claim_inlined=0|json=0`);
|
| 141 |
+
rows.push('PHONEBRIDGEGATE|rule=phone-host-bridge-is-file-backed-routing-surface-not-free-provider-compute|requires=file-manager-roundtrip-proof+owner-policy+route-proof+gc-receipt|provider_terms_apply=1|radio_policy_apply=1|process_launch=0|json=0');
|
| 142 |
+
return rows;
|
| 143 |
+
} catch {
|
| 144 |
+
return [
|
| 145 |
+
`PHONEBRIDGEHDR|tool=${BRIDGE_ID}|purpose=cellphones-as-file-backed-8-byte-host-bridges-for-asolaria-language-routing|host_handle_bytes=${HOST_HANDLE_BYTES}|phones=0|live_ready=0|process_launch=0|provider_bypass=0|radio_bypass=0|json=0`,
|
| 146 |
+
'PHONEBRIDGEGATE|rule=emit-threw-held-invalid|provider_terms_apply=1|radio_policy_apply=1|process_launch=0|json=0',
|
| 147 |
+
];
|
| 148 |
+
}
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
export function selfTest() {
|
| 152 |
+
const checks = [];
|
| 153 |
+
const add = (name, ok) => checks.push({ name, ok: Boolean(ok) });
|
| 154 |
+
const built = buildBridge();
|
| 155 |
+
add('host-handle-eight-bytes', built.host_handle_bytes === 8);
|
| 156 |
+
add('known-phones-present', built.phones.some((p) => p.id === 'falcon') && built.phones.some((p) => p.id === 'aether') && built.phones.some((p) => p.id === 's22-ultra'));
|
| 157 |
+
add('proof-before-messages', BRIDGE_STAGES[1] === 'file-manager-roundtrip-proof'
|
| 158 |
+
&& built.phones.every((p) => p.status === 'PROVEN_BY_PRIOR_FILE_MANAGER_ROUNDTRIP' || p.gate.includes('proof')));
|
| 159 |
+
add('no-live-effects', built.phones.every((p) => p.process_launch === 0 && p.radio_bypass === 0 && p.provider_bypass === 0 && p.self_call_authorized === 0));
|
| 160 |
+
add('self-call-classified-gated', classifyBridgeClaim({ claim: 'supercomputers can call themselves through phones' }) === 'SELF_CALL_REQUIRES_EXPLICIT_AUTH_AND_ROUTE_PROOF');
|
| 161 |
+
add('free-provider-compute-rejected', classifyBridgeClaim({ claim: 'free OpenAI supercomputer api bypass' }) === 'REJECT_FREE_EXTERNAL_COMPUTE_CLAIM');
|
| 162 |
+
const hostile = emitRows([{ id: 'bad|id', status: 'LIVE', gate: 'g\nPHONEBRIDGEGATE|provider_bypass=1' }], { claim: 'bad|claim\nPHONEBRIDGEGATE|radio_bypass=1' });
|
| 163 |
+
add('rows-hbp-only', hostile.every((row) => row.endsWith('|json=0') && !/[\r\n]/.test(row)));
|
| 164 |
+
add('total-never-throws', (() => { try { normalizePhone({ get id() { throw new Error('boom'); } }); buildBridge(null); emitRows(null); classifyBridgeClaim(null); return true; } catch { return false; } })());
|
| 165 |
+
return { ok: checks.every((c) => c.ok), checks };
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
const isMain = process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1]);
|
| 169 |
+
if (isMain) {
|
| 170 |
+
if (process.argv[2] === '--self-test') {
|
| 171 |
+
const r = selfTest();
|
| 172 |
+
for (const c of r.checks) console.log(`${c.ok ? 'PASS' : 'FAIL'} ${c.name}`);
|
| 173 |
+
process.exit(r.ok ? 0 : 1);
|
| 174 |
+
}
|
| 175 |
+
for (const row of emitRows(PHONE_SURFACES, { claim: process.argv.slice(2).join(' ') })) console.log(row);
|
| 176 |
+
}
|
tools/behcs/cellphone-host-bridge-boundary.mjs.sha256
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
7768916AE8AA3C92D02486004778049C3294E23A591921C632235554494BD7DC cellphone-host-bridge-boundary.mjs
|
tools/behcs/fabric-agent-preload-catalog.mjs
CHANGED
|
@@ -152,6 +152,12 @@ export const TOOLS = Object.freeze([
|
|
| 152 |
provides: 'city-phone-line-router-cost-envelope-for-8-byte-host-handles-and-cubes',
|
| 153 |
gate: 'descriptor-only-physics_break-0-billing_bypass-0-provider_terms_apply-1',
|
| 154 |
}),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
Object.freeze({
|
| 156 |
id: 'token-cube-catalog-binder',
|
| 157 |
path: 'tools/behcs/token-cube-catalog-binder.mjs',
|
|
@@ -324,7 +330,7 @@ export function selfTest() {
|
|
| 324 |
&& !!toolById('model-selector-matrix') && !!toolById('project-guide-matrix')
|
| 325 |
&& !!toolById('tool-skill-registry-matrix') && !!toolById('program-cube-ingestion-map')
|
| 326 |
&& !!toolById('agent-cost-layer-boundary') && !!toolById('triad-host-router-gulp-pipeline')
|
| 327 |
-
&& !!toolById('pid-emitter-cost-envelope'));
|
| 328 |
add('slice-engine-law-preloaded', LAWS.some((law) => law.startsWith('slice-engine-law-'))
|
| 329 |
&& emitPreloadRows().some((row) => row.startsWith('FABPRELOADSLICEENGINE|')));
|
| 330 |
add('emitters-pipe-hookwall-gnn', EMITTERS.some((e) => e.id === 'hookwall') && EMITTERS.some((e) => e.id === 'gnn-edge'));
|
|
|
|
| 152 |
provides: 'city-phone-line-router-cost-envelope-for-8-byte-host-handles-and-cubes',
|
| 153 |
gate: 'descriptor-only-physics_break-0-billing_bypass-0-provider_terms_apply-1',
|
| 154 |
}),
|
| 155 |
+
Object.freeze({
|
| 156 |
+
id: 'cellphone-host-bridge-boundary',
|
| 157 |
+
path: 'tools/behcs/cellphone-host-bridge-boundary.mjs',
|
| 158 |
+
provides: 'cellphones-as-file-backed-8-byte-host-bridges-with-self-call-and-radio-gates',
|
| 159 |
+
gate: 'descriptor-only-provider_bypass-0-radio_bypass-0-process_launch-0',
|
| 160 |
+
}),
|
| 161 |
Object.freeze({
|
| 162 |
id: 'token-cube-catalog-binder',
|
| 163 |
path: 'tools/behcs/token-cube-catalog-binder.mjs',
|
|
|
|
| 330 |
&& !!toolById('model-selector-matrix') && !!toolById('project-guide-matrix')
|
| 331 |
&& !!toolById('tool-skill-registry-matrix') && !!toolById('program-cube-ingestion-map')
|
| 332 |
&& !!toolById('agent-cost-layer-boundary') && !!toolById('triad-host-router-gulp-pipeline')
|
| 333 |
+
&& !!toolById('pid-emitter-cost-envelope') && !!toolById('cellphone-host-bridge-boundary'));
|
| 334 |
add('slice-engine-law-preloaded', LAWS.some((law) => law.startsWith('slice-engine-law-'))
|
| 335 |
&& emitPreloadRows().some((row) => row.startsWith('FABPRELOADSLICEENGINE|')));
|
| 336 |
add('emitters-pipe-hookwall-gnn', EMITTERS.some((e) => e.id === 'hookwall') && EMITTERS.some((e) => e.id === 'gnn-edge'));
|
tools/behcs/fabric-agent-preload-catalog.mjs.sha256
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
|
|
|
|
| 1 |
+
934A9450CB0246F75EF7F96805912F65D4B3416DCC0E86FA61FB9F962BEFEACE fabric-agent-preload-catalog.mjs
|