Skip to content

rule(B-0743)+backlog: desktop admin consent pattern via biometric + small challenge ('I execute, you fingerprint') — new consent-first AI design pattern for admin permission on desktop instead of server#5006

Closed
AceHack wants to merge 1 commit into
mainfrom
rule/desktop-admin-consent-biometric-plus-nonce-b0743-aaron-2026-05-25
Closed

rule(B-0743)+backlog: desktop admin consent pattern via biometric + small challenge ('I execute, you fingerprint') — new consent-first AI design pattern for admin permission on desktop instead of server#5006
AceHack wants to merge 1 commit into
mainfrom
rule/desktop-admin-consent-biometric-plus-nonce-b0743-aaron-2026-05-25

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented May 25, 2026

Summary

Aaron 2026-05-25, after B-0737 zflash shipped + the full day's substrate cascade:

"hey we should save this interaction pattern about human permission excalation being on touch and the extra small challenge as new consent first ai design patterns for admin permisson on desktop instead of server."

Two artifacts in one PR — saving the interaction pattern as substrate so future AIs inherit it:

  1. New auto-loading rule at .claude/rules/desktop-admin-consent-via-biometric-plus-small-challenge-i-execute-you-fingerprint.md — future-Otto + Alexa + Riven + Vera + Lior + any future AI inherits the pattern at cold-boot
  2. B-0743 backlog row — generalization scope for applying the pattern to other desktop destructive ops

