Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: `<prefix><jobId>.<jobsRootName>`.
- With current defaults, names are:
- Preview ENS name format is: `<prefix><jobId>.<jobsRootName>` 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.
Expand Down Expand Up @@ -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 `<prefix><jobId>.<jobsRootName>` (default `agijob...alpha.jobs.agi.eth`).
- New legacy-manager jobs preview as `<prefix><jobId>.<jobsRootName>` (default `agijob-<jobId>.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.

Expand Down
4 changes: 2 additions & 2 deletions docs/ENS/OBSERVED_MAINNET_STATE.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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`
44 changes: 23 additions & 21 deletions docs/ui/GENESIS_JOB_MAINNET_HTML_UI.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# 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)
- [Standalone artifact inventory](./STANDALONE_HTML_UIS.md)

## 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.

Expand Down Expand Up @@ -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).
Expand All @@ -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 |
| --- | --- | --- |
Expand All @@ -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)

Expand All @@ -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):

Expand Down Expand Up @@ -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)

Expand All @@ -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.)
Expand All @@ -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:
Expand All @@ -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.
Expand All @@ -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.
Expand Down Expand Up @@ -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:

Expand All @@ -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.

Expand Down Expand Up @@ -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.
Expand All @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion scripts/ens/output/audit-mainnet.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
16 changes: 8 additions & 8 deletions ui/agijobmanager_genesis_job_mainnet_2026-03-05-v39.html
Original file line number Diff line number Diff line change
Expand Up @@ -2971,10 +2971,10 @@ <h2 style="margin:0 0 12px">2) Create a Job (Employer)</h2>
<tr><td>Job label prefix</td><td><span id="ensJobLabelPrefixPreview">—</span></td></tr>
<tr><td>Next job id</td><td><span id="ensNextJobId">—</span></td></tr>
<tr><td>Snapshot status</td><td><span id="ensSnapshotStatus">—</span></td></tr>
<tr><td>Effective label</td><td><span id="predictedJobLabel">—</span></td></tr>
<tr><td>Effective ENS name</td><td><span id="predictedEnsName">—</span></td></tr>
<tr><td>Effective ENS URI</td><td><span id="predictedEnsURI">—</span></td></tr>
<tr><td>Effective node</td><td><span id="predictedEnsNode">—</span></td></tr>
<tr><td>Preview label</td><td><span id="predictedJobLabel">—</span></td></tr>
<tr><td>Preview ENS name</td><td><span id="predictedEnsName">—</span></td></tr>
<tr><td>Preview ENS URI</td><td><span id="predictedEnsURI">—</span></td></tr>
<tr><td>Preview node</td><td><span id="predictedEnsNode">—</span></td></tr>
<tr><td>ENSJobPages useEnsJobTokenURI</td><td><span id="ensTokenUriMode">—</span></td></tr>
<tr><td>AGIJobManager tokenURI mode</td><td><span id="managerTokenUriMode">owner-configurable, getter unavailable</span></td></tr>
<tr><td>Config locked</td><td><span id="ensConfigLocked">—</span></td></tr>
Expand Down Expand Up @@ -5468,7 +5468,7 @@ <h2 style="margin:0 0 10px">Contact & Legal</h2>
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{
Expand Down Expand Up @@ -7677,7 +7677,7 @@ <h2 style="margin:0 0 10px">Contact & Legal</h2>
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) : '—')},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore effective ENS labeling in the lock dialog

For terminal jobs, this dialog usually shows currentLivePacket.job.ensName, which comes from fetchEnsVisibility() via ENSJobPages.jobEnsName(). In the checked contract path (contracts/ens/ENSJobPages.sol::_createJobPage), authority is established at create time, so completed/expired jobs normally have an effective name already. Relabeling that field to "Preview ENS name" reintroduces the exact ambiguity this patch is trying to remove right before the operator signs lockJobENS(...).

Useful? React with 👍 / 👎.

{label:'Burn fuses', value: 'false'},
{label:'Terminal requirement', value: 'Completed or expired only'}
],
Expand Down Expand Up @@ -8340,8 +8340,8 @@ <h2 style="margin:0 0 10px">Contact & Legal</h2>
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 || '—')]
Comment on lines +8343 to +8344

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Render snapshot state next to the job-detail ENS fields

These labels now tell the reader to "see snapshot status", but the job-detail modal does not render any snapshot indicator and fetchEnsVisibility() only loads the compatibility getters (jobEnsName/jobEnsURI/jobEnsNode), not whether authority is established. In the exact cutover/debug workflow this patch targets, operators still cannot tell whether the displayed name/URI is mutable preview data or authoritative state.

Useful? React with 👍 / 👎.

].map(([k,v])=>`<div class="ensRecord"><div class="k">${k}</div><div class="v">${v}</div></div>`).join('');
el('jobEnsRecords').innerHTML = [
['ENS root', escapeHtml(ens.rootName || '—')],
Expand Down
Loading