diff --git a/README.md b/README.md index c43f28b..dacb895 100644 --- a/README.md +++ b/README.md @@ -1192,3 +1192,30 @@ Boundary: - No current production claim: true - No starship claim: true - No physical production instructions: true + +## Move 143 — Org profile binds CONTROL v0.2.69 + +This public surface binds the CONTROL v0.2.69 closure authority. + +Authority: + +- CONTROL release: https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.69-antimatterium-control-move141-surface-closure +- Verify CI: https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29655274264 +- Main SHA: e78622f490ae36a2b2c4bb672191d5c4d2b90659 +- Closure ID: 63c59d3b79e4d34cec2f33f72fc898aba3e8a1311f664f62b247107054b2b31d + +Surface release: + +- https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.78-antimatterium-org-profile-control-v0269-backlink + +Backlink ID: + +- 7422db968eac4d1dda7cea72a3985581ef28aa8ece97c66f0cf5306183a66b1e + +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 8e0ef94..c1d0f03 100644 --- a/package.json +++ b/package.json @@ -131,8 +131,10 @@ "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", "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" + "test:move141-control-v0268-backlink": "node --test tests/org-profile-move141-control-v0268-backlink.test.mjs", + "verify:move143-control-v0269-backlink": "node scripts/verify-org-profile-move143-control-v0269-backlink.mjs", + "test:move143-control-v0269-backlink": "node --test tests/org-profile-move143-control-v0269-backlink.test.mjs" }, "type": "module", - "version": "0.0.77" + "version": "0.0.78" } diff --git a/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE143_CONTROL_V0269_BACKLINK.json b/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE143_CONTROL_V0269_BACKLINK.json new file mode 100644 index 0000000..146f72b --- /dev/null +++ b/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE143_CONTROL_V0269_BACKLINK.json @@ -0,0 +1,30 @@ +{ + "schema": "antimatterium.surface_control_backlink.v1", + "move": 123, + "surface": "org_profile", + "package": { + "version": "0.0.78", + "tag": "v0.0.78-antimatterium-org-profile-control-v0269-backlink", + "release": "https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.78-antimatterium-org-profile-control-v0269-backlink" + }, + "authority": { + "control_version": "0.2.69", + "control_tag": "v0.2.69-antimatterium-control-move141-surface-closure", + "control_release": "https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.69-antimatterium-control-move141-surface-closure", + "verify_ci_run": "https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29655274264", + "main_sha": "e78622f490ae36a2b2c4bb672191d5c4d2b90659", + "closure_id": "63c59d3b79e4d34cec2f33f72fc898aba3e8a1311f664f62b247107054b2b31d" + }, + "membership": { + "member_of_move143_surface_fanout": true, + "control_v0269_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": "7422db968eac4d1dda7cea72a3985581ef28aa8ece97c66f0cf5306183a66b1e" +} diff --git a/scripts/verify-org-profile-move143-control-v0269-backlink.mjs b/scripts/verify-org-profile-move143-control-v0269-backlink.mjs new file mode 100755 index 0000000..97fc94c --- /dev/null +++ b/scripts/verify-org-profile-move143-control-v0269-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_MOVE143_CONTROL_V0269_BACKLINK.json", 'utf8') +); + +const expected = { + "schema": "antimatterium.surface_control_backlink.v1", + "move": 123, + "surface": "org_profile", + "packageVersion": "0.0.78", + "packageTag": "v0.0.78-antimatterium-org-profile-control-v0269-backlink", + "packageRelease": "https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.78-antimatterium-org-profile-control-v0269-backlink", + "controlVersion": "0.2.69", + "controlTag": "v0.2.69-antimatterium-control-move141-surface-closure", + "controlRelease": "https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.69-antimatterium-control-move141-surface-closure", + "controlCi": "https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29655274264", + "controlSha": "e78622f490ae36a2b2c4bb672191d5c4d2b90659", + "controlClosureId": "63c59d3b79e4d34cec2f33f72fc898aba3e8a1311f664f62b247107054b2b31d", + "backlinkId": "7422db968eac4d1dda7cea72a3985581ef28aa8ece97c66f0cf5306183a66b1e" +}; +const outputPrefix = "ANTIMATTERIUM_ORG_PROFILE_MOVE143_CONTROL_V0269_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_move143_surface_fanout', receipt.membership?.member_of_move143_surface_fanout, true], + ['membership.control_v0269_release_bound', receipt.membership?.control_v0269_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( + 'MOVE143_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( + 'MOVE143_BACKLINK_ID_RECOMPUTE_FAILED expected ' + + receipt.backlink_id + + ', got ' + + recomputed + ); +} + +console.log(outputPrefix + '_VERIFY_PASS=true'); +console.log(outputPrefix + '_CONTROL_V0269_RELEASE_BOUND=true'); +console.log(outputPrefix + '_CONTROL_V0269_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-move143-control-v0269-backlink.test.mjs b/tests/org-profile-move143-control-v0269-backlink.test.mjs new file mode 100644 index 0000000..da892e8 --- /dev/null +++ b/tests/org-profile-move143-control-v0269-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 143 Org profile CONTROL v0.2.69 backlink verifier exits cleanly', () => { + const result = spawnSync( + 'npm', + ['run', "verify:move143-control-v0269-backlink"], + { encoding: 'utf8' } + ); + + assert.equal(result.status, 0, result.stderr || result.stdout); + + assert.match( + result.stdout, + new RegExp("ANTIMATTERIUM_ORG_PROFILE_MOVE143_CONTROL_V0269_BACKLINK_VERIFY_PASS=true") + ); + + assert.match( + result.stdout, + new RegExp("ANTIMATTERIUM_ORG_PROFILE_MOVE143_CONTROL_V0269_BACKLINK_ID=") + ); +});