The pattern (4 composing elements)

  1. Hardware sanity rails (deterministic; agent CAN'T bypass) — B-0728 substrate
  2. Per-run random nonce + explicit-consent token in a SMALL challenge (yes <4-hex> = 8 chars)
  3. Biometric PAM at sudo / elevation time (Touch ID / Windows Hello / fprintd; system-level UI the agent CANNOT spoof)
  4. Provenance chain (B-0732 Layer 1; captures {tool, nonce, biometric-identity, side-effect})

Desktop vs server design space (rule documents the distinction)

Layer Server AI consent Desktop AI consent (THIS PATTERN)
Who's present No human at action time Human at keyboard/trackpad
Identity proof Machine identity (IAM/SPIFFE/OIDC) Human biometric (Touch ID/Hello/fprintd)
Consent timing Deploy time + policy time Action time + per-invocation
Bypass risk Stolen credentials → full access Stolen credentials → still need physical biometric

Most current AI-agent ecosystems use server-side patterns EVERYWHERE — including on the operator's desktop. That conflates the contexts. Desktop has physical-presence proof available, cheap, meaningful; using it changes the consent model fundamentally.

What CANNOT substitute for biometric (rule documents)

  • Sudoers NOPASSWD (removes all auth)
  • Stored password via Keychain (better than NOPASSWD; no physical-presence proof)
  • GUI password prompt (replay-able; biometric is Secure-Enclave one-shot)
  • Pre-shared secret in env var (agent has access)
  • MFA via phone push (cross-device latency; on-device biometric is lower-friction)

Generalization scope — candidate future Z-tools

Each independently shippable + inherits the pattern wholesale: zformat / zwipe / zrotate-creds / zinstall-cert / zsetup-ssh-key / zdb-migrate-prod / zsign-package / zelevate-network / zinstall-cluster (B-0742 composes) / zfork-zeta (B-0741 composes).

Operator UX consistency across all Z-prefixed desktop destructive tools:

$ z<tool>
[sanity output]
type: yes a3f9
> yes a3f9
[Touch ID / Windows Hello / fprintd prompt]
[ op proceeds ]

Composes with

  • B-0728 (destructive-tool authoring contract; foundation)
  • B-0737 (zflash Mac — empirical anchor; first instance of the pattern)
  • B-0738 / B-0739 (zflash Linux + Windows — cross-platform pattern coverage)
  • B-0732 (leverage-class safety substrate — provenance chain)
  • B-0664 (NCI HC-8 floor — operator authority preserved via biometric)
  • .claude/rules/dont-ask-permission.md (agent invokes within authority; biometric IS per-run permission grant)
  • .claude/rules/classifier-bypass-research-do-not-deploy-without-zeta-safer-floor.md (biometric INSTALLS safety; not a bypass)
  • .claude/rules/glass-halo-bidirectional.md (biometric prompts are system-level UI; visible to operator regardless of terminal)

Closing today's substrate cascade

Today's 2026-05-25 arc — B-0728 destructive-tool authoring contract → B-0743 design-pattern landing. The pattern surfaced operationally in B-0737 zflash; this PR names it as design-pattern substrate so future contributors inherit the discipline without re-discovering it.

Naming-expert review pending

If pattern goes public-surface (talk / blog post / industry presentation), Ilyana (per .claude/skills/naming-expert/SKILL.md) review applies. Current working names documented in the rule body.

Test plan

  • Rule auto-loads at cold-boot (new file in .claude/rules/; matches loading-taxonomy)
  • Rule cross-references all composing rules + backlog
  • B-0743 row has composes_with only B-NNNN row IDs; file paths in related_substrate:
  • BACKLOG.md regenerated
  • No code changes; substrate-engineering pattern-landing only
  • Substrate-honest framing in both rule + row (not perfect; documented trade-offs)
  • Empirical anchor (B-0737 zflash) explicitly cited as validation
  • Server-side AI consent pattern acknowledged as sibling design space (not competing claim)

🤖 Generated with Claude Code

…mall challenge ('I execute, you fingerprint') — new consent-first AI design pattern for admin permission on desktop instead of server

Aaron 2026-05-25, after B-0737 zflash shipped + cron-check:

'hey we should save this interaction pattern about human permission
excalation being on touch and the extra small challenge as new consent
first ai design patterns for admin permisson on desktop instead of
server.'

Lands two artifacts in one PR:

1. New auto-loading rule at .claude/rules/desktop-admin-consent-via-
   biometric-plus-small-challenge-i-execute-you-fingerprint.md that
   future-Otto + future-Alexa + future-Riven + future-Vera + future-Lior
   + any future AI inherits at cold-boot. Names the 4 composing
   elements (hardware sanity rails + per-run nonce + biometric PAM +
   provenance chain). Desktop-vs-server design-space distinction
   table. Documents what CANNOT substitute for biometric (NOPASSWD /
   stored password / GUI prompt / pre-shared secret / MFA-via-phone).
   Empirical anchor: B-0737 zflash.

2. B-0743 backlog row carves the generalization scope: applying the
   pattern to other desktop destructive ops via candidate future
   Z-tools (zformat / zwipe / zrotate-creds / zinstall-cert /
   zsetup-ssh-key / zdb-migrate-prod / zsign-package / zelevate-network
   / zinstall-cluster / zfork-zeta). Each candidate is independently
   shippable + inherits the pattern wholesale. 5 scope items: land
   rule (this PR) / public design-pattern doc (future) / common
   Z-tool framework (future) / cross-platform pattern coverage
   (composes with B-0738+B-0739) / pattern-adoption tracker.

The design-space distinction: server-side AI consent uses IAM / SPIFFE
/ OIDC / RBAC at DEPLOY time (no human present); desktop AI consent
uses biometric + small challenge at ACTION time (human at keyboard).
Most current AI-agent ecosystems use server-side patterns EVERYWHERE
including on operator's desktop — that conflates the contexts.
Desktop is where physical-presence proof is available + cheap +
meaningful; using it changes the consent model fundamentally.

P2 — design-pattern-shaped substrate; high reuse-leverage; rule landing
is immediate scope (this PR); broader generalization is future-shaped.

Naming-expert (Ilyana) review pending if pattern goes public-surface.

Closes today's substrate cascade arc (B-0728 destructive-tool contract
→ B-0743 design-pattern landing).

Co-Authored-By: Claude <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 25, 2026 22:10
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@AceHack AceHack enabled auto-merge (squash) May 25, 2026 22:10
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new .claude/rules/ rule and a corresponding P2 backlog row capturing a “desktop admin consent” interaction pattern (biometric elevation + small per-run challenge) and its intended generalization scope to future desktop-destructive tools.

Changes:

  • Added a new auto-loading rule documenting the biometric + short challenge consent pattern for desktop privileged/destructive operations.
  • Added backlog row B-0743 describing the pattern, its composition, and candidate future tools that should inherit it.
  • Updated docs/BACKLOG.md to include the new B-0743 entry.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
