Skip to content

Commit 1f6f4fb

Browse files
authored
Merge pull request #223 from MontrealAI/codex/create-mainnet-html-artifact-for-applicant-commit
ui: reinforce primary Participate commit flow and role CTA clarity
2 parents 367e60e + ddb4ba0 commit 1f6f4fb

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

ui/agijobmanager_genesis_job_mainnet_2026-04-03.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,27 +1777,27 @@ <h2>To Govern Their Own Kind</h2>
17771777
</div>
17781778
<div class="premiumFormulaRow" style="margin-top:10px"><span class="premiumFormulaPill">keccak256(abi.encodePacked(procurementId, applicant, applicationURI, salt))</span></div>
17791779
<div class="premiumQuickChips" style="margin-top:12px"><button class="btn" type="button" id="premiumParticipateGenerateSaltBtn">Generate secure salt</button><button class="btn" type="button" id="premiumActionGenerateApplicationCommitmentBtn">Recompute commitment</button><button class="btn" type="button" id="premiumParticipateSavePacketBtn">Save local packet</button><button class="btn" type="button" id="premiumParticipateDownloadPacketBtn">Download packet JSON</button><button class="btn" type="button" id="premiumParticipateImportPacketBtn">Import packet JSON</button></div>
1780-
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="applicantApproveStakeButton">Approve application stake</button><button class="btn btn-primary" type="button" id="applicantCommitApplicationButton">Commit application on-chain</button><button class="btn" type="button" id="applicantRevealApplicationButton">Reveal application on-chain</button><button class="btn" type="button" id="premiumParticipateOpenRevealModeBtn">Open reveal mode</button></div><div class="premiumLocalNote" id="applicantCommitBlockers" style="margin-top:10px">Blockers will appear here when commit is not ready.</div>
1780+
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="applicantApproveStakeButton">Approve application stake</button><button class="btn btn-primary" type="button" id="applicantCommitApplicationButton">Commit application on-chain</button><button class="btn" type="button" id="applicantRevealApplicationButton">Reveal application on-chain</button><button class="btn" type="button" id="premiumParticipateOpenRevealModeBtn">Open reveal mode</button></div><div class="premiumLocalNote" id="applicantCommitBlockers" style="margin-top:10px">Blockers will appear here when commit is not ready.</div><div class="premiumStickyCtaMobile" id="applicantMobileCommitBar" style="margin-top:12px"><button class="btn btn-primary" type="button" id="applicantCommitApplicationButtonSticky">Commit application on-chain</button><small style="display:block;margin-top:8px;color:var(--text-soft)">Mobile quick action mirrors the primary applicant CTA above.</small></div>
17811781
<div class="statusline" style="margin-top:12px"><b>Applicant result</b>: <span id="premiumActionResult">No participant action submitted yet.</span></div>
17821782
</div>
17831783

17841784
<div class="premiumStepCard" id="premiumFinalistRail" hidden>
17851785
<div class="premiumStepHeader"><div><h3>Finalist rail</h3><p class="premiumStepLead">Accept finalist slot before deadline, top up stake if needed, then submit trial URI.</p></div></div>
17861786
<div class="premiumField"><label for="premiumActionApplicationUriFinalist">Trial URI</label><input id="premiumActionApplicationUriFinalist" type="text" placeholder="ipfs://..."/></div>
1787-
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionAcceptFinalistBtn">Review accept finalist slot</button><button class="btn" type="button" id="premiumActionSubmitTrialBtn">Review submit finalist trial</button></div>
1787+
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionAcceptFinalistBtn">Accept finalist slot</button><button class="btn" type="button" id="premiumActionSubmitTrialBtn">Submit finalist trial</button></div>
17881788
</div>
17891789

17901790
<div class="premiumStepCard" id="premiumValidatorRail" hidden>
17911791
<div class="premiumStepHeader"><div><h3>Validator rail</h3><p class="premiumStepLead">Choose finalist from live list, commit score hash first, then reveal score + salt in reveal window.</p></div></div>
17921792
<div class="premiumInputGrid three"><div class="premiumField"><label for="premiumActionFinalist">Finalist</label><input id="premiumActionFinalist" type="text" placeholder="0x... or select below"></div><div class="premiumField"><label for="premiumActionScore">Score (0-100)</label><input id="premiumActionScore" type="number" min="0" max="100" step="1"></div><div class="premiumField"><label for="premiumActionCommitmentScore">Score commitment</label><input id="premiumActionCommitmentScore" type="text" placeholder="Generated locally" readonly></div></div>
17931793
<div id="premiumParticipateFinalistList" class="premiumLocalNote" style="margin-top:8px">Load procurement to show finalist addresses.</div>
17941794
<div class="premiumQuickChips" style="margin-top:12px"><button class="btn" type="button" id="premiumActionGenerateScoreCommitmentBtn">Generate score commitment</button><button class="btn" type="button" id="premiumParticipateGenerateScoreSaltBtn">Generate score salt</button></div>
1795-
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionCommitScoreBtn">Review commit validator score</button><button class="btn" type="button" id="premiumActionRevealScoreBtn">Review reveal validator score</button></div>
1795+
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionCommitScoreBtn">Commit validator score on-chain</button><button class="btn" type="button" id="premiumActionRevealScoreBtn">Reveal validator score on-chain</button></div>
17961796
</div>
17971797

17981798
<div class="premiumStepCard" id="premiumClaimantRail" hidden>
17991799
<div class="premiumStepHeader"><div><h3>Claimant rail</h3><p class="premiumStepLead">Claim available balance. Typical sources: returned application stake, finalist stake return, stipend, validator bond refund + reward, employer unused reserve.</p></div></div>
1800-
<div class="builderActions"><button class="btn" type="button" id="premiumParticipateClaimsRefreshBtn">Refresh claim posture</button><button class="btn btn-primary" type="button" id="premiumParticipateClaimBtn">Review claim balance</button></div>
1800+
<div class="builderActions"><button class="btn" type="button" id="premiumParticipateClaimsRefreshBtn">Refresh claim posture</button><button class="btn btn-primary" type="button" id="premiumParticipateClaimBtn">Claim AGIALPHA balance</button></div>
18011801
</div>
18021802

18031803
<details class="premiumStepCard" id="advancedLocalPacketArchive"><summary><b>Advanced local packet archive (secondary)</b></summary>
@@ -10912,6 +10912,8 @@ <h3>Operational readiness</h3>
1091210912
document.querySelectorAll('.premiumRoleChip').forEach(btn=>btn.classList.toggle('active', btn.dataset.premiumRole===role));
1091310913
const map={applicant:'participateApplicantPanel',finalist:'premiumFinalistRail',validator:'premiumValidatorRail',claimant:'premiumClaimantRail'};
1091410914
Object.entries(map).forEach(([k,id])=>{ const el=$(id); if(el) el.hidden = k!==role; });
10915+
const mobileBar = $('applicantMobileCommitBar');
10916+
if(mobileBar) mobileBar.hidden = role!=='applicant';
1091510917
}
1091610918
async function refreshParticipate(){
1091710919
const pid=String($('premiumParticipateProcurementId')?.value||'').trim();
@@ -10962,6 +10964,7 @@ <h3>Operational readiness</h3>
1096210964
applicantCommitReadiness = {ready:blockers.length===0, blockers, requiredStake, reputation:rep, minReputation:proc.minReputation||0};
1096310965
if($('applicantCommitBlockers')) $('applicantCommitBlockers').innerHTML = blockers.length ? `<b>Commit blockers</b><ul>${blockers.map(b=>`<li>${escapeHtml(b)}</li>`).join('')}</ul>` : 'Ready for on-chain commitApplication write.';
1096410966
if($('applicantCommitApplicationButton')) $('applicantCommitApplicationButton').disabled = blockers.length>0;
10967+
if($('applicantCommitApplicationButtonSticky')) $('applicantCommitApplicationButtonSticky').disabled = blockers.length>0;
1096510968
if($('applicantApproveStakeButton')) $('applicantApproveStakeButton').disabled = !(requiredStake>0n && state.allowanceShortfall && !!userAccount && !!isMainnet);
1096610969
if($('premiumParticipateAllowance')) $('premiumParticipateAllowance').textContent = `Applicant stake ${fmtUnits(proc.applicationStake||0)} · allowance ${fmtUnits(allowanceState.allowance||0)} · balance ${fmtUnits(allowanceState.balance||0)}`;
1096710970
const finalists = await agiJobDiscovery.methods.procurementFinalists(pid).call().catch(()=>[]);
@@ -11029,6 +11032,7 @@ <h3>Operational readiness</h3>
1102911032
const inspectorButtons=[['premiumInspectorAdvanceBtn','advanceProcurement(procurementId)','Review advanceProcurement',pid=>agiJobDiscovery.methods.advanceProcurement(pid)],['premiumInspectorFinalizeShortlistBtn','finalizeShortlist(procurementId)','Review finalizeShortlist',pid=>agiJobDiscovery.methods.finalizeShortlist(pid)],['premiumInspectorFinalizeWinnerBtn','finalizeWinner(procurementId)','Review finalizeWinner',pid=>agiJobDiscovery.methods.finalizeWinner(pid)],['premiumInspectorFallbackBtn','promoteFallbackFinalist(procurementId)','Review promoteFallbackFinalist',pid=>agiJobDiscovery.methods.promoteFallbackFinalist(pid)],['premiumInspectorCancelBtn','cancelProcurement(procurementId)','Review cancelProcurement',pid=>agiJobDiscovery.methods.cancelProcurement(pid)]];
1103011033
inspectorButtons.forEach(([id,method,title,buildMethod])=>$(id)?.addEventListener('click', ()=>{ const pid=String($('premiumInspectorProcurementId')?.value||'').trim(); if(!pid) return setToast('Enter a procurement id first.','warn'); reviewDiscoveryWrite({title, method, facts:[{label:'Procurement id', value:pid}], txBuilder:()=>buildMethod(pid), run:async()=>{ await runTrackedTx(title, ()=>buildMethod(pid).send({from:userAccount}), {pendingDetail:`Submitting ${method}.`, successDetail:`${method} confirmed.`}); if($('premiumInspectorResult')) $('premiumInspectorResult').textContent=`${method} confirmed for procurement ${pid}.`; await loadProcurement(pid); await loadClaims(); }}).catch(e=>setToast(e.message||String(e),'bad')); }));
1103111034
$('applicantCommitApplicationButton')?.addEventListener('click', ()=>openApplicantCommitReview());
11035+
$('applicantCommitApplicationButtonSticky')?.addEventListener('click', ()=>openApplicantCommitReview());
1103211036
$('applicantRevealApplicationButton')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.salt||!x.uri) return setToast('Enter procurement id, salt, and application URI.','warn'); reviewDiscoveryWrite({title:'Review reveal application', method:'revealApplication(procurementId,subdomain,proof,salt,applicationURI)', facts:[{label:'Procurement id',value:x.pid},{label:'Connected wallet',value:userAccount||'—'},{label:'Application URI',value:x.uri},{label:'Salt',value:x.salt},{label:'Reveal meaning',value:'This reveals the URI and proves it matches your prior commitment hash.'}], txBuilder:()=>agiJobDiscovery.methods.revealApplication(x.pid, x.subdomain, x.proof, x.salt, x.uri), run:async()=>{ const receipt=await runTrackedTx('revealApplication', ()=>agiJobDiscovery.methods.revealApplication(x.pid, x.subdomain, x.proof, x.salt, x.uri).send({from:userAccount}), {pendingDetail:'Revealing application.', successDetail:'Application reveal confirmed.'}); $('premiumActionResult').textContent=`revealApplication confirmed for procurement ${x.pid}.`; if(receipt?.events?.ApplicationRevealed || Object.values(receipt?.events||{}).find(e=>e?.event==='ApplicationRevealed')){ if($('premiumParticipatePacketState')) $('premiumParticipatePacketState').textContent='On-chain revealed'; if($('premiumParticipatePacketMeta')) $('premiumParticipatePacketMeta').textContent='Reveal confirmed on-chain.'; } }}).catch(e=>setToast(e.message||String(e),'bad')); });
1103311037
$('premiumActionAcceptFinalistBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid) return setToast('Enter procurement id.','warn'); reviewDiscoveryWrite({title:'Review acceptFinalist', method:'acceptFinalist(procurementId)', facts:[{label:'Procurement id',value:x.pid}], txBuilder:()=>agiJobDiscovery.methods.acceptFinalist(x.pid), run:async()=>{ await runTrackedTx('acceptFinalist', ()=>agiJobDiscovery.methods.acceptFinalist(x.pid).send({from:userAccount}), {pendingDetail:'Accepting finalist slot.', successDetail:'Finalist acceptance confirmed.'}); $('premiumActionResult').textContent=`acceptFinalist confirmed for procurement ${x.pid}.`; }}).catch(e=>setToast(e.message||String(e),'bad')); });
1103411038
$('premiumActionSubmitTrialBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.uri) return setToast('Enter procurement id and trial URI.','warn'); reviewDiscoveryWrite({title:'Review submitTrial', method:'submitTrial(procurementId,trialURI)', facts:[{label:'Procurement id',value:x.pid},{label:'Trial URI',value:x.uri}], txBuilder:()=>agiJobDiscovery.methods.submitTrial(x.pid, x.uri), run:async()=>{ await runTrackedTx('submitTrial', ()=>agiJobDiscovery.methods.submitTrial(x.pid, x.uri).send({from:userAccount}), {pendingDetail:'Submitting finalist trial.', successDetail:'Finalist trial confirmed.'}); $('premiumActionResult').textContent=`submitTrial confirmed for procurement ${x.pid}.`; }}).catch(e=>setToast(e.message||String(e),'bad')); });

0 commit comments

Comments
 (0)