From 410d5239cd0250bf73c6f3a0017a56d442848b79 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 17 Oct 2026 10:44:23 +0200 Subject: [PATCH] Make the mint-secret actor human (NK48-R1-F1) Kernel a45cf47 refuses effect mint unless the actor is human, so the agent descriptor could never be admitted. Regenerate the 1.2 candidate. Co-Authored-By: Claude Opus 5.5 Assistant: claude-code Assistant-Model: opus Assistant-Process: 1011674@bnt-lap001 Assistant-Session: b3b5b6f0-3bf5-41a3-8150-3ca4606cc028 --- sso-mfa/k8s/keycape/compose-1.2-descriptors.py | 2 +- .../keycape/descriptor-composition-1.2.candidate.json | 8 ++++---- sso-mfa/k8s/keycape/mint-secret-adapter.py | 2 +- sso-mfa/k8s/keycape/test_compose_1_2_descriptors.py | 4 ++-- sso-mfa/k8s/keycape/test_mint_secret_adapter.py | 2 +- workplans/NK-WP-0048-security-case-types.md | 11 +++++++++++ 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/sso-mfa/k8s/keycape/compose-1.2-descriptors.py b/sso-mfa/k8s/keycape/compose-1.2-descriptors.py index 8927d90..23d8b5b 100644 --- a/sso-mfa/k8s/keycape/compose-1.2-descriptors.py +++ b/sso-mfa/k8s/keycape/compose-1.2-descriptors.py @@ -47,7 +47,7 @@ ADAPTERS = { # the founder on 2026-10-17; the artifact records them as names_confirmed. NAMES_CONFIRMED = {'by': 'founder', 'on': '2026-10-17'} PROPOSED = { - # Actor 'agent' was decided by the founder on 2026-10-17; only the schema is open. + # Actor 'human' (founder, 2026-10-17): the kernel refuses agent mint; only the schema is open. 'mint-secret': {'task': 'NK-WP-0048-T25', 'schema': 'railiance-platform.custody-mint.v1'}, 'deliver-secret': {'task': 'NK-WP-0048-T26', 'lane': 'platform-secret-delivery', diff --git a/sso-mfa/k8s/keycape/descriptor-composition-1.2.candidate.json b/sso-mfa/k8s/keycape/descriptor-composition-1.2.candidate.json index 01cabf0..8b06bb8 100644 --- a/sso-mfa/k8s/keycape/descriptor-composition-1.2.candidate.json +++ b/sso-mfa/k8s/keycape/descriptor-composition-1.2.candidate.json @@ -14,7 +14,7 @@ "deliver-secret": "sha256:1e23b05058a61b3558070805329b6906f0ba9b989b98d9df35c621471a7c4938", "ensure-groups": "sha256:775dd71d7da43d16437dcdd9cba81ea6eef5803ab74e93c24d4994a764180135", "hand-over": "sha256:24d1ab891bfccaac1d691245d495ced2571d940d055c5e387076bb57dc68444e", - "mint-secret": "sha256:1fb462d930bae75e35a64bbdefded1e916613f2a630fdecf61885d0e542ea89b", + "mint-secret": "sha256:8c40c2884f8ba15e8cb6c98f33419c395e54fce8ef33d6e1a34782cf3f1fcfa9", "register-client": "sha256:3ccc8eed545cf31f8a48feb8afa0c1355e126d9549eef9737d92d0c1b87708a8" }, "owner_review": false, @@ -56,11 +56,11 @@ "type_owner": "net-kingdom" }, { - "candidate_descriptor_digest": "sha256:1fb462d930bae75e35a64bbdefded1e916613f2a630fdecf61885d0e542ea89b", + "candidate_descriptor_digest": "sha256:8c40c2884f8ba15e8cb6c98f33419c395e54fce8ef33d6e1a34782cf3f1fcfa9", "descriptor": { - "actor": "agent", + "actor": "human", "adapter": "net-kingdom/keycape-mint-secret@v1", - "adapter_source": "sha256:b9be1e421f17ae36a2da19699ea86a9368583f9e1f5f089c68a49e315f76bf5c", + "adapter_source": "sha256:9b292d259fa766a70970fa02ea29918e5feaf860d851688aaf80c72835c3fed8", "allowed_created": [ "custody-secret-version" ], diff --git a/sso-mfa/k8s/keycape/mint-secret-adapter.py b/sso-mfa/k8s/keycape/mint-secret-adapter.py index 0141f40..a6c7c19 100644 --- a/sso-mfa/k8s/keycape/mint-secret-adapter.py +++ b/sso-mfa/k8s/keycape/mint-secret-adapter.py @@ -32,7 +32,7 @@ def source_digest(): def descriptor(): return Descriptor('warden.case.execution.v1', 'mint-secret', 'railiance-platform', - REFERENCE, source_digest(), 'agent', 'keycape-client-secret-generate', + REFERENCE, source_digest(), 'human', 'keycape-client-secret-generate', 'client_id', 'mint', CREATED, False, ('parent-session', 'broker-grant')) diff --git a/sso-mfa/k8s/keycape/test_compose_1_2_descriptors.py b/sso-mfa/k8s/keycape/test_compose_1_2_descriptors.py index 6d83d59..776ffcd 100644 --- a/sso-mfa/k8s/keycape/test_compose_1_2_descriptors.py +++ b/sso-mfa/k8s/keycape/test_compose_1_2_descriptors.py @@ -98,7 +98,7 @@ class ComposeTests(unittest.TestCase): def test_current_adapters_do_not_compose(self): # Pins the present source findings; this test must change when they are fixed. doc = c.artifact(CHECKER, PARAMS) - # Complete in source since mint-secret's actor became 'agent'; still not an admission. + # Complete in source with mint-secret's actor 'human'; still not an admission. self.assertTrue(doc['complete_executable_descriptor_set']) self.assertEqual(len(doc['execution_descriptors']), 7) self.assertIsNone(doc['refusal']) @@ -106,7 +106,7 @@ class ComposeTests(unittest.TestCase): findings = {r['step']: r['findings'] for r in doc['steps']} self.assertEqual({s for s, f in findings.items() if f}, set()) mint = next(r for r in doc['steps'] if r['step'] == 'mint-secret') - self.assertEqual(mint['descriptor']['actor'], 'agent') + self.assertEqual(mint['descriptor']['actor'], 'human') hand_over = next(r for r in doc['steps'] if r['step'] == 'hand-over') self.assertEqual(hand_over['descriptor']['owner'], PARAMS['consumer_owner_repo']) self.assertNotIn('owner', hand_over['names_confirmed']) diff --git a/sso-mfa/k8s/keycape/test_mint_secret_adapter.py b/sso-mfa/k8s/keycape/test_mint_secret_adapter.py index f1bd664..6faa80f 100644 --- a/sso-mfa/k8s/keycape/test_mint_secret_adapter.py +++ b/sso-mfa/k8s/keycape/test_mint_secret_adapter.py @@ -30,7 +30,7 @@ class MintSecretTests(unittest.TestCase): desc = json.dumps(asdict(a.descriptor()), sort_keys=True, separators=(',', ':')).encode() pins = Pins(digest(self.case), digest(b'type'), digest(desc), digest(b'catalog'), digest(b'case-acceptance:test'), digest(b'run sheet')) - self.admitted = Invocation('mint-secret', 'railiance-platform', 'forgejo', 'agent', + self.admitted = Invocation('mint-secret', 'railiance-platform', 'forgejo', 'human', 'founder', 'keycape-client-secret-generate', pins) self.run = replace(self.admitted, attempt_id='attempt-one', operation='run') self.back = replace(self.admitted, attempt_id='attempt-one', operation='rollback') diff --git a/workplans/NK-WP-0048-security-case-types.md b/workplans/NK-WP-0048-security-case-types.md index 8aa69f2..85ca12d 100644 --- a/workplans/NK-WP-0048-security-case-types.md +++ b/workplans/NK-WP-0048-security-case-types.md @@ -1389,6 +1389,17 @@ as-is. The artifact records them as `names_confirmed` (by founder, 2026-10-17), and no step is still `owner_confirmation_required`. Next: independent source review of the seven adapters. +2026-10-17 founder decision (supersedes the `agent` decision below): the +mint-secret actor is `human`. Coordinator review r1 (the-custodian +`docs/changes/netkingdom-target-2026-10-17/nk48-adapters-1.2-review/coordinator-review-r1.json`, +finding NK48-R1-F1) showed that unchanged kernel a45cf47 refuses every +`effect: mint` admission whose actor is not `human` ("agent mint is +forbidden"), so the `agent` descriptor could never be admitted. Adapter, tests +and composer comment updated and the artifact regenerated (mint-secret +descriptor digest now `sha256:8c40c2884f8ba15e8cb6c98f33419c395e54fce8ef33d6e1a34782cf3f1fcfa9`); +98 tests pass against a45cf47. Open: no test yet runs `Executor.admit` on the +1.2 descriptors. The set needs an independent r2 review. + 2026-10-17 founder decision: the mint-secret actor is `agent`, not `warden`. The kernel is unchanged. The adapter, its test and the composer were updated and the artifact regenerated; all seven steps pass `Descriptor.decode` and