docs/backlog/P2/B-0743-desktop-admin-consent-pattern-biometric-plus-small-challenge-i-execute-you-fingerprint-rule-landing-plus-generalization-scope-aaron-2026-05-25.md New backlog row capturing the pattern + generalization scope; includes cross-references and a candidate-tool table.
docs/BACKLOG.md Regenerated index entry adding B-0743 under P2.
.claude/rules/desktop-admin-consent-via-biometric-plus-small-challenge-i-execute-you-fingerprint.md New rule describing the operational consent pattern and when/why it applies.

Comment on lines +21 to +22
- full-ai-cluster/tools/zflash.ts
- full-ai-cluster/tools/zflash-setup.ts
Comment on lines +53 to +57
Documents:
- The pattern + when it applies + when it doesn't
- Desktop vs server design-space distinction table
- Why each element matters (what biometric alone misses; what challenge alone misses)
- What CANNOT be substituted (NOPASSWD / stored password / GUI prompt / pre-shared secret / MFA-via-phone — each has trade-offs the rule documents)
Comment on lines +70 to +72
| Tool | Operation | Why biometric gates it |
|---|---|---|
| **zformat** | Format a disk / partition | Destroys data; biometric proves intent at format time |
Comment on lines +73 to +77
| Layer | Server AI consent pattern | Desktop AI consent pattern (THIS RULE) |
|---|---|---|
| **Who's present** | No human in the loop at action time | Human at the keyboard / trackpad |
| **Identity proof** | Machine identity (SPIFFE / OIDC tokens / IAM roles) | Human biometric (Touch ID / Windows Hello / fprintd) |
| **Consent timing** | Deploy time + policy-time (RBAC, sudoers, IAM policy) | Action time + per-invocation (biometric gate fires each run) |
AceHack pushed a commit that referenced this pull request May 25, 2026
…ef operator (not Aaron), soften B-0743 cross-ref to in-flight PR, correct multi-USB doc claim, defense-in-depth partition-path validation

P1 (description length): SKILL.md frontmatter description was ~360 chars; per B-0347 carved-sentence routing budget (<150 hard), shortened to ~110 chars while preserving the load-bearing routing signal (zflash + Touch ID + macOS + operator-only/agent-driven paths).

P1 (named-human attribution in skill prose): two 'Aaron' mentions replaced with role-refs ('the operator', 'the human maintainer') per the repo's naming convention for current-state skill files.

P1 (broken cross-reference): B-0743 rule file doesn't exist on main yet (lands via PR #5006, still open). Updated the cross-ref to name B-0743 + note 'in PR #5006' so the linked-file claim doesn't 404 readers landing on main between these two PRs merging.

P0 (incorrect docs): the multi-USB FAQ entry claimed the long-form 'forces explicit device choice' — incorrect; flash-usb.ts rejects 2+ USB candidates upstream of the consent prompt regardless of challenge format. Doc updated to name the actual escape hatch (manual sudo dd) when physical USB-isolation isn't possible.

P2 (defense-in-depth): added per-partition path validation before feeding partition identifiers to diskutilInfo. The identifier comes from diskutil's own plist (trusted), but matches the assertSafeDevicePath discipline applied to whole-disk candidates. Partition-aware regex (/^\/dev\/disk\d+s\d+$/) used since partition paths have the 's<N>' suffix.

Codex P0 + 5 Copilot threads addressed; 2 Copilot threads (double-pipe table) were FP per .claude/rules/blocked-green-ci-investigate-threads.md suspect-by-default class.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
AceHack added a commit that referenced this pull request May 25, 2026
…ent prompt + flash-cluster-iso skill (#5027)

* feat(zflash): show USB partition contents + vendor/serial before consent prompt + new flash-cluster-iso skill

Two improvements from the 2026-05-25 USB-flash session with the
human maintainer:

1. **flash-usb.ts pre-prompt display enrichment** — adds Vendor,
   IORegName, Serial, Writable, and Part. table fields to the
   device block; adds a new "Currently on /dev/diskN (will be
   DESTROYED)" section that iterates partitions and prints
   filesystem, volume name, mount point, and used-space per
   partition via `diskutil info -plist`. Operator's request:
   *"show me the usb device somehow and some stats abuout it
   and details before i fingerprint"* — the rails already showed
   device/model/size; this adds what's actually on the stick so
   the runner sees what they're about to destroy.

