deadbyte-mcp 0.15.75 → 0.15.76

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.
Files changed (42) hide show
  1. package/MANIFEST.SHA256 +41 -35
  2. package/PROVENANCE.json +17 -17
  3. package/README.txt +12 -12
  4. package/RELEASE.json +35 -17
  5. package/SBOM.cdx.json +2 -2
  6. package/TEST-MATRIX.json +12 -2
  7. package/bridge/package.json +1 -1
  8. package/controller/deadbyte-process-policy.json +4 -4
  9. package/docs/R184-package-lock.json +2 -2
  10. package/package.json +3 -2
  11. package/scripts/gate-windows-r207.ps1 +104 -0
  12. package/scripts/npm-release-r48.mjs +10 -0
  13. package/scripts/npm-release-readiness-r207.mjs +76 -0
  14. package/scripts/r193-owner-request-live.mjs +3 -1
  15. package/scripts/r193-owner-uac-broker.mjs +3 -2
  16. package/src/r207-owner-enrollment-io.mjs +30 -0
  17. package/src/version.mjs +1 -1
  18. package/test/process-policy-refresh.test.mjs +4 -4
  19. package/test/r130-release-security-contract.test.mjs +7 -7
  20. package/test/r132-release-identity.test.mjs +6 -6
  21. package/test/r153-prepublish-identity.test.mjs +1 -1
  22. package/test/r160-release-contract.test.mjs +3 -3
  23. package/test/r165-live-cli-skew.test.mjs +1 -1
  24. package/test/r167-release-contract.test.mjs +10 -10
  25. package/test/r168-release-contract.test.mjs +4 -4
  26. package/test/r172-release-contract.test.mjs +5 -5
  27. package/test/r173-release-contract.test.mjs +15 -15
  28. package/test/r179-release-contract.test.mjs +10 -10
  29. package/test/r190-release-contract.test.mjs +8 -8
  30. package/test/r191-release-contract.test.mjs +10 -10
  31. package/test/r192-release-identity.test.mjs +9 -9
  32. package/test/r193-release-identity.test.mjs +21 -21
  33. package/test/r193-release-readiness.test.mjs +2 -2
  34. package/test/r193-windows-gate.test.mjs +10 -10
  35. package/test/r194-release-identity.test.mjs +10 -10
  36. package/test/r194-release-readiness.test.mjs +3 -3
  37. package/test/r194-windows-gate.test.mjs +8 -8
  38. package/test/r206-release-contract.test.mjs +14 -14
  39. package/test/r207-owner-enrollment-io.test.mjs +37 -0
  40. package/test/r207-release-contract.test.mjs +51 -0
  41. package/test/r207-release-readiness.test.mjs +23 -0
  42. package/test/r59-tool-surface-compat.test.mjs +1 -1
@@ -6,23 +6,23 @@ import path from 'node:path';
6
6
  import {DEADBYTE_VERSION} from '../src/version.mjs';
7
7
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
8
8
  const json=async f=>JSON.parse(await readFile(path.join(root,f),'utf8'));
