diff --git a/README.md b/README.md index 095e8531..3616d156 100644 --- a/README.md +++ b/README.md @@ -153,8 +153,8 @@ Legacy docs: - `AGIJobManager` provides the numeric `jobId`. - `ENSJobPages` provides the label prefix (`jobLabelPrefix`, default `agijob-`) and root suffix (`jobsRootName`, e.g. `alpha.jobs.agi.eth`). -- Effective ENS name format is: `.`. -- With current defaults, names are: +- Preview ENS name format is: `.` until a per-job authority snapshot is established; effective ENS names come from immutable per-job authority records. +- With current defaults, preview names are: - `agijob-0.alpha.jobs.agi.eth` - `agijob-1.alpha.jobs.agi.eth` - Prefix updates only affect jobs whose labels are not yet snapshotted. @@ -188,7 +188,7 @@ If you are also operating legacy `AGIJobManager` + `ENSJobPages`, use the separa 4. Only lock ENS/identity configuration after post-cutover validation. Expected result after legacy ENS cutover: -- New legacy-manager jobs use `.` (default `agijob...alpha.jobs.agi.eth`). +- New legacy-manager jobs preview as `.` (default `agijob-.alpha.jobs.agi.eth`) until authority is snapshotted/imported. - AGIJobManager lifecycle and settlement continue even if an ENS side-effect fails. - Legacy labels remain stable unless explicitly migrated/imported. diff --git a/docs/ENS/OBSERVED_MAINNET_STATE.md b/docs/ENS/OBSERVED_MAINNET_STATE.md index a343dbd8..3fcab4b9 100644 --- a/docs/ENS/OBSERVED_MAINNET_STATE.md +++ b/docs/ENS/OBSERVED_MAINNET_STATE.md @@ -1,6 +1,6 @@ # Observed Mainnet State -_As of 2026-03-22 UTC this sandbox could not reach Ethereum mainnet RPC (`ENETUNREACH`). This file therefore distinguishes proven local facts from chain facts that must be re-read using the included audit scripts from a networked operator workstation._ +_As of 2026-03-23 UTC this sandbox could not reach Ethereum mainnet RPC (latest `scripts/ens/audit-mainnet.ts` run returned `AggregateError`). This file therefore distinguishes proven local facts from chain facts that must be re-read using the included audit scripts from a networked operator workstation._ ## Proven locally @@ -73,7 +73,7 @@ _As of 2026-03-22 UTC this sandbox could not reach Ethereum mainnet RPC (`ENETUN ## Required operator action -Run both scripts below from a networked environment and commit the generated JSON artifacts before mainnet cutover decisions: +Run both scripts below from a networked environment and commit the generated JSON artifacts before mainnet cutover decisions. The checked-in `scripts/ens/output/audit-mainnet.json` from this sandbox run is explicitly non-authoritative because RPC was unreachable: - `node scripts/ens/audit-mainnet.ts` - `node scripts/ens/inventory-job-pages.ts` diff --git a/docs/ui/GENESIS_JOB_MAINNET_HTML_UI.md b/docs/ui/GENESIS_JOB_MAINNET_HTML_UI.md index 5813bb84..5d392b42 100644 --- a/docs/ui/GENESIS_JOB_MAINNET_HTML_UI.md +++ b/docs/ui/GENESIS_JOB_MAINNET_HTML_UI.md @@ -1,9 +1,9 @@ -# Standalone HTML UI: `agijobmanager_genesis_job_mainnet_2026-03-05-v21.html` +# Standalone HTML UI: `agijobmanager_genesis_job_mainnet_2026-03-05-v39.html` ## At-a-glance navigation - [Quick start (safe and practical)](#quick-start-safe-and-practical) -- [Embedded network and contract assumptions (v21)](#embedded-network-and-contract-assumptions-v21) +- [Embedded network and contract assumptions (v39)](#embedded-network-and-contract-assumptions-v39) - [Security and trust hygiene](#security-and-trust-hygiene) - [Troubleshooting (standalone page)](#troubleshooting-standalone-page) - [What this page does not replace](#what-this-page-does-not-replace) @@ -11,10 +11,10 @@ ## What this page is -`ui/agijobmanager_genesis_job_mainnet_2026-03-05-v21.html` is a **standalone, versioned HTML interface artifact** for AGIJobManager mainnet operations and demonstrations. +`ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html` is a **standalone, versioned HTML interface artifact** for AGIJobManagerPrime mainnet operations and demonstrations. Version/lifecycle posture: -- This file is a point-in-time artifact (`v21`) committed in-repo for reproducible browser-based operations and review. +- This file is a point-in-time artifact (`v39`) committed in-repo for reproducible browser-based operations and review. - It is intentionally additive to the broader/full UI effort (Next.js app in `ui/src/`, docs in [docs/ui/README.md](./README.md)). - It is not the deployment authority and not a replacement for Hardhat runbooks. @@ -48,9 +48,9 @@ Do not use it as a deployment source of truth: This page is a UI client for that ecosystem, not a deployment framework. -## Grounded capabilities in v21 +## Grounded capabilities in v39 -Based on the file contents, this standalone page includes: +Based on the file contents, this standalone page includes, including a preview-vs-authoritative ENS distinction that operators must read carefully: - Wallet connection and network state display. - Ethereum mainnet gating for write actions (`chainId 1` behavior). @@ -63,9 +63,9 @@ Based on the file contents, this standalone page includes: - `$AGIALPHA` bridge/conversion console (deBridge widget embedding plus `depositExact` flow into `AGIALPHAEqualMinterVault`). - Embedded Terms & Conditions section and in-page acceptance gating for write controls. -Grounding note: this list is based on visible controls, embedded ABIs, and in-page handlers in the `v21` file. +Grounding note: this list is based on visible controls, embedded ABIs, and in-page handlers in the `v39` file. -## Grounded page sections and expected outcomes (v21) +## Grounded page sections and expected outcomes (v39) | Section in page | What you do there | Expected result | | --- | --- | --- | @@ -75,7 +75,7 @@ Grounding note: this list is based on visible controls, embedded ABIs, and in-pa | AGIALPHA bridge/conversion area | Review bridged vs official balances, run approval, run vault conversion, optionally use embedded deBridge route. | Bridged token can be converted into official Ethereum `$AGIALPHA` (when wallet and vault state permit). | | Terms & Conditions area | Review and accept embedded terms. | Write controls remain intentionally locked until terms are accepted in-page. | -Inference boundary: this table describes visible UX and method wiring present in `v21`; it does not redefine protocol-level permissions. +Inference boundary: this table describes visible UX and method wiring present in `v39`; it does not redefine protocol-level permissions. ## Grounded non-goals (important) @@ -100,7 +100,7 @@ This section maps major UI actions to the contract methods surfaced in the file' If uncertain about exact callable semantics, confirm against contract docs/runbooks before signing. -## Write-capable transaction methods exposed in v21 +## Write-capable transaction methods exposed in v39 The standalone page includes handlers that can submit the following transactions (subject to role/state checks enforced by contracts): @@ -129,7 +129,7 @@ Primary: - Reviewers/auditors/demo participants validating end-to-end operator UX without running the full Next.js stack. Secondary: -- Developers comparing standalone snapshots (`v13` ... `v21`) during UI iteration. +- Developers comparing standalone snapshots (`v13` ... `v39`) during UI iteration. ## Quick start (safe and practical) @@ -143,7 +143,7 @@ python3 -m http.server 8000 Open: ```text -http://127.0.0.1:8000/agijobmanager_genesis_job_mainnet_2026-03-05-v21.html +http://127.0.0.1:8000/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html ``` (Direct `file://` open can work, but local HTTP is more reliable for wallet/provider behavior.) @@ -166,7 +166,7 @@ No local backend, indexer, or database is required for this standalone page. ### Open method Use either: -1. Direct file open (`file://.../ui/agijobmanager_genesis_job_mainnet_2026-03-05-v21.html`), or +1. Direct file open (`file://.../ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html`), or 2. Serve over HTTP from repository root. Recommended HTTP approach: @@ -179,7 +179,7 @@ python3 -m http.server 8000 Then open: ```text -http://localhost:8000/ui/agijobmanager_genesis_job_mainnet_2026-03-05-v21.html +http://localhost:8000/ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html ``` HTTP serving is generally safer for extension compatibility and future browser restrictions. @@ -195,7 +195,7 @@ HTTP serving is generally safer for extension compatibility and future browser r ### Minimal safe operating sequence 1. Open via local HTTP. -2. Confirm filename/path ends with `agijobmanager_genesis_job_mainnet_2026-03-05-v21.html`. +2. Confirm filename/path ends with `agijobmanager_genesis_job_mainnet_2026-03-05-v39.html`. 3. Connect wallet and confirm Ethereum Mainnet. 4. Confirm address panel values against deployment docs. 5. Accept terms in-page. @@ -237,12 +237,12 @@ Use this checklist before each write transaction: - **Read-only (no wallet):** You can view static sections and most dashboard content, but cannot submit on-chain transactions. - **Action-capable (wallet + mainnet + terms accepted):** Write buttons unlock and the page can submit contract transactions through your wallet. -Write-gate conditions in v21 are explicitly tied to: +Write-gate conditions in v39 are explicitly tied to: 1. wallet connection, 2. Ethereum mainnet (`chainId 1`), and 3. in-page terms acceptance checkbox. -## Embedded network and contract assumptions (v21) +## Embedded network and contract assumptions (v39) The page hardcodes the following addresses/constants in the script block: @@ -267,11 +267,11 @@ The broader UI is a separate Next.js surface that continues to evolve in paralle - Broader UI docs hub: [docs/ui/README.md](./README.md) - UI directory inventory (artifact + app): [ui/README.md](../../ui/README.md) -Use this `v21` runbook when you intentionally need a single-file, versioned browser interface. Use the broader UI docs when you need roadmap/development/testing context. +Use this `v39` runbook when you intentionally need a single-file, versioned browser interface. Use the broader UI docs when you need roadmap/development/testing context. ## Relationship to other UI artifacts in `ui/` -- `v21` is the documented standalone artifact for this runbook. +- `v39` is the documented standalone artifact for this runbook. - Other `agijobmanager_genesis_job_mainnet_2026-03-05-v*.html` files are adjacent snapshots for comparison/reproducibility. - The Next.js app in `ui/` remains the broader/full UI effort under active development. @@ -323,9 +323,11 @@ The page also surfaces ENS-oriented context (label/name/URI previews and ENS-loc Operationally, AGIJobManager settlement/dispute outcomes remain authoritative even when ENS side-effects fail. +Preview ENS values shown in the standalone page are projections from the current ENSJobPages root/prefix. Treat authoritative/effective ENS identity as established only after the contract-side authority snapshot exists and the audit/inventory tooling confirms it. + ## Status and lifecycle -- This file documents a **versioned standalone artifact**: `v21`. +- This file documents a **versioned standalone artifact**: `v39`. - It is intended as an additive, practical browser interface for current operator/reviewer workflows. - The broader/full UI effort is still in active development in `ui/` (Next.js surface) and tracked in [docs/ui/README.md](./README.md). - When operational guidance conflicts, treat deployment/operator docs and on-chain contract behavior as canonical. @@ -350,7 +352,7 @@ For full UI development and operations docs, use: ### Write buttons remain disabled -Typical causes in v21: +Typical causes in v39: - Wallet not connected. - Not on Ethereum Mainnet. - Terms not accepted in-page. diff --git a/scripts/ens/output/audit-mainnet.json b/scripts/ens/output/audit-mainnet.json index 8e41ffa0..07d65d0a 100644 --- a/scripts/ens/output/audit-mainnet.json +++ b/scripts/ens/output/audit-mainnet.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-03-23T01:21:30.822Z", + "generatedAt": "2026-03-23T02:50:11.389Z", "network": "ethereum-mainnet", "rpc": "https://ethereum-rpc.publicnode.com", "inputs": { diff --git a/ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html b/ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html index e1b8a74d..99779998 100644 --- a/ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html +++ b/ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html @@ -2971,10 +2971,10 @@

