Skip to content

docs: replace inline GenLayer guide with pointer to genlayer-dev plugin#8

Closed
acastellana wants to merge 110 commits into
mainfrom
docs/remove-genlayer-guide-duplicate
Closed

docs: replace inline GenLayer guide with pointer to genlayer-dev plugin#8
acastellana wants to merge 110 commits into
mainfrom
docs/remove-genlayer-guide-duplicate

Conversation

@acastellana

Copy link
Copy Markdown
Collaborator

Summary

The docs/GENLAYER_GUIDE.md (1,286 lines) was a manually maintained copy of GenLayer developer reference that duplicates content from the official genlayer-dev Claude Code plugin.

Change

Replace the full inline copy with a short pointer file (~40 lines) that links to the canonical source.

Before: 1,286 lines of manually maintained GenLayer docs
After: Pointer to the authoritative plugin with skill index, install command, and key URLs

Why

  • Eliminates maintenance burden — the guide was already drifting from the real CLI/SDK
  • Developers get always-up-to-date information from the source
  • The genlayer-dev plugin is the right place for this content (it's also what Claude Code agents use)

rasca and others added 30 commits February 8, 2026 17:06
- Add GenLayer intelligent contract test infrastructure (pytest)
- Add GitHub Actions CI pipeline for contracts and frontend
- Create project structure: contracts/, frontend/, bridge/, docs/
- Add .gitignore for Python, Node, and IDE files
- Include project documentation (CLAUDE.md, PROJECT.md, ARCHITECTURE.md)
- Include research docs (IDEA.md, REPO_ANALYSIS.md, GENLAYER_GUIDE.md, etc.)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- MoltCourt.py intelligent contract with three-key dispute resolution
- 62 contract tests passing (genlayer-test)
- Next.js frontend with homepage, case browser, case detail, create form
- 20 frontend tests passing (vitest)
- GitHub Actions CI/CD pipeline
- SKILL.md and HEARTBEAT.md for agent discovery
- Full documentation suite (10+ docs)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace all mock data with GenLayer JSON-RPC client
- Redesign landing page: punchy hero, Statement/Guidelines/Evidence section
- Remove "For Agents" section and all escrow references
- Add /docs page with full platform documentation
- Add /changelog page starting at v0.1.0
- Add /api/heartbeat endpoint
- Create SKILL.md for agent discovery (curl https://moltcourt.ai/skill.md)
- Add contract address tracking via localStorage
- Cases page shows creator/counterparty labels, pending acceptance section
- Case detail routes by contract address, copy-to-clipboard addresses

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Redesign homepage timeline: merge jury+verdict, add evidence examples
- GSAP ScrollTrigger animations for scroll-based reveals
- HeroToggle: argue.fun style with numbered steps, min-width
- Latest Cases section fetching from GenLayer API
- Fix logo/header display (unoptimized Image prop)
- Create skill.md + genlayer.md agent documentation
- Add contract headers (v0.1.0, py-genlayer:latest)
- Fix str→Address conversion for studionet deployment
- MoltCourtFactory contract + full test suite (175 tests)
- Integration test script + wallets for studionet
- Timing research doc (min dispute period, resolution timeout)
- Visual fixes: disputed pill opacity, box heights, text alignment
- Simplified verdict UI, resolve() fix, genlayer.md rewrite

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace useState+useEffect with useSyncExternalStore in WalletProvider
  to fix react-hooks/set-state-in-effect error
- Remove unused formatAddress import from case detail page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…cases page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…onboarding flow

- Add prominent "No Gas Fees, Free Simulation" section near the top
- Add complete Wallet Setup section (genlayer-js + JSON-RPC options)
- Add "Quick Start for Agents" with full lifecycle code example
- Clarify that creating agent needs BOTH party addresses upfront
- Add contract creation flow diagram
- Add API/SDK-first callout (no browser automation)
- Update wallet.json to include privateKey field
- Add wallet security guidance (chmod 600, never share key)
- Update genlayer.md funding section with no-gas clarification
- Reference argue.fun wallet management patterns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace genlayer-js SDK with genlayer CLI as the recommended approach
for agent interactions. CLI commands are simpler — just shell commands,
no JavaScript required. SDK examples moved to collapsible "Alternative"
sections. Added CLI Command Reference section and updated "Everything
You Can Do" table with CLI commands.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added docs/FACTORY_IMPROVEMENTS.md analyzing missing factory features:
- Pagination for large registries (HIGH priority)
- Party address indexing for agent case lookup (HIGH priority)
- Recent contracts query (HIGH priority)
- Status counts for dashboard (MEDIUM, recommend API layer)

Added 14 new tests across both contracts (180 → 194 total):
- Factory: get_owner view, count behavior, is_type_registered states,
  contracts still queryable after type unregister
- MoltCourt: dispute timestamp tests, get_evidence_deadline across states

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HIGH priority: Export/import methods for migrating registry data between
factory versions. Includes export_all_types, export_contracts_page (paginated),
import_types, import_contracts (owner-only, rebuilds indexes). Detailed
migration script workflow and batch size considerations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Added export_all_contracts() convenience method to factory migration
  proposal alongside the paginated export_contracts_page()
- Added testing policy section to CLAUDE.md: always create and run tests
  for every contract function before deploying

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reorganized tasks.md: moved completed items to Done, updated In Progress
  and Backlog sections to reflect current state
- Added frontend/src/lib/contract-source.ts: inlined MoltCourt.py contract
  code as a TypeScript string constant for Vercel compatibility (filesystem
  reads don't work in serverless)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rebrand from MoltCourt to InternetCourt (internetcourt.org). Renames
contracts (MoltCourt.py -> InternetCourt.py, MoltCourtFactory.py ->
InternetCourtFactory.py), updates all tests, frontend components,
configuration, documentation, and assets. Updates package name,
page titles, constants, API routes, logo file, and every reference
in docs/ and markdown files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ng navbar

- Fonts: Besley (serif headings), DM Mono, DM Sans replacing Geist/Playfair
- Colors: #dc2626 red accent, #1a1817 warm black, #f7f7f7 light gray
- Header: floating pill navbar with rounded corners
- Hero: centered large serif heading, refined toggle + dark command box
- "How does a case work?": vertical timeline replaced with 5-tab case type explainer
- Recent Cases: centered layout, updated card styling, 3-card grid
- Docs: added plain-text evidence limitation note (no file uploads or URLs yet)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Step text matches Figma exactly (wallet setup on GenLayer)
- Fixed descriptions hardcoded (not per-tab) matching Figma copy
- Verdict pills: title case (True/False/Undetermined)
- Column widths: 5/12 + 7/12 balanced split
- Create Contract uses FileText icon (not Zap)
- FolderOpen replaces FolderSearch for evidence section
- Removed decorative Scale divider between hero and tabs
- Header nav + Connect Wallet in single flex group
- Evidence/Verdict headings bumped to text-2xl

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Martina Plantijn font replaces Besley for serif headings
- SVG logotype in header replaces old jpg + text
- Official favicon SVGs (red, multiple sizes)
- Hero background video at 5% opacity
- Local font loading via @font-face

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…headings

- True verdict pill: red-filled (bg-[#dc2626] text-white)
- Description text indented pl-7 past icons
- Mobile steps stack vertically
- Content area capped at 904px max-width
- Row padding p-3 for consistent spacing
- Section headings italic to match Martina Plantijn design
- Tab bar natural width (no flex-1 stretch)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ile layout, typography

- Verdict pills: exact Figma colors (bg-#f5bebe, border-2, text-white for True)
- ConnectButton.Custom for clean wallet display (no double borders)
- Video background positioned at top of hero (not centered)
- Section headings: remove italic, add proper tracking
- All text sizes matched to Figma 16px/20px specs
- Equal 400px columns with justify-between layout
- Mobile: globe symbol logo, 40px heading, red disputed border
- Mobile: active tab shows label, inactive icons only
- Nav links: 16px foreground with red hover
- Step badges: rounded-4px, muted text, proper sizing
- Tab bar: equal-width flex-1 tabs, 10px gaps
- Section subtitles: 20px text, 20px gap from heading

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The SVG had "Court" baked as italic vector paths. Now renders
as inline text with Martina Plantijn font + globe icon, giving
full CSS control. No italic on any part of the logotype.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
15 rounds of testing and improving — homepage icon sizes, padding,
spacing, mobile corners, serif headings on all pages, docs dark-mode
color fix, footer weight, hero line-height, flex alignment, mobile
verdict buttons, tracking, and italic Court in header.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…s, tab nowrap

- Header: restore HTML text with italic Court via <em>
- Video: add relative z-10 to content sections so video stays behind
- Hero toggle: fixed min-height to prevent layout shift on tab switch
- Tab bar: whitespace-nowrap to prevent Deadline Dispute wrapping
- Verdict buttons: match Figma exactly (border-2 on True, no border on others)
- Wallet button: display:contents wrapper to fix double padding
- Layout: add openGraph metadata, fix description spacing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
albert-mr and others added 23 commits February 17, 2026 23:30
Drop GenLayer-specific code, endpoints, and UI references in favor of Base Sepolia / AI jury flows. Removed GenLayer RPC docket parsing, related API routes (/api/contracts, /api/contract-code) and generated contract source; deleted genlayer client/helpers and contract-source files. Updated /api/cases/[id]/docket to no longer call GenLayer (returns 404 for non-Base contracts) and adjusted cross-chain/LayerZero wording. Simplified frontend: removed GenLayer badges, loading states, fallbacks and factory references; migrate formatAddress imports to utils; update copy to reference Base Sepolia and AI jury. Constants were consolidated (hardcoded BASE_FACTORY_ADDRESS, MOCK_USDC_ADDRESS, DEPLOYMENT_BLOCK) and GenLayer constants removed. Tests updated to use utils and renamed suite. Small type/util tweaks applied to match removals. This simplifies the app to a Base-only flow and removes dependency on GenLayer endpoints.
Replace TRUE/FALSE verdict semantics with PARTY_A/PARTY_B across contracts, bridge service, and tests. Update AI prompt text, verdict normalization/mapping, and validation logic in InternetCourt and CaseResolution so juries and proposals use PARTY_A/PARTY_B (UNDETERMINED remains).

Add GenLayer UI support: EvmToGenLayer now persists minimal GenLayer metadata to data/genlayer.json (verdict, reasoning, tx, timestamp) and includes glJsonRpc helpers (gl_getContractState, gl_getTransactionReceipt). The bridge service exposes a new /cases/:agreement/gl endpoint that reads this metadata and returns a small docket-style entries array for the frontend. Also import a sleep helper and tidy some logging.

Tests and integration scripts updated to use the new party-centric outcome strings.
Only expose the verdict when a case is in the RESOLVED state (status === 4). Update API handlers to read raw verdicts but set verdict to -1 and verdictName to empty unless status is RESOLVED; this was applied to both single-case and cases-list endpoints (frontend/src/app/api/cases/[id]/route.ts and frontend/src/app/api/cases/route.ts). Also update frontend mapping (frontend/src/app/cases/page.tsx) to default to an empty verdict unless the server marks it as resolvable. This prevents showing verdict information prematurely.
Enforce that AI verdict responses include both 'verdict' and a non-empty 'reasoning' field (update GenLayer prompt/criteria) and trim parsed reasoning. Add a fallback synthesize pass to generate a short neutral reasoning when the model returns no reasoning. Return reasoning and verdict via the existing ABI encoding paths in both bridge service and contracts. Expose GenLayer oracle metadata from the bridge list API (meta.oracleAddress / meta.oracleTxHash) and add a new frontend API route to resolve a case id to an agreement address and fetch that metadata from the relay with a timeout. Update case list/detail UI to fetch and display the oracle address when available and only show verdict text when the case is resolved.
Prefer the transaction receipt when extracting the GenLayer oracle address and timestamp in EvmToGenLayer: fetch the receipt once, handle multiple backend shapes (contract_address / to_address / data.contract_address), and fall back to tx hints if needed. Remove the Next.js API route that proxied GenLayer metadata (frontend/src/app/api/cases/[id]/genlayer/route.ts) and strip the related state, fetch, and UI display of the oracle address from the case detail page (frontend/src/app/cases/[id]/page.tsx). Adds a comment noting the oracle address is intentionally not shown.
…integration

Contracts:
- IResolutionTarget.sol: new interface (setResolution, getOracleType, getOracleArgs)
- Agreement.sol: implements IResolutionTarget; AGENT_DISPUTE_V1 oracle type
- InternetCourtFactory.sol: registerCase() for external self-registration;
  generic processBridgeMessage() routes to IResolutionTarget.setResolution();
  deployedAgreements covers both factory-deployed and self-registered cases
  Deployed: 0xd533cB0B52E85b3F506b6f0c28b8f6bc4E449Dda (Base Sepolia)

Relay:
- EvmToGenLayer.ts: full rewrite with ORACLE_REGISTRY pattern;
  reads getOracleType() + getOracleArgs() per case; dispatches correct oracle
  Supports AGENT_DISPUTE_V1 (case_resolution.py) and TRADE_FINANCE_V1 (ShipmentDeadlineCourt.py)
- config.ts: factory v2 address note

Oracle:
- contracts/bridge/ShipmentDeadlineCourt.py: moved from trade-finance repo;
  added target_contract param (targets factory, not settlement directly)
- bridge/service/contracts/bridge/: symlinks for relay runtime resolution

Deployed & tested (2026-03-07/08):
  A: TIMELY → SETTLED  0xb4700D67d6cBeF18011021A2A20389ea88753234
  B: LATE → CANCELLED  0xbd0dB046A913817522B595CFEb922D5E2aad4268
  C: UNDETERMINED      0xe50A8F382B3B751dBd7053963EbaBB59916f3788
…0xb981 address

- skill.md: update factory address in metadata, Contract Addresses table, and session
  variable block; add factory v2 note explaining registerCase() support
- chain/config.ts: remove dead FACTORY_CONTRACT constant (0xb981, never consumed)
  and the TODO comment referencing it; only CHAIN and RPC_URL remain
- cases/page.tsx: add visible 'InternetCourtFactory v2 · Base Sepolia' label in the
  page footer so visitors can verify the active factory without checking source code
Multi-factory index:
- constants.ts: add FACTORY_REGISTRY (N entries with address, label, deploymentBlock)
  currently: v2 (0xd533) + v1 (0xb981); extend by adding to the array
- route.ts: fetchCasesFromFactory() runs per factory, all in parallel via Promise.all;
  results merged + deduplicated by contract address; each case tagged with
  factoryAddress + factoryLabel; parseAbi imported (was missing, caused TradeFx
  multicall to silently fail)
- cases/page.tsx: factory badge on each card (font-mono, gray, shows v1/v2/0xABCD…);
  baseToMoltContract passes baseFactory + factoryId through

Rename:
- MoltContract → InternetContract across types.ts, cases/page.tsx,
  cases/[id]/page.tsx, page.tsx (was a meaningless scaffolding name)
…le constant

- FACTORY_REGISTRY deploymentBlock: v2 24700000→38576182, v1 21000000→37657150
  (verified via cast call .../deploymentBlock()); wrong values caused timestamp
  queries to scan 14M extra blocks per case — ~1400 unnecessary RPC calls
- Remove DEPLOYMENT_BLOCK top-level constant (no consumers; per-factory values
  in FACTORY_REGISTRY supersede it)
- InternetContract: add factoryLabel?: string field
- baseToInternetContract: forward c.factoryLabel from API response
- Factory badge: use c.factoryLabel directly instead of hardcoded address
  comparison (future-proofs for v3+)
/api/cases/[id]/route.ts:
- Multi-factory address lookup: findInFactories() searches all FACTORY_REGISTRY
  entries in parallel instead of only querying FACTORY_ADDRESS (v2)
- TradeFx fallbacks: TRADEFX_ABI multicall items [18-24] added alongside
  Agreement.sol items [0-17]; isTradeFx detected via exporter() success
- TradeFx field mapping:
    partyA        = exporter()
    partyB        = importer()
    statement     = shipmentStatement()
    status        = tradeFxStatusToIc(tfStatus, shipStatus)
    verdict       = shipStatusToVerdict(shipStatus) → PARTY A/PARTY B/UNDETERMINED
    escrowAmount  = fundedAmount()
    guidelines    = human-readable summary (not on-chain, no readable field)
- Returns factoryAddress, factoryLabel, contractType in response
- Removes direct FACTORY_ADDRESS import (replaced by FACTORY_REGISTRY)
… timeline

docket/route.ts:
- Detects TradeFx vs Agreement.sol via exporter() call
- Routes to buildTradeFxDocket() or buildAgreementDocket() accordingly
- Multi-factory lookup for both numeric and address-based case IDs

TradeFx events covered (source tagged per entry):
  Base:      TradeCreated, RateLockRequested, Funded, ShipmentAccepted,
             ShipmentContested, ShipmentVerdictReceived, Settled, Cancelled,
             SettlementCancelledByVerdict, SettlementManualReview,
             ManualReviewResolved, ManualReviewTimedOut, ExceptionFlagged
  GenLayer:  RateLocked, RateRolled (delivered by oracle relayer)
  LayerZero: DisputeRequested (outbound bridge), VerdictReceived (inbound bridge)
  GenLayer relay entries from RELAY_BASE_URL (best-effort, parallel)

Human-readable field formatting:
  - Rate: /1e6 → PEN/BOB ratio
  - Amounts: /1e18 → MockPEN
  - Timestamps: ISO date or UTC string
  - Verdict: TIMELY→'exporter wins' / LATE→'importer wins' / UNDETERMINED
tradeFxStatusToIc() rewrite:
- Verdict-first logic: check shipmentStatus before trade settlement status
- TIMELY(3) or LATE(4) → RESOLVED (was: CANCELLED/DISPUTED for B)
- UNDETERMINED(5) or CONTESTED(2) → RESOLVING (was: DISPUTED for C)
- CANCELLED without verdict stays CANCELLED; SETTLED without contest stays RESOLVED

Detail API (cases/[id]/route.ts):
- hasVerdict = shipStatus >= 3 (show verdict for RESOLVING too, not just RESOLVED)
- Case B (CANCELLED/LATE) now shows: RESOLVED + PARTY B wins
- Case C (FUNDED/UNDETERMINED) now shows: RESOLVING + UNDETERMINED

List API (cases/route.ts):
- TradeFx verdict derived from shipmentStatus (PARTY A=TIMELY, PARTY B=LATE, 0=UNDETERMINED)
- Was reading Agreement verdict() which fails on TradeFx → always returned 0/UNDETERMINED
- RateLocked: source GenLayer → LayerZero (rate delivered via LZ bridge)
  + add LZ scan link to RateLocked and RateRolled entries
- ShipmentVerdictReceived verdict label: was using TradeFx shipmentStatus
  numbering (3/4/5) but event emits factory/IC numbering (0/1/2)
  → verdict=2 was showing UNDETERMINED instead of LATE
- bytes32ToAscii(): decode benchmarkId from raw hex to readable ASCII
  e.g. 0x5143323032363030303100...  → 'QC20260001'
Problem:
  gen_call with data:'{}' always fails → genlayer.json verdicts all null
  RELAY_BASE_URL not set on Vercel → docket shows no GenLayer entries

Solution:
frontend/src/lib/gl-oracle-meta.ts (new):
  Static lookup of all 5 known oracle entries keyed by case address.
  Verdicts recovered by calling gen_call with data:0x80 (empty msgpack)
  and decoding base64 contract_state from the error response.

docket/route.ts:
  glEntriesPromise now: tries relay first, falls back to static lookup.
  Static path builds 3 GL docket entries (oracle deployed / verdict / dispatched)
  with GenLayer Explorer links and validator vote counts.

bridge/service/src/relay/EvmToGenLayer.ts:
  persistGlMeta: use gen_call with data:0x80 + parse error.data.receipt.contract_state
  to reliably extract verdict and reasoning from deployed oracle state.

bridge/service/data/genlayer.json:
  Updated all 3 TradeFx entries with real verdicts + reasoning.
  Added missing case C (0xe50A8F38..., UNDETERMINED, oracle 0xb7CC51a5...).
…stamps

Merges:
  ShipmentContested + DisputeRequested (same tx) → single 'Shipment disputed
    — case registered and forwarded to AI jury via bridge' (source: LayerZero)

  VerdictReceived + ShipmentVerdictReceived + SettlementCancelledByVerdict
    (all same tx) → single 'Verdict received via bridge: [label]' (source:
    LayerZero) with reasoning + refund amount in details

  Settles that share the verdict tx are skipped (already captured above)

GL entries:
  Static fallback now builds 1 entry instead of 3 (oracle deploy + evaluate
  + dispatch are one GenLayer tx). Action: 'AI jury evaluated — verdict: X'

  Timestamp override: buildTradeFxDocket computes midpoint between
  'disputed' LayerZero entry and 'Verdict received' LayerZero entry,
  placing the GenLayer entry between them correctly in the timeline.

Result: 12 messy entries → ~7 clean entries in correct chronological order:
  Base: Trade created
  Base: Rate lock requested
  LayerZero: FX benchmark locked
  Base: Settlement escrowed
  LayerZero: Shipment disputed — forwarded to AI jury
  GenLayer: AI jury evaluated — verdict: LATE
  LayerZero: Verdict received via bridge — [outcome]
* fix: rate formatting — divide by 1e18 not 1e6 (rate is 18-decimal)

* skill: merge bridge architecture, trust model, do-not-overclaim into SKILL.md

- 30-second explanation of normal vs disputed paths
- Cross-chain architecture (relay-only outbound, relay+LZ inbound)
- Key contract addresses and IResolutionTarget pattern
- gen_call with 0x80 (msgpack) for reading GenLayer state
- Do-not-overclaim guardrails (5 explicit lines)
- Frontend/API reference and trade-finance demo caveats
- Version bump to 0.2.0

* skill: add contract-writing section (court + oracle skeletons, eq principles, testing)

- Court skeleton with prompt_non_comparative
- Oracle skeleton with prompt_comparative
- Equivalence principle decision table
- Storage types quick reference
- Testing quick ref with conftest patch for prompt_non_comparative
- Cross-reference to full genlayer skill for deep dives

* fix: RateLocked attribution — source GenLayer, link to FxBenchmarkOracle

The FX benchmark is fetched BY the GenLayer oracle, then delivered to Base.
Source was incorrectly 'LayerZero'. Now 'GenLayer' with a link to the
FxBenchmarkOracle contract on GenLayer Explorer.

---------

Co-authored-by: Bob (Clawdbot) <bob@clawd.bot>
- tradeFxStatusToIc: handle RETURN_REQUIRED (6) and CONTESTED+SETTLED states
- shipStatusToVerdict: map graduated penalty states to PARTY B
- shipmentVerdictLabel: recognize all 6 ShipmentDeadlineCourt verdict codes
- gl-oracle-meta: add D (LATE_1_4), F (LATE_7_8), G2 (VERY_LATE) oracle entries
- hasVerdict: detect settled graduated penalties (shipStatus=2, tfStatus=6)

Fixes: D/F showing RESOLVING instead of RESOLVED, F/G2 showing
UNDETERMINED instead of LATE, missing AI jury evaluated docket entries.
- Read shipmentCourtSheetACid/BCid as evidenceA/B (IPFS CIDs)
- Set evidenceASubmitted/evidenceBSubmitted based on CID presence
- Use on-chain shipmentVerdictReason for reasoning field
- Map shipmentVerdictAt to disputeTimestamp

Previously all TradeFx cases showed empty evidence, false submissions,
and generic reasoning text.
The 1286-line GENLAYER_GUIDE.md was a manually maintained copy of
GenLayer developer reference that duplicated content from the official
genlayer-dev Claude Code plugin (https://github.com/genlayerlabs/skills).

Replace with a short pointer file that:
- Links to the canonical genlayer-dev plugin and its skills
- Lists the available skills (write-contract, genlayer-cli, etc.)
- Includes the install command and key doc URLs
- Mentions the Testnet Bradbury faucet

This eliminates a maintenance burden and ensures developers always get
up-to-date information from the authoritative source.
@vercel

vercel Bot commented Mar 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
internetcourt Ready Ready Preview, Comment Apr 28, 2026 8:35am

Request Review

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.

4 participants