Skip to content

feat(B-0792 iter-5.2.1): auto-generate node-<6hex> hostname default — operator can rename later via digital-twin (Aaron 2026-05-26)#5107

Merged
AceHack merged 2 commits into
mainfrom
otto-cli/iter521-auto-generated-hostname-default-digital-twin-renamable-2026-05-26
May 26, 2026
Merged

feat(B-0792 iter-5.2.1): auto-generate node-<6hex> hostname default — operator can rename later via digital-twin (Aaron 2026-05-26)#5107
AceHack merged 2 commits into
mainfrom
otto-cli/iter521-auto-generated-hostname-default-digital-twin-renamable-2026-05-26

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented May 26, 2026

Composes iter-5.2 --host mechanism with B-0794 digital-twin substrate. Zero-typing default when --host omitted: generate node-<6hex> via Web Crypto (24-bit entropy, ~16M names, negligible collision). Operator-named hosts take priority. Logged clearly pre-flash. Aaron 2026-05-26: 'can we have it auto generate the host name we can change later via digital twin after it self registers.'

…st not specified — operator can rename later via digital-twin substrate (Aaron 2026-05-26)

The maintainer 2026-05-26 architectural framing:

> "can we have it auto generate the host name we can change
> later via digital twin after it self registers"

Composes iter-5.2 (--host injection mechanism) with B-0794
(node self-registration / digital-twin substrate). Zero-typing
default for operators who don't want to think about names at
flash time; rename later via editing the digital-twin
node-config YAML once self-registration substrate (B-0794)
ships.

Implementation: when operator runs `zflash` without --host
flag, generate `node-<6hex>` from 3 random bytes (Web Crypto
getRandomValues). 24-bit entropy = ~16M possible names →
negligible collision risk for any homelab cluster size +
mDNS uniqueness preserved per-node.

Operator-named hostnames (via --host) take priority; auto-gen
only fires when --host omitted AND --no-inject NOT set (no ESP
write to carry the name anyway in --no-inject path). Generated
name logged CLEARLY pre-flash so operator knows what to ssh to
post-install:

  iter-5.2.1: --host not specified; auto-generated hostname:
              node-a3f9c2
              (rename later via digital-twin substrate per
               B-0794)
              cluster will be reachable as:
              ssh zeta@node-a3f9c2.local