2. **.claude/skills/flash-cluster-iso/SKILL.md** — captures the
   end-to-end zflash flow as substrate so future agent cold-boots
   inherit it. Two paths documented: operator-only (zflash + yes
   <4-hex> + Touch ID), and agent-driven (expect drives the nonce
   echo; operator's Touch ID still gates the sudo dd as the
   physical-presence floor). Empirical anchor: this session's
   successful flash via the agent-driven expect script.

Composes with B-0737 (zflash + Touch ID PAM + short challenge),
B-0743 ("I execute, you fingerprint" desktop admin consent
pattern), B-0728 (destructive-tool authoring contract). Linux +
Windows extensions remain at B-0738 + B-0739.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(#5027): Copilot+Codex catches — shorten skill description, role-ref operator (not Aaron), soften B-0743 cross-ref to in-flight PR, correct multi-USB doc claim, defense-in-depth partition-path validation

P1 (description length): SKILL.md frontmatter description was ~360 chars; per B-0347 carved-sentence routing budget (<150 hard), shortened to ~110 chars while preserving the load-bearing routing signal (zflash + Touch ID + macOS + operator-only/agent-driven paths).

P1 (named-human attribution in skill prose): two 'Aaron' mentions replaced with role-refs ('the operator', 'the human maintainer') per the repo's naming convention for current-state skill files.

P1 (broken cross-reference): B-0743 rule file doesn't exist on main yet (lands via PR #5006, still open). Updated the cross-ref to name B-0743 + note 'in PR #5006' so the linked-file claim doesn't 404 readers landing on main between these two PRs merging.

P0 (incorrect docs): the multi-USB FAQ entry claimed the long-form 'forces explicit device choice' — incorrect; flash-usb.ts rejects 2+ USB candidates upstream of the consent prompt regardless of challenge format. Doc updated to name the actual escape hatch (manual sudo dd) when physical USB-isolation isn't possible.

P2 (defense-in-depth): added per-partition path validation before feeding partition identifiers to diskutilInfo. The identifier comes from diskutil's own plist (trusted), but matches the assertSafeDevicePath discipline applied to whole-disk candidates. Partition-aware regex (/^\/dev\/disk\d+s\d+$/) used since partition paths have the 's<N>' suffix.

Codex P0 + 5 Copilot threads addressed; 2 Copilot threads (double-pipe table) were FP per .claude/rules/blocked-green-ci-investigate-threads.md suspect-by-default class.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Lior <lior@zeta.dev>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@AceHack
Copy link
Copy Markdown
Member Author

AceHack commented May 26, 2026

Closing as substrate-stale (DIRTY-conflict) per .claude/rules/pr-triage-tiers.md Tier 3 + the discriminator pass below.

Discriminator pass:

  • Branch prefix: backlog/ or rule/ (past-Otto-CLI session work) → MINE (the maintainer's 2026-05-26 catch: "this is losing to yourself")
  • Substrate state: mergeStateStatus: DIRTY, mergeable: CONFLICTING — branch created 2026-05-25; main has moved ~30 commits since; rebase would need substantial conflict resolution
  • Substrate on main: this PR's B-number is NOT on main today (verified via git ls-tree origin/main -- docs/backlog/) — substrate is genuinely missing, not redundant

Disposition: close. The branch content is preserved in git history; re-land path is cherry-pick onto a fresh branch off current main with any ID-collision renumbering needed. This is the same Tier 3 disposition applied to today's #5038 + #5032 (same root cause: 2026-05-25 evening session left ~9 backlog/rule PRs DIRTY when the next morning's iter-5.x + iter-6 work landed and moved main forward).

This close is NOT a punt — it's explicit ownership classification per .claude/rules/fighting-past-self-vs-peer-agent-distinguisher-fix-your-own-coordinate-on-peers-dont-punt-by-default.md (recurrence anchor landed today via #5126). The substrate-honest re-land path is documented; the operator-tax of indeterminate DIRTY state is cleared.

@AceHack AceHack closed this May 26, 2026
auto-merge was automatically disabled May 26, 2026 08:07

Pull request was closed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants