diff --git a/.github/workflows/chargeback-velocity.yml b/.github/workflows/chargeback-velocity.yml new file mode 100644 index 00000000..fbf85928 --- /dev/null +++ b/.github/workflows/chargeback-velocity.yml @@ -0,0 +1,88 @@ +name: Chargeback velocity (daily) + +# P3.RAIL3 — runs scripts/chargeback-velocity.ts daily at 08:30 UTC +# (just after the reconciliation cron clears at 08:00 UTC). Tiers +# every connected account green/yellow/red and: +# - inserts a chargeback_alerts row for non-green tiers +# - sends a developer-facing email (rate-limited yellow 7d / red 24h) +# - flips developers.onboarding_paused = true on red tier +# +# Hostile posture (per audit): +# (a) idempotent payout-schedule update (handled in +# packages/rails/src/stripe.ts — see updatePayoutSchedule) +# (b) low-sample-size guard via --min-charges (default 10) +# (c) auto-pause is reversible via the founder admin UI +# (d) email rate-limit per (developer, tier) +# +# Auto-push of any outputs is OFF (nothing to push — DB-only side +# effects). Workflow_dispatch is allowed for ad-hoc runs. + +on: + schedule: + - cron: '30 8 * * *' + workflow_dispatch: + inputs: + developer_id: + description: 'Run for a single developer (UUID). Empty → all developers.' + required: false + default: '' + dry_run: + description: 'Skip Stripe / DB / email side effects.' + required: false + default: 'false' + type: boolean + +permissions: + contents: read + +concurrency: + group: chargeback-velocity + cancel-in-progress: false + +jobs: + run: + runs-on: ubuntu-latest + timeout-minutes: 15 + env: + DATABASE_URL: ${{ secrets.RECONCILE_DATABASE_URL }} + STRIPE_RECONCILE_KEY: ${{ secrets.STRIPE_RECONCILE_KEY }} + RESEND_API_KEY: ${{ secrets.RESEND_API_KEY }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: npm ci + + - name: Build @settlegrid/rails + run: npm --workspace @settlegrid/rails run build + + - name: Run chargeback velocity + # workflow_dispatch inputs are bound via env vars (not ${{ }} + # template substitution) so a malicious dispatcher can't + # inject shell metacharacters via the developer_id field. + env: + INPUT_DEVELOPER_ID: ${{ github.event.inputs.developer_id }} + INPUT_DRY_RUN: ${{ github.event.inputs.dry_run }} + run: | + set -euo pipefail + ARGS=() + if [[ -n "${INPUT_DEVELOPER_ID:-}" ]]; then + # Hostile-review fix: the loose regex `^[0-9a-f-]{36}$` + # accepts e.g. 36 dashes. Require the canonical UUID + # 8-4-4-4-12 layout instead. + if ! [[ "${INPUT_DEVELOPER_ID}" =~ ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ ]]; then + echo "Invalid developer_id: ${INPUT_DEVELOPER_ID}" >&2 + exit 2 + fi + ARGS+=(--developer-id "${INPUT_DEVELOPER_ID}") + fi + if [[ "${INPUT_DRY_RUN:-false}" == "true" ]]; then + ARGS+=(--dry-run) + fi + npx tsx scripts/chargeback-velocity.ts "${ARGS[@]}" diff --git a/.github/workflows/index-registry.yml b/.github/workflows/index-registry.yml new file mode 100644 index 00000000..796410b2 --- /dev/null +++ b/.github/workflows/index-registry.yml @@ -0,0 +1,28 @@ +name: Index Registry to Meilisearch + +on: + push: + branches: [main] + paths: + - 'apps/web/public/registry.json' + workflow_dispatch: + +jobs: + index: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: npm ci + + - name: Index registry to Meilisearch + env: + MEILI_URL: ${{ secrets.MEILI_URL }} + MEILI_MASTER_KEY: ${{ secrets.MEILI_MASTER_KEY }} + run: npx tsx scripts/meilisearch/index-registry.ts diff --git a/.github/workflows/python-sdk-ci.yml b/.github/workflows/python-sdk-ci.yml new file mode 100644 index 00000000..32154258 --- /dev/null +++ b/.github/workflows/python-sdk-ci.yml @@ -0,0 +1,115 @@ +name: Python SDK CI + +on: + push: + branches: [main] + paths: + - 'packages/sdk-python/**' + - '.github/workflows/python-sdk-ci.yml' + pull_request: + paths: + - 'packages/sdk-python/**' + - '.github/workflows/python-sdk-ci.yml' + +# H9 hostile fix — least-privilege explicit permissions (default for new +# repos, but stating it here makes the contract explicit and survives +# org-level default changes). +permissions: + contents: read + +# Cancel in-progress runs when a new commit lands on the same ref — +# avoids burning CI minutes on superseded commits. +concurrency: + group: python-sdk-ci-${{ github.ref }} + cancel-in-progress: true + +defaults: + run: + working-directory: packages/sdk-python + +jobs: + test: + name: test (py${{ matrix.python-version }} / ${{ matrix.os }}) + runs-on: ${{ matrix.os }} + # H8 hostile fix — bound CI duration; a hung pytest used to be able + # to consume 6h of CI time silently before getting killed. + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + python-version: ['3.10', '3.11', '3.12'] + steps: + - uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: packages/sdk-python/pyproject.toml + + - name: Install dev dependencies + run: | + python -m pip install --upgrade pip + pip install -e ".[dev]" + + - name: Verify no transitive-dep conflicts + run: pip check + + - name: Lint (ruff) + run: ruff check settlegrid tests + + - name: Type check (mypy) + run: mypy settlegrid + + - name: Tests + coverage + run: pytest --cov=settlegrid --cov-report=xml --cov-report=term --cov-fail-under=90 + + - name: Upload coverage report + if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12' + uses: actions/upload-artifact@v4 + with: + name: coverage-xml + path: packages/sdk-python/coverage.xml + if-no-files-found: error + + build: + name: build wheel + sdist + smoke install + runs-on: ubuntu-latest + needs: test + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install build backend + run: | + python -m pip install --upgrade pip + pip install build twine + + - name: Build wheel + sdist + run: python -m build + + - name: twine check + run: twine check dist/* + + - name: Smoke install in fresh venv + run: | + python -m venv /tmp/smoke + /tmp/smoke/bin/pip install --upgrade pip + /tmp/smoke/bin/pip install dist/*.whl + /tmp/smoke/bin/pip check + /tmp/smoke/bin/python -c "import settlegrid; print(settlegrid.SDK_VERSION)" + /tmp/smoke/bin/python -c "from settlegrid import SettleGrid, Wrapper, Invocation, InvalidKeyError, RateLimitedError, KeyValidationResult, MeterResult" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: sdk-python-dist + path: packages/sdk-python/dist/ + if-no-files-found: error diff --git a/.github/workflows/stripe-reconcile.yml b/.github/workflows/stripe-reconcile.yml new file mode 100644 index 00000000..a0974aeb --- /dev/null +++ b/.github/workflows/stripe-reconcile.yml @@ -0,0 +1,144 @@ +name: Stripe reconciliation (daily) + +# P3.RAIL2 — Reconciles the SettleGrid unified ledger against Stripe +# Balance Transactions + Connect Transfers for the previous UTC +# calendar day. Reports drift to data/reconciliation/stripe/{date}.json, +# posts a one-line summary to Slack/Discord, and opens a rate-limited +# GitHub issue when drift breaches the configured threshold (1% / 100 +# bps by default). The orchestrator caps GitHub issues at one per +# 24h via .reconcile-state.json, so a 24h Stripe outage that produces +# 24 daily drift reports opens AT MOST one issue. +# +# Hostile-lens posture: +# (a) Schedule is FIXED at 08:00 UTC — well after Stripe's UTC-day +# window closes, so the run sees a complete day. +# (b) Workflow runs on the default branch only and uses the +# repository's default GITHUB_TOKEN scopes. No third-party +# actions handle secrets. +# (c) workflow_dispatch input is allowed for ad-hoc backfills, +# but the script validates --date through the same +# utcDayBounds() guard the cron path uses. +# (d) The job commits its outputs (data/reconciliation/stripe/* +# and data/reconciliation/.reconcile-state.json) so the +# audit trail lives in git, not action artifacts. + +on: + schedule: + # Daily 08:00 UTC. Verifier check 17 expects this exact cron string. + - cron: '0 8 * * *' + workflow_dispatch: + inputs: + date: + description: 'UTC calendar day to reconcile (YYYY-MM-DD). Empty → yesterday UTC.' + required: false + default: '' + dry_run: + description: 'Skip DB / Stripe / disk / webhook calls.' + required: false + default: 'false' + type: boolean + +permissions: + # `contents: write` is reserved for the opt-in auto-push step + # (gated by vars.RECONCILE_AUTO_PUSH). When the variable is unset, + # the step is skipped and the token is unused. + contents: write + issues: write + +concurrency: + # One reconciliation at a time. A 2nd manual run while a cron run is + # in flight queues rather than racing the state file. + group: stripe-reconciliation + cancel-in-progress: false + +jobs: + reconcile: + runs-on: ubuntu-latest + timeout-minutes: 15 + env: + DATABASE_URL: ${{ secrets.RECONCILE_DATABASE_URL }} + # Per spec: use a Stripe restricted key with + # rak_balance_transaction_read + rak_transfer_read scopes only. + # Repo secret name = STRIPE_RECONCILE_KEY (rotate independently + # of the platform STRIPE_SECRET_KEY). + STRIPE_RECONCILE_KEY: ${{ secrets.STRIPE_RECONCILE_KEY }} + SLACK_RECONCILE_WEBHOOK: ${{ secrets.SLACK_RECONCILE_WEBHOOK }} + DISCORD_RECONCILE_WEBHOOK: ${{ secrets.DISCORD_RECONCILE_WEBHOOK }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RECONCILE_REPO_SLUG: ${{ github.repository }} + steps: + - uses: actions/checkout@v4 + with: + # Auto-push is opt-in (see step below). Default checkout is + # shallow; deepen only if we actually intend to push. + fetch-depth: 1 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: npm ci + + - name: Build @settlegrid/rails + run: npm --workspace @settlegrid/rails run build + + - name: Run reconciliation + # Bind workflow_dispatch inputs to env vars instead of pasting + # them via `${{ ... }}` template substitution. The `${{ }}` + # form is expanded by GitHub BEFORE the shell sees it, so a + # malicious `date: 2026-04-23 && rm -rf /` would inject. The + # env-var form passes the value through `process.env` and the + # shell's quoting; safe. + env: + INPUT_DATE: ${{ github.event.inputs.date }} + INPUT_DRY_RUN: ${{ github.event.inputs.dry_run }} + run: | + set -euo pipefail + ARGS=() + if [[ -n "${INPUT_DATE:-}" ]]; then + # Reject anything but YYYY-MM-DD up-front so we never feed + # an unvalidated string to the script even on a misconfigured + # input. The script also re-validates via utcDayBounds. + if ! [[ "${INPUT_DATE}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then + echo "Invalid date input: ${INPUT_DATE}" >&2 + exit 2 + fi + ARGS+=(--date "${INPUT_DATE}") + fi + if [[ "${INPUT_DRY_RUN:-false}" == "true" ]]; then + ARGS+=(--dry-run) + fi + npx tsx scripts/reconcile-stripe.ts "${ARGS[@]}" + + - name: Upload reconciliation report + if: ${{ github.event.inputs.dry_run != 'true' }} + uses: actions/upload-artifact@v4 + with: + name: stripe-reconciliation-${{ github.run_id }} + path: data/reconciliation/ + retention-days: 90 + if-no-files-found: warn + + - name: Commit reconciliation report and state (opt-in) + # Auto-push is OPT-IN via the `RECONCILE_AUTO_PUSH` repo + # variable. Default-off because pushing data files to the + # default branch triggers Vercel rebuilds on every nightly + # run, which burns the deploy budget. Operators who need an + # in-git audit trail can set + # `vars.RECONCILE_AUTO_PUSH=true` in the repo's "Variables" + # tab; the commit-and-push path will then run. + if: ${{ github.event.inputs.dry_run != 'true' && vars.RECONCILE_AUTO_PUSH == 'true' }} + env: + REF_NAME: ${{ github.ref_name }} + run: | + set -euo pipefail + if [[ -z "$(git status --porcelain data/reconciliation/)" ]]; then + echo "No reconciliation changes to commit." + exit 0 + fi + git config user.name 'settlegrid-bot' + git config user.email 'bot@settlegrid.dev' + git add data/reconciliation/ + git commit -m "chore(reconcile): nightly Stripe reconciliation $(date -u +%Y-%m-%d)" + git push origin "HEAD:${REF_NAME}" diff --git a/.github/workflows/template-ci.yml b/.github/workflows/template-ci.yml new file mode 100644 index 00000000..1bfca6e3 --- /dev/null +++ b/.github/workflows/template-ci.yml @@ -0,0 +1,158 @@ +name: Template CI (weekly codemods) + +# Weekly sweep: runs all registered codemods against every template +# under open-source-servers/ and opens a PR with any resulting +# changes. Labeled `template-ci` and assigned to the founder. +# +# ─── Setup prerequisite ─────────────────────────────────────────── +# This workflow handles the CODEMOD half of template maintenance. +# The DEPENDENCY half is handled by the Renovate GitHub App, which +# must be installed separately: +# +# 1. Visit https://github.com/apps/renovate +# 2. Install the app on the `settlegrid` repo +# 3. Renovate will read `renovate.json` and open scoped PRs +# for template dependency updates on the same Sunday cron. +# +# Both streams converge on the `template-ci` label so the founder +# reviews them together. This workflow does NOT invoke Renovate +# itself — invoking Renovate CLI from an Action requires +# self-hosted auth setup. The App-based pattern is the standard +# Renovate integration. +# +# ─── Security posture ──────────────────────────────────────────── +# The workflow NEVER pushes to main directly (hostile audit a): +# peter-evans/create-pull-request always commits to a fresh branch +# and opens a PR. The default branch is never a push target. + +on: + schedule: + # Sunday 06:00 UTC — matches the renovate.json schedule so + # both sweeps land in the same weekly window. + - cron: '0 6 * * 0' + workflow_dispatch: + inputs: + dry_run: + description: 'Dry-run only (no PR created)' + type: boolean + default: false + +# The workflow writes to disk during codemod apply and needs PR +# creation permissions. Pull-requests: write lets the bot open a +# PR; contents: write lets peter-evans/create-pull-request push +# the generated branch. Neither permits force-push to protected +# branches by itself — branch-protection rules on main still apply. +permissions: + contents: write + pull-requests: write + +concurrency: + group: template-ci + cancel-in-progress: false + +jobs: + run-codemods: + name: template-ci / weekly codemods + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + # Full history so the PR branch commit has the full graph. + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Dry-run codemods (preview before applying) + id: dryrun + run: | + node scripts/codemods/run-all.mjs 2>&1 | tee /tmp/codemods-dryrun.log + # Consume the machine-readable summary line emitted by + # run-all.mjs: `[run-all] files-touched=N`. Grepping this + # token is stable across prose changes in the runner's + # human output. Defaults to 0 if (for some reason) the + # token is missing — the workflow then skips the apply + # step, which is the safe outcome. + touched=$(grep -oE 'files-touched=[0-9]+' /tmp/codemods-dryrun.log | head -1 | cut -d= -f2 || echo "0") + touched=${touched:-0} + echo "files_touched=$touched" >> "$GITHUB_OUTPUT" + echo "Dry run found $touched file(s) to touch." + + - name: Apply codemods (writes to disk) + if: steps.dryrun.outputs.files_touched != '0' && github.event.inputs.dry_run != 'true' + run: | + node scripts/codemods/run-all.mjs --apply --smoke-test 5 + + - name: Check for changes + if: steps.dryrun.outputs.files_touched != '0' && github.event.inputs.dry_run != 'true' + id: git_status + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "has_changes=true" >> "$GITHUB_OUTPUT" + git status --porcelain | head -40 + else + echo "has_changes=false" >> "$GITHUB_OUTPUT" + fi + + - name: Create Pull Request + if: steps.git_status.outputs.has_changes == 'true' + uses: peter-evans/create-pull-request@v6 + with: + # Fixed branch name so a second weekly run updates the + # existing PR rather than opening a parallel one. If the + # prior PR has been merged/closed, a fresh branch opens + # automatically. + branch: template-ci/weekly-codemods + base: main + title: 'template-ci: weekly codemod sweep' + body: | + Automated weekly codemod sweep applied to every template + under `open-source-servers/` and + `packages/create-settlegrid-tool/templates/`. + + **What changed** + See the diff. The codemod suite covers: + + - `costCents` → `priceCents` in `sg.wrap()` options + - `@settlegrid/mcp/legacy` → `@settlegrid/mcp` import paths + - `SGError` → `SettleGridError` + - Removal of deprecated `sg.debug()` calls + + **Verification** + - Each transform is pure + idempotent (running twice is + a no-op). + - Post-apply smoke test ran `tsc --noEmit` on 5 random + templates (seeded by today's date). + - If the smoke test failed, the workflow would have + exited non-zero before opening this PR. + + **Review checklist** + - [ ] Confirm the diff matches the stated transforms. + - [ ] Run `node scripts/codemods/run-all.mjs` locally + and verify the dry-run summary matches this PR's + changes (idempotency check). + - [ ] If any transform should NOT apply to a specific + template, add an opt-out marker and re-run. + commit-message: | + chore(templates): weekly codemod sweep + + Applied the sdk-breaking-changes codemod suite to every + template under open-source-servers/ and packages/ + create-settlegrid-tool/templates/. + + See the PR body for the full transform list and the + post-apply smoke-test result. + labels: template-ci + assignees: lexwhiting + # delete-branch ensures a merged or closed PR doesn't + # leave a stale branch behind — the next weekly run will + # start fresh. + delete-branch: true diff --git a/.github/workflows/template-quality.yml b/.github/workflows/template-quality.yml new file mode 100644 index 00000000..8732d8f6 --- /dev/null +++ b/.github/workflows/template-quality.yml @@ -0,0 +1,91 @@ +name: Template Quality Gate + +on: + pull_request: + paths: + - 'open-source-servers/**' + - 'packages/create-settlegrid-tool/templates/**' + - 'scripts/build-registry.ts' + - 'packages/mcp/src/template-schema.ts' + +concurrency: + group: template-quality-${{ github.event.pull_request.number }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + validate-manifests: + name: templates / validate manifests + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: npm ci + + - name: Build MCP package + run: npm --workspace @settlegrid/mcp run build + + - name: Validate all manifests (strict) + run: npm run build:registry -- --strict + + run-quality-gates: + name: templates / quality gates + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: npm ci + + - name: Build MCP package + run: npm --workspace @settlegrid/mcp run build + + - name: Run quality gates on changed templates + run: npx tsx scripts/quality-gates.ts --only-changed + + schema-roundtrip: + name: templates / schema roundtrip + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: npm ci + + - name: Build MCP package (regenerates JSON Schema) + run: npm --workspace @settlegrid/mcp run build + + - name: Verify JSON Schema is up to date + run: | + # Use `git status --porcelain` instead of `git diff --exit-code` so + # an untracked file (e.g., schema previously `git rm`'d, then + # regenerated by build) is also caught — `git diff` only sees + # tracked-file changes. + STATUS=$(git status --porcelain packages/mcp/schemas/template.schema.json) + if [[ -n "$STATUS" ]]; then + echo "ERROR: packages/mcp/schemas/template.schema.json is out of date or untracked." + echo "$STATUS" + git diff packages/mcp/schemas/template.schema.json || true + echo "Run 'npm --workspace @settlegrid/mcp run build' and commit the updated file." + exit 1 + fi diff --git a/.gitignore b/.gitignore index 19d98447..a109075c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,23 @@ internal/ *-private/ .mcpregistry_* +# Founder reference drafts — outreach replies, 1:1 templates, private +# user notes. These contain real names and should never be committed. +data/cold-outreach/ +data/users/ + +# Word doc exports of master-plan content. These are regeneratable from +# the .md sources and the proprietary versions live in private/master-plan/ +# rather than docs/master-plan/. Belt-and-suspenders preventive. +docs/master-plan/*.docx + # GridBot runtime state & logs scripts/gridbot/state.json scripts/gridbot/schedule-state.json scripts/gridbot/logs/*.jsonl + +# P4.6 outreach generator — local cache for GitHub + Claude API responses. +# Per-recipient personalization (PII-adjacent) lives here; never check in. +scripts/.cache/ +# P4.6 generated output — 100 emails with real names + addresses. DO NOT COMMIT. +scripts/.outreach/ diff --git a/AUDIT_LOG.md b/AUDIT_LOG.md new file mode 100644 index 00000000..5a53f636 --- /dev/null +++ b/AUDIT_LOG.md @@ -0,0 +1,4176 @@ +# SettleGrid Audit Log + +Append-only log of phase gate verdicts. Each gate run appends one section. + +## Phase 2 Gate — 2026-04-16T22:55:31.663Z + +**Verdict:** 4 PASS / 16 DEFER / 0 FAIL (of 20) +**Mode:** default +**Exit code:** 0 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files all present | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | DEFER | skipped via --skip-build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace tests green (turbo) | PASS | 5/5 workspace tasks PASS | +| 9 | K1 — marketplace proxy uses unified adapter package | DEFER | pre-K1 state: 1 lib/*-proxy import(s), 0 kernel imports | +| 10 | K2 — 12 lib/*-proxy.ts migrated to adapter classes | DEFER | 12 *-proxy.ts files still in lib/ (K2 not yet shipped) | +| 11 | K3 — proxy-vs-kernel snapshot test exists | DEFER | /Users/lex/settlegrid/packages/mcp/src/__tests__/snapshot-equivalence.test.ts not present | +| 12 | K4 — typed MeterContext + lifecycle stubs | DEFER | /Users/lex/settlegrid/packages/mcp/src/lifecycle.ts not present | +| 13 | FMT1 — @settlegrid/ai-sdk package | DEFER | /Users/lex/settlegrid/packages/ai-sdk/package.json not present | +| 14 | FMT2 — @settlegrid/mastra package | DEFER | /Users/lex/settlegrid/packages/mastra/package.json not present | +| 15 | FMT3 — TS adapter packages polished/rebranded | DEFER | no @settlegrid/{langchain,n8n,cursor} packages present | +| 16 | FMT4 — n8n Invoke operation node | DEFER | /Users/lex/settlegrid/packages/n8n/src/nodes/Invoke.ts not present | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter interface | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T21:03:50.447Z + +**Verdict:** 11 PASS / 8 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | DEFER | /Users/lex/settlegrid/packages/n8n/src/nodes/Invoke.ts not present | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T21:08:52.607Z + +**Verdict:** 11 PASS / 8 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | DEFER | /Users/lex/settlegrid/packages/n8n/src/nodes/Invoke.ts not present | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T21:41:09.813Z + +**Verdict:** 12 PASS / 7 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T21:46:04.091Z + +**Verdict:** 12 PASS / 7 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T21:54:01.240Z + +**Verdict:** 12 PASS / 7 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T22:06:04.024Z + +**Verdict:** 12 PASS / 7 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | DEFER | /Users/lex/settlegrid/apps/web/src/app/compare/nevermined/page.tsx not present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T22:12:49.893Z + +**Verdict:** 13 PASS / 6 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T22:19:00.995Z + +**Verdict:** 13 PASS / 6 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T23:14:07.769Z + +**Verdict:** 13 PASS / 6 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T23:23:37.841Z + +**Verdict:** 13 PASS / 6 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-17T23:25:06.629Z + +**Verdict:** 13 PASS / 6 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:18:10.332Z + +**Verdict:** 13 PASS / 6 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | DEFER | /Users/lex/settlegrid/packages/rails/src/index.ts not present | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:28:44.582Z + +**Verdict:** 14 PASS / 5 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:35:59.897Z + +**Verdict:** 13 PASS / 5 DEFER / 2 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | FAIL | tsc packages/mcp exit 2: packages/mcp/src/rails/__tests__/stripe-connect.test.ts(101,12): error TS2693: 'StripeRailAdapter' only refers to a type, but is being used as a value here. | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:36:37.627Z + +**Verdict:** 13 PASS / 5 DEFER / 2 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | FAIL | tsc packages/mcp exit 2: packages/mcp/src/rails/__tests__/stripe-connect.test.ts(101,12): error TS2693: 'StripeRailAdapter' only refers to a type, but is being used as a value here. | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:38:47.400Z + +**Verdict:** 14 PASS / 5 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:50:34.254Z + +**Verdict:** 13 PASS / 5 DEFER / 2 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | FAIL | turbo test exit 1: • turbo 2.8.17 @settlegrid/web:test: ERROR: command finished with error: command (/Users/lex/settlegrid/apps/web) /usr/local/bin/npm run test exited (1) @settlegrid/web#test: command (/Users/lex/settlegrid/apps/web) /usr/local/bin/npm run test exited (1) ERROR run failed: command exited (1) | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T02:53:04.468Z + +**Verdict:** 14 PASS / 5 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:05:19.168Z + +**Verdict:** 14 PASS / 5 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:13:11.238Z + +**Verdict:** 13 PASS / 5 DEFER / 2 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | FAIL | tsc apps/web exit 2: apps/web/src/lib/__tests__/rails.test.ts(161,10): error TS2537: Type 'Partial>' has no matching index signature for type 'string'. | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:14:55.930Z + +**Verdict:** 14 PASS / 5 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 0 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:45:03.200Z + +**Verdict:** 13 PASS / 5 DEFER / 2 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | FAIL | 1 lib/stripe-*.ts file(s) still import 'stripe' directly: stripe-tax.ts | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:46:00.439Z + +**Verdict:** 13 PASS / 5 DEFER / 2 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | FAIL | 1 lib/stripe-*.ts file(s) still import 'stripe' directly: stripe-tax.ts | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:47:24.917Z + +**Verdict:** 14 PASS / 5 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | DEFER | no COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T03:55:07.269Z + +**Verdict:** 15 PASS / 4 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T17:58:27.063Z + +**Verdict:** 15 PASS / 4 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T18:07:26.208Z + +**Verdict:** 15 PASS / 4 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T18:16:01.664Z + +**Verdict:** 15 PASS / 4 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | DEFER | neither tracker nor Wise SOP present | + +## Phase 2 Gate — 2026-04-18T18:24:52.992Z + +**Verdict:** 16 PASS / 3 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | + +## Phase 2 Gate — 2026-04-18T18:36:40.156Z + +**Verdict:** 16 PASS / 3 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | + +## Phase 2 Gate — 2026-04-18T18:44:22.279Z + +**Verdict:** 16 PASS / 3 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | + +## Phase 2 Gate — 2026-04-18T18:51:03.824Z + +**Verdict:** 16 PASS / 3 DEFER / 1 FAIL (of 20) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | + +## Phase 2 Gate — 2026-04-18T18:57:24.138Z + +**Verdict:** 17 PASS / 3 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 25 tests (≥8 required); marketplace query + badge wired | + +## Phase 2 Gate — 2026-04-18T18:58:57.654Z + +**Verdict:** 17 PASS / 3 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 25 tests (≥8 required); marketplace query + badge wired | + +## Phase 2 Gate — 2026-04-18T19:11:06.343Z + +**Verdict:** 17 PASS / 3 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | build exit 1: e/config/eslint#disabling-rules npm error Lifecycle script `build` failed with error: npm error code 1 npm error path /Users/lex/settlegrid/apps/web npm error workspace @settlegrid/web@0.1.0 npm error location /Users/lex/settlegrid/apps/web npm error command failed npm error command sh -c next build | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 25 tests (≥8 required); marketplace query + badge wired | + +## Phase 2 Gate — 2026-04-18T19:23:08.717Z + +**Verdict:** 15 PASS / 6 DEFER / 0 FAIL (of 21) +**Mode:** default +**Exit code:** 0 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | DEFER | --version OK (0.1.0); smoke skipped via --skip-tests | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | DEFER | skipped via --skip-build | +| 6 | template-quality workflow green on main | DEFER | skipped via --skip-network | +| 7 | Meilisearch /health reports available | DEFER | skipped via --skip-network | +| 8 | Workspace typecheck + tests green | DEFER | skipped via --skip-tests | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 30 tests (≥8 required); marketplace query + badge wired; public detail route uses canonical marketplaceInclusionSql | + +## Phase 2 Gate — 2026-04-18T19:42:52.026Z + +**Verdict:** 17 PASS / 3 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | gallery index missing at /Users/lex/settlegrid/apps/web/.next/server/app/templates/page.html | +| 6 | template-quality workflow green on main | DEFER | skipped via --skip-network | +| 7 | Meilisearch /health reports available | DEFER | skipped via --skip-network | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 30 tests (≥8 required); marketplace query + badge wired; public detail route uses canonical marketplaceInclusionSql | + +## Phase 2 Gate — 2026-04-18T19:45:50.703Z + +**Verdict:** 17 PASS / 3 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | only 1 shadow pages (expected ≥1000) | +| 6 | template-quality workflow green on main | DEFER | skipped via --skip-network | +| 7 | Meilisearch /health reports available | DEFER | skipped via --skip-network | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 30 tests (≥8 required); marketplace query + badge wired; public detail route uses canonical marketplaceInclusionSql | + +## Phase 2 Gate — 2026-04-18T20:17:39.594Z + +**Verdict:** 14 PASS / 6 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | DEFER | --version OK (0.1.0); smoke skipped via --skip-tests | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | DEFER | skipped via --skip-build | +| 6 | template-quality workflow green on main | DEFER | skipped via --skip-network | +| 7 | Meilisearch /health reports available | DEFER | skipped via --skip-network | +| 8 | Workspace typecheck + tests green | DEFER | skipped via --skip-tests | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | FAIL | claim route does not set listedInMarketplace=true (spec DoD item 3) | + +## Phase 2 Gate — 2026-04-18T20:18:04.528Z + +**Verdict:** 15 PASS / 6 DEFER / 0 FAIL (of 21) +**Mode:** default +**Exit code:** 0 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | DEFER | --version OK (0.1.0); smoke skipped via --skip-tests | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | DEFER | skipped via --skip-build | +| 6 | template-quality workflow green on main | DEFER | skipped via --skip-network | +| 7 | Meilisearch /health reports available | DEFER | skipped via --skip-network | +| 8 | Workspace typecheck + tests green | DEFER | skipped via --skip-tests | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 40 tests (≥8 required); marketplace query + badge wired; public detail route uses canonical marketplaceInclusionSql | + +## Phase 2 Gate — 2026-04-18T20:40:31.148Z + +**Verdict:** 16 PASS / 3 DEFER / 2 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | only 1 shadow pages (expected ≥1000) | +| 6 | template-quality workflow green on main | DEFER | gh run list exit 1: HTTP 404: workflow template-quality.yml not found on the default branch (https://api.github.com/repos/lexwhiting/settlegrid/actions/workflows/template-quality.yml) | +| 7 | Meilisearch /health reports available | DEFER | NEXT_PUBLIC_MEILI_URL / MEILI_URL not set | +| 8 | Workspace typecheck + tests green | FAIL | turbo test exit 1: @settlegrid/ai-sdk:test: ERROR: command finished with error: command (/Users/lex/settlegrid/packages/ai-sdk) /usr/local/bin/npm run test exited (1) @settlegrid/ai-sdk#test: command (/Users/lex/settlegrid/packages/ai-sdk) /usr/local/bin/npm run test exited (1) ERROR run failed: command exited (1) | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 40 tests (≥8 required); marketplace query + badge wired; public detail route uses canonical marketplaceInclusionSql | + +## Phase 2 Gate — 2026-04-18T20:47:03.680Z + +**Verdict:** 17 PASS / 3 DEFER / 1 FAIL (of 21) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | CLI installable + smoke passes | PASS | --version 0.1.0, smoke PASS | +| 2 | Registry exists, validates, ≥20 templates | PASS | 20 templates, all valid | +| 3 | Canonical 20 templates polished (4 files each) | PASS | 20 templates × 4 files present, all template.json valid | +| 4 | Shadow directory populated (≥1000 rows) | DEFER | DATABASE_URL not set in env | +| 5 | SSG build emits gallery + ≥1000 shadow pages | FAIL | only 1 shadow pages (expected ≥1000) | +| 6 | template-quality workflow green on main | DEFER | skipped via --skip-network | +| 7 | Meilisearch /health reports available | DEFER | skipped via --skip-network | +| 8 | Workspace typecheck + tests green | PASS | tsc clean (mcp+web), 10/10 turbo tasks | +| 9 | K1 — marketplace proxy uses unified adapter package | PASS | 2 file(s) reference unified-adapter dispatch (protocolRegistry / decideUnifiedDispatch) | +| 10 | K2 — 13 lib/*-proxy.ts migrated to adapter classes | PASS | 13 file(s) are thin shims importing @settlegrid/mcp | +| 11 | K3 — proxy-vs-kernel snapshot test exists + included in test runner | PASS | proxy-equivalence.test.ts present with 86 test declarations | +| 12 | K4 — typed MeterContext + lifecycle stubs | PASS | MeterContext + 4 lifecycle stubs present | +| 13 | FMT1 — @settlegrid/ai-sdk package builds + ≥6 tests | PASS | build + 64 tests pass | +| 14 | FMT2 — @settlegrid/mastra package builds + ≥6 tests | PASS | build + 88 tests pass | +| 15 | FMT3 — TS adapter packages polished/rebranded (@settlegrid namespace + READMEs) | PASS | 3/3 present, all @settlegrid + README | +| 16 | FMT4 — n8n Invoke operation node | PASS | invokeTool operation present in SettleGrid.node.ts (n8n smoke test deferred — needs local n8n runtime) | +| 17 | MKT1 — /compare/nevermined draft page | PASS | comparison page present | +| 18 | RAIL1 — Stripe behind RailAdapter (no direct stripe imports in lib/stripe-*) | PASS | RailAdapter + StripeRailAdapter exported; 1 lib/stripe-*.ts file(s) routed through adapter | +| 19 | COMP1 — OFAC + AUP + IR playbook docs | PASS | all 3 COMP1 docs present | +| 20 | INTL1 — country tracker + Wise stopgap SOP | PASS | both INTL1 artifacts present (cohort-1 enumeration check pending list spec) | +| 21 | INTL2 — marketplace visibility for claimed-but-unpublished tools | PASS | all 7 INTL2 artifacts present; claim route sets listedInMarketplace=true; 40 tests (≥8 required); marketplace query + badge wired; public detail route uses canonical marketplaceInclusionSql | + +## Phase 3 Gate — 2026-04-21T22:58:50.688Z + +**Verdict:** 9 PASS / 13 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | PASS | cron='0 6 * * 0' (weekly Sunday sweep) | +| 8 | Workspace typecheck passes (tsc --noEmit per package) | PASS | apps/web=PASS, packages/mcp=PASS | +| 9 | pnpm -w test passes across workspace (using npm+turbo) | PASS | turbo test exit=0; 10 successful | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 64 across 7 test files | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; adapter-l402.test.ts has 18 it() blocks | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T00:09:54.688Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 64 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T00:10:43.731Z + +**Verdict:** 6 PASS / 15 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | DEFER | skipped via --skip-tests | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 64 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T00:11:52.464Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 64 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T00:35:02.104Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 45 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T00:36:47.925Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 45 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T00:51:24.308Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 45 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.PROT1 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.K6/P3.RAIL2 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.PROT1/P3.MKT directory-expansion prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K5 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T13:36:38.390Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 45 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 15/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-22T17:33:22.677Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 45 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 14/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-23T17:41:25.043Z + +**Verdict:** 7 PASS / 14 DEFER / 6 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 45 across 7 test files; 4 of 7 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | FAIL | all adapter-l402 tests are contract-level (no LND/voltage env, no fetch mock); integration coverage missing | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 13/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-23T18:10:54.370Z + +**Verdict:** 8 PASS / 14 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 13/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-23T18:14:25.933Z + +**Verdict:** 8 PASS / 14 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (10 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | DEFER | packages/client/ missing — P3.K3 prompt not yet shipped | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 13/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-23T18:33:45.677Z + +**Verdict:** 9 PASS / 13 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=51 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 13/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-23T18:54:56.965Z + +**Verdict:** 9 PASS / 13 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=52 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 12/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-23T19:10:04.195Z + +**Verdict:** 9 PASS / 13 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=77 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 12/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T00:24:12.234Z + +**Verdict:** 9 PASS / 13 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: verifyWebhook in SDK, ledger_entries migration SQL, adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 12/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T00:45:47.670Z + +**Verdict:** 9 PASS / 13 DEFER / 5 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | FAIL | missing: adapter-dispatch → ledger wiring | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 12/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T00:48:42.475Z + +**Verdict:** 10 PASS / 13 DEFER / 4 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 12/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T00:58:46.373Z + +**Verdict:** 10 PASS / 13 DEFER / 4 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 11/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T01:12:40.622Z + +**Verdict:** 10 PASS / 13 DEFER / 4 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 11/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T01:22:02.054Z + +**Verdict:** 10 PASS / 13 DEFER / 4 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | FAIL | drain.ts still uses sha256 stand-in or lacks keccak vector test — see P3.K5 | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 11/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T03:02:30.684Z + +**Verdict:** 11 PASS / 13 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 11/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T03:15:05.536Z + +**Verdict:** 11 PASS / 13 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 10/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T13:44:34.393Z + +**Verdict:** 11 PASS / 13 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 10/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T13:52:01.664Z + +**Verdict:** 11 PASS / 13 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | DEFER | packages/mcp/src/authorize.ts missing — P3.K6 prompt not yet shipped | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 10/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T14:06:57.976Z + +**Verdict:** 12 PASS / 12 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 10/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T14:19:08.384Z + +**Verdict:** 12 PASS / 12 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T23:24:19.371Z + +**Verdict:** 11 PASS / 12 DEFER / 4 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | FAIL | main:apps/web=PASS, main:packages/mcp=FAIL(1 errors), agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T23:26:39.120Z + +**Verdict:** 12 PASS / 12 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-24T23:38:03.225Z + +**Verdict:** 12 PASS / 12 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (11 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | FAIL | partial: missing packages/rails/src/router.ts, stripe-connect-countries.json, /api/eligibility — see P3.RAIL1 | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T02:08:27.649Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T02:09:32.963Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T03:16:20.860Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T03:35:19.689Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:05:27.038Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: reconcile-stripe.ts, daily cron workflow, dry-run report | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:28:27.611Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: daily cron workflow | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:29:33.458Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: daily cron workflow | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:30:39.326Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: daily cron workflow | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:31:56.038Z + +**Verdict:** 13 PASS / 12 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | DEFER | missing: daily cron workflow | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:33:40.897Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T12:48:02.277Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T13:01:19.927Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T13:02:25.194Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T13:03:48.543Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T13:13:57.131Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T13:16:48.038Z + +**Verdict:** 14 PASS / 11 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | DEFER | missing: /dashboard/payouts page, chargeback-velocity.ts, /dashboard/admin/chargeback-watch, chargeback_alerts table | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T19:22:59.931Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T19:37:35.586Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T19:49:37.807Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T19:51:10.914Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T19:52:20.024Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T20:09:48.513Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T20:11:02.332Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T20:20:52.244Z + +**Verdict:** 15 PASS / 10 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | DEFER | packages/sdk-python/ missing — P3.PYTHON1 prompt not yet shipped | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | packages/sdk-python/ missing; cascades from C19 | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T20:35:51.764Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T20:37:00.649Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T20:45:08.984Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T23:34:28.069Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-25T23:49:14.572Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 9/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:09:43.997Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 8/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:10:57.768Z + +**Verdict:** 16 PASS / 9 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | DEFER | cascades until P3.PYTHON2 lands: cannot measure parity without SDK | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 8/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:12:53.108Z + +**Verdict:** 17 PASS / 8 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=282, tsTests(SDK-relevant)=300, parity=94%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 8/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:20:13.211Z + +**Verdict:** 17 PASS / 8 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=282, tsTests(SDK-relevant)=300, parity=94%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 8/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:26:58.255Z + +**Verdict:** 17 PASS / 8 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=282, tsTests(SDK-relevant)=300, parity=94%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 7/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:36:30.168Z + +**Verdict:** 17 PASS / 8 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | DEFER | no Python settlegrid-langchain package — P3.PYTHON3 prompt not yet shipped | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 7/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:51:10.559Z + +**Verdict:** 18 PASS / 7 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=23, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 7/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T00:59:13.088Z + +**Verdict:** 17 PASS / 7 DEFER / 3 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | FAIL | package=/packages/sdk-python-langchain, tests=0, metered_tool exported=true — needs ≥8 tests | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 7/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T01:00:51.791Z + +**Verdict:** 18 PASS / 7 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 7/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T01:09:25.159Z + +**Verdict:** 18 PASS / 7 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T01:16:46.551Z + +**Verdict:** 18 PASS / 7 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters | DEFER | missing packages — P3.PYTHON4 prompt not yet shipped | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T01:34:43.157Z + +**Verdict:** 19 PASS / 6 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=11), crewai(tests=9), pydantic-ai(tests=10)] | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T01:46:48.681Z + +**Verdict:** 19 PASS / 6 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=12), crewai(tests=10), pydantic-ai(tests=11)] | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T01:47:52.181Z + +**Verdict:** 19 PASS / 6 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=12), crewai(tests=10), pydantic-ai(tests=11)] | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T03:11:34.963Z + +**Verdict:** 19 PASS / 6 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters | DEFER | missing packages — P3.PYTHON5 prompt not yet shipped | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T03:24:25.658Z + +**Verdict:** 20 PASS / 5 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T03:29:52.994Z + +**Verdict:** 20 PASS / 5 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T15:39:07.082Z + +**Verdict:** 20 PASS / 5 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 6/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T15:45:51.235Z + +**Verdict:** 20 PASS / 5 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 5/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T16:02:03.805Z + +**Verdict:** 20 PASS / 5 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | DEFER | /protocols/mastercard-vi page not built yet — P3.PROT1 prompt not yet shipped | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 5/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T16:24:16.676Z + +**Verdict:** 21 PASS / 4 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | PASS | adapter=true, landing=true | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 5/15 expansion prompts have no audit-chain commits — Phase 4 blocked | + +## Phase 3 Gate — 2026-04-26T16:30:36.594Z + +**Verdict:** 21 PASS / 4 DEFER / 2 FAIL (of 27) +**Mode:** default +**Exit code:** 1 + +| # | Check | Status | Detail | +|---|-------|--------|--------| +| 1 | ≥75 new templates in open-source-servers/ | FAIL | only 72 new templates (<75) | +| 2 | Templater total cost ≤$300 | PASS | well under $300 cap (70 upper bound) | +| 3 | Templater global reject rate <30% | PASS | 18.1% < 30% | +| 4 | ≥2 WG outreach replies logged (founder-manual verify) | DEFER | replies.md not present at /Users/lex/settlegrid-agents/data/wg-outreach/replies.md — founder has not yet logged replies; P3.5 briefs shipped but outreach emails are founder-sent (not agent-sent) | +| 5 | ≥5 directory submissions sent | FAIL | only 0 submissions logged as sent/accepted (<5). Founder-manual verification: confirm whether submissions were sent but status column not updated | +| 6 | Academy lessons 1-5 published at /learn/academy | PASS | registry slugs=[pricing-your-mcp-server, per-call-vs-subscription, stripe-vs-settlegrid-vs-x402, economics-of-tool-calling, calculate-margin-on-ai-api], body files=5, routes=[all present] | +| 7 | Template CI pipeline running weekly | DEFER | workflow configured locally but not yet on the default branch — push origin/main to unblock first weekly run | +| 8 | Workspace typecheck passes across both repos (tsc --noEmit) | PASS | main:apps/web=PASS, main:packages/mcp=PASS, agents=PASS | +| 9 | Tests pass across both repos | PASS | main:PASS (12 successful); agents:Tests=863 passed (863) | +| 10 | All P3.1–P3.11 audit chains PASS | PASS | checked 11 audit chains across main + agents repos; missing stages: none | +| 11 | MPP adapter wired (≥12 unit tests, Stripe test mode) | PASS | MPPAdapter exported; measured MPP-referencing test blocks = 113 across 8 test files; 5 of 8 test files reference Stripe test-mode context | +| 12 | L402 adapter wired with Voltage backend (≥1 integration test) | PASS | l402.ts present; LND wiring=true; L402 test files found=2; total it() blocks=104; integration-test markers matched: 2 of 8 | +| 13 | Consumer SDK shipped (packages/client/ builds, ≥18 unit tests) | PASS | package=@settlegrid/client, createSettleGridClient exported=true, test files=1, it() blocks=109 | +| 14 | Per-rail pricing + unified ledger + tool-secret auth + verifyWebhook in SDK | PASS | ledger-table=true, protocol-on-sessions=true, rail-on-ledger=true, toolSecret-in-kernel=true, verifyWebhook-in-SDK=true, ledger-migration=true, settlement-ledger-module=true, ledger-imports-in-api=1 | +| 15 | DRAIN keccak-256 fix OR removal | PASS | drain.ts present; noble-keccak import=true; explicit-stand-in-comment=false; vector-test-in-suite=true | +| 16 | Stripe account-type router + eligibility pre-check + waitlist shipped | PASS | router=true, countries=true, eligibility=true, waitlist-table=true, waitlist-route=true | +| 17 | Stripe Connect reconciliation + drift detection | PASS | script=true, workflow=stripe-reconcile.yml, 08:00-cron=true, report-present=true | +| 18 | Payout schedule config + chargeback velocity monitoring | PASS | payouts-page=true, velocity-script=true, watch-page=true, alerts-table=true | +| 19 | Python SDK core (packages/sdk-python/ builds + pip install -e .) | PASS | packages/sdk-python/ present with pyproject.toml | +| 20 | Python SDK test parity ≥90% of TS SDK + CI matrix 3.10/3.11/3.12 | PASS | pyTests=288, tsTests(SDK-relevant)=300, parity=96%, CI=present, matrix=3.10+3.11+3.12 × ubuntu+macos | +| 21 | settlegrid-langchain Python adapter (≥8 tests) | PASS | package=/packages/sdk-python-langchain, tests=30, metered_tool exported=true | +| 22 | settlegrid-llamaindex + crewai + pydantic-ai Python adapters (≥5 tests, metered_tool exported) | PASS | ok=[llamaindex(tests=17), crewai(tests=17), pydantic-ai(tests=15)] | +| 23 | settlegrid-dspy + smolagents Python adapters (≥5 tests, metered_tool exported, framework version pinned) | PASS | ok=[dspy(tests=15,pinned), smolagents(tests=15,pinned)] | +| 24 | Mastercard VI detection stub (adapter + landing page) | PASS | adapter=true, landing=true | +| 25 | cursor.directory submission packet | DEFER | cursor.directory packet missing — P3.13 prompt not yet shipped | +| 26 | Pre-execution authorization gate (authorize.ts + kernel wiring + ≥20 tests) | PASS | authorize.ts present; authorizeInvocation=true; AuthorizationPlugin=true; kernel-calls=true | +| 27 | All settlement-layer expansion audit chains PASS | DEFER | 5/15 expansion prompts have no audit-chain commits — Phase 4 blocked | diff --git a/CANONICAL_20.json b/CANONICAL_20.json new file mode 100644 index 00000000..77d9e5f1 --- /dev/null +++ b/CANONICAL_20.json @@ -0,0 +1,168 @@ +{ + "version": 1, + "generatedAt": "2026-04-16", + "source": "CANONICAL_50.json", + "selectionCriteria": "Category diversity (>=2 per used manifest category), all TypeScript (language mix deferred — CANONICAL_50 has no Python/JS templates), monetization potential, repo health (all score >=92)", + "entries": [ + { + "slug": "github-api", + "name": "GitHub API", + "score": 94, + "sourceCategory": "developer", + "manifestCategory": "devtools", + "selectionRationale": "Developer platform with massive audience; natural devtools fit; high call volume from CI/CD and agent workflows" + }, + { + "slug": "gitlab-api", + "name": "GitLab API", + "score": 94, + "sourceCategory": "developer", + "manifestCategory": "devtools", + "selectionRationale": "CI/CD integration complement to GitHub; enterprise demand; pipelines and MR data are high-value" + }, + { + "slug": "cve-search", + "name": "CVE Search", + "score": 93, + "sourceCategory": "security", + "manifestCategory": "devtools", + "selectionRationale": "Vulnerability scanning is core devtools use case; NVD data is enterprise-grade; security teams pay for speed" + }, + { + "slug": "virustotal", + "name": "VirusTotal", + "score": 93, + "sourceCategory": "security", + "manifestCategory": "devtools", + "selectionRationale": "Premium malware analysis data; high value per call; SOC/IR teams are natural buyers" + }, + { + "slug": "urlscan", + "name": "URLScan", + "score": 93, + "sourceCategory": "security", + "manifestCategory": "devtools", + "selectionRationale": "URL threat scanning; complements CVE/VirusTotal for full security devtools coverage" + }, + { + "slug": "spotify-metadata", + "name": "Spotify Metadata", + "score": 94, + "sourceCategory": "entertainment", + "manifestCategory": "media", + "selectionRationale": "Massive consumer brand; music search has broad audience; high call volume from recommendation agents" + }, + { + "slug": "tmdb", + "name": "TMDB", + "score": 94, + "sourceCategory": "entertainment", + "manifestCategory": "media", + "selectionRationale": "Movie/TV data with huge audience; entertainment agents are a growing segment" + }, + { + "slug": "guardian", + "name": "The Guardian", + "score": 94, + "sourceCategory": "news", + "manifestCategory": "media", + "selectionRationale": "Quality news source; article search is high-volume; natural fit for research/summarization agents" + }, + { + "slug": "podcast-index", + "name": "Podcast Index", + "score": 94, + "sourceCategory": "entertainment", + "manifestCategory": "media", + "selectionRationale": "Growing podcast market; discovery and search are natural agent workflows" + }, + { + "slug": "nasa-data", + "name": "NASA Open Data", + "score": 94, + "sourceCategory": "science", + "manifestCategory": "research", + "selectionRationale": "Iconic brand; free upstream API; APOD and NEO data have broad education + research appeal" + }, + { + "slug": "open-alex", + "name": "OpenAlex", + "score": 94, + "sourceCategory": "science", + "manifestCategory": "research", + "selectionRationale": "Academic research database; growing replacement for Microsoft Academic; high value for research agents" + }, + { + "slug": "gutenberg", + "name": "Project Gutenberg", + "score": 94, + "sourceCategory": "education", + "manifestCategory": "research", + "selectionRationale": "Free ebook library; unique content source; NLP and education agents benefit" + }, + { + "slug": "etymology", + "name": "Etymology & Definitions", + "score": 92, + "sourceCategory": "language", + "manifestCategory": "research", + "selectionRationale": "Word origins and definitions; language tools have steady demand; unique niche in research category" + }, + { + "slug": "flight-prices", + "name": "Flight Prices", + "score": 94, + "sourceCategory": "travel", + "manifestCategory": "data", + "selectionRationale": "High-value travel pricing data; obvious monetization — agents planning trips need real-time prices" + }, + { + "slug": "opensky", + "name": "OpenSky Network", + "score": 94, + "sourceCategory": "travel", + "manifestCategory": "data", + "selectionRationale": "Real-time flight tracking; ADS-B data is unique and high-demand; aviation analytics" + }, + { + "slug": "spoonacular", + "name": "Spoonacular", + "score": 94, + "sourceCategory": "food", + "manifestCategory": "data", + "selectionRationale": "Comprehensive recipe + nutrition API; high call volume from meal planning agents" + }, + { + "slug": "api-football", + "name": "API Football", + "score": 94, + "sourceCategory": "sports", + "manifestCategory": "data", + "selectionRationale": "Global football/soccer data; massive market; fixtures and standings drive high call volume" + }, + { + "slug": "clinicaltrials", + "name": "ClinicalTrials.gov", + "score": 93, + "sourceCategory": "health", + "manifestCategory": "data", + "selectionRationale": "Pharma/health data; high value per call; regulatory and research demand" + }, + { + "slug": "openaq", + "name": "OpenAQ", + "score": 93, + "sourceCategory": "environment", + "manifestCategory": "data", + "selectionRationale": "Air quality data; ESG compliance and environmental monitoring are growing markets" + }, + { + "slug": "holidays-worldwide", + "name": "Holidays Worldwide", + "score": 92, + "sourceCategory": "education", + "manifestCategory": "data", + "selectionRationale": "Reference data for calendar integration; travel and scheduling agents need holiday awareness" + } + ] +} diff --git a/CANONICAL_50.json b/CANONICAL_50.json new file mode 100644 index 00000000..2a76e67b --- /dev/null +++ b/CANONICAL_50.json @@ -0,0 +1,758 @@ +{ + "version": 1, + "generatedAt": "2026-04-12T02:43:48.832Z", + "rubricHash": "sha256:03d6cf126a8ca3dd", + "templates": [ + { + "slug": "settlegrid-anime", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "entertainment" + }, + { + "slug": "settlegrid-api-football", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-aviationstack", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "travel" + }, + { + "slug": "settlegrid-chess", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-fifa", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-flight-prices", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "travel" + }, + { + "slug": "settlegrid-football-data", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-github-api", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "developer" + }, + { + "slug": "settlegrid-gitlab-api", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "developer" + }, + { + "slug": "settlegrid-guardian", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "news" + }, + { + "slug": "settlegrid-gutenberg", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "education" + }, + { + "slug": "settlegrid-listennotes", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "entertainment" + }, + { + "slug": "settlegrid-mealdb", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "food" + }, + { + "slug": "settlegrid-mlb-stats", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-nasa-data", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "science" + }, + { + "slug": "settlegrid-newsapi", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "news" + }, + { + "slug": "settlegrid-nfl-data", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-open-alex", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "science" + }, + { + "slug": "settlegrid-opensky", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "travel" + }, + { + "slug": "settlegrid-picsum-photos", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "photos" + }, + { + "slug": "settlegrid-podcast-index", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "entertainment" + }, + { + "slug": "settlegrid-reddit-news", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "social" + }, + { + "slug": "settlegrid-rugby", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-spoonacular", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "food" + }, + { + "slug": "settlegrid-spotify-metadata", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "entertainment" + }, + { + "slug": "settlegrid-tennis", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "sports" + }, + { + "slug": "settlegrid-themealdb", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "food" + }, + { + "slug": "settlegrid-tmdb", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "entertainment" + }, + { + "slug": "settlegrid-tvmaze", + "score": 94, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "entertainment" + }, + { + "slug": "settlegrid-allergy-data", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-bmi-calculator", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-carbon-offset", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "environment" + }, + { + "slug": "settlegrid-clinicaltrials", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-cve-search", + "score": 93, + "breakdown": { + "readme": 12, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "security" + }, + { + "slug": "settlegrid-disease-sh", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-exercisedb", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-first-aid", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-green-energy", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "environment" + }, + { + "slug": "settlegrid-malware-bazaar", + "score": 93, + "breakdown": { + "readme": 12, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "security" + }, + { + "slug": "settlegrid-nutrition-data", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-openaq", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "environment" + }, + { + "slug": "settlegrid-plastic-pollution", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "environment" + }, + { + "slug": "settlegrid-renewable-tracker", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "environment" + }, + { + "slug": "settlegrid-uk-nhs", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-urlscan", + "score": 93, + "breakdown": { + "readme": 12, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "security" + }, + { + "slug": "settlegrid-virustotal", + "score": 93, + "breakdown": { + "readme": 12, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "security" + }, + { + "slug": "settlegrid-yoga-api", + "score": 93, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 15, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 9 + }, + "categoryTag": "health" + }, + { + "slug": "settlegrid-smithsonian", + "score": 92, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 13, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "science" + }, + { + "slug": "settlegrid-etymology", + "score": 92, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 13, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "language" + }, + { + "slug": "settlegrid-holidays-worldwide", + "score": 92, + "breakdown": { + "readme": 13, + "tools": 10, + "schema": 13, + "gates": 25, + "deps": 10, + "docker": 6, + "category": 5, + "novelty": 10 + }, + "categoryTag": "education" + } + ], + "rejected": 972 +} diff --git a/DEMAND_GENERATION_PLAN.md b/DEMAND_GENERATION_PLAN.md new file mode 100644 index 00000000..c2e1bbbd --- /dev/null +++ b/DEMAND_GENERATION_PLAN.md @@ -0,0 +1,2479 @@ +# SettleGrid Demand Generation Implementation Plan + +## Master Document for All 35 Recommendations + +**Created:** 2026-03-28 + +> **Historical snapshot (2026-04-15).** This document predates the P1.MKT1 +> honest-framing rewrite; protocol shorthand may appear in the body. +> Canonical name mapping in +> [docs/audits/15-protocol-claim.md](docs/audits/15-protocol-claim.md). +**Source:** Comprehensive demand generation research (30 greenlit recommendations + 5 gap-filling items) +**Scope:** Full implementation details for every item, organized into 4 phases + +--- + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Flywheel Diagram](#flywheel-diagram) +- [Critical Path](#critical-path) +- [Phase 1: Immediate Wins (Ship This Week)](#phase-1-immediate-wins-ship-this-week) +- [Phase 2: Short-Term Projects (1-2 Weeks)](#phase-2-short-term-projects-1-2-weeks) +- [Phase 3: Medium-Term Initiatives (1-2 Months)](#phase-3-medium-term-initiatives-1-2-months) +- [Phase 4: Long-Term Bets (3-6 Months)](#phase-4-long-term-bets-3-6-months) +- [Gap-Filling Items](#gap-filling-items) +- [Risk Assessment](#risk-assessment) +- [Resource Requirements](#resource-requirements) + +--- + +## Architecture Overview + +SettleGrid's existing infrastructure that these recommendations build on: + +- **18 Vercel cron jobs** defined in `apps/web/vercel.json` (health checks, webhook retry, alert check, abandoned checkout, session expiry, usage aggregation, onboarding drip, quality check, monthly summary, crawl-registry, monitor-reddit, monitor-github-repos, weekly-report, claim-outreach, crawl-services, data-retention, ecosystem-metrics, gridbot, anomaly-detection) +- **MCP Discovery Server** at `apps/web/src/app/api/mcp/route.ts` (4 tools: search_tools, get_tool, list_categories, get_developer) +- **Discovery API** at `/api/v1/discover` (public, no auth) +- **Smart Proxy** for tool invocation routing +- **Badge endpoints** at `apps/web/src/app/api/badge/` (tool status, powered-by, dev, embed.js) +- **6 framework definitions** in `apps/web/src/lib/frameworks.ts` (LangChain, CrewAI, smolagents, AutoGen, Semantic Kernel, Mastra) +- **6 packages** in `packages/` (mcp SDK, langchain-settlegrid, n8n-settlegrid, publish-action, create-settlegrid-tool, discovery-server) +- **Programmatic SEO** routes: `/explore/category/[cat]`, `/explore/for/[framework]`, `/explore/collections/[slug]`, `/marketplace/[type]`, `/marketplace/ecosystem/[eco]`, `/guides/monetize-[cat]-tools`, `/tools/[slug]` +- **Ask SettleGrid** at `apps/web/src/app/ask/page.tsx` (single-question, 3/day rate limit) +- **Blog infrastructure** at `/learn/blog/[slug]` with `BLOG_SLUGS` +- **Email system** at `apps/web/src/lib/email.ts` +- **Existing JSON-LD** on tool pages: `Product` and `BreadcrumbList` schemas + +--- + +## Flywheel Diagram + +``` + +---------------------+ + | More Tools Indexed | + | (crawlers, claims) | + +----------+----------+ + | + v + +---------------------+ + | More SEO Pages | + | (JSON-LD, sitemap, | + | comparison pages) | + +----------+----------+ + | + v + +----------------+----------------+ + | More Search Traffic | + | (Google, AI search, registries) | + +----------------+----------------+ + | + +---------------+---------------+ + | | + v v + +----------+----------+ +----------+----------+ + | More Consumers | | More Developers | + | (Ask SG, widgets, | | (badges, referrals,| + | chat, digests) | | spotlight) | + +----------+----------+ +----------+----------+ + | | + v v + +----------+----------+ +----------+----------+ + | More Invocations |<------->| More Tools | + | (schedules, pipes, | | (hero tools, SDK, | + | meta-MCP, events) | | templates) | + +----------+----------+ +----------+----------+ + | | + +---------------+---------------+ + | + v + +---------------------+ + | Better Recs & Data | + | (analytics, ratings,| + | leaderboards) | + +----------+----------+ + | + +----> feeds back to top +``` + +**Which items feed which:** + +| Source Item | Feeds Into | +|---|---| +| #1 robots.txt fix | More SEO pages crawled -> more search traffic | +| #2 SoftwareApplication JSON-LD | Richer SERP results -> more search traffic | +| #3 FAQPage schema | Richer SERP results -> more search traffic | +| #4 Sitemap expansion | More pages indexed -> more search traffic | +| #5 llms.txt update | AI search recommends tools -> more consumers | +| #6 Canonical tags | Prevents duplicate dilution -> stronger rankings | +| #7 Ask SG email capture | Traffic -> registered consumers | +| #8 Comparison pages | Bottom-funnel search traffic -> consumers | +| #10 Ask SG multi-turn | Consumer engagement -> invocations -> revenue | +| #13 Badge campaign | Backlinks -> domain authority -> rankings | +| #14 Scheduled invocations | One-time setup -> recurring invocations | +| #15 Pipeline builder | Multiplied invocations per user action | +| #25 Meta-MCP Server | One connection -> all tools -> massive invocations | +| #26 Hero tools | Supply guarantee -> consumer trust -> invocations | +| #31 Email digest | Repeat visits -> more invocations | +| #32 Leaderboard | Social proof -> developer competition -> more tools | + +--- + +## Critical Path + +``` +Phase 1 (Week 1): + #1 robots.txt -----> unblocks crawler access (prerequisite for all SEO) + #2 JSON-LD --------> independent + #3 FAQPage --------> independent + #4 sitemap --------> independent (uses existing FRAMEWORK_SLUGS) + #5 llms.txt -------> independent + #6 canonical ------> independent + #7 Ask SG capture -> independent + +Phase 2 (Weeks 2-3): + #13 badge campaign -> independent (badges already built) + #12 registry submissions -> independent (MCP server already built) + #8 comparison pages -> independent (competitive data exists) + #11 blog pipeline --> depends on tool data in DB + #9 rec widget -----> depends on Discovery API (already built) + #10 Ask SG chat ---> depends on #7 (email capture flow) + #14 scheduled inv -> independent (heavy; start early) + #15 pipeline ------> depends on #14 (shares invocation infrastructure) + +Phase 3 (Weeks 4-8): + #16 LangChain int -> depends on #28 Python SDK (Phase 4, start early) + #17 Zapier/n8n ----> depends on n8n package (already built) + #18 webhook events -> depends on Svix (already integrated) + #19 intent detect -> depends on Reddit monitor (already built) + #20 analytics -----> depends on invocations data (already in DB) + #21 affiliate -----> depends on purchase flow (already built) + #22 edge caching --> depends on Upstash Redis (already configured) + #23 volume packs --> depends on Stripe (already integrated) + #24 spotlight -----> depends on weekly-report cron (already built) + +Phase 4 (Months 2-6): + #25 Meta-MCP ------> depends on MCP server + Smart Proxy (both built) + #26 hero tools ----> depends on open-source templates (991 exist) + #27 enterprise ----> depends on consumer balance system (already built) + #28 Python SDK ----> blocks #16 LangChain integration + #29 academic ------> depends on consumer signup flow + #30 SLA failover --> depends on Smart Proxy + Discovery API +``` + +**Blocking relationships:** +- #28 Python SDK blocks #16 LangChain official integration +- #7 Ask SG email capture enables #10 multi-turn chat (shared user model) +- #14 scheduled invocations shares infrastructure with #15 pipelines +- #1 robots.txt should ship before any other SEO work for maximum impact + +--- + +## Phase 1: Immediate Wins (Ship This Week) + +### Item 1: Fix robots.txt API Whitelist + +**What:** Update robots.txt to allow crawling of public API endpoints (Discovery API, feed, badges, OpenAPI spec, marketplace stats) while keeping private endpoints disallowed. + +**Why:** The current `robots.ts` disallows `/api/` entirely, blocking search engines and AI crawlers from indexing `/api/v1/discover`, `/api/feed`, `/api/openapi.json`, `/api/badge/*`, `/api/widget/*`, and `/api/marketplace/*`. These are public endpoints specifically designed for discovery. Fixing this is the highest-ROI action in the entire plan: 15 minutes of work unblocks every crawler. + +**Files to modify:** +- `apps/web/src/app/robots.ts` + +**Implementation approach:** +```typescript +// apps/web/src/app/robots.ts +import type { MetadataRoute } from 'next' + +export default function robots(): MetadataRoute.Robots { + return { + rules: [ + { + userAgent: '*', + allow: [ + '/', + '/api/v1/discover', + '/api/v1/discover/categories', + '/api/v1/discover/developers', + '/api/feed', + '/api/openapi.json', + '/api/badge/', + '/api/widget/', + '/api/marketplace/stats', + '/api/marketplace/bundles', + ], + disallow: [ + '/api/', + '/dashboard/', + '/consumer/', + ], + }, + ], + sitemap: 'https://settlegrid.ai/sitemap.xml', + } +} +``` + +The key is that `robots.txt` processes rules top-to-bottom, and more specific `Allow` rules override broader `Disallow` rules for most major crawlers (Googlebot, Bingbot). By listing the specific `/api/v1/discover`, `/api/feed`, etc. in `allow` alongside the blanket `/api/` in `disallow`, crawlers will index the public endpoints while respecting the restriction on private API routes. + +**Dependencies:** None. + +**Estimated time:** 15 minutes. + +**Success metric:** Google Search Console shows the Discovery API URLs indexed within 1-2 weeks. Verify via `site:settlegrid.ai/api/v1/discover` in Google. + +**Priority within phase:** 1 of 7 (ship first -- unblocks all SEO improvements). + +--- + +### Item 2: JSON-LD SoftwareApplication Schema on Tool Pages + +**What:** Add `SoftwareApplication` structured data to every tool detail page alongside the existing `Product` and `BreadcrumbList` JSON-LD, enabling Google's software rich results. + +**Why:** The existing `Product` schema tells Google "this is a physical product." `SoftwareApplication` is the correct schema type for API/tool listings and enables software-specific rich results (application category, operating system, version). RapidAPI ranks partly due to correct schema typing. Each of the 1,444+ tool pages becomes eligible for richer SERP display. + +**Files to modify:** +- `apps/web/src/app/tools/[slug]/page.tsx` + +**Implementation approach:** + +After the existing `jsonLdBreadcrumb` definition (around line 234), add: + +```typescript +const jsonLdSoftware = { + '@context': 'https://schema.org', + '@type': 'SoftwareApplication', + name: tool.name, + description: tool.description, + applicationCategory: 'DeveloperApplication', + applicationSubCategory: categoryDef?.name ?? tool.category, + operatingSystem: 'Any', + url: `https://settlegrid.ai/tools/${tool.slug}`, + author: { + '@type': 'Organization', + name: tool.developerName, + }, + offers: { + '@type': 'Offer', + price: priceUsd, + priceCurrency: 'USD', + availability: 'https://schema.org/InStock', + }, + softwareVersion: tool.currentVersion, + ...(tool.reviewCount > 0 && { + aggregateRating: { + '@type': 'AggregateRating', + ratingValue: tool.averageRating.toFixed(1), + reviewCount: tool.reviewCount, + bestRating: 5, + worstRating: 1, + }, + }), +} +``` + +Add the corresponding `Hello')).toBe( + 'alert("xss")Hello', + ) + }) + + it('strips img onerror', () => { + expect(sanitizeHighlight('text')).toBe('text') + }) + + it('handles mixed mark + malicious tags', () => { + expect( + sanitizeHighlight('safe ok'), + ).toBe('safebad ok') + }) + + it('passes through plain text unchanged', () => { + expect(sanitizeHighlight('Hello world')).toBe('Hello world') + }) + + it('handles empty string', () => { + expect(sanitizeHighlight('')).toBe('') + }) +}) diff --git a/apps/web/src/__tests__/privacy-notice-regression.test.ts b/apps/web/src/__tests__/privacy-notice-regression.test.ts new file mode 100644 index 00000000..27d9e1f2 --- /dev/null +++ b/apps/web/src/__tests__/privacy-notice-regression.test.ts @@ -0,0 +1,347 @@ +/** + * Regression tests for docs/legal/privacy-notice-draft.md + * + * These tests guard the hostile-review fixes made on 2026-04-14 against + * accidental reintroduction. The privacy notice is a legal document, not code + * — but it makes factual claims about what personal data SettleGrid's own + * schema stores, and those claims must stay aligned with the real schema. + * + * The hostile review found that an earlier draft of §3.1 listed four fields + * that don't exist as columns on the `developers` table: + * - "business name" + * - "website URL" + * - "optional phone number" + * - "last four digits of the tax ID" + * It also mis-characterized the `audit_logs.ip_address` / `user_agent` + * columns as login-time capture; they are actually written against + * administrative actions via writeAuditLog(), not against login events + * (Supabase Auth holds login IP/UA in its own tables). + * + * §3.2, §5.1, §7(e), and §14.1 had related corrections that we want to keep + * in force. Each describe block below locks in one specific finding. + */ + +import { describe, it, expect } from 'vitest' +import { readFileSync } from 'node:fs' +import { resolve } from 'node:path' + +const PRIVACY_NOTICE_PATH = resolve(__dirname, '../../../../docs/legal/privacy-notice-draft.md') +const STRIPE_DPA_PATH = resolve(__dirname, '../../../../docs/legal/stripe-dpa-status.md') + +const privacyNotice = readFileSync(PRIVACY_NOTICE_PATH, 'utf8') +const stripeDpa = readFileSync(STRIPE_DPA_PATH, 'utf8') + +/** + * Extract the body of a markdown section between two heading prefixes. + * Uses indexOf so callers can pass a heading prefix rather than the exact + * full heading line. + */ +function extractSection(text: string, startHeading: string, endHeading: string): string { + const start = text.indexOf(startHeading) + if (start === -1) { + throw new Error(`Section start heading not found: ${JSON.stringify(startHeading)}`) + } + const afterStart = start + startHeading.length + const end = text.indexOf(endHeading, afterStart) + if (end === -1) { + throw new Error(`Section end heading not found: ${JSON.stringify(endHeading)}`) + } + return text.slice(afterStart, end) +} + +describe('privacy-notice-draft.md — structural integrity', () => { + it('exists and is non-trivially long', () => { + expect(privacyNotice.length).toBeGreaterThan(5000) + }) + + it('retains the DRAFT banner (guards against accidental promotion to published)', () => { + // The DRAFT banner is the single clearest signal to any reader that this + // document has not been lawyer-reviewed. Removing it without a counsel + // sign-off would create real liability. + expect(privacyNotice).toMatch(/⚠️\s+\*\*DRAFT/) + expect(privacyNotice).toMatch(/pending lawyer review/i) + }) + + it('has all 14 numbered top-level sections', () => { + const sections = [ + '## 1. Who we are', + '## 2. Scope of this notice', + '## 3. Data we collect', + '## 4. How we use your data', + '## 5. Subprocessors and data sharing', + '## 6. Lawful basis for processing', + '## 7. Notice to India-resident Developers', + '## 8. Cookies and analytics disclosures', + '## 9. Data subject rights', + '## 10. Data retention', + '## 11. Security', + '## 12. Children', + '## 13. Changes to this notice', + '## 14. Jurisdiction-specific disclosures', + ] + for (const section of sections) { + expect(privacyNotice, `missing top-level section: ${section}`).toContain(section) + } + }) + + it('retains the engineering Drafting Notes section for the lawyer reviewer', () => { + expect(privacyNotice).toContain('## Drafting Notes') + // The drafting notes should warn the reviewer they are not published. + expect(privacyNotice).toMatch(/NOT part of the executed Privacy Notice/i) + }) + + it('declares Pattern A+ architecture context (Polar abandoned)', () => { + // This prevents a future editor from silently re-introducing the Polar + // subprocessor entry after the 2026-04-14 pivot. + expect(privacyNotice).toMatch(/Pattern A\+/) + expect(privacyNotice).toMatch(/Polar was abandoned|polar-onboarding-status/i) + }) +}) + +describe('privacy-notice-draft.md — §3.1 hostile-review regression guards', () => { + // Grab §3.1 only so positive phrases in §3.2 (the exclusions section) + // don't accidentally satisfy "§3.1 doesn't mention X" assertions. + const section31 = extractSection( + privacyNotice, + '### 3.1 From Developers', + '### 3.2 What SettleGrid does NOT collect', + ) + + it('§3.1 is non-empty and derived from the actual schema', () => { + expect(section31.length).toBeGreaterThan(1000) + // The audit-driven rewrite explicitly states the list is schema-derived. + expect(section31).toMatch(/auditing SettleGrid's `developers` table/i) + }) + + it('§3.1 does NOT claim SettleGrid holds the last four digits of the tax ID', () => { + // This was the most load-bearing hostile finding: the first draft + // claimed SettleGrid stored `tax_id_last_four`, but no such column + // exists anywhere in the schema. All tax IDs are held exclusively by + // Stripe during Connect onboarding. + expect(section31).not.toMatch(/last four digits of the tax ID/i) + expect(section31).not.toMatch(/tax ID.*last[- ]?four/i) + expect(section31).not.toMatch(/retained for reconciliation/i) + }) + + it('§3.1 does NOT claim SettleGrid holds a Developer phone number', () => { + // There is no `phone` or `phone_number` column on the developers table. + // Any phone numbers the Developer provides are held by Stripe. + expect(section31).not.toMatch(/\bphone number\b/i) + expect(section31).not.toMatch(/optional phone number/i) + }) + + it('§3.1 does NOT claim SettleGrid holds a business name', () => { + // There is no `business_name` column on the developers table. Legal + // entity names are held by Stripe during Connect onboarding. + expect(section31).not.toMatch(/\bbusiness name\b/i) + }) + + it('§3.1 does NOT claim SettleGrid holds a Developer website URL', () => { + // There is no `website_url` column on the developers table. Tools may + // have a source-repo URL but that's a per-tool field, not a Developer + // profile field. + expect(section31).not.toMatch(/\bwebsite URL\b/i) + }) + + it('§3.1 does NOT describe IP or user-agent capture as happening at login', () => { + // SettleGrid's `audit_logs.ip_address` / `user_agent` columns are + // written by writeAuditLog() against administrative actions (key + // revocation, payout trigger, settings change), not against login + // events. Login IP/UA is held by Supabase Auth in its own tables. + expect(section31).not.toMatch(/IP address at login/i) + expect(section31).not.toMatch(/user agent at login/i) + }) + + it('§3.1 positively covers the real schema categories (sanity)', () => { + // Guards against a future edit that drops the rewritten content and + // accidentally reverts to a less-accurate list. + expect(section31).toContain('Stripe Customer ID') + expect(section31).toContain('Stripe Connected Account') + expect(section31).toMatch(/API[- ]key/i) + expect(section31).toMatch(/notification.*webhook/i) + expect(section31).toMatch(/founding-?member/i) + expect(section31).toMatch(/referral/i) + expect(section31).toMatch(/retention/i) + }) + + it('§3.1 correctly scopes IP/UA capture to administrative audit events', () => { + // Positive counterpart to the "not at login" assertion above. + expect(section31).toMatch(/administrative action/i) + expect(section31).toMatch(/IP address and user agent/i) + }) +}) + +describe('privacy-notice-draft.md — §3.2 exclusions (hostile-review strengthening)', () => { + const section32 = extractSection( + privacyNotice, + '### 3.2 What SettleGrid does NOT collect', + '### 3.3 From Customers', + ) + + it('§3.2 explicitly states tax identifiers are never held, even truncated', () => { + // The first draft's "Full tax ID ... in plaintext" wording implied a + // possible hashed / truncated version. The hostile-review rewrite + // slams that door shut. + expect(section32).toMatch(/tax identifiers of any kind/i) + expect(section32).toMatch(/truncated form/i) + }) + + it('§3.2 covers banking-detail exclusions (US + international)', () => { + expect(section32).toMatch(/IBAN/) + expect(section32).toMatch(/routing numbers/i) + expect(section32).toMatch(/SWIFT/) + }) + + it('§3.2 explicitly excludes phone / business name / website URL as non-fields', () => { + // These are the mirror-image of the §3.1 regression guards: if the + // claim "SettleGrid does not collect X" is ever dropped, that's as + // much a regression as re-adding "SettleGrid does collect X" to §3.1. + expect(section32).toMatch(/\bphone number\b/i) + expect(section32).toMatch(/\bbusiness name\b/i) + expect(section32).toMatch(/\bwebsite URL\b/i) + }) + + it('§3.2 excludes archival of invocation payload bodies', () => { + // Protects the "we don't store your prompts" claim in §4. + expect(section32).toMatch(/request bodies or responses/i) + }) +}) + +describe('privacy-notice-draft.md — §5.1 Stripe DPA status language', () => { + const section51 = extractSection( + privacyNotice, + '### 5.1 Stripe Payments Company', + '### 5.2 Supabase', + ) + + it('describes the DPA as in-effect via SSA auto-incorporation', () => { + expect(section51).toMatch(/in effect for SettleGrid/i) + expect(section51).toMatch(/automatic incorporation/i) + expect(section51).toMatch(/Stripe Services Agreement/i) + }) + + it('does NOT contain the stale "executed (or will execute)" language', () => { + // This was the phrasing in the first draft, before we confirmed that + // Stripe's Dashboard does not expose a click-to-execute flow for this + // account type. + expect(section51).not.toMatch(/executed \(or will execute\)/i) + }) + + it('references the Stripe DPA status tracker file', () => { + expect(section51).toContain('docs/legal/stripe-dpa-status.md') + }) +}) + +describe('privacy-notice-draft.md — §7(e) DPDP cross-border transfer', () => { + const section7 = extractSection( + privacyNotice, + '## 7. Notice to India-resident Developers', + '## 8. Cookies', + ) + + it('does NOT claim servers are "primarily located" in specific regions', () => { + // The first draft's "primarily located in the United States and + // European Union (Supabase regions)" assertion was speculative — no + // config file was checked. The rewrite defers region disclosure. + expect(section7).not.toMatch(/primarily located in the United States/i) + expect(section7).not.toMatch(/\(Supabase regions\)/i) + }) + + it('defers specific-region disclosure to an amendment before India onboarding', () => { + expect(section7).toMatch(/amendment to this Notice before any India-resident Developer is onboarded/i) + }) + + it('preserves the DPDP grievance-redressal contact', () => { + // The hostile-review rewrite touched §7(e) only; §7 as a whole should + // still name the grievance-redressal contact. + expect(section7).toContain('privacy@settlegrid.ai') + expect(section7).toMatch(/Data Protection Board of India/i) + }) +}) + +describe('privacy-notice-draft.md — §14.1 CCPA sensitive-PII carveout', () => { + const section141 = extractSection( + privacyNotice, + '### 14.1 California residents', + '### 14.2 Virginia', + ) + + it('does NOT carve out a "tax ID last-four retained for reconciliation" exception', () => { + // Matches the §3.1 fictional-field regression: §14.1 also has to stay + // consistent with the actual schema. + expect(section141).not.toMatch(/tax ID last-?four/i) + expect(section141).not.toMatch(/retained for reconciliation/i) + }) + + it('states SettleGrid has nothing to limit under the sensitive-PII subsection', () => { + expect(section141).toMatch(/nothing to limit under this subsection/i) + }) + + it('preserves the CCPA right list and the no-sale declaration', () => { + expect(section141).toMatch(/Right to know/i) + expect(section141).toMatch(/Right to delete/i) + expect(section141).toMatch(/does not sell personal information/i) + }) +}) + +describe('privacy-notice-draft.md — drafting notes lock-in', () => { + // The drafting notes block is where the hostile-review findings are + // explained to the lawyer reviewer. If somebody drops that block, the + // lawyer won't know why §3.1 looks the way it does and might re-introduce + // the fictional fields. These assertions prevent silent drop. + // + // The drafting notes section is the last section in the file, so we read + // from its heading to end-of-file rather than using extractSection (which + // requires a terminating heading). + const draftingNotesStart = privacyNotice.indexOf('## Drafting Notes') + const notesFromStart = draftingNotesStart === -1 + ? '' + : privacyNotice.slice(draftingNotesStart) + + it('drafting notes block is present at end-of-file', () => { + expect(draftingNotesStart).toBeGreaterThan(0) + expect(notesFromStart.length).toBeGreaterThan(1000) + }) + + it('has a drafting note covering the §3.1 audit-driven correction', () => { + expect(notesFromStart).toMatch(/audit-driven correction/i) + expect(notesFromStart).toMatch(/business name/i) + expect(notesFromStart).toMatch(/optional phone number/i) + expect(notesFromStart).toMatch(/last four digits of the tax ID/i) + }) + + it('has a drafting note covering the §7(e) deferred-region approach', () => { + expect(notesFromStart).toMatch(/DPDP cross-border transfer language/i) + expect(notesFromStart).toMatch(/speculative/i) + }) + + it('has a drafting note explaining the DPA status language correction', () => { + expect(notesFromStart).toMatch(/DPA status language/i) + expect(notesFromStart).toMatch(/auto-incorporated-via-SSA/i) + }) +}) + +describe('stripe-dpa-status.md — status tracker', () => { + it('exists and is non-trivially long', () => { + expect(stripeDpa.length).toBeGreaterThan(1000) + }) + + it('reports DPA status as IN EFFECT', () => { + expect(stripeDpa).toMatch(/IN EFFECT/) + }) + + it('documents the SSA auto-incorporation mechanism', () => { + expect(stripeDpa).toMatch(/Stripe Services Agreement/i) + expect(stripeDpa).toMatch(/auto-incorporated|automatically incorporated|incorporated.*SSA/i) + }) + + it('retains the optional countersigned PDF request draft email', () => { + // This is the output the founder uses if they want a countersigned PDF. + // Dropping it would lose the turn-key path. + expect(stripeDpa).toMatch(/compliance@stripe\.com/i) + }) + + it('notes that a countersigned PDF is optional, not required', () => { + expect(stripeDpa).toMatch(/optional/i) + }) +}) diff --git a/apps/web/src/__tests__/registry.test.ts b/apps/web/src/__tests__/registry.test.ts new file mode 100644 index 00000000..734bd4fc --- /dev/null +++ b/apps/web/src/__tests__/registry.test.ts @@ -0,0 +1,162 @@ +import { describe, it, expect } from 'vitest' +import { + getTemplateBySlug, + listCategories, + listTags, + sortTemplates, + filterTemplates, + type RegistryJson, + type TemplateManifest, +} from '@/lib/registry' + +// ── Fixture ──────────────────────────────────────────────────────────────── + +function makeTemplate(overrides: Partial = {}): TemplateManifest { + return { + slug: 'test-api', + name: 'Test API', + description: 'A test template.', + version: '1.0.0', + category: 'devtools', + tags: ['test', 'api'], + author: { name: 'Test' }, + repo: { type: 'git', url: 'https://github.com/test/test' }, + runtime: 'node', + languages: ['ts'], + entry: 'src/index.ts', + pricing: { model: 'per-call', perCallUsdCents: 1, currency: 'USD' }, + quality: { tests: false }, + capabilities: ['search'], + featured: false, + ...overrides, + } +} + +function makeRegistry(templates: TemplateManifest[]): RegistryJson { + const categories: Record = {} + for (const t of templates) { + categories[t.category] = (categories[t.category] ?? 0) + 1 + } + return { + version: 1, + generatedAt: '2026-01-01T00:00:00.000Z', + commit: 'abc123', + totalTemplates: templates.length, + categories, + templates, + } +} + +// ── Tests ────────────────────────────────────────────────────────────────── + +describe('registry', () => { + const alpha = makeTemplate({ slug: 'alpha', name: 'Alpha', category: 'data', tags: ['data', 'api'] }) + const beta = makeTemplate({ slug: 'beta', name: 'Beta', category: 'devtools', tags: ['dev', 'cli'], trendingRank: 2 }) + const gamma = makeTemplate({ slug: 'gamma', name: 'Gamma', category: 'data', tags: ['data', 'stream'], trendingRank: 1 }) + const registry = makeRegistry([alpha, beta, gamma]) + + describe('getTemplateBySlug', () => { + it('returns matching template (with explicit registry)', () => { + expect(getTemplateBySlug('beta', registry)).toBe(beta) + }) + + it('returns undefined for unknown slug', () => { + expect(getTemplateBySlug('nonexistent', registry)).toBeUndefined() + }) + }) + + describe('listCategories', () => { + it('returns categories sorted by count descending', () => { + const cats = listCategories(registry) + expect(cats).toEqual([ + { name: 'data', count: 2 }, + { name: 'devtools', count: 1 }, + ]) + }) + }) + + describe('listTags', () => { + it('returns all unique tags sorted', () => { + const tags = listTags(undefined, registry) + expect(tags).toEqual(['api', 'cli', 'data', 'dev', 'stream']) + }) + + it('filters tags by category', () => { + const tags = listTags('data', registry) + expect(tags).toEqual(['api', 'data', 'stream']) + }) + }) + + describe('sortTemplates', () => { + it('sorts by trendingRank ascending, then name', () => { + const sorted = sortTemplates([alpha, beta, gamma]) + expect(sorted.map((t) => t.slug)).toEqual(['gamma', 'beta', 'alpha']) + }) + + it('tie-breaks same rank by name alphabetically', () => { + const a = makeTemplate({ slug: 'z-api', name: 'Zebra', trendingRank: 1 }) + const b = makeTemplate({ slug: 'a-api', name: 'Alpha', trendingRank: 1 }) + const sorted = sortTemplates([a, b]) + expect(sorted.map((t) => t.slug)).toEqual(['a-api', 'z-api']) + }) + + it('does not mutate the input array', () => { + const input = [gamma, beta, alpha] + const original = [...input] + sortTemplates(input) + expect(input).toEqual(original) + }) + + it('returns empty array for empty input', () => { + expect(sortTemplates([])).toEqual([]) + }) + }) + + describe('filterTemplates', () => { + it('filters by category', () => { + const result = filterTemplates(registry.templates, { category: 'data' }) + expect(result.map((t) => t.slug)).toEqual(['alpha', 'gamma']) + }) + + it('filters by tags', () => { + const result = filterTemplates(registry.templates, { tags: ['cli'] }) + expect(result.map((t) => t.slug)).toEqual(['beta']) + }) + + it('combines category + tags', () => { + const result = filterTemplates(registry.templates, { + category: 'data', + tags: ['stream'], + }) + expect(result.map((t) => t.slug)).toEqual(['gamma']) + }) + + it('returns all when no filters applied', () => { + const result = filterTemplates(registry.templates, {}) + expect(result).toHaveLength(3) + }) + + it('returns empty array when no templates match', () => { + const result = filterTemplates(registry.templates, { category: 'finance' }) + expect(result).toEqual([]) + }) + }) + + describe('listTags — edge cases', () => { + it('returns empty array for category with no templates', () => { + const tags = listTags('finance', registry) + expect(tags).toEqual([]) + }) + }) + + describe('listCategories — edge cases', () => { + it('returns empty array when categories map is empty', () => { + const emptyReg: RegistryJson = { + ...registry, + categories: {}, + } + const cats = listCategories(emptyReg) + expect(cats).toEqual([]) + }) + }) +}) diff --git a/apps/web/src/__tests__/shadow-index.test.ts b/apps/web/src/__tests__/shadow-index.test.ts new file mode 100644 index 00000000..57486513 --- /dev/null +++ b/apps/web/src/__tests__/shadow-index.test.ts @@ -0,0 +1,185 @@ +import { describe, it, expect, vi } from 'vitest' + +// ── Mock DB layer ────────────────────────────────────────────────────────── + +const mockSelect = vi.fn() +const mockFrom = vi.fn() +const mockWhere = vi.fn() +const mockOrderBy = vi.fn() +const mockLimit = vi.fn() +const mockSelectDistinct = vi.fn() + +// Chain: db.select().from().where().orderBy().limit() +mockLimit.mockResolvedValue([]) +mockOrderBy.mockReturnValue({ limit: mockLimit }) +mockWhere.mockReturnValue({ limit: mockLimit, orderBy: mockOrderBy }) +mockFrom.mockReturnValue({ + where: mockWhere, + orderBy: mockOrderBy, + limit: mockLimit, +}) +mockSelect.mockReturnValue({ from: mockFrom }) +mockSelectDistinct.mockReturnValue({ from: vi.fn().mockReturnValue({ orderBy: vi.fn().mockResolvedValue([]) }) }) + +vi.mock('@/lib/db', () => ({ + db: { + select: mockSelect, + selectDistinct: mockSelectDistinct, + }, +})) + +vi.mock('@/lib/logger', () => ({ + logger: { warn: vi.fn() }, +})) + +// ── Import after mocks ────────────────────────��─────────────────────────── + +const { + getAllShadowEntries, + getShadowEntry, + listOwners, + countShadowEntries, +} = await import('@/lib/shadow-index') + +// ── Fixtures ────────────────────��───────────────────────��────────────────── + +const FIXTURE_ENTRY = { + id: '00000000-0000-0000-0000-000000000001', + source: 'github', + owner: 'anthropics', + repo: 'claude-code', + name: 'Claude Code', + description: 'AI coding assistant', + category: 'ai', + tags: ['ai', 'coding'], + stars: 5000, + downloads: null, + lastUpdated: new Date('2026-04-01'), + sourceUrl: 'https://github.com/anthropics/claude-code', + settlegridAvailable: true, + indexedAt: new Date('2026-04-10'), +} + +// ── Tests ──────────────────────────────────────────────��─────────────────── + +describe('shadow-index reader', () => { + it('getAllShadowEntries returns rows ordered by stars desc', async () => { + mockLimit.mockResolvedValueOnce([FIXTURE_ENTRY]) + const entries = await getAllShadowEntries(10) + expect(entries).toHaveLength(1) + expect(entries[0].name).toBe('Claude Code') + }) + + it('getAllShadowEntries returns empty array on DB error', async () => { + mockSelect.mockReturnValueOnce({ + from: vi.fn().mockReturnValue({ + orderBy: vi.fn().mockReturnValue({ + limit: vi.fn().mockRejectedValueOnce(new Error('DB down')), + }), + }), + }) + const entries = await getAllShadowEntries() + expect(entries).toEqual([]) + }) + + it('getShadowEntry returns matching row', async () => { + mockLimit.mockResolvedValueOnce([FIXTURE_ENTRY]) + const entry = await getShadowEntry('anthropics', 'claude-code') + expect(entry?.name).toBe('Claude Code') + }) + + it('getShadowEntry returns undefined for missing entry', async () => { + mockLimit.mockResolvedValueOnce([]) + const entry = await getShadowEntry('nobody', 'nothing') + expect(entry).toBeUndefined() + }) + + it('getShadowEntry returns undefined on DB error', async () => { + mockSelect.mockReturnValueOnce({ + from: vi.fn().mockReturnValue({ + where: vi.fn().mockReturnValue({ + limit: vi.fn().mockRejectedValueOnce(new Error('timeout')), + }), + }), + }) + const entry = await getShadowEntry('x', 'y') + expect(entry).toBeUndefined() + }) + + it('countShadowEntries returns count on success', async () => { + mockSelect.mockReturnValueOnce({ + from: vi.fn().mockResolvedValueOnce([{ count: 42 }]), + }) + const count = await countShadowEntries() + expect(count).toBe(42) + }) + + it('countShadowEntries returns 0 on DB error', async () => { + mockSelect.mockReturnValueOnce({ + from: vi.fn().mockRejectedValueOnce(new Error('no db')), + }) + const count = await countShadowEntries() + expect(count).toBe(0) + }) + + it('listOwners returns distinct owners on success', async () => { + mockSelectDistinct.mockReturnValueOnce({ + from: vi.fn().mockReturnValue({ + orderBy: vi.fn().mockResolvedValueOnce([ + { owner: 'alice' }, + { owner: 'bob' }, + ]), + }), + }) + const owners = await listOwners() + expect(owners).toEqual(['alice', 'bob']) + }) + + it('listOwners returns empty array on DB error', async () => { + mockSelectDistinct.mockReturnValueOnce({ + from: vi.fn().mockReturnValue({ + orderBy: vi.fn().mockRejectedValueOnce(new Error('timeout')), + }), + }) + const owners = await listOwners() + expect(owners).toEqual([]) + }) +}) + +describe('JSON-LD XSS prevention', () => { + it('escapes in JSON-LD output', () => { + const malicious = { + name: 'Test', + description: '', + } + const escaped = JSON.stringify(malicious).replace(/') + expect(escaped).toContain('\\u003c/script') + // Still valid JSON when unescaped + expect(JSON.parse(escaped.replace(/\\u003c/g, '<'))).toEqual(malicious) + }) +}) + +describe('generateStaticParams deduplication', () => { + it('deduplicates entries with same owner+repo from different sources', async () => { + const entries = [ + { ...FIXTURE_ENTRY, source: 'github' }, + { ...FIXTURE_ENTRY, source: 'awesome-mcp' }, + { ...FIXTURE_ENTRY, source: 'npm', owner: 'other', repo: 'thing' }, + ] + + // Simulate the dedup logic from the page (tested here as a pure function) + const seen = new Set() + const params: { owner: string; repo: string }[] = [] + for (const e of entries) { + const key = `${e.owner}/${e.repo}` + if (seen.has(key)) continue + seen.add(key) + params.push({ owner: e.owner, repo: e.repo }) + } + + expect(params).toHaveLength(2) + expect(params[0]).toEqual({ owner: 'anthropics', repo: 'claude-code' }) + expect(params[1]).toEqual({ owner: 'other', repo: 'thing' }) + }) +}) diff --git a/apps/web/src/__tests__/smoke.test.ts b/apps/web/src/__tests__/smoke.test.ts index 196fd46f..e584d64a 100644 --- a/apps/web/src/__tests__/smoke.test.ts +++ b/apps/web/src/__tests__/smoke.test.ts @@ -263,10 +263,14 @@ describe('SDK (@settlegrid/mcp)', () => { const sdk = await import('../../../../packages/mcp/src/index') expect(sdk).toHaveProperty('settlegrid') - expect(sdk.settlegrid.version).toBe('0.1.1') + // Compare against the SDK_VERSION constant instead of a literal + // so future bumps (e.g. P2.6 → 0.2.0) don't require touching + // this file. `version` on the singleton instance MUST match the + // exported constant by construction. + expect(sdk.settlegrid.version).toBe(sdk.SDK_VERSION) expect(typeof sdk.settlegrid.init).toBe('function') expect(typeof sdk.settlegrid.extractApiKey).toBe('function') - expect(sdk).toHaveProperty('SDK_VERSION', '0.1.1') + expect(sdk.SDK_VERSION).toMatch(/^\d+\.\d+\.\d+$/) }) it('exports all error classes', async () => { @@ -634,10 +638,11 @@ describe('Page Files', () => { 'app/(dashboard)/dashboard/analytics/error.tsx', 'app/(dashboard)/dashboard/analytics/loading.tsx', - // Dashboard - Payouts - 'app/(dashboard)/dashboard/payouts/page.tsx', - 'app/(dashboard)/dashboard/payouts/error.tsx', - 'app/(dashboard)/dashboard/payouts/loading.tsx', + // Dashboard - Payouts (P3.RAIL3 — moved out of (dashboard) route group + // because the verifier checks the literal path apps/web/src/app/dashboard/payouts/page.tsx) + 'app/dashboard/payouts/page.tsx', + 'app/dashboard/payouts/error.tsx', + 'app/dashboard/payouts/loading.tsx', // Dashboard - Webhooks 'app/(dashboard)/dashboard/webhooks/page.tsx', @@ -776,12 +781,13 @@ describe('Lib Module Files', () => { 'lib/settlement/rbac.ts', 'lib/settlement/organizations.ts', - // Settlement Adapters - 'lib/settlement/adapters/index.ts', - 'lib/settlement/adapters/mcp.ts', - 'lib/settlement/adapters/x402.ts', - 'lib/settlement/adapters/ap2.ts', - 'lib/settlement/adapters/tap.ts', + // Settlement adapters moved to `@settlegrid/mcp` under P1.K1. The + // canonical location is packages/mcp/src/adapters/ and file-existence is + // verified by the SDK package's own test suite, not here. Literal Layer + // A entries were removed from this smoke test so that gate check 18's + // orphan-import detector (which scans apps/web/src for the deprecated + // path) returns no matches. A deprecation stub is retained under + // apps/web/src for one cycle; new callers must import from the SDK. // x402 'lib/settlement/x402/index.ts', @@ -881,13 +887,15 @@ describe('Test File Coverage', () => { 'lib/__tests__/ip-validation.test.ts', 'lib/__tests__/ledger.test.ts', 'lib/__tests__/logger.test.ts', - 'lib/__tests__/mcp-adapter.test.ts', + // mcp-adapter.test.ts moved to packages/mcp/src/__tests__/ as part of + // the K1 adapter extraction; smoke test no longer covers it from here 'lib/__tests__/metering.test.ts', 'lib/__tests__/middleware.test.ts', 'lib/__tests__/multi-hop.test.ts', 'lib/__tests__/organizations.test.ts', 'lib/__tests__/outcomes.test.ts', - 'lib/__tests__/protocol-adapters.test.ts', + // protocol-adapters.test.ts moved to packages/mcp/src/__tests__/ as part of + // the K1 adapter extraction; smoke test no longer covers it from here 'lib/__tests__/rate-limit.test.ts', 'lib/__tests__/rbac.test.ts', 'lib/__tests__/redis.test.ts', @@ -1177,10 +1185,14 @@ describe('Package.json Integrity', () => { expect(deps).toHaveProperty('viem') }) - it('SDK package has correct name and version', () => { + it('SDK package has correct name and valid semver version', () => { const pkg = readPkg(SDK_PKG_PATH) expect(pkg.name).toBe('@settlegrid/mcp') - expect(pkg.version).toBe('0.1.1') + // Semver regex instead of a literal so additive minor bumps + // (P2.6 → 0.2.0) don't require touching this file — the P1.SDK + // surface is stable and this assertion just proves the manifest + // exists and has a well-formed version, not a specific number. + expect(pkg.version).toMatch(/^\d+\.\d+\.\d+$/) }) it('SDK package has proper exports config', () => { diff --git a/apps/web/src/app/(auth)/register/page.tsx b/apps/web/src/app/(auth)/register/page.tsx index 8840072d..da14f529 100644 --- a/apps/web/src/app/(auth)/register/page.tsx +++ b/apps/web/src/app/(auth)/register/page.tsx @@ -88,12 +88,21 @@ export default function RegisterPage() { .catch(() => setDeveloperCount(null)) }, []) - // Capture referral code from URL and persist to cookie so it survives the OAuth redirect + // Producer-audit #9 — referral code from URL, persisted through OAuth + // redirect. SameSite=Strict prevents an attacker from cross-posting a + // victim to /register with a hidden ref param to harvest the signup + // bonus (CSRF-style fraud). Strict is fine here: OAuth redirects are + // top-level navigations within our own origin, which Strict allows. + // Secure is added so the cookie only travels over HTTPS. useEffect(() => { const ref = searchParams.get('ref') if (ref && /^inv_[0-9a-f]{24}$/.test(ref)) { setReferralCode(ref) - document.cookie = `sg_ref=${ref}; path=/; max-age=3600; SameSite=Lax` + const cookieFlags = ['path=/', 'max-age=3600', 'SameSite=Strict'] + if (typeof window !== 'undefined' && window.location.protocol === 'https:') { + cookieFlags.push('Secure') + } + document.cookie = `sg_ref=${ref}; ${cookieFlags.join('; ')}` } }, [searchParams]) @@ -256,7 +265,7 @@ export default function RegisterPage() { - 15 protocols + Multi-protocol diff --git a/apps/web/src/app/(dashboard)/consumer/credits/page.tsx b/apps/web/src/app/(dashboard)/consumer/credits/page.tsx new file mode 100644 index 00000000..51d709db --- /dev/null +++ b/apps/web/src/app/(dashboard)/consumer/credits/page.tsx @@ -0,0 +1,243 @@ +'use client' + +import { useEffect, useState, useCallback } from 'react' +import Link from 'next/link' +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' +import { Button } from '@/components/ui/button' +import { Badge } from '@/components/ui/badge' +import { Skeleton } from '@/components/ui/skeleton' +import { Breadcrumbs } from '@/components/dashboard/breadcrumbs' + +// ── Types ─────────────────────────────────────────────────────────────────── + +interface CreditPack { + id: string + label: string + creditAmountCents: number + priceCents: number + discountPct: number +} + +interface PurchaseHistory { + id: string + packId: string + creditAmountCents: number + priceCents: number + status: string + createdAt: string +} + +// ── Helpers ───────────────────────────────────────────────────────────────── + +function formatCents(cents: number): string { + const safe = Number.isFinite(cents) ? cents : 0 + return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(safe / 100) +} + +function formatDate(iso: string): string { + return new Date(iso).toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + }) +} + +// ── Page ──────────────────────────────────────────────────────────────────── + +export default function ConsumerCreditsPage() { + const [packs, setPacks] = useState([]) + const [history, setHistory] = useState([]) + const [globalBalanceCents, setGlobalBalanceCents] = useState(0) + const [loading, setLoading] = useState(true) + const [error, setError] = useState('') + const [purchasing, setPurchasing] = useState(null) + + const fetchData = useCallback(async () => { + try { + const [packsRes, balanceRes, historyRes] = await Promise.all([ + fetch('/api/consumer/credit-packs'), + fetch('/api/consumer/balance'), + fetch('/api/consumer/purchases'), + ]) + if (packsRes.ok) { + const data = await packsRes.json() + setPacks(data.packs ?? []) + } + if (balanceRes.ok) { + const data = await balanceRes.json() + setGlobalBalanceCents(data.globalBalanceCents ?? 0) + } + if (historyRes.ok) { + const data = await historyRes.json() + setHistory(data.purchases ?? []) + } + } catch { + setError('Failed to load credit pack data.') + } finally { + setLoading(false) + } + }, []) + + useEffect(() => { + fetchData() + }, [fetchData]) + + async function purchasePack(packId: string) { + setPurchasing(packId) + try { + const res = await fetch('/api/consumer/credit-packs', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ packId }), + }) + if (res.ok) { + const data = await res.json() + if (data.checkoutUrl) { + window.location.href = data.checkoutUrl as string + } + } else { + const data = await res.json().catch(() => ({})) + setError((data as Record).error ?? 'Failed to initiate purchase.') + } + } catch { + setError('Network error.') + } finally { + setPurchasing(null) + } + } + + if (loading) { + return ( +
+ + +
+ + + +
+
+ ) + } + + return ( +
+ + +
+
+

Credit Packs

+

+ Purchase credits in bulk at a discount. Credits apply across all tools. +

+
+
+

Global Balance

+

{formatCents(globalBalanceCents)}

+
+
+ + {error && ( +
+ {error} +
+ )} + + {/* Credit Packs Grid */} +
+ {packs.map((pack) => ( + + {pack.discountPct > 0 && ( +
+ + {pack.discountPct}% off + +
+ )} + + {pack.label} + + {formatCents(pack.creditAmountCents)} in credits + + + +
+

+ {formatCents(pack.priceCents)} +

+ {pack.discountPct > 0 && ( +

+ Save {formatCents(pack.creditAmountCents - pack.priceCents)} +

+ )} +
+ +
+
+ ))} +
+ + {packs.length === 0 && ( + + +

+ No credit packs available at the moment. Check back soon or purchase credits directly from tool pages. +

+
+
+ )} + + {/* Purchase History */} + {history.length > 0 && ( + + + Purchase History + + +
+ + + + + + + + + + + + {history.map((p) => ( + + + + + + + + ))} + +
PackCreditsPaidStatusDate
{p.packId}{formatCents(p.creditAmountCents)}{formatCents(p.priceCents)} + + {p.status} + + {formatDate(p.createdAt)}
+
+
+
+ )} + +

+ Credits never expire. All purchases are processed securely via Stripe.{' '} + + Back to Consumer Dashboard + +

+
+ ) +} diff --git a/apps/web/src/app/(dashboard)/consumer/page.tsx b/apps/web/src/app/(dashboard)/consumer/page.tsx index f10864c4..b732f888 100644 --- a/apps/web/src/app/(dashboard)/consumer/page.tsx +++ b/apps/web/src/app/(dashboard)/consumer/page.tsx @@ -1,6 +1,9 @@ 'use client' import { useEffect, useState, useCallback } from 'react' +import { useSearchParams } from 'next/navigation' +import Link from 'next/link' +import posthog from 'posthog-js' import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' @@ -10,6 +13,7 @@ import { ConsumerStatBar } from '@/components/consumer/stat-bar' import { UsageAnalytics } from '@/components/consumer/usage-analytics' import { AlertsManager } from '@/components/consumer/alerts-manager' import { PurchaseHistory } from '@/components/consumer/purchase-history' +import { POSTHOG_EVENTS } from '@/lib/experiments' // ─── Types ────────────────────────────────────────────────────────────────── @@ -81,6 +85,7 @@ function ChevronIcon({ expanded }: { expanded: boolean }) { // ─── Main Page ────────────────────────────────────────────────────────────── export default function ConsumerDashboardPage() { + const searchParams = useSearchParams() const [balances, setBalances] = useState([]) const [keys, setKeys] = useState([]) const [budgets, setBudgets] = useState([]) @@ -107,6 +112,18 @@ export default function ConsumerDashboardPage() { const [toolUsageData, setToolUsageData] = useState>({}) const [toolUsageLoading, setToolUsageLoading] = useState(null) + // Track credit purchase success via PostHog when redirected from Stripe + useEffect(() => { + const purchaseStatus = searchParams.get('purchase') + const packId = searchParams.get('pack') + if (purchaseStatus === 'success' && posthog.__loaded) { + posthog.capture(POSTHOG_EVENTS.CREDIT_PURCHASED, { + pack_id: packId ?? 'unknown', + source: 'stripe_checkout', + }) + } + }, [searchParams]) + useEffect(() => { async function fetchData() { try { @@ -794,6 +811,57 @@ export default function ConsumerDashboardPage() { )} + + {/* Quick Links — Schedules, Credit Packs, Referral */} +
+ + + +
+ +
+
+

Scheduled Invocations

+

Automate tool calls on a cron schedule

+
+
+
+ + + + + +
+ +
+
+

Credit Packs

+

Buy credits in bulk at a discount

+
+
+
+ + + + + +
+ +
+
+

Referral Program

+

Share SettleGrid and earn bonus credits

+
+
+
+ +
) } diff --git a/apps/web/src/app/(dashboard)/consumer/referral/page.tsx b/apps/web/src/app/(dashboard)/consumer/referral/page.tsx new file mode 100644 index 00000000..b872b3d4 --- /dev/null +++ b/apps/web/src/app/(dashboard)/consumer/referral/page.tsx @@ -0,0 +1,158 @@ +'use client' + +import { useEffect, useState, useCallback } from 'react' +import Link from 'next/link' +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' +import { Button } from '@/components/ui/button' +import { Skeleton } from '@/components/ui/skeleton' +import { Breadcrumbs } from '@/components/dashboard/breadcrumbs' + +// ── Types ─────────────────────────────────────────────────────────────────── + +interface ReferralData { + referralCode: string + shareUrl: string + referralsMade: number + creditsEarnedCents: number +} + +// ── Helpers ───────────────────────────────────────────────────────────────── + +function formatCents(cents: number): string { + const safe = Number.isFinite(cents) ? cents : 0 + return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(safe / 100) +} + +// ── Page ──────────────────────────────────────────────────────────────────── + +export default function ConsumerReferralPage() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState('') + const [copied, setCopied] = useState(false) + + const fetchData = useCallback(async () => { + try { + const res = await fetch('/api/consumer/referral') + if (res.ok) { + const json = await res.json() + setData(json as ReferralData) + } else { + setError('Failed to load referral data.') + } + } catch { + setError('Network error loading referral data.') + } finally { + setLoading(false) + } + }, []) + + useEffect(() => { + fetchData() + }, [fetchData]) + + async function copyLink() { + if (!data?.shareUrl) return + try { + await navigator.clipboard.writeText(data.shareUrl) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } catch { + // Clipboard API unavailable + } + } + + if (loading) { + return ( +
+ + + +
+ ) + } + + return ( +
+ + +
+

Referral Program

+

+ Share SettleGrid with others and earn credits when they sign up. +

+
+ + {error && ( +
+ {error} +
+ )} + + {data && ( + <> + {/* Share Link */} + + + Your Referral Link + + Share this link. When someone signs up and makes their first purchase, you both earn credits. + + + +
+ + {data.shareUrl} + + +
+

+ Your referral code: {data.referralCode} +

+
+
+ + {/* Stats */} +
+ + +

{data.referralsMade}

+

Total Referrals

+
+
+ + +

{formatCents(data.creditsEarnedCents)}

+

Credits Earned

+
+
+
+ + {/* How it works */} + + + How It Works + + +
    +
  1. Share your unique referral link with friends and colleagues.
  2. +
  3. They sign up for a SettleGrid account using your link.
  4. +
  5. When they make their first credit purchase, you both receive bonus credits.
  6. +
  7. There is no limit to how many people you can refer.
  8. +
+
+
+ + )} + +

+ Referral credits are applied automatically and never expire.{' '} + + Back to Consumer Dashboard + +

+
+ ) +} diff --git a/apps/web/src/app/(dashboard)/consumer/schedules/page.tsx b/apps/web/src/app/(dashboard)/consumer/schedules/page.tsx new file mode 100644 index 00000000..b95cd63d --- /dev/null +++ b/apps/web/src/app/(dashboard)/consumer/schedules/page.tsx @@ -0,0 +1,281 @@ +'use client' + +import { useEffect, useState, useCallback } from 'react' +import Link from 'next/link' +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' +import { Button } from '@/components/ui/button' +import { Badge } from '@/components/ui/badge' +import { Input } from '@/components/ui/input' +import { Skeleton } from '@/components/ui/skeleton' +import { Breadcrumbs } from '@/components/dashboard/breadcrumbs' + +// ── Types ─────────────────────────────────────────────────────────────────── + +interface Schedule { + id: string + toolId: string + toolName: string + method: string + cronExpression: string + enabled: boolean + lastRunAt: string | null + nextRunAt: string | null + createdAt: string +} + +// ── Helpers ───────────────────────────────────────────────────────────────── + +function formatDate(iso: string): string { + return new Date(iso).toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }) +} + +// ── Page ──────────────────────────────────────────────────────────────────── + +export default function ConsumerSchedulesPage() { + const [schedules, setSchedules] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState('') + const [creating, setCreating] = useState(false) + + // Create form + const [formToolId, setFormToolId] = useState('') + const [formSlug, setFormSlug] = useState('') + const [formMethod, setFormMethod] = useState('') + const [formCron, setFormCron] = useState('') + const [formError, setFormError] = useState('') + + const fetchSchedules = useCallback(async () => { + try { + const res = await fetch('/api/consumer/schedules') + if (res.ok) { + const data = await res.json() + setSchedules(data.schedules ?? []) + } else { + setError('Failed to load schedules.') + } + } catch { + setError('Network error loading schedules.') + } finally { + setLoading(false) + } + }, []) + + useEffect(() => { + fetchSchedules() + }, [fetchSchedules]) + + async function createSchedule() { + setFormError('') + if (!formToolId.trim() || !formSlug.trim() || !formCron.trim()) { + setFormError('Tool ID, slug, and cron expression are required.') + return + } + setCreating(true) + try { + const res = await fetch('/api/consumer/schedules', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + toolId: formToolId.trim(), + slug: formSlug.trim(), + method: formMethod.trim() || null, + cronExpression: formCron.trim(), + }), + }) + if (res.ok) { + setFormToolId('') + setFormSlug('') + setFormMethod('') + setFormCron('') + fetchSchedules() + } else { + const data = await res.json().catch(() => ({})) + setFormError((data as Record).error ?? 'Failed to create schedule.') + } + } catch { + setFormError('Network error.') + } finally { + setCreating(false) + } + } + + async function toggleSchedule(id: string, enabled: boolean) { + try { + await fetch(`/api/consumer/schedules/${id}`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ enabled: !enabled }), + }) + setSchedules((prev) => + prev.map((s) => (s.id === id ? { ...s, enabled: !enabled } : s)) + ) + } catch { + // Silently fail + } + } + + async function deleteSchedule(id: string) { + try { + const res = await fetch(`/api/consumer/schedules/${id}`, { + method: 'DELETE', + }) + if (res.ok) { + setSchedules((prev) => prev.filter((s) => s.id !== id)) + } + } catch { + // Silently fail + } + } + + if (loading) { + return ( +
+ + + +
+ ) + } + + return ( +
+ + +
+

Scheduled Invocations

+

+ Automate tool calls on a cron schedule. Credits are deducted on each run. +

+
+ + {error && ( +
+ {error} +
+ )} + + {/* Create Schedule */} + + + Create Schedule + Set up a cron-based automatic invocation for any tool you have credits for. + + +
+
+ + setFormToolId(e.target.value)} + placeholder="550e8400-e29b-41d4-a716-..." + /> +
+
+ + setFormSlug(e.target.value)} + placeholder="web-search-pro" + /> +
+
+ + setFormMethod(e.target.value)} + placeholder="analyze" + /> +
+
+ + setFormCron(e.target.value)} + placeholder="0 */6 * * *" + /> +
+
+ {formError && ( +

{formError}

+ )} + +
+
+ + {/* Active Schedules */} + + + Active Schedules + + + {schedules.length === 0 ? ( +

+ No schedules yet. Create one above to automate your tool invocations. +

+ ) : ( +
+ {schedules.map((s) => ( +
+
+
+ + {s.toolName || s.toolId} + + + {s.method} + + + {s.enabled ? 'Active' : 'Paused'} + +
+
+ Cron: {s.cronExpression} + {s.lastRunAt && Last run: {formatDate(s.lastRunAt)}} + {s.nextRunAt && Next run: {formatDate(s.nextRunAt)}} +
+
+
+ + +
+
+ ))} +
+ )} +
+
+ + {/* Help */} +

