diff --git a/README.md b/README.md index 2d477dc..35cf204 100644 --- a/README.md +++ b/README.md @@ -1057,3 +1057,30 @@ Boundary: - No current production claim: true - No starship claim: true - No physical production instructions: true + +## Move 133 — Org profile binds CONTROL v0.2.64 + +This public surface binds the CONTROL v0.2.64 closure authority. + +Authority: + +- CONTROL release: https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.64-antimatterium-control-move131-surface-closure +- Verify CI: https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29361021498 +- Main SHA: 29f697a9c6711b9338794fb4ccde24b90d0590f5 +- Closure ID: 0d825bba6e10b333ca0ce5d613b5c0c151a340d6ab4cc6ba485175545d44952e + +Surface release: + +- https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.73-antimatterium-org-profile-control-v0264-backlink + +Backlink ID: + +- 4cab00fb8e7aac50cc5f346fb458ff102b1b0a2dfc27626518efb3e0d5f124eb + +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 b9fd32b..4fa6acc 100644 --- a/package.json +++ b/package.json @@ -121,8 +121,10 @@ "verify:move129-control-v0262-backlink": "node scripts/verify-org-profile-move129-control-v0262-backlink.mjs", "test:move129-control-v0262-backlink": "node --test tests/org-profile-move129-control-v0262-backlink.test.mjs", "verify:move131-control-v0263-backlink": "node scripts/verify-org-profile-move131-control-v0263-backlink.mjs", - "test:move131-control-v0263-backlink": "node --test tests/org-profile-move131-control-v0263-backlink.test.mjs" + "test:move131-control-v0263-backlink": "node --test tests/org-profile-move131-control-v0263-backlink.test.mjs", + "verify:move133-control-v0264-backlink": "node scripts/verify-org-profile-move133-control-v0264-backlink.mjs", + "test:move133-control-v0264-backlink": "node --test tests/org-profile-move133-control-v0264-backlink.test.mjs" }, "type": "module", - "version": "0.0.72" + "version": "0.0.73" } diff --git a/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE133_CONTROL_V0264_BACKLINK.json b/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE133_CONTROL_V0264_BACKLINK.json new file mode 100644 index 0000000..84b747b --- /dev/null +++ b/public/receipts/ANTIMATTERIUM_ORG_PROFILE_MOVE133_CONTROL_V0264_BACKLINK.json @@ -0,0 +1,30 @@ +{ + "schema": "antimatterium.surface_control_backlink.v1", + "move": 123, + "surface": "org_profile", + "package": { + "version": "0.0.73", + "tag": "v0.0.73-antimatterium-org-profile-control-v0264-backlink", + "release": "https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.73-antimatterium-org-profile-control-v0264-backlink" + }, + "authority": { + "control_version": "0.2.64", + "control_tag": "v0.2.64-antimatterium-control-move131-surface-closure", + "control_release": "https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.64-antimatterium-control-move131-surface-closure", + "verify_ci_run": "https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29361021498", + "main_sha": "29f697a9c6711b9338794fb4ccde24b90d0590f5", + "closure_id": "0d825bba6e10b333ca0ce5d613b5c0c151a340d6ab4cc6ba485175545d44952e" + }, + "membership": { + "member_of_move133_surface_fanout": true, + "control_v0264_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": "4cab00fb8e7aac50cc5f346fb458ff102b1b0a2dfc27626518efb3e0d5f124eb" +} diff --git a/scripts/verify-org-profile-move133-control-v0264-backlink.mjs b/scripts/verify-org-profile-move133-control-v0264-backlink.mjs new file mode 100755 index 0000000..2ed3524 --- /dev/null +++ b/scripts/verify-org-profile-move133-control-v0264-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_MOVE133_CONTROL_V0264_BACKLINK.json", 'utf8') +); + +const expected = { + "schema": "antimatterium.surface_control_backlink.v1", + "move": 123, + "surface": "org_profile", + "packageVersion": "0.0.73", + "packageTag": "v0.0.73-antimatterium-org-profile-control-v0264-backlink", + "packageRelease": "https://github.com/ANTIMATTERIUM/.github/releases/tag/v0.0.73-antimatterium-org-profile-control-v0264-backlink", + "controlVersion": "0.2.64", + "controlTag": "v0.2.64-antimatterium-control-move131-surface-closure", + "controlRelease": "https://github.com/ANTIMATTERIUM/CONTROL/releases/tag/v0.2.64-antimatterium-control-move131-surface-closure", + "controlCi": "https://github.com/ANTIMATTERIUM/CONTROL/actions/runs/29361021498", + "controlSha": "29f697a9c6711b9338794fb4ccde24b90d0590f5", + "controlClosureId": "0d825bba6e10b333ca0ce5d613b5c0c151a340d6ab4cc6ba485175545d44952e", + "backlinkId": "4cab00fb8e7aac50cc5f346fb458ff102b1b0a2dfc27626518efb3e0d5f124eb" +}; +const outputPrefix = "ANTIMATTERIUM_ORG_PROFILE_MOVE133_CONTROL_V0264_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_move133_surface_fanout', receipt.membership?.member_of_move133_surface_fanout, true], + ['membership.control_v0264_release_bound', receipt.membership?.control_v0264_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( + 'MOVE133_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( + 'MOVE133_BACKLINK_ID_RECOMPUTE_FAILED expected ' + + receipt.backlink_id + + ', got ' + + recomputed + ); +} + +console.log(outputPrefix + '_VERIFY_PASS=true'); +console.log(outputPrefix + '_CONTROL_V0264_RELEASE_BOUND=true'); +console.log(outputPrefix + '_CONTROL_V0264_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-move133-control-v0264-backlink.test.mjs b/tests/org-profile-move133-control-v0264-backlink.test.mjs new file mode 100644 index 0000000..0802a86 --- /dev/null +++ b/tests/org-profile-move133-control-v0264-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 133 Org profile CONTROL v0.2.64 backlink verifier exits cleanly', () => { + const result = spawnSync( + 'npm', + ['run', "verify:move133-control-v0264-backlink"], + { encoding: 'utf8' } + ); + + assert.equal(result.status, 0, result.stderr || result.stdout); + + assert.match( + result.stdout, + new RegExp("ANTIMATTERIUM_ORG_PROFILE_MOVE133_CONTROL_V0264_BACKLINK_VERIFY_PASS=true") + ); + + assert.match( + result.stdout, + new RegExp("ANTIMATTERIUM_ORG_PROFILE_MOVE133_CONTROL_V0264_BACKLINK_ID=") + ); +});