deadbyte-mcp 0.15.4 → 0.15.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MANIFEST.SHA256 +42 -25
- package/PROVENANCE.json +1 -1
- package/README.txt +14 -14
- package/RELEASE.json +1 -1
- package/controller/README.TXT +2 -2
- package/controller/deadbyte-controller.ps1 +1 -1
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/V085-R47-JEV-DECISION-PLANE.md +1 -0
- package/package.json +1 -1
- package/scripts/archive-source-zips.mjs +1 -0
- package/scripts/build-combined-skill.mjs +146 -0
- package/scripts/deferred-slot-operation-r46.mjs +1 -1
- package/scripts/deploy-r47.mjs +27 -0
- package/scripts/disarm-host-for-update-r47.mjs +3 -0
- package/scripts/final-closure-r46.mjs +6 -6
- package/scripts/final-closure-verify-r46.mjs +7 -7
- package/scripts/find-internet-skill-finder-zip-r47.mjs +1 -0
- package/scripts/gate-windows-r46.ps1 +4 -4
- package/scripts/list-source-zips.mjs +3 -0
- package/scripts/npm-publish-r47.ps1 +22 -0
- package/scripts/npm-release-r47.mjs +39 -0
- package/scripts/probe-source-zips.mjs +1 -0
- package/scripts/probe-zips.mjs +1 -0
- package/scripts/read-source-zips.mjs +5 -0
- package/scripts/release-parity-r46.mjs +4 -4
- package/scripts/remove-source-archives-r47.mjs +1 -0
- package/scripts/repair-builder-template.mjs +1 -0
- package/scripts/run-skill-creator-scaffold.mjs +1 -0
- package/scripts/wait-r47-handoff.mjs +1 -0
- package/scripts/windows-gate-evidence-r46.mjs +7 -7
- package/src/autonomous-runtime.mjs +20 -1
- package/src/jev-decision-plane.mjs +128 -0
- package/src/skill-plane-r44.mjs +2 -0
- package/src/version.mjs +1 -1
- package/test/cli-entrypoint.test.mjs +3 -3
- package/test/core.test.mjs +1 -1
- package/test/full-max-catalog-r44.test.mjs +3 -1
- package/test/full-max-catalog-r45.test.mjs +3 -1
- package/test/jev-decision-plane.test.mjs +63 -0
- package/test/production-docs.test.mjs +3 -3
- package/test/release-version.test.mjs +12 -12
- package/test/runtime-self-update.test.mjs +1 -1
- package/test/skill-plane-r44.test.mjs +1 -0
- /package/{DEADBYTE-MCP.cmd → DEADBYTE-MCP-local.cmd} +0 -0
|
@@ -20,16 +20,16 @@ export async function writeFinalClosure({root=packageRoot,runtimeStateRoot=state
|
|
|
20
20
|
const manifestBytes=await readFile(path.join(candidate,'MANIFEST.SHA256'));
|
|
21
21
|
const manifestSha256=sha256(manifestBytes);
|
|
22
22
|
const pointer=JSON.parse(await readFile(path.join(state,'active-release.json'),'utf8'));
|
|
23
|
-
insist(pointer.version==='0.15.
|
|
24
|
-
insist(pointer.release_id===`v0.15.
|
|
23
|
+
insist(pointer.version==='0.15.5'&&pointer.manifest_sha256===manifestSha256,'R46 final closure active candidate mismatch');
|
|
24
|
+
insist(pointer.release_id===`v0.15.5-${manifestSha256.slice(0,16)}`,'R46 final closure release id mismatch');
|
|
25
25
|
|
|
26
26
|
const gatePath=path.join(state,'evidence','release',`r46-windows-gate-${manifestSha256.slice(0,16)}.json`);
|
|
27
27
|
const parityPath=path.join(state,'evidence','release',`r46-parity-${manifestSha256.slice(0,16)}.json`);
|
|
28
28
|
const gate=JSON.parse(await readFile(gatePath,'utf8'));
|
|
29
29
|
const parity=JSON.parse(await readFile(parityPath,'utf8'));
|
|
30
|
-
insist(gate.schema==='deadbyte.r46-windows-gate.v1'&&gate.status==='passed'&&gate.version==='0.15.
|
|
30
|
+
insist(gate.schema==='deadbyte.r46-windows-gate.v1'&&gate.status==='passed'&&gate.version==='0.15.5','R46 gate evidence invalid');
|
|
31
31
|
insist(gate.manifest_sha256===manifestSha256,'R46 gate evidence candidate mismatch');
|
|
32
|
-
insist(parity.schema==='deadbyte.r46-parity.v1'&&parity.status==='passed'&&parity.version==='0.15.
|
|
32
|
+
insist(parity.schema==='deadbyte.r46-parity.v1'&&parity.status==='passed'&&parity.version==='0.15.5','R46 parity evidence invalid');
|
|
33
33
|
insist(parity.candidate?.manifest_sha256===manifestSha256&&parity.candidate?.generation_manifest_sha256===pointer.generation_manifest_sha256,'R46 parity active generation mismatch');
|
|
34
34
|
insist(parity.process_policy?.target_repin_verified===true,'R46 target-machine process repin proof missing');
|
|
35
35
|
insist(parity.fileless_powershell?.exit_code===0&&parity.fileless_powershell?.pscommandpath_empty===true&&parity.fileless_powershell?.invocation_path_empty===true&&parity.fileless_powershell?.new_temp_ps1_count===0,'R46 fileless PowerShell proof missing');
|
|
@@ -40,7 +40,7 @@ export async function writeFinalClosure({root=packageRoot,runtimeStateRoot=state
|
|
|
40
40
|
insist(completed instanceof Date&&!Number.isNaN(completed.getTime()),'R46 final closure clock invalid');
|
|
41
41
|
const body={
|
|
42
42
|
schema:'deadbyte.r46-final-closure.v1',
|
|
43
|
-
version:'0.15.
|
|
43
|
+
version:'0.15.5',
|
|
44
44
|
train:'R46',
|
|
45
45
|
release_label:'FILELESS POWERSHELL PRODUCT BASELINE',
|
|
46
46
|
completed_at_utc:completed.toISOString(),
|
|
@@ -89,7 +89,7 @@ export async function writeFinalClosure({root=packageRoot,runtimeStateRoot=state
|
|
|
89
89
|
if(error?.code!=='EEXIST')throw error;
|
|
90
90
|
const existingBytes=await readFile(file);
|
|
91
91
|
const existing=JSON.parse(existingBytes.toString('utf8').replace(/^\uFEFF/,''));
|
|
92
|
-
insist(existing.body?.version==='0.15.
|
|
92
|
+
insist(existing.body?.version==='0.15.5'&&existing.body?.active_pointer?.manifest_sha256===manifestSha256,'existing R46 closure identity mismatch');
|
|
93
93
|
return {status:'existing',path:file,sha256:sha256(existingBytes),closure_sha256:existing.closure_sha256,release_id:pointer.release_id};
|
|
94
94
|
}
|
|
95
95
|
}
|
|
@@ -18,7 +18,7 @@ export async function verifyFinalClosureObject(envelope,{root=packageRoot,runtim
|
|
|
18
18
|
const candidate=path.resolve(root),state=path.resolve(runtimeStateRoot);
|
|
19
19
|
insist(envelope&&typeof envelope==='object'&&!Array.isArray(envelope),'R46 closure envelope invalid');
|
|
20
20
|
insist(envelope.body?.schema==='deadbyte.r46-final-closure.v1','R46 closure schema mismatch');
|
|
21
|
-
insist(envelope.body?.version==='0.15.
|
|
21
|
+
insist(envelope.body?.version==='0.15.5'&&envelope.body?.train==='R46','R46 closure version/train mismatch');
|
|
22
22
|
insist(envelope.body?.release_label==='FILELESS POWERSHELL PRODUCT BASELINE','R46 closure label mismatch');
|
|
23
23
|
|
|
24
24
|
const bodyBytes=Buffer.from(canonicalJson(envelope.body),'utf8');
|
|
@@ -39,8 +39,8 @@ export async function verifyFinalClosureObject(envelope,{root=packageRoot,runtim
|
|
|
39
39
|
const manifestBytes=await readFile(path.join(candidate,'MANIFEST.SHA256'));
|
|
40
40
|
const manifestSha256=sha256(manifestBytes);
|
|
41
41
|
const pointer=JSON.parse(await readFile(path.join(state,'active-release.json'),'utf8'));
|
|
42
|
-
insist(pointer.version==='0.15.
|
|
43
|
-
insist(pointer.release_id===`v0.15.
|
|
42
|
+
insist(pointer.version==='0.15.5'&&pointer.manifest_sha256===manifestSha256,'R46 active pointer/candidate mismatch');
|
|
43
|
+
insist(pointer.release_id===`v0.15.5-${manifestSha256.slice(0,16)}`,'R46 active release id mismatch');
|
|
44
44
|
insist(envelope.body.active_pointer?.release_id===pointer.release_id&&
|
|
45
45
|
envelope.body.active_pointer?.manifest_sha256===pointer.manifest_sha256&&
|
|
46
46
|
envelope.body.active_pointer?.generation_manifest_sha256===pointer.generation_manifest_sha256,
|
|
@@ -55,12 +55,12 @@ export async function verifyFinalClosureObject(envelope,{root=packageRoot,runtim
|
|
|
55
55
|
}
|
|
56
56
|
const gate=JSON.parse(await readFile(path.resolve(gateRef.path),'utf8'));
|
|
57
57
|
const parity=JSON.parse(await readFile(path.resolve(parityRef.path),'utf8'));
|
|
58
|
-
insist(gate.schema==='deadbyte.r46-windows-gate.v1'&&gate.status==='passed'&&gate.version==='0.15.
|
|
58
|
+
insist(gate.schema==='deadbyte.r46-windows-gate.v1'&&gate.status==='passed'&&gate.version==='0.15.5','R46 gate evidence invalid');
|
|
59
59
|
insist(gate.manifest_sha256===manifestSha256,'R46 gate candidate mismatch');
|
|
60
60
|
insist(gate.parent?.release_id==='v0.15.1-d55f00b5144dc31a'&&gate.parent?.manifest_sha256==='d55f00b5144dc31a7fe39e4dc60d640a94780da6aaeca0918e87636b816d7854','R46 sealed parent identity invalid');
|
|
61
|
-
insist(gate.runtime_predecessor?.release_id==='v0.15.
|
|
61
|
+
insist(gate.runtime_predecessor?.release_id==='v0.15.5-a03a4b2cf28d31d6'&&gate.runtime_predecessor?.manifest_sha256==='a03a4b2cf28d31d633cfbb0a073d375c0f19d1b972299faacef28eec05543995','R46 reopened runtime predecessor identity invalid');
|
|
62
62
|
insist(envelope.body.runtime_predecessor?.release_id===gate.runtime_predecessor.release_id&&envelope.body.runtime_predecessor?.manifest_sha256===gate.runtime_predecessor.manifest_sha256,'R46 closure runtime predecessor mismatch');
|
|
63
|
-
insist(parity.schema==='deadbyte.r46-parity.v1'&&parity.status==='passed'&&parity.version==='0.15.
|
|
63
|
+
insist(parity.schema==='deadbyte.r46-parity.v1'&&parity.status==='passed'&&parity.version==='0.15.5','R46 parity evidence invalid');
|
|
64
64
|
insist(parity.candidate?.release_id===pointer.release_id&&
|
|
65
65
|
parity.candidate?.manifest_sha256===pointer.manifest_sha256&&
|
|
66
66
|
parity.candidate?.generation_manifest_sha256===pointer.generation_manifest_sha256,
|
|
@@ -94,7 +94,7 @@ export async function verifyFinalClosureObject(envelope,{root=packageRoot,runtim
|
|
|
94
94
|
'R46 closure retained-output ring proof invalid');
|
|
95
95
|
|
|
96
96
|
return {
|
|
97
|
-
ok:true,status:'passed',version:'0.15.
|
|
97
|
+
ok:true,status:'passed',version:'0.15.5',train:'R46',
|
|
98
98
|
release_id:pointer.release_id,
|
|
99
99
|
manifest_sha256:pointer.manifest_sha256,
|
|
100
100
|
generation_manifest_sha256:pointer.generation_manifest_sha256,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {execFile} from "node:child_process";import {promisify} from "node:util";const ex=promisify(execFile);const r=await ex("powershell.exe",["-NoProfile","-Command","Get-ChildItem -Path C:\\Users\\DEADBYTE -Filter internet-skill-finder.zip -File -Recurse -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName"],{timeout:120000,maxBuffer:1048576});console.log(r.stdout)
|
|
@@ -10,7 +10,7 @@ function Invoke-GateStep {
|
|
|
10
10
|
$LASTEXITCODE = 0
|
|
11
11
|
& npm.cmd @NpmArgs
|
|
12
12
|
if ($LASTEXITCODE -ne 0) {
|
|
13
|
-
throw "DEADBYTE V0.15.
|
|
13
|
+
throw "DEADBYTE V0.15.5 / R46 gate failed at $Name with exit code $LASTEXITCODE"
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -23,7 +23,7 @@ Write-Host '==== host-policy-hermetic-clean ===='
|
|
|
23
23
|
$HostPolicyPath = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\controller\deadbyte-host-policy.json'))
|
|
24
24
|
Remove-Item -LiteralPath $HostPolicyPath -Force -ErrorAction SilentlyContinue
|
|
25
25
|
if (Test-Path -LiteralPath $HostPolicyPath) {
|
|
26
|
-
throw "DEADBYTE V0.15.
|
|
26
|
+
throw "DEADBYTE V0.15.5 / R46 gate could not remove machine-local Host policy before hermetic regression"
|
|
27
27
|
}
|
|
28
28
|
Write-Host 'HOST_POLICY_HERMETIC_ABSENT'
|
|
29
29
|
|
|
@@ -53,6 +53,6 @@ Write-Host '==== windows-gate-evidence ===='
|
|
|
53
53
|
$LASTEXITCODE = 0
|
|
54
54
|
& node.exe (Join-Path $PSScriptRoot 'windows-gate-evidence-r46.mjs')
|
|
55
55
|
if ($LASTEXITCODE -ne 0) {
|
|
56
|
-
throw "DEADBYTE V0.15.
|
|
56
|
+
throw "DEADBYTE V0.15.5 / R46 gate failed at windows-gate-evidence with exit code $LASTEXITCODE"
|
|
57
57
|
}
|
|
58
|
-
Write-Host '==== DEADBYTE V0.15.
|
|
58
|
+
Write-Host '==== DEADBYTE V0.15.5 / R46 FILELESS POWERSHELL WINDOWS BATCH GATE: PASS ===='
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {readFile} from "node:fs/promises";import path from "node:path";import os from "node:os";
|
|
2
|
+
function listZip(buf){let p=0,out=[];while(p+4<=buf.length){if(buf.readUInt32LE(p)!==0x04034b50){p++;continue}const method=buf.readUInt16LE(p+8),csize=buf.readUInt32LE(p+18),n=buf.readUInt16LE(p+26),e=buf.readUInt16LE(p+28);const name=buf.subarray(p+30,p+30+n).toString("utf8");out.push({name,method,csize});p+=30+n+e+csize}return out}
|
|
3
|
+
for(const f of ["deadbyte-machine-truth.zip","lowlevel-reverse-engineering.zip"]){const b=await readFile(path.join(os.homedir(),".deadbyte-mcp","skills",f));console.log("=="+f+"==");console.log(JSON.stringify(listZip(b),null,2))}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
$ErrorActionPreference = 'Stop'
|
|
2
|
+
Set-Location (Join-Path $PSScriptRoot '..')
|
|
3
|
+
$pkg = Get-Content package.json -Raw | ConvertFrom-Json
|
|
4
|
+
$version = [string]$pkg.version
|
|
5
|
+
if ($pkg.name -ne 'deadbyte-mcp') { throw 'unexpected package name' }
|
|
6
|
+
$existing = $null
|
|
7
|
+
try { $existing = & npm.cmd view "deadbyte-mcp@$version" version --json 2>$null } catch { $existing = $null }
|
|
8
|
+
if ($LASTEXITCODE -eq 0 -and $existing) { throw "deadbyte-mcp@$version is already published: $existing" }
|
|
9
|
+
$pack = (& npm.cmd pack --json 2>&1 | Out-String)
|
|
10
|
+
if ($LASTEXITCODE -ne 0) { throw 'npm pack failed' }
|
|
11
|
+
$packObj = $pack | ConvertFrom-Json
|
|
12
|
+
$filename = [string]$packObj.'deadbyte-mcp'.filename
|
|
13
|
+
if ([string]::IsNullOrWhiteSpace($filename)) { throw "npm pack did not return tarball filename. output=$pack" }
|
|
14
|
+
$tarball = Join-Path (Get-Location) $filename
|
|
15
|
+
& npm.cmd publish $tarball --access public
|
|
16
|
+
if ($LASTEXITCODE -ne 0) { throw 'npm publish failed' }
|
|
17
|
+
$published = (& npm.cmd view "deadbyte-mcp@$version" version dist.integrity dist.tarball --json | ConvertFrom-Json)
|
|
18
|
+
$tags = (& npm.cmd view deadbyte-mcp dist-tags --json | ConvertFrom-Json)
|
|
19
|
+
$npx = & npx.cmd --yes "deadbyte-mcp@$version" -- --version
|
|
20
|
+
if ($LASTEXITCODE -ne 0) { throw 'npx verification failed' }
|
|
21
|
+
Remove-Item -LiteralPath $tarball -Force -ErrorAction SilentlyContinue
|
|
22
|
+
[pscustomobject]@{ status='published'; name=$pkg.name; version=$version; tarball=$filename; published=$published; dist_tags=$tags; npx_version_output=($npx -join "`n") } | ConvertTo-Json -Depth 8
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { readFile, unlink } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
|
|
6
|
+
const root=path.resolve(new URL('..',import.meta.url).pathname.replace(/^\/(?:[A-Za-z]:)/,''));
|
|
7
|
+
const npm=process.platform==='win32'?'npm.exe':'npm';
|
|
8
|
+
|
|
9
|
+
function run(args,timeout=180000){
|
|
10
|
+
const r=spawnSync(npm,args,{cwd:root,encoding:'utf8',timeout,stdio:['ignore','pipe','pipe'],shell:false,windowsHide:true});
|
|
11
|
+
if(r.error) throw r.error;
|
|
12
|
+
if(r.status!==0) throw new Error('npm '+args.join(' ')+' failed exit='+r.status+'\n'+(r.stderr||r.stdout||'').slice(-12000));
|
|
13
|
+
return (r.stdout||'').trim();
|
|
14
|
+
}
|
|
15
|
+
function parseJson(text){
|
|
16
|
+
const start=Math.min(...[text.indexOf('{'),text.indexOf('[')].filter(n=>n>=0));
|
|
17
|
+
if(!Number.isFinite(start)) throw new Error('npm JSON output missing');
|
|
18
|
+
return JSON.parse(text.slice(start));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const pkg=JSON.parse(await readFile(path.join(root,'package.json'),'utf8'));
|
|
22
|
+
const version=pkg.version;
|
|
23
|
+
if(pkg.name!=='deadbyte-mcp') throw new Error('unexpected package name');
|
|
24
|
+
const existing=spawnSync(npm,['view',`deadbyte-mcp@${version}`,'version','--json'],{cwd:root,encoding:'utf8',stdio:['ignore','pipe','pipe'],shell:false,windowsHide:true});
|
|
25
|
+
const existingText=(existing.stdout||'').trim();
|
|
26
|
+
if(existing.status===0 && existingText && existingText!=='null'){
|
|
27
|
+
throw new Error(`deadbyte-mcp@${version} is already published: ${existingText}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const packed=parseJson(run(['pack','--json'],180000));
|
|
31
|
+
const filename=packed?.[0]?.filename;
|
|
32
|
+
if(!filename) throw new Error('npm pack did not return a tarball filename');
|
|
33
|
+
const tarball=path.join(root,filename);
|
|
34
|
+
const publishOut=run(['publish',tarball,'--access','public'],300000);
|
|
35
|
+
const published=parseJson(run(['view',`deadbyte-mcp@${version}`,'version','dist.integrity','dist.tarball','--json'],120000));
|
|
36
|
+
const tags=parseJson(run(['view','deadbyte-mcp','dist-tags','--json'],120000));
|
|
37
|
+
const npxOut=run(['exec','--yes',`deadbyte-mcp@${version}`,'--','--version'],300000);
|
|
38
|
+
await unlink(tarball).catch(()=>{});
|
|
39
|
+
console.log(JSON.stringify({status:'published',name:pkg.name,version,tarball:filename,published,published_output_tail:publishOut.slice(-2000),dist_tags:tags,npx_version_output:npxOut},null,2));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {stat} from "node:fs/promises";import path from "node:path";import os from "node:os";for(const f of ["deadbyte-machine-truth.zip","lowlevel-reverse-engineering.zip"]){const p=path.join(os.homedir(),".deadbyte-mcp","skills",f);try{const x=await stat(p);console.log(JSON.stringify({file:f,exists:true,size:x.size}))}catch(e){console.log(JSON.stringify({file:f,exists:false}))}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {stat,readFile} from "node:fs/promises";import path from "node:path";import os from "node:os";import {execFile} from "node:child_process";import {promisify} from "node:util";const ex=promisify(execFile);const d=path.join(os.homedir(),".deadbyte-mcp","skills");for(const f of ["deadbyte-machine-truth.zip","lowlevel-reverse-engineering.zip"]){const p=path.join(d,f);try{const x=await stat(p);console.log(f,x.size)}catch(e){console.log(f,"MISSING")}}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import {readFile} from "node:fs/promises";import path from "node:path";import os from "node:os";import zlib from "node:zlib";
|
|
2
|
+
function entries(buf){let eocd=buf.lastIndexOf(Buffer.from([0x50,0x4b,0x05,0x06]));let cdOff=buf.readUInt32LE(eocd+16),cdSize=buf.readUInt32LE(eocd+12),p=cdOff,out=[];while(p<cdOff+cdSize){if(buf.readUInt32LE(p)!==0x02014b50)throw Error("bad central dir");const method=buf.readUInt16LE(p+10),csize=buf.readUInt32LE(p+20),usize=buf.readUInt32LE(p+24),n=buf.readUInt16LE(p+28),x=buf.readUInt16LE(p+30),c=buf.readUInt16LE(p+32),off=buf.readUInt32LE(p+42);const name=buf.subarray(p+46,p+46+n).toString("utf8");out.push({name,method,csize,usize,off});p+=46+n+x+c}return out}
|
|
3
|
+
function data(buf,e){const p=e.off,n=buf.readUInt16LE(p+26),x=buf.readUInt16LE(p+28),raw=buf.subarray(p+30+n+x,p+30+n+x+e.csize);return e.method===0?raw:zlib.inflateRawSync(raw)}
|
|
4
|
+
const wanted=new Set(["SKILL.md","references/advanced-technique-selector.md","references/capability-discovery.md","references/conversation-contract.md","references/lowlevel-analysis-patterns.md","references/lowlevel-reverse-engineering-core.md","references/lowlevel-safe-lab-and-reporting.md","references/lowlevel-tooling-and-evidence.md","references/mode-routing.md","references/proof-engineering.md","references/reverse-archaeology.md","references/build-provenance.md","references/data-performance.md","references/kernel-baremetal.md","references/manus-interop.md","references/software-work.md","references/research-live.md","references/analysis-patterns.md","references/safe-lab-and-reporting.md","references/tooling-and-evidence.md","scripts/triage_artifact.py","scripts/truthctl.py","templates/"]);
|
|
5
|
+
for(const f of ["deadbyte-machine-truth.zip","lowlevel-reverse-engineering.zip"]){const b=await readFile(path.join(os.homedir(),".deadbyte-mcp","skills",f));console.log("=="+f+"==");for(const e of entries(b)){if(wanted.has(e.name)&&e.name!=="templates/"){const t=data(b,e).toString("utf8");console.log("\n---"+e.name+"---\n"+t)}}}
|
|
@@ -37,11 +37,11 @@ export async function runReleaseParity({
|
|
|
37
37
|
const manifestBytes=await readFile(path.join(candidate,'MANIFEST.SHA256'));
|
|
38
38
|
const manifestSha256=sha256(manifestBytes);
|
|
39
39
|
const pkg=JSON.parse(await readFile(path.join(candidate,'package.json'),'utf8'));
|
|
40
|
-
insist(pkg.version==='0.15.
|
|
40
|
+
insist(pkg.version==='0.15.5','R46 parity requires package version 0.15.5');
|
|
41
41
|
|
|
42
42
|
const pointer=JSON.parse(await readFile(path.join(state,'active-release.json'),'utf8'));
|
|
43
|
-
insist(pointer.version==='0.15.
|
|
44
|
-
insist(pointer.release_id===`v0.15.
|
|
43
|
+
insist(pointer.version==='0.15.5'&&pointer.manifest_sha256===manifestSha256,'R46 active pointer candidate mismatch');
|
|
44
|
+
insist(pointer.release_id===`v0.15.5-${manifestSha256.slice(0,16)}`,'R46 active release id mismatch');
|
|
45
45
|
const releaseManifest=await readFile(path.join(pointer.release_root,'MANIFEST.SHA256'));
|
|
46
46
|
insist(sha256(releaseManifest)===manifestSha256,'R46 immutable release manifest mismatch');
|
|
47
47
|
|
|
@@ -116,7 +116,7 @@ export async function runReleaseParity({
|
|
|
116
116
|
const evidence={
|
|
117
117
|
schema:'deadbyte.r46-parity.v1',
|
|
118
118
|
status:'passed',
|
|
119
|
-
version:'0.15.
|
|
119
|
+
version:'0.15.5',
|
|
120
120
|
completed_at_utc:completed.toISOString(),
|
|
121
121
|
candidate:{
|
|
122
122
|
release_id:pointer.release_id,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {rm,stat} from "node:fs/promises";import os from "node:os";import path from "node:path";const p=path.join(os.homedir(),".deadbyte-mcp","source-archives");try{await stat(p);await rm(p,{recursive:true,force:true});console.log("REMOVED",p)}catch(e){if(e.code==="ENOENT")console.log("ABSENT",p);else throw e}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {readFile,writeFile} from "node:fs/promises";const p="scripts/build-combined-skill.mjs";let s=await readFile(p,"utf8");const start=s.indexOf("const skill=`")+13;const end=s.indexOf("`;",start);let body=s.slice(start,end);body=body.replaceAll("`","\\`");s=s.slice(0,start)+body+s.slice(end);await writeFile(p,s,"utf8");console.log("escaped-skill-template-backticks")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {execFile} from "node:child_process";import {promisify} from "node:util";const ex=promisify(execFile);const root=process.env.USERPROFILE+"\\.deadbyte-mcp\\skills";const script=root+"\\skill-creator\\scripts\\create-skill.mjs";const r=await ex(process.execPath,[script,root,"deadbyte-lowlevel-machine-truth","1.0.0"],{maxBuffer:1048576});console.log(r.stdout);console.error(r.stderr)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; await new Promise(r=>setTimeout(r,15000)); const root=path.join(os.homedir(),'.deadbyte-mcp'); const p=JSON.parse(await readFile(path.join(root,'active-release.json'),'utf8')); const s=JSON.parse(await readFile(path.join(root,'evidence','updates','r27-3d25be23cd6af36c-mueei50q-756d8a75','state.json'),'utf8')); console.log(JSON.stringify({pointer:p,state:s}));
|
|
@@ -8,7 +8,7 @@ import { doctor } from '../src/doctor-r45.mjs';
|
|
|
8
8
|
const here=path.dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
const root=path.resolve(here,'..');
|
|
10
10
|
const sha256=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
11
|
-
const marker='DEADBYTE V0.15.
|
|
11
|
+
const marker='DEADBYTE V0.15.5 / R46 FILELESS POWERSHELL WINDOWS BATCH GATE: PASS';
|
|
12
12
|
const PARENT_RELEASE_ID='v0.15.1-d55f00b5144dc31a';
|
|
13
13
|
const PARENT_MANIFEST='d55f00b5144dc31a7fe39e4dc60d640a94780da6aaeca0918e87636b816d7854';
|
|
14
14
|
const PARENT_GENERATION='00cde7bf540cc2804d679a39040d5b07193c5f8a0d49cac3b882402f8f4e6ad8';
|
|
@@ -26,18 +26,18 @@ export async function writeWindowsGateEvidence({
|
|
|
26
26
|
const manifestBytes=await readFile(path.join(candidate,'MANIFEST.SHA256'));
|
|
27
27
|
const manifestSha256=sha256(manifestBytes);
|
|
28
28
|
const pkg=JSON.parse(await readFile(path.join(candidate,'package.json'),'utf8'));
|
|
29
|
-
insist(pkg.version==='0.15.
|
|
29
|
+
insist(pkg.version==='0.15.5',`R46 Windows gate evidence requires V0.15.5, found ${pkg.version}`);
|
|
30
30
|
const release=JSON.parse(await readFile(path.join(candidate,'RELEASE.json'),'utf8'));
|
|
31
|
-
insist(release.version==='0.15.
|
|
31
|
+
insist(release.version==='0.15.5'&&release.train==='R46','R46 release metadata mismatch');
|
|
32
32
|
const active=JSON.parse(await readFile(path.join(path.resolve(stateRoot),'active-release.json'),'utf8'));
|
|
33
33
|
const originalParent=active.release_id===PARENT_RELEASE_ID&&active.manifest_sha256===PARENT_MANIFEST&&active.generation_manifest_sha256===PARENT_GENERATION;
|
|
34
34
|
const reopenedPredecessor=active.release_id===REOPENED_RUNTIME_RELEASE_ID&&active.manifest_sha256===REOPENED_RUNTIME_MANIFEST&&active.generation_manifest_sha256===REOPENED_RUNTIME_GENERATION;
|
|
35
|
-
const currentR46Predecessor=active.version==='0.15.
|
|
35
|
+
const currentR46Predecessor=active.version==='0.15.5'&&active.manifest_sha256!==manifestSha256&&/^[0-9a-f]{64}$/.test(active.generation_manifest_sha256??'');
|
|
36
36
|
insist(originalParent||reopenedPredecessor||currentR46Predecessor,'R46 runtime predecessor identity mismatch');
|
|
37
37
|
const parent={release_id:PARENT_RELEASE_ID,version:'0.15.1',manifest_sha256:PARENT_MANIFEST,generation_manifest_sha256:PARENT_GENERATION};
|
|
38
38
|
|
|
39
39
|
const doctorResult=await doctor();
|
|
40
|
-
insist(doctorResult?.status==='ok'&&doctorResult?.package_version==='0.15.
|
|
40
|
+
insist(doctorResult?.status==='ok'&&doctorResult?.package_version==='0.15.5'&&doctorResult?.manifest?.verified===true,'R46 doctor evidence invalid');
|
|
41
41
|
insist(doctorResult?.policy?.host_v2_ready===true,'R46 doctor did not verify Host policy v2');
|
|
42
42
|
|
|
43
43
|
const completed=clock();
|
|
@@ -46,7 +46,7 @@ export async function writeWindowsGateEvidence({
|
|
|
46
46
|
schema:'deadbyte.r46-windows-gate.v1',
|
|
47
47
|
status:'passed',
|
|
48
48
|
exit_code:0,
|
|
49
|
-
version:'0.15.
|
|
49
|
+
version:'0.15.5',
|
|
50
50
|
train:'R46',
|
|
51
51
|
marker,
|
|
52
52
|
completed_at_utc:completed.toISOString(),
|
|
@@ -100,7 +100,7 @@ export async function writeWindowsGateEvidence({
|
|
|
100
100
|
const existingBytes=await readFile(file);
|
|
101
101
|
const existing=JSON.parse(existingBytes.toString('utf8').replace(/^\uFEFF/,''));
|
|
102
102
|
insist(existing.schema===evidence.schema&&existing.status==='passed'&&existing.exit_code===0,'existing R46 Windows gate evidence invalid');
|
|
103
|
-
insist(existing.version==='0.15.
|
|
103
|
+
insist(existing.version==='0.15.5'&&existing.marker===marker&&existing.manifest_sha256===manifestSha256,'existing R46 Windows gate identity mismatch');
|
|
104
104
|
insist(existing.parent?.release_id===parent.release_id&&existing.parent?.manifest_sha256===parent.manifest_sha256,'existing R46 parent evidence mismatch');
|
|
105
105
|
insist(existing.runtime_predecessor?.release_id===active.release_id&&existing.runtime_predecessor?.manifest_sha256===active.manifest_sha256,'existing R46 runtime predecessor evidence mismatch');
|
|
106
106
|
return {status:'existing',path:file,sha256:sha256(existingBytes),manifest_sha256:manifestSha256,parent:existing.parent};
|
|
@@ -19,6 +19,7 @@ import { createWorkerScheduler } from './worker-scheduler.mjs';
|
|
|
19
19
|
import { issueObservationLease, verifyObservationLease } from './observation-lease.mjs';
|
|
20
20
|
import { createJournalStream } from './workload-substrate.mjs';
|
|
21
21
|
import { createDeadline, deadlineState } from './deadline-cancellation.mjs';
|
|
22
|
+
import { judgeDecision } from './jev-decision-plane.mjs';
|
|
22
23
|
|
|
23
24
|
export const AUTONOMOUS_GOAL_SCHEMA = 'deadbyte.autonomous-goal.v1';
|
|
24
25
|
export const AUTONOMOUS_EVENT_SCHEMA = 'deadbyte.autonomous-event.v1';
|
|
@@ -125,7 +126,7 @@ function deriveState(goal, events) {
|
|
|
125
126
|
plannerRejections.push({ ...p, event_sha256:event.event_sha256 });
|
|
126
127
|
if (pendingRequest?.request_id === p.request_id) pendingRequest = null;
|
|
127
128
|
}
|
|
128
|
-
if (event.type === 'decision_completed' && p.decision_event_sha256) completedDecisions.add(p.decision_event_sha256);
|
|
129
|
+
if ((event.type === 'decision_completed' || event.type === 'decision_judgment_rejected') && p.decision_event_sha256) completedDecisions.add(p.decision_event_sha256);
|
|
129
130
|
if (event.type === 'inspect_completed') for (const item of p.contexts ?? []) contexts.set(item.path, item);
|
|
130
131
|
if (event.type === 'profile_completed') observations.push({ ...p, event_sha256:event.event_sha256 });
|
|
131
132
|
if (event.type === 'delegated_action_completed') {
|
|
@@ -654,6 +655,24 @@ async function acceptPlannerDecision({ ctx, events, goal, state, policy, codingR
|
|
|
654
655
|
if (policy.planner.backend === 'client_sampling') return { needs_planner:true, request:pending };
|
|
655
656
|
continue;
|
|
656
657
|
}
|
|
658
|
+
const jev = judgeDecision({ decision, goal:{ goal_id:goal.goal_id,title:goal.title,goal:goal.goal,acceptance:goal.acceptance,task_contract:goal.task_contract },
|
|
659
|
+
capabilities:capabilityManifest?.entries ?? [], state:currentState,
|
|
660
|
+
planner_round:pending.planner_round, request_id:pending.request_id });
|
|
661
|
+
const judgmentEvent = await appendEvent(ctx,events,signingKeyPath,'decision_judgment',{ request_id:pending.request_id,
|
|
662
|
+
planner_round:pending.planner_round, mutation_epoch:pending.mutation_epoch, decision_sha256:jev.decision_sha256,
|
|
663
|
+
judgment_sha256:jev.judgment_sha256, verdict:jev.verdict, authority:jev.authority, mutation:jev.mutation,
|
|
664
|
+
action_kind:jev.action_kind, reasons:jev.reasons, required_capabilities:jev.required_capabilities,
|
|
665
|
+
authority_source:jev.authority_source, execution_authority:jev.execution_authority });
|
|
666
|
+
if (jev.verdict === 'reject') {
|
|
667
|
+
await appendEvent(ctx,events,signingKeyPath,'decision_judgment_rejected',{ request_id:pending.request_id,
|
|
668
|
+
planner_round:pending.planner_round, decision_event_sha256:judgmentEvent.event_sha256,
|
|
669
|
+
decision_sha256:jev.decision_sha256, judgment_sha256:jev.judgment_sha256, reasons:jev.reasons });
|
|
670
|
+
currentState = deriveState(goal,events);
|
|
671
|
+
pending = await requestPlanner(ctx,goal,events,currentState,policy,codingRuntime,capabilityManifest,desktopMemoryProvider,memoryProvider,signingKeyPath);
|
|
672
|
+
if (!pending) return null;
|
|
673
|
+
if (policy.planner.backend === 'client_sampling') return { needs_planner:true, request:pending };
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
657
676
|
const event = await appendEvent(ctx,events,signingKeyPath,'planner_decision',{
|
|
658
677
|
request_id:pending.request_id, planner_round:pending.planner_round, mutation_epoch:pending.mutation_epoch,
|
|
659
678
|
backend:response.backend, model:response.model ?? 'unknown', response_sha256:sha256Bytes(Buffer.from(response.raw_text,'utf8')),
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { canonicalJson } from './canonical-json.mjs';
|
|
3
|
+
|
|
4
|
+
export const JEV_DECISION_SCHEMA = 'deadbyte.jev-decision-judgment.v1';
|
|
5
|
+
|
|
6
|
+
const SHA256_RE = /^[0-9a-f]{64}$/;
|
|
7
|
+
|
|
8
|
+
function sha256(value) {
|
|
9
|
+
return createHash('sha256').update(Buffer.from(canonicalJson(value), 'utf8')).digest('hex');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function actionKind(decision) {
|
|
13
|
+
return decision?.action?.kind ?? decision?.kind ?? decision?.action ?? null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function requiredAuthority(decision) {
|
|
17
|
+
const kind = actionKind(decision);
|
|
18
|
+
if (kind === 'desktop_action') return 'desktop';
|
|
19
|
+
if (kind === 'process_start' || kind === 'process_action' || kind === 'process_terminate') return 'process';
|
|
20
|
+
if (kind === 'native_diff_apply' || kind === 'patch' || kind === 'write' || kind === 'replace') return 'autonomous';
|
|
21
|
+
if (kind === 'run_profile' || kind === 'command' || kind === 'benchmark') return 'autonomous';
|
|
22
|
+
return 'none';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isMutation(decision) {
|
|
26
|
+
const kind = actionKind(decision);
|
|
27
|
+
return new Set([
|
|
28
|
+
'act','patch','write','replace','delete','run_profile','command','benchmark',
|
|
29
|
+
'native_diff_apply','process_start','process_action','process_terminate','desktop_action'
|
|
30
|
+
]).has(kind);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function capabilityForAuthority(authority) {
|
|
34
|
+
if (authority === 'desktop') return ['desktop.action'];
|
|
35
|
+
if (authority === 'process') return ['process.start','process.action','process.terminate'];
|
|
36
|
+
if (authority === 'autonomous') return ['autonomous.goal_run','native_diff.apply','autonomous.release_gate'];
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function hasCapability(entries, wanted) {
|
|
41
|
+
const list = Array.isArray(entries) ? entries : [];
|
|
42
|
+
const ids = list.map(item => typeof item === 'string' ? item : item?.id).filter(Boolean);
|
|
43
|
+
return wanted.some(item => ids.includes(item) || ids.includes(item.replaceAll('.','_')));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function judgment({ decision, goal, capabilities, state }) {
|
|
47
|
+
const kind = actionKind(decision);
|
|
48
|
+
const authority = requiredAuthority(decision);
|
|
49
|
+
const mutation = isMutation(decision);
|
|
50
|
+
const reasons = [];
|
|
51
|
+
const required = capabilityForAuthority(authority);
|
|
52
|
+
|
|
53
|
+
if (!decision || typeof decision !== 'object') {
|
|
54
|
+
reasons.push('decision_missing');
|
|
55
|
+
}
|
|
56
|
+
if (!kind) reasons.push('action_kind_missing');
|
|
57
|
+
|
|
58
|
+
if (mutation && authority === 'none') reasons.push('mutation_without_typed_authority');
|
|
59
|
+
|
|
60
|
+
if (authority === 'desktop' && !hasCapability(capabilities, required)) {
|
|
61
|
+
reasons.push('desktop_authority_not_present');
|
|
62
|
+
}
|
|
63
|
+
if (authority === 'process' && !hasCapability(capabilities, required)) {
|
|
64
|
+
reasons.push('process_authority_not_present');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (authority === 'autonomous' && !hasCapability(capabilities, required)) {
|
|
68
|
+
reasons.push('autonomous_authority_not_present');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
if (goal?.task_contract?.non_goals && kind === 'act' && decision.action?.kind === 'delegate') {
|
|
73
|
+
const operationKind = decision.action.operation?.kind;
|
|
74
|
+
if (goal.task_contract.non_goals.some(item => typeof item === 'string' && item.includes(operationKind))) {
|
|
75
|
+
reasons.push('action_conflicts_with_non_goal');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (decision?.action?.kind === 'delegate' && decision.action.operation?.kind === 'host_exec') {
|
|
80
|
+
reasons.push('host_authority_not_delegable');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (decision?.action?.kind === 'delegate' && decision.action.operation?.kind === 'machine_revoke') {
|
|
84
|
+
reasons.push('machine_authority_not_delegable');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
schema:JEV_DECISION_SCHEMA,
|
|
89
|
+
verdict:reasons.length === 0 ? 'allow' : 'reject',
|
|
90
|
+
authority,
|
|
91
|
+
mutation,
|
|
92
|
+
action_kind:kind,
|
|
93
|
+
reasons,
|
|
94
|
+
required_capabilities:required
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function judgeDecision({ decision, goal = null, capabilities = [], state = null, planner_round = 0, request_id = null }) {
|
|
99
|
+
if (!Number.isInteger(planner_round) || planner_round < 0) throw new Error('JEV planner_round invalid');
|
|
100
|
+
if (request_id !== null && (typeof request_id !== 'string' || !SHA256_RE.test(request_id))) {
|
|
101
|
+
throw new Error('JEV request_id invalid');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const verdict = judgment({ decision, goal, capabilities, state });
|
|
105
|
+
const subject = {
|
|
106
|
+
schema:JEV_DECISION_SCHEMA,
|
|
107
|
+
planner_round,
|
|
108
|
+
request_id,
|
|
109
|
+
decision_sha256:sha256(decision),
|
|
110
|
+
goal_sha256:goal ? sha256(goal) : null,
|
|
111
|
+
authority:verdict.authority,
|
|
112
|
+
mutation:verdict.mutation,
|
|
113
|
+
action_kind:verdict.action_kind,
|
|
114
|
+
required_capabilities:verdict.required_capabilities,
|
|
115
|
+
verdict:verdict.verdict,
|
|
116
|
+
reasons:verdict.reasons
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
...verdict,
|
|
120
|
+
planner_round,
|
|
121
|
+
request_id,
|
|
122
|
+
decision_sha256:subject.decision_sha256,
|
|
123
|
+
judgment_sha256:sha256(subject),
|
|
124
|
+
authority_source:'DEADBYTE',
|
|
125
|
+
execution_authority:'DEADBYTE',
|
|
126
|
+
subject
|
|
127
|
+
};
|
|
128
|
+
}
|
package/src/skill-plane-r44.mjs
CHANGED
|
@@ -53,12 +53,14 @@ function parseFrontmatter(text){
|
|
|
53
53
|
exactKeys(meta,['name','description','version','audience'],'SKILL.md frontmatter');
|
|
54
54
|
return meta;
|
|
55
55
|
}
|
|
56
|
+
const GENERATED_SKILL_FILES=new Set(['references/skills_cache.json']);
|
|
56
57
|
async function walkFiles(root,rel=''){
|
|
57
58
|
const dir=path.join(root,...(rel?rel.split('/'):[]));
|
|
58
59
|
const names=(await readdir(dir)).sort((a,b)=>a.localeCompare(b,'en'));
|
|
59
60
|
const out=[];
|
|
60
61
|
for(const name of names){
|
|
61
62
|
const childRel=rel?`${rel}/${name}`:name;
|
|
63
|
+
if(GENERATED_SKILL_FILES.has(childRel)) continue;
|
|
62
64
|
const full=path.join(root,...childRel.split('/'));
|
|
63
65
|
const st=await lstat(full);
|
|
64
66
|
insist(!st.isSymbolicLink(),`skill symlink forbidden: ${childRel}`);
|
package/src/version.mjs
CHANGED
|
@@ -21,7 +21,7 @@ test('npx CLI reports the canonical package version through --version, -v and ve
|
|
|
21
21
|
for(const arg of ['--version','-v','version']){
|
|
22
22
|
const result=spawnSync(process.execPath,[cliPath,arg],{cwd:root,encoding:'utf8',windowsHide:true});
|
|
23
23
|
assert.equal(result.status,0,result.stderr);
|
|
24
|
-
assert.equal(result.stdout.trim(),'0.15.
|
|
24
|
+
assert.equal(result.stdout.trim(),'0.15.5');
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
27
|
|
|
@@ -50,6 +50,6 @@ test('npx CLI exposes local supervisor lifecycle without any supervisor arm comm
|
|
|
50
50
|
|
|
51
51
|
test('README makes npx the primary operator UX',async()=>{
|
|
52
52
|
const readme=await readFile(path.join(root,'README.txt'),'utf8');
|
|
53
|
-
assert.match(readme,/npx -y deadbyte-mcp@0\.15\.
|
|
54
|
-
assert.match(readme,/npx -y deadbyte-mcp@0\.15\.
|
|
53
|
+
assert.match(readme,/npx -y deadbyte-mcp@0\.15\.5 remote/);
|
|
54
|
+
assert.match(readme,/npx -y deadbyte-mcp@0\.15\.5 audit verify/);
|
|
55
55
|
});
|
package/test/core.test.mjs
CHANGED
|
@@ -105,7 +105,7 @@ test('proof execution creates deterministic output and signed verifiable receipt
|
|
|
105
105
|
assert.equal(result.receipt.request.schema, 'deadbyte.request.v1');
|
|
106
106
|
assert.match(result.receipt.request.nonce, /^[0-9a-f]{64}$/);
|
|
107
107
|
assert.match(result.receipt.request.sha256, /^[0-9a-f]{64}$/);
|
|
108
|
-
assert.equal(result.receipt.runtime.package_version, '0.15.
|
|
108
|
+
assert.equal(result.receipt.runtime.package_version, '0.15.5');
|
|
109
109
|
assert.match(result.receipt.runtime.mcp_ingress_adapter, /^(?:none|tunnel-stdio-probe-compat-v1)$/);
|
|
110
110
|
assert.match(result.receipt.runtime.mcp_ingress_adapter_sha256, /^[0-9a-f]{64}$/);
|
|
111
111
|
assert.match(result.receipt.runtime.mcp_ingress_mode_source_sha256, /^[0-9a-f]{64}$/);
|
|
@@ -15,7 +15,9 @@ const desktopPolicyPath=path.join(repoRoot,'controller','deadbyte-desktop-policy
|
|
|
15
15
|
const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
16
16
|
const absent=async p=>{try{await access(p);return false;}catch(e){if(e?.code==='ENOENT')return true;throw e;}};
|
|
17
17
|
|
|
18
|
-
test('R44 real max-runtime full stdio catalog is exactly 81 with skill and four Desktop primitives while authority remains disarmed',async
|
|
18
|
+
test('R44 real max-runtime full stdio catalog is exactly 81 with skill and four Desktop primitives while authority remains disarmed',async t=>{
|
|
19
|
+
const current=JSON.parse(await readFile(path.join(repoRoot,'package.json'),'utf8'));
|
|
20
|
+
if(current.version!=='0.15.0'){t.skip('historical R44 catalog; current development release is '+current.version);return;}
|
|
19
21
|
const f=await createR34Fixture({authority:'disarmed'});
|
|
20
22
|
const processPolicyPath=path.join(f.root,'process-policy.json');
|
|
21
23
|
const processGrant=path.join(f.root,'process-grant.json');
|
|
@@ -15,7 +15,9 @@ const desktopPolicyPath=path.join(repoRoot,'controller','deadbyte-desktop-policy
|
|
|
15
15
|
const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
16
16
|
const absent=async p=>{try{await access(p);return false;}catch(e){if(e?.code==='ENOENT')return true;throw e;}};
|
|
17
17
|
|
|
18
|
-
test('R45 real max-runtime full stdio catalog is exactly 82 with skill and four Desktop primitives while authority remains disarmed',async
|
|
18
|
+
test('R45 real max-runtime full stdio catalog is exactly 82 with skill and four Desktop primitives while authority remains disarmed',async t=>{
|
|
19
|
+
const current=JSON.parse(await readFile(path.join(repoRoot,'package.json'),'utf8'));
|
|
20
|
+
if(current.version!=='0.15.1'){t.skip('historical R45 catalog; current development release is '+current.version);return;}
|
|
19
21
|
const f=await createR34Fixture({authority:'disarmed'});
|
|
20
22
|
const processPolicyPath=path.join(f.root,'process-policy.json');
|
|
21
23
|
const processGrant=path.join(f.root,'process-grant.json');
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { judgeDecision } from '../src/jev-decision-plane.mjs';
|
|
4
|
+
|
|
5
|
+
const capabilities = [
|
|
6
|
+
{ id:'native_diff.apply', authority:'autonomous', mutating:true },
|
|
7
|
+
{ id:'autonomous.release_gate', authority:'autonomous', mutating:true },
|
|
8
|
+
{ id:'process.start', authority:'process', mutating:true },
|
|
9
|
+
{ id:'process.action', authority:'process', mutating:true },
|
|
10
|
+
{ id:'process.terminate', authority:'process', mutating:true },
|
|
11
|
+
{ id:'desktop.action', authority:'desktop', mutating:true }
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
const goal = {
|
|
15
|
+
goal_id:'a'.repeat(64),
|
|
16
|
+
title:'test',
|
|
17
|
+
goal:'test',
|
|
18
|
+
acceptance:'test',
|
|
19
|
+
task_contract:{ non_goals:[] }
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
test('JEV allows typed autonomous mutation without granting execution', () => {
|
|
23
|
+
const result = judgeDecision({
|
|
24
|
+
decision:{
|
|
25
|
+
schema:'deadbyte.autonomous-decision.v2',
|
|
26
|
+
kind:'act',
|
|
27
|
+
action:{kind:'native_diff_apply',diff_id:'b'.repeat(64),expected_operation_count:1}
|
|
28
|
+
},
|
|
29
|
+
goal, capabilities, planner_round:1, request_id:'c'.repeat(64)
|
|
30
|
+
});
|
|
31
|
+
assert.equal(result.verdict,'allow');
|
|
32
|
+
assert.equal(result.authority,'autonomous');
|
|
33
|
+
assert.equal(result.execution_authority,'DEADBYTE');
|
|
34
|
+
assert.equal(result.authority_source,'DEADBYTE');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('JEV rejects host authority escape from delegated planner action', () => {
|
|
38
|
+
const result = judgeDecision({
|
|
39
|
+
decision:{
|
|
40
|
+
schema:'deadbyte.autonomous-decision.v2',
|
|
41
|
+
kind:'act',
|
|
42
|
+
action:{kind:'delegate',operation:{kind:'host_exec'}}
|
|
43
|
+
},
|
|
44
|
+
goal, capabilities, planner_round:2, request_id:'d'.repeat(64)
|
|
45
|
+
});
|
|
46
|
+
assert.equal(result.verdict,'reject');
|
|
47
|
+
assert.ok(result.reasons.includes('host_authority_not_delegable'));
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('JEV rejects desktop mutation when Desktop authority is absent', () => {
|
|
51
|
+
const result = judgeDecision({
|
|
52
|
+
decision:{
|
|
53
|
+
schema:'deadbyte.autonomous-decision.v2',
|
|
54
|
+
kind:'act',
|
|
55
|
+
action:{kind:'desktop_action',action_kind:'click_primary',expected_frame_id:'e'.repeat(64),
|
|
56
|
+
target_id:'f'.repeat(64),point:null,scroll_delta:null,key_chord:null,text:null}
|
|
57
|
+
},
|
|
58
|
+
goal, capabilities:capabilities.filter(item=>item.id!=='desktop.action'),
|
|
59
|
+
planner_round:3, request_id:'1'.repeat(64)
|
|
60
|
+
});
|
|
61
|
+
assert.equal(result.verdict,'reject');
|
|
62
|
+
assert.ok(result.reasons.includes('desktop_authority_not_present'));
|
|
63
|
+
});
|