Skip to content

Feature/production worker runtime - #55

Closed
SuPuHe wants to merge 143 commits into
mainfrom
feature/production-worker-runtime
Closed

SuPuHe wants to merge 143 commits into
mainfrom
feature/production-worker-runtime

Conversation

@SuPuHe

@SuPuHe SuPuHe commented Sep 9, 2026

Copy link
Copy Markdown
Member

fix dockerfile

kapustazh and others added 30 commits September 6, 2026 00:23
feat: setup agent policy, milestone loop, and review templates
Claude Code auto-loads CLAUDE.md, not AGENTS.md. Without this file, a session
started in this repository begins without the agent policy or the milestone loop
in context, and can proceed unaware of the review gates.

Add .claude/CLAUDE.md as a pointer: it directs the agent to read AGENTS.md,
.agent/AGENTS.md, and .agent/MILESTONE_IMPLEMENTATION_LOOP.md, and states that
those files are authoritative and that nothing in it overrides them.

Restates only the non-negotiables as a reminder, not a replacement: branch from
develop, PRs target develop as drafts, Gates A and B run in independent sessions,
the implementer never reviews its own work, an ambiguous verdict is a FAIL, never
bypass a failing check, never merge. Adds a short project description and the
handoff format.
docs: add .claude/CLAUDE.md pointing to repository policy
docs: expand independent three-coder milestone plan
docs(plan): define hashless recovery
Add an explicit sponsor claim mapping across the three partner slots, naming
each claimed track and recording why the Composable/Standardized Graph and
Circle Agent Stack tracks are deliberately not claimed.

Add section 5b covering Arc qualification: every Arc requirement mapped to an
owner and artifact, the four-screen minimum qualifying frontend marked
non-cuttable, an early OpenAPI freeze so frontend slices can start against the
mock ahead of live proof, and the deliberate thin Circle tool surface.

State the mainnet-readiness position against Arc public mainnet opening
16 September 2026 on chain 5042, after the submission deadline. The build
targets deployment-ready, with MAINNET_READINESS.md as the single
reviewer-facing artifact and real-value execution disabled pending explicit
human authorization.

Extend section 18 risks and the Gate P6 checklist to cover the new claims.
Restore the MCP-only Graph recovery path selected before d6758dd while retaining the Mermaid and Arc Testnet corrections.
docs(plan): map sponsor claims and Arc qualification
Implements the B01 core for Coder B as a standalone package with its own
install, lint, typecheck, test, and build commands, so the packet closes
without root workspace composition or any credential.

Arc Testnet is the only enabled deployment profile and pins the constants
frozen in milestones/CONTRACTS.md: chain 5042002, eip155:5042002, the USDC
interface at 0x3600...0000, and six-decimal precision. The Mainnet profile is
structurally present but carries no chain ID, RPC, explorer, or token value at
all. develop@d6758dd removed a previously asserted mainnet chain and launch
date as unverified guesses, and a test now asserts no profile contains any
endpoint so they cannot creep back in. RPC and explorer URLs are operator
configuration rather than profile constants for the same reason.

Money is integer atomic units and bigint only. parseAmountAtomic rejects
rather than normalizes non-canonical input, because accepting both "1" and
"01" would let two strings describe one amount and break the payload
fingerprint the duplicate-settlement guard depends on. Display formatting is
string slicing, never division.

The readiness probe separates UNAVAILABLE from MISMATCH. A wrong chain ID or a
token address holding no bytecode is a permanent, human-fix condition and must
never be retried into working; an unreachable endpoint may resolve on its own.
Both block readiness, and the probe is driven through a small RPC interface so
it runs fully offline.

Configuration classifies every variable as public, secret, optional, or
human-only, and fails closed on a missing, malformed, or contradictory value.
Enabling a mainnet profile requires pinned values, an enabled flag, and
explicit human authorization together; authorization alone is refused.

Redaction is deny-by-default on key name and on secret-shaped content, so an
unclassified new provider field is redacted rather than leaked. Key matching
strips case and separators after a test caught x-api-key slipping past an
apikey pattern.