Composes with iter-5.1+5.2 (#5103 merged at 6ee3a29) + B-0794
self-registration target. Future iter-5.4+ can extend the
auto-gen with memorable-name dictionaries (pokemon, gemstones,
fruits, etc.) once the framework is empirically validated.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 26, 2026 05:52
@AceHack AceHack enabled auto-merge (squash) May 26, 2026 05:52
@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.

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 zero-typing default hostname for zflash when --host is omitted, generating a random node-<6hex> name and printing it pre-flash so the operator can SSH in post-install (with the intent to allow later renames via the digital-twin workflow).

Changes:

  • Auto-generate node-<6hex> hostname via Web Crypto when --host is not provided (and --no-inject is not set).
  • Print a clear pre-flash message showing the generated hostname and an example ssh zeta@<host>.local target.

Comment thread full-ai-cluster/tools/zflash.ts Outdated
Comment thread full-ai-cluster/tools/zflash.ts Outdated
…h to unimplemented B-0794 substrate (Copilot P0 + P1 on #5107)

- P0 race: auto-gen was running BEFORE pubkey-existence check that
  sets willInject=false. If pubkey missing, willInject becomes
  false but auto-gen already happened + already printed
  "ssh zeta@node-XXXXXX.local" — misleading the operator since
  the hostname never gets written to the USB ESP. Move auto-gen
  AFTER willInject finalized + gate on willInject (was: gate on
  !noInject which doesn't account for missing-pubkey path).
- P1 misleading path: comment referenced
  `maintainers/<name>/cluster-nodes/<node>/` which doesn't exist
  yet (B-0794 substrate not implemented; current
  maintainers/aaron/ only has legal-entities/). Reword to point
  at B-0794 backlog row instead of a concrete-but-fictional path.
  Same reword in the printed operator-facing line.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
auto-merge was automatically disabled May 26, 2026 06:00

Pull Request is not mergeable

@AceHack AceHack enabled auto-merge (squash) May 26, 2026 06:00
@AceHack AceHack merged commit f96ccec into main May 26, 2026
32 checks passed
@AceHack AceHack deleted the otto-cli/iter521-auto-generated-hostname-default-digital-twin-renamable-2026-05-26 branch May 26, 2026 06:03
AceHack added a commit that referenced this pull request May 26, 2026
…evice-registration substrate; production bootstrap-key-rotation deferred (informs B-0794 iter-5.4) (#5108)

* preserve(mika): Aaron + Mika 2026-05-26 homelab-first gh-auth-login device-registration; production-mode bootstrap-key-rotation deferred

Verbatim preservation of Aaron + Mika voice-mode conversation
during iter-5 session. Mika is external Grok-native AI participant
per .claude/rules/agent-roster-reference-card.md; co-originator
of substantive substrate-engineering input.

Architectural lock-in (Aaron 2026-05-26 final decision):

- HOMELAB MODE FIRST: USB ships with NO embedded credentials;
  first boot prompts `gh auth login` interactively; operator's
  GitHub credentials register the machine + clone + set up
  cluster under operator's account; auto-copies operator's
  pubkey to authorized_keys. Zero shipped secrets.

- PRODUCTION MODE LATER: ship USB with narrow restricted
  "bootstrap key" / "registration key" with register-only scope;
  immediately rotates to per-node identity after first
  registration succeeds.

Two modes use DIFFERENT USBs (different flakes). Aaron:
"different USBs for different audiences. But home lab is
what I'm going for first, not production."

Aaron standing direction for next iteration:
"we should do it like this for gh and device registration
the simple homelab way first but like prod later"

THIS conversation directly informs B-0794 iter-5.4
implementation. Composes with PR #5103 (iter-5.1+5.2 substrate)
+ PR #5107 (iter-5.2.1 auto-hostname) + B-0792/B-0793/B-0794
backlog rows landed today.

Per .claude/rules/substrate-or-it-didnt-happen.md verbatim
preservation discipline.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore(memory): regen MEMORY.md to include Mika 2026-05-26 homelab-gh-auth-login preservation file

* fix(mika preservation): add YAML frontmatter per memory format standard + reconcile 'MERGED' wording with rows' actual status: open state (Copilot P1 ×2 on #5108)

---------

Co-authored-by: Lior <lior@zeta.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request May 26, 2026
… + rows_filed_24h (Aaron 2026-05-26 — "per agent so we can see helath like per trajectory") (#5115)

Aaron 2026-05-26 substrate-engineering concern:

> 'we need to make sure that decopose is happening an on going
> backlog log or else infinate backlog is just infnate debt'

> 'the decompose to action is what i want background to show
> with stats over time on the github page we have for plant
> metrics that and also prs, i want that per agent so we can
> see helath like per trajectory'

Extends tools/dashboard/generate-metrics.ts to surface per-agent
PR-shipping rate + decompose-to-action ratio in demo/metrics.json
(consumed by the Zeta Factory Dashboard at
lucent-financial-group.github.io/Zeta/demo/index.html).

Three new per-agent fields:

  prs_merged_24h           — PRs this agent merged in 24h window
  rows_filed_24h           — PRs whose title matches `backlog(B-NNNN`
                             (row-filing-only PRs, NOT action-on-rows)
  decompose_to_action_ratio — (prs_merged - rows_filed) / max(rows_filed, 1)
                             → impl-PRs per row-filing-PR
                             → >=1 = strong action-on-rows discipline
                             → <1  = filing rows faster than shipping
                                     them = debt-accumulation signal

Attribution via branch-prefix lookup (BRANCH_PREFIX_TO_AGENT) per
.claude/rules/agent-roster-reference-card.md lane discipline:
otto-cli/ + otto-desktop/ + otto-vscode/ + otto/ → Otto;
alexa-kiro/ + alexa/ → Alexa; riven-cursor/ + riven/ → Riven;
vera-codex/ + vera/ → Vera; lior-antigravity/ + lior-gemini/ +
lior/ → Lior. PRs from non-prefixed branches attribute to 'Unknown'
bucket (operator-auditable as missing-attribution surface).

EMPIRICAL validation 2026-05-26 (live run):

  Otto:  57 PRs / 30 row-filing → ratio = 0.9 (nearly 1:1; debt signal!)
  Lior:   6 PRs / 0 row-filing  → ratio = 6   (all action)
  Others: 0/0/0 (quiet 24h window)

Otto ratio 0.9 EMPIRICALLY VALIDATES Aaron's concern — this
session filed 6 substantive rows (B-0791..B-0794, B-0796, B-0797)
+ shipped 4 implementation PRs (#5103 iter-5.1+5.2, #5107 iter-5.2.1,
#5113 iter-5.2.2, #5110 draft) — ratio < 1. The metric now exposes
the pattern continuously.

Dashboard HTML render of these new fields is follow-on substrate
(small UI work). The data layer is the load-bearing first step;
operator + Mika can read demo/metrics.json directly until UI lands.

Substrate-honest note: the dashboard generation itself happens on
the autonomous-loop cron tick (per B-0414); per-agent stats will
update on every tick going forward. Time-series tracking (today's
metric vs 7d-ago, 30d-ago) is separate substrate (would need to
preserve historical metrics.json snapshots; deferred to follow-on
iteration).

Composes with .claude/rules/agent-roster-reference-card.md
(branch-prefix attribution), .claude/rules/holding-without-named-
dependency-is-standing-by-failure.md (decompose-to-action discipline),
B-0797 (autonomous-loop sometimes-task; same substrate-engineering
direction).

Co-authored-by: Lior <lior@zeta.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
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