{"recipe":"headhunter-key","goal":"a headhunter is going to contact my beji about a role — set up what they'll be able to see, and get a key I can email them, capped and expiring, without touching a terminal","actor":"the twin's owner (one actor; their agent lays the scaffolding, then the owner only talks)","credential":"minting agent token for the owner-side setup; a key over the Owner audience for the conversation; the minted visitor key for the proof","ends_with":"a hands-free audience named for the recruiter exists on the twin with the role brief bundled in, and exactly one live key — capped at 12 messages, expiring in two weeks, handed back inside the conversation — opens that audience and nothing else","verified":true,"unverified_because":null,"verified_on":"intent-tortoise-280","verified_at":"2026-08-07T15:13:46.996Z","arc":{"red_before":{"ok":true,"excused":false,"detail":"check failed as required: twin 'recipe-hh-kr5evg' is not on the roster"},"green_after":{"ok":true,"excused":false,"detail":"key j577a1r196ebfmfy62j5ga7gp18c1js5 opens 'Nordlys Search' on 'recipe-hh-kr5evg': cap 12, expires 2026-08-21T15:12:00.000Z, hands-free, holdings = [The role brief for Nordlys Search], thread opens"},"red_after_cleanup":{"ok":true,"excused":false,"detail":"check failed as required: 0 live key(s) over 'Nordlys Search' (need exactly 1)"}},"steps":[{"n":1,"name":"register PoW challenge","status":"ok","method":"GET","path":"/beji/challenge","note":"20 bits"},{"n":2,"name":"register agent","status":"ok","method":"POST","path":"/beji/register","note":"balance 5"},{"n":3,"name":"stake","status":"ok","method":"POST","path":"/beji/stake","note":"balance 30"},{"n":4,"name":"signup beji","status":"ok","method":"POST","path":"/beji/signup","note":"1 audience, 2 exhibits, staked 25"},{"n":5,"name":"set inference credential","status":"ok","method":"POST","path":"/beji/inference","note":"model tencent/hy3"},{"n":6,"name":"mint the owner key","status":"ok","method":"POST","path":"/beji/me/beji/recipe-hh-kr5evg/keys","note":"the owner's conversational seat; quota 10"},{"n":7,"name":"open the owner thread","status":"ok","method":"POST","path":"convex dm:openThread","note":"credential: the owner key"},{"n":8,"name":"turn 1: set up what the headhunter will see","status":"ok","method":"POST","path":"convex dm:sendMessage","note":"create_audience + create_expo, by asking"},{"n":9,"name":"audience landed, hands-free, exhibit bundled","status":"ok","method":"GET","path":"/beji/me/beji/recipe-hh-kr5evg/exposes","note":"toolset [] — the wall held on the create side"},{"n":10,"name":"turn 2: mint the key, capped and expiring","status":"ok","method":"POST","path":"convex dm:sendMessage","note":"mint_key, by asking"},{"n":11,"name":"the token came back in conversation","status":"ok","method":null,"path":null,"note":"reply contains the roster row's exact token — no terminal needed"},{"n":12,"name":"turn 3: ask for a key into the Owner audience","status":"ok","method":"POST","path":"convex dm:sendMessage","note":"must be refused: Owner carries tools"},{"n":13,"name":"the wall held","status":"ok","method":"GET","path":"/beji/me/beji/recipe-hh-kr5evg/keys","note":"key rows unchanged (2); no such key came back, no key row appeared"},{"n":14,"name":"end state reached","status":"ok","method":null,"path":null,"note":"key j577a1r196ebfmfy62j5ga7gp18c1js5 opens 'Nordlys Search' on 'recipe-hh-kr5evg': cap 12, expires 2026-08-21T15:12:00.000Z, hands-free, holdings = [The role brief for Nordlys Search], thread opens"},{"n":15,"name":"cleanup","status":"ok","method":null,"path":null,"note":"7 reversal(s) through the doors that exist"},{"n":16,"name":"end state removed","status":"ok","method":null,"path":null,"note":"check failed as required: 0 live key(s) over 'Nordlys Search' (need exactly 1)"}],"ledger":{"created":[{"what":"agent 'recipe-hh-kr5evg'","reason":null},{"what":"beji 'recipe-hh-kr5evg' (https://intent-tortoise-280.convex.site/recipe-hh-kr5evg) with audience 'Owner' + 2 exhibits","reason":null},{"what":"access key 'Eirik (the owner) — this conversation' over 'Owner'","reason":null},{"what":"owner thread jd79xd2rest1yfb5pyrmt84rjs8c0jfh on 'recipe-hh-kr5evg'","reason":null},{"what":"audience 'Nordlys Search' + exhibit 'The role brief for Nordlys Search' (created by the resident, in conversation)","reason":null},{"what":"access key 'Marit Sølvberg — Nordlys Search' over 'Nordlys Search' (minted by the resident, in conversation)","reason":null},{"what":"visitor thread jd73ax2q2rbg4c1xyw9gh3ezrd8c1kg2 on 'recipe-hh-kr5evg' (opened by the end-state check)","reason":null}],"removed":[{"what":"key 'Eirik (the owner) — this conversation' over 'Owner' — revoked (dead; row remains)","reason":null},{"what":"key 'Marit Sølvberg — Nordlys Search' over 'Nordlys Search' — revoked (dead; row remains)","reason":null},{"what":"audience 'Owner' — unpublished to draft (row remains)","reason":null},{"what":"exhibit 'The brief — shareable with recruiters' — unpublished to draft (row remains)","reason":null},{"what":"exhibit 'Private notes — never for recruiters' — unpublished to draft (row remains)","reason":null},{"what":"audience 'Nordlys Search' — unpublished to draft (row remains)","reason":null},{"what":"exhibit 'The role brief for Nordlys Search' — unpublished to draft (row remains)","reason":null}],"remaining":[{"what":"agent 'recipe-hh-kr5evg' (+ its token_ledger rows)","reason":"no door deletes an agent"},{"what":"beji 'recipe-hh-kr5evg' with its exposes/expos (all drafted) and revoked key rows","reason":"no door deletes a beji, an expose, an expo, or a key row"},{"what":"dm threads + messages on 'recipe-hh-kr5evg'","reason":"no door deletes a thread"}]},"header_defects":{"missing":[],"withheld_as_secret":[]},"how_to_run":{"script":"challenges/recipes/recipe-headhunter-key.mjs","command":"node challenges/recipes/recipe-headhunter-key.mjs","trace":"challenges/recipes/recipe-headhunter-key.run.json","emit_trace":"node challenges/recipes/recipe-headhunter-key.mjs --out challenges/recipes/recipe-headhunter-key.run.json"},"before_you_run":{"executable_or_unpublished":"A recipe is a runnable script that proves itself by running. Nothing here is a hand-written account of a road; every field either comes from the recipe file or from its last committed run.","mutates_dev_only":"Recipes MUTATE. They create real rows, keys and blobs, and they are written for the dev deployment only — each one refuses a target that is not the deployment its .env.local names. Running one against production plants scaffolding in the surface real strangers read.","credential_required":"Every write in this house goes through an authority. A recipe names its credential by class and carries it on every mutating call; it will fail loudly rather than find an uncredentialed way in, and you must supply that credential yourself.","verified_means":"Verified means a committed run proved the end-state check red before the road, green after it, and red again after cleanup — read back through the audience’s own door. Unverified means no such run is on the shelf, or the last one did not close the arc."},"human_page":"https://beji.me/cookbook/headhunter-key","catalog":"https://beji.me/cookbook"}