Toolchain pinned by the B01.1 compatibility spike: Node >=22.12, TypeScript
5.9.3, viem 2.56.3, Vitest 5.0.0, ESLint 9.39.1. TypeScript 7.0.2 is rejected
because typescript-eslint constrains typescript to <6.1.0 at every published
version.
selezenart and others added 28 commits September 8, 2026 23:23
Adds a fail-closed verifier for the Privy and Arc sponsor evidence, a CLI
that publishes a sanitized report, an evidence index, and the B06 handoff
document.

The live Arc Testnet run already happened and is recorded in
docs/settlement/LIVE_EVIDENCE.md, so this milestone re-verifies that
record rather than executing another payment. What it checks is the
binding rather than the label:

- Privy denials only count when the broadcast and settlement counters
  were observed at zero, and a drill that omits the amounts it compared
  fails rather than skipping the check.
- The Arc settlement must match the pinned network and token, carry a
  canonical integer amount, and publish an explorer link that is https,
  on an allowed host, and contains the transaction hash on screen.
- The lost-response drill must reach UNKNOWN, reconcile to the original
  transaction, and leave exactly one settlement.
- The mainnet profile must be disabled, unpinned, and carry no chain,
  RPC, explorer, or token value. Readiness is the absence of usable
  values, not a flag.
- Qualification statuses are computed, so any failing section or a
  non-live record downgrades a sponsor to NOT VERIFIED.

The sanitization audit applies the arc-adapter redaction contract at
every level, including scalars nested in arrays and the query string of
an allowlisted URL. Two public fields need a narrow exemption from the
generic rules: token_contract matches the token key pattern, and
explorer_url embeds the transaction hash. Both are load-bearing evidence,
so the exemption lives here with a per-field shape check rather than
widening the shared adapter contract for every caller.
Gate B and the following Gate A round found three ways the evidence
engine could report a pass it had not earned.

Receipt validation stopped at the receipt level, so a malformed log
entry threw from inside the adapter instead of producing a listed
failure. Every log is now checked for address, data, logIndex, and a
string topics array.

The public-field allowlist shared one permissive guard, which would have
accepted a short JWT-shaped string under token_symbol or explorer_host.
That guard is gone; each allowlisted field now has its own shape: EVM
address, asset symbol, decimal count, hostname, https URL.

The replay check matched REPLAY as a substring, so a tampered
NOT_REPLAYED would have satisfied a check asserting the opposite. It now
matches REPLAYED or RETURNED_EXISTING_RESULT exactly, with tests for the
tampered spellings.
feat(testkit-settlement): B06 Privy and Arc sponsor evidence
Three findings were carried rather than fixed during B05 and B06.

The live-evidence document described the Arc Mainnet profile as
OFFLINE_PROTECTED, which is not a state the code has. It now states what
packages/arc-adapter/src/profiles.ts actually carries: disabled,
verification UNPUBLISHED, and no chain, RPC, explorer, or token value at
all. A sponsor reading the document should see the same words as the
code.

The settlement UI refused secrets by field name only, so a credential
arriving under a benign name would have reached a component prop. PEM
private keys, JWTs, and bearer tokens are now refused by value shape
wherever they appear, including inside arrays, while transaction hashes,
addresses, and digests keep rendering.

Fields that render verbatim now reject control characters. That covers
the identity fields, timestamps, digests, and evidence enums, which all
print without sanitizeText by design.

The accessibility scan disables axe's color-contrast rule because jsdom
cannot compute rendered colours, which left that claim unproven. A static
audit now reads the palette tokens and surfaces from the stylesheet and
asserts WCAG AA, so a future palette edit that drops below it fails.
docs: correct Gate P4 verification status
fix(settlement): close lane B review follow-ups
feat(reconciliation): implement live Vertex AI recovery advisor and Subgraph MCP client
docs: update plan with Graph deployment status
docs: record PR 46 recovery adapter progress
…vertex ai advisor

Native SettlementCandidate schema in v0.2.1, direct query pass-through, live Vertex AI Gemini 2.5 Flash recovery proof, and aligned qualification docs.
feat(graph): complete live Subgraph MCP recovery proof and qualify The Graph
docs: define Arc Circle qualification path
Gate P5: merge frontend acceptance implementations
@SuPuHe
SuPuHe marked this pull request as ready for review September 9, 2026 20:50
@SuPuHe SuPuHe closed this Sep 9, 2026
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.

3 participants