2) Create a Job (Employer)

Job label prefix Next job id Snapshot status - Effective label - Effective ENS name - Effective ENS URI - Effective node + Preview label + Preview ENS name + Preview ENS URI + Preview node ENSJobPages useEnsJobTokenURI AGIJobManager tokenURI modeowner-configurable, getter unavailable Config locked @@ -5468,7 +5468,7 @@

Contact & Legal

function useEnsUriPreview(){ const uri = (el("predictedEnsURI")?.textContent || "").trim(); if(!uri || uri === "—"){ setToast("No ENS URI preview available.", "warn"); return; } - navigator.clipboard.writeText(uri).then(()=>setToast("Effective ENS URI copied.", "ok")).catch(()=>setToast(uri, "ok")); + navigator.clipboard.writeText(uri).then(()=>setToast("ENS URI copied (preview or authoritative depending on snapshot status).", "ok")).catch(()=>setToast(uri, "ok")); } async function updateEnsJobPagePreview(){ try{ @@ -7677,7 +7677,7 @@

Contact & Legal

body:'You are about to call the public ENS lock path for a terminal job. This is best-effort and depends on the ENSJobPages configuration and terminal state.', facts:[ {label:'Job status', value: job ? classifyJobStatus(job) : 'Unknown'}, - {label:'Effective ENS name', value: currentLivePacket?.job?.id === jobId ? (currentLivePacket.job.ensName || '—') : (job ? ensLabelPreviewForJobId(jobId) : '—')}, + {label:'Preview ENS name', value: currentLivePacket?.job?.id === jobId ? (currentLivePacket.job.ensName || '—') : (job ? ensLabelPreviewForJobId(jobId) : '—')}, {label:'Burn fuses', value: 'false'}, {label:'Terminal requirement', value: 'Completed or expired only'} ], @@ -8340,8 +8340,8 @@

Contact & Legal

el('jobUriCards').innerHTML = [ ['Spec URI', safeLink(job.specURI)], ['Completion URI', job.completionURI ? safeLink(job.completionURI) : '—'], - ['Effective ENS URI', ens.ensUri ? safeLink(ens.ensUri) : '—'], - ['Effective ENS name', escapeHtml(ens.ensName || '—')] + ['ENS URI (preview or authoritative, see snapshot status)', ens.ensUri ? safeLink(ens.ensUri) : '—'], + ['ENS name (preview or authoritative, see snapshot status)', escapeHtml(ens.ensName || '—')] ].map(([k,v])=>`
${k}
${v}
`).join(''); el('jobEnsRecords').innerHTML = [ ['ENS root', escapeHtml(ens.rootName || '—')],