diff --git a/README.md b/README.md index 8ce771f..c43f28b 100644 --- a/README.md +++ b/README.md @@ -1165,3 +1165,30 @@ Boundary: - No current production claim: true - No starship claim: true - No physical production instructions: true + +## Move 141 — Org profile binds CONTROL v0.2.68 + +This public surface binds the CONTROL v0.2.68 closure authority. + +Authority: + +- CONTROL release: https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.68-antimatterium-control-move139-surface-closure +- Verify CI: https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29654567950 +- Main SHA: 1b72f44cd0887ae62c23499274b1d023df35a9d1 +- Closure ID: d952f0926fbb5036879e354b301b8a17a77bb1088a133be7494590ad69de2b1e + +Surface release: + +- https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.77-antimatterium-org-profile-control-v0268-backlink + +Backlink ID: + +- dc0832d31542e4d403483a7a213a02992e70950cc3d20c1002af4648a4c16dcc + +Boundary: + +- Short public tag required: true +- No local root required: true +- No current production claim: true +- No starship claim: true +- No physical production instructions: true diff --git a/package.json b/package.json index f3167e0..8e0ef94 100644 --- a/package.json +++ b/package.json @@ -129,8 +129,10 @@ "verify:move137-control-v0266-backlink": "node scripts/verify-org-profile-move137-control-v0266-backlink.mjs", "test:move137-control-v0266-backlink": "node --test tests/org-profile-move137-control-v0266-backlink.test.mjs", "verify:move139-control-v0267-backlink": "node scripts/verify-org-profile-move139-control-v0267-backlink.mjs", - "test:move139-control-v0267-backlink": "node --test tests/org-profile-move139-control-v0267-backlink.test.mjs" + "test:move139-control-v0267-backlink": "node --test tests/org-profile-move139-control-v0267-backlink.test.mjs", + "verify:move141-control-v0268-backlink": "node scripts/verify-org-profile-move141-control-v0268-backlink.mjs", + "test:move141-control-v0268-backlink": "node --test tests/org-profile-move141-control-v0268-backlink.test.mjs" }, "type": "module", - "version": "0.0.76" + "version": "0.0.77" } diff --git a/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK.json b/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK.json new file mode 100644 index 0000000..2e75d97 --- /dev/null +++ b/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK.json @@ -0,0 +1,30 @@ +{ + "schema": "antimatterium.surface_control_backlink.v1", + "move": 123, + "surface": "org_profile", + "package": { + "version": "0.0.77", + "tag": "v0.0.77-antimatterium-org-profile-control-v0268-backlink", + "release": "https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.77-antimatterium-org-profile-control-v0268-backlink" + }, + "authority": { + "control_version": "0.2.68", + "control_tag": "v0.2.68-antimatterium-control-move139-surface-closure", + "control_release": "https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.68-antimatterium-control-move139-surface-closure", + "verify_ci_run": "https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29654567950", + "main_sha": "1b72f44cd0887ae62c23499274b1d023df35a9d1", + "closure_id": "d952f0926fbb5036879e354b301b8a17a77bb1088a133be7494590ad69de2b1e" + }, + "membership": { + "member_of_move141_surface_fanout": true, + "control_v0268_release_bound": true, + "short_public_tag_required": true, + "no_local_root_required": true + }, + "safety": { + "no_current_production_claim": true, + "no_starship_claim": true, + "no_physical_production_instructions": true + }, + "backlink_id": "dc0832d31542e4d403483a7a213a02992e70950cc3d20c1002af4648a4c16dcc" +} diff --git a/scripts/verify-org-profile-move141-control-v0268-backlink.mjs b/scripts/verify-org-profile-move141-control-v0268-backlink.mjs new file mode 100755 index 0000000..8554d90 --- /dev/null +++ b/scripts/verify-org-profile-move141-control-v0268-backlink.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +import fs from 'node:fs'; +import crypto from 'node:crypto'; + +function fail(message) { + console.error(message); + process.exit(1); +} + +function stable(value) { + if (Array.isArray(value)) { + return '[' + value.map(stable).join(',') + ']'; + } + + if (value && typeof value === 'object') { + return '{' + Object.keys(value) + .sort() + .map(key => JSON.stringify(key) + ':' + stable(value[key])) + .join(',') + '}'; + } + + return JSON.stringify(value); +} + +const receipt = JSON.parse( + fs.readFileSync("public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK.json", 'utf8') +); + +const expected = { + "schema": "antimatterium.surface_control_backlink.v1", + "move": 123, + "surface": "org_profile", + "packageVersion": "0.0.77", + "packageTag": "v0.0.77-antimatterium-org-profile-control-v0268-backlink", + "packageRelease": "https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.77-antimatterium-org-profile-control-v0268-backlink", + "controlVersion": "0.2.68", + "controlTag": "v0.2.68-antimatterium-control-move139-surface-closure", + "controlRelease": "https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.68-antimatterium-control-move139-surface-closure", + "controlCi": "https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29654567950", + "controlSha": "1b72f44cd0887ae62c23499274b1d023df35a9d1", + "controlClosureId": "d952f0926fbb5036879e354b301b8a17a77bb1088a133be7494590ad69de2b1e", + "backlinkId": "dc0832d31542e4d403483a7a213a02992e70950cc3d20c1002af4648a4c16dcc" +}; +const outputPrefix = "ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK"; + +const checks = [ + ['schema', receipt.schema, expected.schema], + ['move', receipt.move, expected.move], + ['surface', receipt.surface, expected.surface], + ['package.version', receipt.package?.version, expected.packageVersion], + ['package.tag', receipt.package?.tag, expected.packageTag], + ['package.release', receipt.package?.release, expected.packageRelease], + ['authority.control_version', receipt.authority?.control_version, expected.controlVersion], + ['authority.control_tag', receipt.authority?.control_tag, expected.controlTag], + ['authority.control_release', receipt.authority?.control_release, expected.controlRelease], + ['authority.verify_ci_run', receipt.authority?.verify_ci_run, expected.controlCi], + ['authority.main_sha', receipt.authority?.main_sha, expected.controlSha], + ['authority.closure_id', receipt.authority?.closure_id, expected.controlClosureId], + ['membership.member_of_move141_surface_fanout', receipt.membership?.member_of_move141_surface_fanout, true], + ['membership.control_v0268_release_bound', receipt.membership?.control_v0268_release_bound, true], + ['membership.short_public_tag_required', receipt.membership?.short_public_tag_required, true], + ['membership.no_local_root_required', receipt.membership?.no_local_root_required, true], + ['safety.no_current_production_claim', receipt.safety?.no_current_production_claim, true], + ['safety.no_starship_claim', receipt.safety?.no_starship_claim, true], + ['safety.no_physical_production_instructions', receipt.safety?.no_physical_production_instructions, true], + ['backlink_id', receipt.backlink_id, expected.backlinkId] +]; + +for (const [name, actual, wanted] of checks) { + if (actual !== wanted) { + fail( + 'MOVE141_CHECK_FAILED ' + + name + + ': expected ' + + wanted + + ', got ' + + actual + ); + } +} + +const canonical = structuredClone(receipt); +delete canonical.backlink_id; + +const recomputed = crypto + .createHash('sha256') + .update(stable(canonical)) + .digest('hex'); + +if (recomputed !== receipt.backlink_id) { + fail( + 'MOVE141_BACKLINK_ID_RECOMPUTE_FAILED expected ' + + receipt.backlink_id + + ', got ' + + recomputed + ); +} + +console.log(outputPrefix + '_VERIFY_PASS=true'); +console.log(outputPrefix + '_CONTROL_V0268_RELEASE_BOUND=true'); +console.log(outputPrefix + '_CONTROL_V0268_MEMBER=true'); +console.log('ANTIMATTERIUM_SHORT_PUBLIC_TAG_REQUIRED=true'); +console.log('ANTIMATTERIUM_NO_LOCAL_ROOT_REQUIRED=true'); +console.log(outputPrefix + '_ID=' + receipt.backlink_id); +console.log('NO_CURRENT_PRODUCTION_CLAIM=true'); +console.log('NO_STARSHIP_CLAIM=true'); +console.log('NO_PHYSICAL_PRODUCTION_INSTRUCTIONS=true'); diff --git a/tests/org-profile-move141-control-v0268-backlink.test.mjs b/tests/org-profile-move141-control-v0268-backlink.test.mjs new file mode 100644 index 0000000..6b292c2 --- /dev/null +++ b/tests/org-profile-move141-control-v0268-backlink.test.mjs @@ -0,0 +1,23 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; + +test('Move 141 Org profile CONTROL v0.2.68 backlink verifier exits cleanly', () => { + const result = spawnSync( + 'npm', + ['run', "verify:move141-control-v0268-backlink"], + { encoding: 'utf8' } + ); + + assert.equal(result.status, 0, result.stderr || result.stdout); + + assert.match( + result.stdout, + new RegExp("ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK_VERIFY_PASS=true") + ); + + assert.match( + result.stdout, + new RegExp("ANTIMATTERIUM_ORG_PROFILE_MOVE141_CONTROL_V0268_BACKLINK_ID=") + ); +});