9
- const predecessor='v0.15.74-e84bf4eed16e9443';
10
- const publishedManifest='e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47';
11
- const publishedTarball='5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c';
9
+ const predecessor='v0.15.75-9039fff265696091';
10
+ const publishedManifest='9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248';
11
+ const publishedTarball='c2ebb079e7725f3a2f2c7d8f98ef42059e94e51f402d99c1825f46e020237ee9';
12
12
  test('R191 exact version identity includes bundled bridge, lock snapshot, SBOM, provenance and matrix',async()=>{
13
13
  const [pkg,bridge,lock,release,provenance,matrix,bom]=await Promise.all(['package.json','bridge/package.json','docs/R184-package-lock.json','RELEASE.json','PROVENANCE.json','TEST-MATRIX.json','SBOM.cdx.json'].map(json));
14
- for(const ver of [pkg.version,bridge.version,lock.version,lock.packages[''].version,release.version,provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION])assert.equal(ver,'0.15.75');
15
- for(const train of [release.train,matrix.train])assert.equal(train,'R206');
16
- assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
14
+ for(const ver of [pkg.version,bridge.version,lock.version,lock.packages[''].version,release.version,provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION])assert.equal(ver,'0.15.76');
15
+ for(const train of [release.train,matrix.train])assert.equal(train,'R207');
16
+ assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r207:0.15.76');
17
17
  assert.equal(release.parent.release_id,predecessor);
18
18
  assert.equal(provenance.parent_release_id,predecessor);
19
19
  assert.equal(release.source_predecessor.version,'0.15.75');
20
- assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
21
- assert.equal(release.source_predecessor.tarball_sha256,null);
20
+ assert.equal(release.source_predecessor.manifest_sha256,publishedManifest);
21
+ assert.equal(release.source_predecessor.tarball_sha256,publishedTarball);
22
22
  assert.equal(provenance.source_predecessor_version,'0.15.75');
23
23
  assert.equal(provenance.parent_tarball_sha256,publishedTarball);
24
- assert.equal(provenance.source_predecessor_tarball_sha256,null);
25
- assert.equal(provenance.source_predecessor_manifest_file_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
24
+ assert.equal(provenance.source_predecessor_tarball_sha256,publishedTarball);
25
+ assert.equal(provenance.source_predecessor_manifest_file_sha256,publishedManifest);
26
26
  assert.equal(release.r191_activation_repair.npm_publish,'NOT_RUN');
27
27
  assert.equal(release.r191_activation_repair.production_activation,'NOT_RUN');
28
28
  assert.equal(release.r190_foreground_recovery.status,'PREPUBLISH_VERIFIED');
@@ -3,21 +3,21 @@ import {readFile} from 'node:fs/promises';import {createHash} from 'node:crypto'
3
3
  import {DEADBYTE_VERSION} from '../src/version.mjs';
4
4
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
5
5
  const read=async name=>JSON.parse(await readFile(path.join(root,name),'utf8'));
6
- const prevHash='e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47';
7
- const prevTar='5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c';
6
+ const prevHash='9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248';
7
+ const prevTar='c2ebb079e7725f3a2f2c7d8f98ef42059e94e51f402d99c1825f46e020237ee9';
8
8
  test('R193 current identity retains exact published R192 predecessor evidence',async()=>{
9
9
  const [pkg,bridge,lock,release,prov,matrix,bom]=await Promise.all([
10
10
  read('package.json'),read('bridge/package.json'),read('docs/R184-package-lock.json'),
11
11
  read('RELEASE.json'),read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
12
12
  for(const actual of [pkg.version,bridge.version,lock.version,lock.packages[''].version,
13
13
  release.version,prov.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION])
14
- assert.equal(actual,'0.15.75');
15
- assert.equal(release.train,'R206');assert.equal(matrix.train,'R206');
16
- assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
17
- assert.equal(release.parent.release_id,'v0.15.74-e84bf4eed16e9443');
14
+ assert.equal(actual,'0.15.76');
15
+ assert.equal(release.train,'R207');assert.equal(matrix.train,'R207');
16
+ assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r207:0.15.76');
17
+ assert.equal(release.parent.release_id,'v0.15.75-9039fff265696091');
18
18
  assert.equal(release.parent.manifest_sha256,prevHash);
19
- assert.equal(release.source_predecessor.tarball_sha256,null);
20
- assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
19
+ assert.equal(release.source_predecessor.tarball_sha256,prevTar);
20
+ assert.equal(release.source_predecessor.manifest_sha256,prevHash);
21
21
  assert.equal(prov.parent_tarball_sha256,prevTar);
22
22
  assert.equal(prov.parent_manifest_sha256,prevHash);
23
23
  assert.equal(release.r192.production_activation,'NOT_RUN');
@@ -33,7 +33,7 @@ test('R192 foreground reader enforces caller-safe telemetry rather than changing
33
33
  assert.match(log,/sanitizeAuditArgs\(compact\[6\]\)/);
34
34
  const [policy,release]=await Promise.all([
35
35
  read('controller/deadbyte-process-policy.json'),read('RELEASE.json')]);
36
- const approved=release.r206.development_policy_root;
36
+ const approved=release.r207.development_policy_root;
37
37
  assert.equal(typeof approved,'string');
38
38
  assert.ok(path.isAbsolute(approved));
39
39
  assert.equal(path.resolve(policy.roots.core.path),path.resolve(approved));
@@ -7,41 +7,41 @@ import path from 'node:path';
7
7
  const root=fileURLToPath(new URL('..',import.meta.url));
8
8
  const json=async file=>JSON.parse(await readFile(path.join(root,file),'utf8'));
9
9
  const parent={
10
- version:'0.15.74',
11
- release_id:'v0.15.74-e84bf4eed16e9443',
12
- manifest_sha256:'e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47',
13
- generation_manifest_sha256:'598f896be9ce65e6b0c618e8c8f6eaa2a9d91617a76a146bf3deb385a56d19e7'
10
+ version:'0.15.75',
11
+ release_id:'v0.15.75-9039fff265696091',
12
+ manifest_sha256:'9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248',
13
+ generation_manifest_sha256:'83a212e01173c73f78cff2a6d26e6f3f50f476a8c0ea3cbbf592a466071909e9'
14
14
  };
15
- const parentTarball='5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c';
15
+ const parentTarball='c2ebb079e7725f3a2f2c7d8f98ef42059e94e51f402d99c1825f46e020237ee9';
16
16
 
17
- test('R206 package identity preserves the R193 owner boundary and separates R205 source from active R194 runtime',async()=>{
17
+ test('R207 package identity preserves the R193 owner boundary and separates R206 source from active R206 runtime',async()=>{
18
18
  const [pkg,bridge,release,provenance,matrix,sbom,versionSource]=await Promise.all([
19
19
  json('package.json'),json('bridge/package.json'),json('RELEASE.json'),json('PROVENANCE.json'),
20
20
  json('TEST-MATRIX.json'),json('SBOM.cdx.json'),readFile(path.join(root,'src','version.mjs'),'utf8')]);
21
- assert.equal(pkg.version,'0.15.75');
22
- assert.equal(bridge.version,'0.15.75');
23
- assert.match(versionSource,/DEADBYTE_VERSION = '0\.15\.75'/);
24
- assert.equal(release.version,'0.15.75');
25
- assert.equal(release.train,'R206');
21
+ assert.equal(pkg.version,'0.15.76');
22
+ assert.equal(bridge.version,'0.15.76');
23
+ assert.match(versionSource,/DEADBYTE_VERSION = '0\.15\.76'/);
24
+ assert.equal(release.version,'0.15.76');
25
+ assert.equal(release.train,'R207');
26
26
  for(const key of Object.keys(parent)){
27
27
  assert.equal(release.parent[key],parent[key]);
28
28
  assert.equal(release.runtime_predecessor[key],parent[key]);
29
29
  }
30
30
  assert.equal(release.source_predecessor.version,'0.15.75');
31
- assert.equal(release.source_predecessor.train,'R205');
32
- assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
33
- assert.equal(release.source_predecessor.tarball_sha256,null);
34
- assert.equal(provenance.version,'0.15.75');
31
+ assert.equal(release.source_predecessor.train,'R206');
32
+ assert.equal(release.source_predecessor.manifest_sha256,parent.manifest_sha256);
33
+ assert.equal(release.source_predecessor.tarball_sha256,parentTarball);
34
+ assert.equal(provenance.version,'0.15.76');
35
35
  assert.equal(provenance.parent_release_id,parent.release_id);
36
36
  assert.equal(provenance.parent_manifest_sha256,parent.manifest_sha256);
37
37
  assert.equal(provenance.parent_generation_manifest_sha256,parent.generation_manifest_sha256);
38
38
  assert.equal(provenance.source_predecessor_version,'0.15.75');
39
- assert.equal(provenance.source_predecessor_train,'R205');
40
- assert.equal(provenance.source_predecessor_tarball_sha256,null);
41
- assert.equal(matrix.version,'0.15.75');
42
- assert.equal(matrix.train,'R206');
43
- assert.equal(sbom.metadata.component.version,'0.15.75');
44
- assert.match(sbom.serialNumber,/r206:0\.15\.75$/);
39
+ assert.equal(provenance.source_predecessor_train,'R206');
40
+ assert.equal(provenance.source_predecessor_tarball_sha256,parentTarball);
41
+ assert.equal(matrix.version,'0.15.76');
42
+ assert.equal(matrix.train,'R207');
43
+ assert.equal(sbom.metadata.component.version,'0.15.76');
44
+ assert.match(sbom.serialNumber,/r207:0\.15\.76$/);
45
45
  });
46
46
 
47
47
  test('R193 manifest binds every protected owner-boundary implementation file',async()=>{
@@ -77,11 +77,11 @@ test('R193 publisher refuses a repacked artifact that differs from closure bytes
77
77
  observedSha256:'c'.repeat(64),observedIntegrity:'sha512-other',observedShasum:'d'.repeat(40)}),/PUBLISH_BLOCKED R193.*repacked tarball/);
78
78
  });
79
79
 
80
- test('canonical npm release entrypoint enforces current R195 closure before registry or pack work',async()=>{
80
+ test('canonical npm release entrypoint enforces current R207 closure before registry or pack work',async()=>{
81
81
  const root=fileURLToPath(new URL('..',import.meta.url));
82
82
  const env={...process.env};delete env.DEADBYTE_R193_CLOSURE_ROOT;
83
83
  const result=spawnSync(process.execPath,[path.join(root,'scripts','npm-release-r48.mjs'),'--publish-only'],{cwd:root,env,encoding:'utf8',windowsHide:true});
84
84
  assert.notEqual(result.status,0);
85
- assert.match(`${result.stdout}\n${result.stderr}`,/PUBLISH_BLOCKED R206.*closure root absent/);
85
+ assert.match(`${result.stdout}\n${result.stderr}`,/PUBLISH_BLOCKED R207.*closure root absent/);
86
86
  assert.doesNotMatch(`${result.stdout}\n${result.stderr}`,/npm publish|Packing artifact/);
87
87
  });
@@ -6,19 +6,19 @@ import path from 'node:path';
6
6
 
7
7
  const root=fileURLToPath(new URL('..',import.meta.url));
8
8
 
9
- test('R206 Windows gate is the canonical exact-identity prepublication gate',async()=>{
9
+ test('R207 Windows gate is the canonical exact-identity prepublication gate',async()=>{
10
10
  const [pkg,gate]=await Promise.all([
11
11
  readFile(path.join(root,'package.json'),'utf8').then(JSON.parse),
12
- readFile(path.join(root,'scripts','gate-windows-r206.ps1'),'utf8')
12
+ readFile(path.join(root,'scripts','gate-windows-r207.ps1'),'utf8')
13
13
  ]);
14
- assert.equal(pkg.scripts['gate:windows'],'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r206.ps1 -Stage all');
15
- assert.match(gate,/0\.15\.75/);
16
- assert.match(gate,/R206/);
17
- assert.match(gate,/v0\.15\.74-e84bf4eed16e9443/);
18
- assert.match(gate,/e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47/);
19
- assert.match(gate,/598f896be9ce65e6b0c618e8c8f6eaa2a9d91617a76a146bf3deb385a56d19e7/);
20
- assert.match(gate,/test\/r193-release-identity\.test\.mjs/);
21
- assert.match(gate,/test\/r193-release-readiness\.test\.mjs/);
14
+ assert.equal(pkg.scripts['gate:windows'],'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r207.ps1 -Stage all');
15
+ assert.match(gate,/0\.15\.76/);
16
+ assert.match(gate,/R207/);
17
+ assert.match(gate,/v0\.15\.75-9039fff265696091/);
18
+ assert.match(gate,/9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248/);
19
+ assert.match(gate,/83a212e01173c73f78cff2a6d26e6f3f50f476a8c0ea3cbbf592a466071909e9/);
20
+ assert.match(gate,/test\/r207-release-contract\.test\.mjs/);
21
+ assert.match(gate,/test\/r207-owner-enrollment-io\.test\.mjs/);
22
22
  assert.match(gate,/test\/r193-owner-uac-broker\.test\.mjs/);
23
23
  assert.match(gate,/test\/r70-owner-approval\.test\.mjs/);
24
24
  assert.match(gate,/test\/r89-privileged-install-boundary\.test\.mjs/);
@@ -5,23 +5,23 @@ import{fileURLToPath}from'node:url';
5
5
  import path from'node:path';
6
6
  const root=fileURLToPath(new URL('..',import.meta.url));
7
7
  const json=async n=>JSON.parse(await readFile(path.join(root,n),'utf8'));
8
- test('R206 exact release identity binds R205 source separately from active R194 runtime',async()=>{
8
+ test('R207 exact release identity binds R206 source separately from active R206 runtime',async()=>{
9
9
  const [pkg,bridge,release,provenance,matrix,sbom,lock,ver]=await Promise.all([
10
10
  json('package.json'),json('bridge/package.json'),json('RELEASE.json'),json('PROVENANCE.json'),
11
11
  json('TEST-MATRIX.json'),json('SBOM.cdx.json'),json('docs/R184-package-lock.json'),
12
12
  readFile(path.join(root,'src','version.mjs'),'utf8')]);
13
13
  for(const v of [pkg.version,bridge.version,release.version,provenance.version,matrix.version,
14
- sbom.metadata.component.version,lock.version,lock.packages[''].version])assert.equal(v,'0.15.75');
15
- assert.match(ver,/DEADBYTE_VERSION = '0\.15\.75'/);
16
- assert.equal(release.train,'R206');assert.equal(matrix.train,'R206');
17
- assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
18
- assert.equal(release.parent.release_id,'v0.15.74-e84bf4eed16e9443');
14
+ sbom.metadata.component.version,lock.version,lock.packages[''].version])assert.equal(v,'0.15.76');
15
+ assert.match(ver,/DEADBYTE_VERSION = '0\.15\.76'/);
16
+ assert.equal(release.train,'R207');assert.equal(matrix.train,'R207');
17
+ assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r207:0.15.76');
18
+ assert.equal(release.parent.release_id,'v0.15.75-9039fff265696091');
19
19
  assert.equal(release.runtime_predecessor.release_id,release.parent.release_id);
20
20
  assert.equal(release.source_predecessor.version,'0.15.75');
21
- assert.equal(release.source_predecessor.train,'R205');
22
- assert.equal(release.source_predecessor.release_status,'DEVELOPMENT_VERIFIED_RELEASE_BLOCKED');
23
- assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
24
- assert.equal(release.source_predecessor.tarball_sha256,null);
21
+ assert.equal(release.source_predecessor.train,'R206');
22
+ assert.equal(release.source_predecessor.release_status,'RELEASED');
23
+ assert.equal(release.source_predecessor.manifest_sha256,'9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248');
24
+ assert.equal(release.source_predecessor.tarball_sha256,'c2ebb079e7725f3a2f2c7d8f98ef42059e94e51f402d99c1825f46e020237ee9');
25
25
  assert.equal(provenance.source_predecessor_version,'0.15.75');
26
26
  assert.equal(provenance.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
27
27
  assert.equal(release.r195.scope,'CANONICAL_PROTECTED_OWNER_OBSERVATION');
@@ -77,11 +77,11 @@ test('R194 publisher refuses a repacked artifact that differs from closure bytes
77
77
  observedSha256:'c'.repeat(64),observedIntegrity:'sha512-other',observedShasum:'d'.repeat(40)}),/PUBLISH_BLOCKED R194.*repacked tarball/);
78
78
  });
79
79
 
80
- test('canonical npm release entrypoint enforces current R195 closure before registry or pack work',async()=>{
80
+ test('canonical npm release entrypoint enforces current R207 closure before registry or pack work',async()=>{
81
81
  const root=fileURLToPath(new URL('..',import.meta.url));
82
- const env={...process.env};delete env.DEADBYTE_R194_CLOSURE_ROOT;
82
+ const env={...process.env};delete env.DEADBYTE_R207_CLOSURE_ROOT;
83
83
  const result=spawnSync(process.execPath,[path.join(root,'scripts','npm-release-r48.mjs'),'--publish-only'],{cwd:root,env,encoding:'utf8',windowsHide:true});
84
84
  assert.notEqual(result.status,0);
85
- assert.match(`${result.stdout}\n${result.stderr}`,/PUBLISH_BLOCKED R206.*closure root absent/);
85
+ assert.match(`${result.stdout}\n${result.stderr}`,/PUBLISH_BLOCKED R207.*closure root absent/);
86
86
  assert.doesNotMatch(`${result.stdout}\n${result.stderr}`,/npm publish|Packing artifact/);
87
87
  });
@@ -4,17 +4,17 @@ import {readFile} from 'node:fs/promises';
4
4
  import path from 'node:path';
5
5
  import {fileURLToPath} from 'node:url';
6
6
  const root=fileURLToPath(new URL('..',import.meta.url));
7
- test('R206 prepublication Windows gate keeps active R194 runtime parent pinned',async()=>{
7
+ test('R207 prepublication Windows gate keeps active R206 runtime parent pinned',async()=>{
8
8
  const [pkg,gate]=await Promise.all([
9
9
  readFile(path.join(root,'package.json'),'utf8').then(JSON.parse),
10
- readFile(path.join(root,'scripts/gate-windows-r206.ps1'),'utf8')]);
10
+ readFile(path.join(root,'scripts/gate-windows-r207.ps1'),'utf8')]);
11
11
  assert.equal(pkg.scripts['gate:windows'],
12
- 'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r206.ps1 -Stage all');
13
- assert.match(gate,/0\.15\.75/);assert.match(gate,/R206/);
14
- assert.match(gate,/v0\.15\.74-e84bf4eed16e9443/);
15
- assert.match(gate,/598f896be9ce65e6b0c618e8c8f6eaa2a9d91617a76a146bf3deb385a56d19e7/);
16
- assert.match(gate,/test\/r194-release-identity\.test\.mjs/);
17
- assert.match(gate,/test\/r194-npm-auth-recovery\.test\.mjs/);
12
+ 'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r207.ps1 -Stage all');
13
+ assert.match(gate,/0\.15\.76/);assert.match(gate,/R207/);
14
+ assert.match(gate,/v0\.15\.75-9039fff265696091/);
15
+ assert.match(gate,/83a212e01173c73f78cff2a6d26e6f3f50f476a8c0ea3cbbf592a466071909e9/);
16
+ assert.match(gate,/test\/r207-release-contract\.test\.mjs/);
17
+ assert.match(gate,/test\/r207-owner-enrollment-io\.test\.mjs/);
18
18
  assert.match(gate,/test\/r195-canonical-owner-observation\.test\.mjs/);
19
19
  assert.match(gate,/test\/r193-owner-uac-broker\.test\.mjs/);
20
20
  assert.doesNotMatch(gate,/arm(process|coding|autonomous|desktop|host)/i);
@@ -7,24 +7,24 @@ import path from 'node:path';
7
7
  const root=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
8
8
  const json=async name=>JSON.parse(await readFile(path.join(root,name),'utf8'));
9
9
 
10
- test('R206 identity binds R205 source separately from active 0.15.74 runtime',async()=>{
10
+ test('R207 retains R206 evidence while binding R206 source separately from active 0.15.75 runtime',async()=>{
11
11
  const [pkg,lock,bridge,release,provenance,matrix,sbom]=await Promise.all([
12
12
  json('package.json'),json('docs/R184-package-lock.json'),json('bridge/package.json'),json('RELEASE.json'),
13
13
  json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json')
14
14
  ]);
15
- assert.equal(pkg.version,'0.15.75');
16
- assert.equal(lock.version,'0.15.75');
17
- assert.equal(lock.packages[''].version,'0.15.75');
18
- assert.equal(bridge.version,'0.15.75');
19
- assert.equal(release.version,'0.15.75');assert.equal(release.train,'R206');
20
- assert.equal(release.source_predecessor.train,'R205');
21
- assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
22
- assert.equal(release.runtime_predecessor.release_id,'v0.15.74-e84bf4eed16e9443');
23
- assert.equal(provenance.builder,'deadbyte-r206-release-closure');
24
- assert.equal(provenance.source_predecessor_train,'R205');
25
- assert.equal(provenance.source_predecessor_manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
26
- assert.equal(matrix.train,'R206');
27
- assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
15
+ assert.equal(pkg.version,'0.15.76');
16
+ assert.equal(lock.version,'0.15.76');
17
+ assert.equal(lock.packages[''].version,'0.15.76');
18
+ assert.equal(bridge.version,'0.15.76');
19
+ assert.equal(release.version,'0.15.76');assert.equal(release.train,'R207');
20
+ assert.equal(release.source_predecessor.train,'R206');
21
+ assert.equal(release.source_predecessor.manifest_sha256,'9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248');
22
+ assert.equal(release.runtime_predecessor.release_id,'v0.15.75-9039fff265696091');
23
+ assert.equal(provenance.builder,'deadbyte-r207-owner-enrollment-fix');
24
+ assert.equal(provenance.source_predecessor_train,'R206');
25
+ assert.equal(provenance.source_predecessor_manifest_sha256,'9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248');
26
+ assert.equal(matrix.train,'R207');
27
+ assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r207:0.15.76');
28
28
  });
29
29
 
30
30
  test('R206 release contract keeps public surface stable and deferred work truthful',async()=>{
@@ -0,0 +1,37 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import {mkdtemp,mkdir,readFile,rm,symlink,writeFile} from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import {ensureOwnerConsentDirectory,parseOwnerEnrollmentJson} from '../src/r207-owner-enrollment-io.mjs';
7
+
8
+ test('R207 parses Windows PowerShell UTF-8 BOM supervisor ledgers',()=>{
9
+ const value=parseOwnerEnrollmentJson(Buffer.concat([Buffer.from([0xef,0xbb,0xbf]),Buffer.from('{"schema":"deadbyte.supervisor.instance.v1","pid":17}')]),'supervisor ledger');
10
+ assert.equal(value.schema,'deadbyte.supervisor.instance.v1');
11
+ assert.equal(value.pid,17);
12
+ assert.throws(()=>parseOwnerEnrollmentJson(Buffer.from('\uFEFF[]'),'supervisor ledger'),/must be an object/);
13
+ });
14
+
15
+ test('R207 initializes the bounded owner-consent state directory before no-clobber request creation',async()=>{
16
+ const base=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r207-owner-'));
17
+ try{
18
+ const runtime=path.join(base,'runtime');await mkdir(runtime);
19
+ const consent=await ensureOwnerConsentDirectory(runtime);
20
+ assert.equal(consent.toLowerCase(),path.join(runtime,'owner-consent').toLowerCase());
21
+ const request=path.join(consent,'request.json');
22
+ await writeFile(request,'{}\n',{flag:'wx'});
23
+ await assert.rejects(writeFile(request,'{}\n',{flag:'wx'}),error=>error?.code==='EEXIST');
24
+ assert.equal(await readFile(request,'utf8'),'{}\n');
25
+ }finally{await rm(base,{recursive:true,force:true});}
26
+ });
27
+
28
+ test('R207 rejects an owner-consent junction or symlink escape',async t=>{
29
+ const base=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r207-owner-link-'));
30
+ try{
31
+ const runtime=path.join(base,'runtime'),outside=path.join(base,'outside');
32
+ await mkdir(runtime);await mkdir(outside);
33
+ try{await symlink(outside,path.join(runtime,'owner-consent'),process.platform==='win32'?'junction':'dir');}
34
+ catch(error){if(error?.code==='EPERM'){t.skip('Windows symlink privilege unavailable');return;}throw error;}
35
+ await assert.rejects(ensureOwnerConsentDirectory(runtime),/real directory|escapes/);
36
+ }finally{await rm(base,{recursive:true,force:true});}
37
+ });
@@ -0,0 +1,51 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFile } from 'node:fs/promises';
4
+
5
+ const root = new URL('../', import.meta.url);
6
+ const json = async name => JSON.parse(await readFile(new URL(name, root), 'utf8'));
7
+
8
+ test('R207 identity binds exact R206 source and active 0.15.75 runtime predecessors', async () => {
9
+ const [pkg, lock, bridge, release, provenance, matrix, sbom, versionSource] = await Promise.all([
10
+ json('package.json'), json('docs/R184-package-lock.json'), json('bridge/package.json'), json('RELEASE.json'),
11
+ json('PROVENANCE.json'), json('TEST-MATRIX.json'), json('SBOM.cdx.json'),
12
+ readFile(new URL('src/version.mjs', root), 'utf8')
13
+ ]);
14
+ for (const value of [pkg.version, lock.version, lock.packages[''].version, bridge.version,
15
+ release.version, provenance.version, matrix.version, sbom.metadata.component.version]) {
16
+ assert.equal(value, '0.15.76');
17
+ }
18
+ assert.match(versionSource, /DEADBYTE_VERSION = '0\.15\.76'/);
19
+ assert.equal(release.train, 'R207');
20
+ assert.equal(matrix.train, 'R207');
21
+ assert.equal(sbom.serialNumber, 'urn:cdx:deadbyte-mcp:r207:0.15.76');
22
+ assert.deepEqual(release.source_predecessor, {
23
+ version: '0.15.75',
24
+ train: 'R206',
25
+ source_path: 'D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.75-r206-release-closure',
26
+ release_status: 'RELEASED',
27
+ manifest_status: 'R206_MANIFEST_VERIFIED',
28
+ manifest_sha256: '9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248',
29
+ tarball_sha256: 'c2ebb079e7725f3a2f2c7d8f98ef42059e94e51f402d99c1825f46e020237ee9'
30
+ });
31
+ assert.deepEqual(release.runtime_predecessor, {
32
+ version: '0.15.75',
33
+ release_id: 'v0.15.75-9039fff265696091',
34
+ manifest_sha256: '9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248',
35
+ generation_manifest_sha256: '83a212e01173c73f78cff2a6d26e6f3f50f476a8c0ea3cbbf592a466071909e9'
36
+ });
37
+ });
38
+
39
+ test('R207 keeps authority surface stable and fixes only protected owner-enrollment IO', async () => {
40
+ const release = await json('RELEASE.json');
41
+ assert.equal(release.capabilities.compact_tool_count, 43);
42
+ assert.equal(release.capabilities.full_tool_count, 117);
43
+ assert.equal(release.r207.scope, 'PROTECTED_OWNER_ENROLLMENT_IO_RECOVERY');
44
+ assert.equal(release.r207.public_tool_delta, 0);
45
+ assert.equal(release.r207.authority_scope_delta, 0);
46
+ assert.equal(release.r207.r70_weakened, false);
47
+ assert.equal(release.r207.r89_weakened, false);
48
+ assert.equal(release.r207.owner_private_key_access, false);
49
+ assert.equal(release.r207.owner_consent_directory_initialization, 'FAIL_CLOSED_CONTAINED_NON_REPARSE');
50
+ assert.equal(release.r207.supervisor_ledger_utf8_bom, 'ACCEPT_ONE_LEADING_BOM_ONLY');
51
+ });
@@ -0,0 +1,23 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import {assertR207NpmPublishReady,assertR207PackedIdentity} from '../scripts/npm-release-readiness-r207.mjs';
4
+ const base={version:'0.15.76',train:'R207',
5
+ parent:{version:'0.15.75',release_id:'v0.15.75-9039fff265696091',manifest_sha256:'9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248',generation_manifest_sha256:'83a212e01173c73f78cff2a6d26e6f3f50f476a8c0ea3cbbf592a466071909e9'},
6
+ source_predecessor:{train:'R206',manifest_sha256:'9039fff265696091f9217ba4f19526c6c74a967f9ff48b75ac6e340b5f431248'},
7
+ r207:{scope:'PROTECTED_OWNER_ENROLLMENT_IO_RECOVERY',public_tool_delta:0,authority_scope_delta:0,owner_private_key_access:false,r70_weakened:false,r89_weakened:false}};
8
+ test('R207 refuses publish absent independently verified closure',async()=>{
9
+ await assert.rejects(assertR207NpmPublishReady(base,{root:'D:\\candidate'}),/PUBLISH_BLOCKED R207.*closure root absent/);
10
+ });
11
+ test('R207 refuses any authority increase or private-key access',async()=>{
12
+ for(const key of ['owner_private_key_access','r70_weakened','r89_weakened']){
13
+ const altered=structuredClone(base);altered.r207[key]=true;
14
+ await assert.rejects(assertR207NpmPublishReady(altered,{root:'D:\\candidate'}),/PUBLISH_BLOCKED R207.*public authority surface widened/);
15
+ }
16
+ });
17
+ test('R207 rejects mismatched parent release before reading any closure',async()=>{
18
+ const altered=structuredClone(base);altered.parent.release_id='v0.15.74-e84bf4eed16e9443';
19
+ await assert.rejects(assertR207NpmPublishReady(altered,{root:'D:\\candidate'}),/PUBLISH_BLOCKED R207.*lineage mismatch/);
20
+ });
21
+ test('R207 refuses repacked artifact identity drift',()=>{
22
+ assert.throws(()=>assertR207PackedIdentity({tarball_sha256:'a'.repeat(64),tarball_integrity:'sha512-proof',tarball_shasum:'b'.repeat(40),observedSha256:'c'.repeat(64),observedIntegrity:'sha512-another',observedShasum:'d'.repeat(40)}),/PUBLISH_BLOCKED R207.*repacked tarball/);
23
+ });
@@ -83,7 +83,7 @@ test('R72 compact baseline permits only R64 read offset and authorized coding-on
83
83
  assert.deepEqual(diff.added,[]);
84
84
  assert.deepEqual(diff.removed,[]);
85
85
  const packageVersion=JSON.parse(await readFile(path.join(repoRoot,'package.json'),'utf8')).version;
86
- if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60','0.15.61','0.15.62','0.15.63','0.15.64','0.15.65','0.15.66','0.15.67','0.15.68','0.15.69','0.15.70','0.15.71','0.15.72','0.15.73','0.15.74','0.15.75'].includes(packageVersion)){
86
+ if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60','0.15.61','0.15.62','0.15.63','0.15.64','0.15.65','0.15.66','0.15.67','0.15.68','0.15.69','0.15.70','0.15.71','0.15.72','0.15.73','0.15.74','0.15.75','0.15.76'].includes(packageVersion)){
87
87
  assert.deepEqual([...diff.schema_changed].sort(),['machine_fs','native_diff_preview']);
88
88
  assert.equal(diff.unchanged.length,41);
89
89
  const prior=baseline.tools.find(tool=>tool.name==='machine_fs');