+ Cron expressions use standard 5-field syntax (minute hour day-of-month month day-of-week). Minimum interval is 5 minutes. + {' '} + + See documentation + +

+
+ ) +} diff --git a/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx b/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx index 16a148e0..802dfdff 100644 --- a/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx @@ -1,13 +1,17 @@ 'use client' import { useEffect, useState, useCallback } from 'react' +import Link from 'next/link' import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card' import { Skeleton } from '@/components/ui/skeleton' +import { Button } from '@/components/ui/button' import { StatCard } from '@/components/dashboard/stat-card' import { BarChart } from '@/components/charts/bar-chart' import { AreaChart } from '@/components/charts/area-chart' import { Breadcrumbs } from '@/components/dashboard/breadcrumbs' +// ─── Types ──────────────────────────────────────────────────────────────────── + interface StatsData { totalRevenueCents: number totalInvocations: number @@ -15,7 +19,7 @@ interface StatsData { recentInvocations: Array<{ hour: string; count: number; revenueCents: number }> } -interface MethodBreakdownItem { +interface BasicMethodBreakdownItem { method: string count: number totalRevenueCents: number @@ -23,52 +27,340 @@ interface MethodBreakdownItem { errorRate: number } -interface TopConsumer { +interface BasicTopConsumer { consumerId: string totalSpendCents: number invocationCount: number } -interface RevenueTrendItem { +interface BasicAnalyticsData { + methodBreakdown: BasicMethodBreakdownItem[] + topConsumers: BasicTopConsumer[] + hourlyDistribution: Array<{ hour: number; count: number }> + latencyPercentiles: { p50: number; p95: number; p99: number } + errorRate: number + revenueTrend: Array<{ date: string; revenueCents: number }> +} + +// Advanced types + +interface RevenueTrendPoint { date: string revenueCents: number + invocations: number + previousRevenueCents: number + previousInvocations: number } -interface AnalyticsData { - methodBreakdown: MethodBreakdownItem[] - topConsumers: TopConsumer[] - hourlyDistribution: Array<{ hour: number; count: number }> - latencyPercentiles: { p50: number; p95: number; p99: number } +interface CohortMetrics { + totalConsumers: number + newConsumers: number + returningConsumers: number + retentionRate: number + avgRevenuePerConsumer: number +} + +interface LatencyBreakdown { + toolId: string + toolName: string + p50: number + p95: number + p99: number + sampleSize: number +} + +interface ErrorTrendPoint { + date: string + totalCount: number + errorCount: number errorRate: number - revenueTrend: RevenueTrendItem[] } +interface TopConsumerRow { + consumerId: string + totalSpendCents: number + invocationCount: number + avgCostCents: number + firstSeen: string + lastSeen: string +} + +interface MethodRow { + method: string + count: number + totalRevenueCents: number + avgLatencyMs: number + errorRate: number + avgCostCents: number +} + +interface HourlyHeatmapPoint { + dayOfWeek: number + hour: number + count: number +} + +interface CostEfficiencyPoint { + date: string + revenueCents: number + invocations: number + revenuePerInvocationCents: number +} + +interface ReferralRow { + referralCode: string + invocations: number + revenueCents: number + uniqueConsumers: number +} + +interface AdvancedAnalyticsData { + revenueTrend: RevenueTrendPoint[] + cohortMetrics: CohortMetrics + latencyByTool: LatencyBreakdown[] + errorTrend: ErrorTrendPoint[] + topConsumers: TopConsumerRow[] + methodBreakdown: MethodRow[] + hourlyHeatmap: HourlyHeatmapPoint[] + costEfficiency: CostEfficiencyPoint[] + referralAttribution: ReferralRow[] + periodDays: number +} + +// ─── Helpers ────────────────────────────────────────────────────────────────── + function formatCents(cents: number): string { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(cents / 100) } +function formatDate(dateStr: string): string { + return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }) +} + +function formatNumber(n: number): string { + return new Intl.NumberFormat('en-US').format(n) +} + +const DAY_NAMES = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] as const + +type Period = '7' | '30' | '90' + +// ─── Heatmap Component ─────────────────────────────────────────────────────── + +function UsageHeatmap({ data }: { data: HourlyHeatmapPoint[] }) { + const maxCount = Math.max(1, ...data.map((d) => d.count)) + + // Build a lookup: [day][hour] = count + const grid = new Map() + for (const d of data) { + grid.set(`${d.dayOfWeek}-${d.hour}`, d.count) + } + + function intensity(count: number): string { + if (count === 0) return 'bg-gray-100 dark:bg-[#1A1D2B]' + const ratio = count / maxCount + if (ratio < 0.25) return 'bg-amber-100 dark:bg-amber-900/30' + if (ratio < 0.5) return 'bg-amber-200 dark:bg-amber-800/40' + if (ratio < 0.75) return 'bg-amber-300 dark:bg-amber-700/50' + return 'bg-amber-400 dark:bg-amber-600/60' + } + + return ( +
+ {/* Hour labels */} +
+ {Array.from({ length: 24 }, (_, h) => ( +
+ {h % 6 === 0 ? `${h}h` : ''} +
+ ))} +
+ {/* Grid rows */} + {Array.from({ length: 7 }, (_, dayIdx) => { + const day = dayIdx + 1 // isodow: 1=Mon + return ( +
+ {DAY_NAMES[dayIdx]} + {Array.from({ length: 24 }, (_, h) => { + const count = grid.get(`${day}-${h}`) ?? 0 + return ( +
+ ) + })} +
+ ) + })} + {/* Legend */} +
+ Less +
+
+
+
+
+ More +
+
+ ) +} + +// ─── Upgrade Gate Component ────────────────────────────────────────────────── + +function UpgradeGate() { + return ( +
+ + +
+

Advanced Analytics

+

+ Deep insights into revenue, consumers, performance, and growth. +

+
+ + {/* Preview cards (blurred/muted) */} +
+ + + {/* Upgrade overlay */} +
+
+
+ +
+

+ Unlock Advanced Analytics +

+

+ The Scale plan includes advanced analytics with period-over-period comparisons, consumer cohort analysis, per-tool latency percentiles, error trend tracking, usage heatmaps, cost efficiency metrics, and referral attribution. +

+
    +
  • + + Revenue trends with previous period comparison +
  • +
  • + + Consumer retention and cohort analysis +
  • +
  • + + Latency p50/p95/p99 per tool +
  • +
  • + + Error spike detection and daily error trends +
  • +
  • + + Peak usage heatmaps and referral attribution +
  • +
+
+ + + + + Back to Dashboard + +
+
+
+
+ + {/* Additional blurred preview sections */} +