Skip to content

Bootstrap protected Brutalist attestation gate - #76

Open
ejmockler wants to merge 2 commits into
mainfrom
agent/brutalist-gate-bootstrap
Open

Bootstrap protected Brutalist attestation gate#76
ejmockler wants to merge 2 commits into
mainfrom
agent/brutalist-gate-bootstrap

Conversation

@ejmockler

@ejmockler ejmockler commented Jul 20, 2026

Copy link
Copy Markdown
Member

Purpose

Bootstrap the protected-base half of the Commons Brutalist launch-review protocol.
The workflow reads candidate source and detached proof only as inert Git objects,
then runs the verifier from the PR base checkout.

This deliberately does not attest this bootstrap PR. A candidate workflow
cannot authorize itself.

Exact scope

  • protected-base diagnostic workflow
  • comments-only allowed-signers trust root
  • capture, sign, finalize, and verify scripts
  • operator runbook
  • isolated attestation and workflow-security tests

No application, cache, Convex, Cloudflare deployment, package, lockfile, or
release-hypergraph state is changed.

Local verification

  • 39/39 isolated attestation tests passed
  • actionlint passed
  • Prettier and ESLint passed
  • svelte-check passed with the required PUBLIC_CONVEX_URL build environment
  • git diff --check passed

Bootstrap limitations and merge order

  1. Manually audit and merge this gate-only PR.
  2. Enroll a dedicated offline Ed25519 signer in a separate one-file PR and
    verify its public-key fingerprint out of band.
  3. Update the launch PR onto the signer-enrolled base.
  4. Capture, sign, finalize, and push the exact detached proof ref.

The check remains diagnostic/spoofable until a distinct GitHub App or
organization-owned required workflow owns the authoritative status. The trust
root intentionally contains no key in this PR.

Summary by CodeRabbit

  • New Features

    • Added a launch attestation process that captures, signs, finalizes, and verifies review evidence.
    • Added protected diagnostic checks for pull requests, including source and proof integrity validation.
    • Added documentation for the attestation ceremony, signing requirements, and verification safeguards.
  • Bug Fixes

    • Improved protection against tampered review evidence, altered source snapshots, invalid signatures, and malformed proof records.
  • Tests

    • Added comprehensive coverage for valid attestations, tampering scenarios, fingerprint mismatches, pagination integrity, and workflow protections.

@strix-security

Copy link
Copy Markdown

Strix is installed on this repository, but we couldn't run this PR security review because this workspace's trial has ended. Add a card to resume code reviews here.

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@ejmockler, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 43 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a1f8e14f-39c6-4ecc-a503-c4e0c38c06c6

📥 Commits

Reviewing files that changed from the base of the PR and between 6c1e9a7 and 4cfd7e1.

📒 Files selected for processing (2)
  • .github/workflows/brutalist-review.yml
  • tests/unit/scripts/brutalist-attestation.test.ts
📝 Walkthrough

Walkthrough

This PR introduces Brutalist launch attestation v3: isolated evidence capture, offline Ed25519 signing, detached proof commits, strict evidence verification, and a protected pull_request_target diagnostic workflow that validates immutable Git objects from trusted base code.

Changes

Brutalist launch attestation

Layer / File(s) Summary
Verification primitives and proof boundaries
scripts/verify-brutalist-attestation.mjs
Adds canonical hashing, Git tree inspection, source and directory fingerprints, signature verification, and strict detached proof-envelope validation.
Evidence reconstruction and attestation validation
scripts/verify-brutalist-attestation.mjs
Validates paginated MCP responses, reviewer markers and verdicts, exact launch requests, evidence bindings, rendered reports, and complete attestation structure.
Isolated review evidence capture
scripts/run-brutalist-launch-review.mjs
Captures review evidence from a pinned MCP runtime against a read-only Git snapshot, with deterministic environment controls, mutation detection, pagination journaling, and canonical evidence output.
Offline signing and detached proof finalization
scripts/sign-brutalist-evidence.mjs, scripts/finalize-brutalist-launch-review.mjs, .github/brutalist-allowed-signers, docs/strategy/public-discovery-release-hypergraph/docs/BRUTALIST-ATTESTATION.md
Adds Ed25519 evidence signing, proof-only commit creation, attestation finalization, deterministic ref updates, and documented signer/bootstrap and ceremony rules.
Base-owned diagnostic workflow
.github/workflows/brutalist-review.yml, docs/strategy/public-discovery-release-hypergraph/docs/BRUTALIST-ATTESTATION.md
Replaces candidate-executing review automation with trusted-base verification of fetched PR and proof objects using read-only permissions.
Attestation and workflow validation tests
tests/unit/scripts/brutalist-attestation.test.ts
Adds fixture-based happy-path and adversarial tests for signatures, evidence, pagination, fingerprints, proof envelopes, isolation boundaries, and workflow invariants.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant CaptureRunner
  participant Signer
  participant Finalizer
  participant DiagnosticWorkflow
  participant Verifier
  Operator->>CaptureRunner: capture canonical review evidence
  CaptureRunner-->>Operator: evidence digest
  Operator->>Signer: sign canonical evidence offline
  Signer-->>Finalizer: detached signature
  Finalizer->>Verifier: validate evidence and create proof commit
  Finalizer-->>DiagnosticWorkflow: attestation proof ref
  DiagnosticWorkflow->>Verifier: verify immutable source and proof objects
  Verifier-->>DiagnosticWorkflow: pass or failure
Loading

Possibly related PRs

  • communisaas/commons#57: Both changes modify the Brutalist review workflow and its critic execution behavior.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 64.81% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly reflects the main change: bootstrapping a protected Brutalist attestation gate.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/brutalist-gate-bootstrap

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/unit/scripts/brutalist-attestation.test.ts (1)

80-80: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

JsonRecord = Record<string, any> uses any.

The coding guidelines direct avoiding any in TypeScript. This alias is threaded through most helpers and the arbitrary-property mutations (attestation.reviewers[0].model = ..., evidence.request.arguments.force_refresh = ...) rely on it, so switching to Record<string, unknown> would require casts at each mutation site. Consider a narrower fixture type (or a small set of interfaces for attestation/evidence) to regain type safety on the shapes actually exercised.

As per coding guidelines: "Strive for strong type safety. Avoid using any whenever possible in TypeScript".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unit/scripts/brutalist-attestation.test.ts` at line 80, Replace the
JsonRecord alias with a narrow, type-safe fixture model covering the attestation
and evidence fields exercised by the tests, including mutable reviewer model and
force_refresh properties. Update the related helpers and fixtures to use these
interfaces so arbitrary-property mutations remain type-checked without any or
repeated casts.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/brutalist-review.yml:
- Around line 41-49: Update the candidate repository fetch command in the
workflow to fetch the pull request base SHA explicitly, alongside the existing
PR head and proof references, so git cat-file can resolve the expected base
commit even when the PR is out of date. Use the existing base-SHA workflow value
and preserve the current repository initialization and fetch behavior.

---

Nitpick comments:
In `@tests/unit/scripts/brutalist-attestation.test.ts`:
- Line 80: Replace the JsonRecord alias with a narrow, type-safe fixture model
covering the attestation and evidence fields exercised by the tests, including
mutable reviewer model and force_refresh properties. Update the related helpers
and fixtures to use these interfaces so arbitrary-property mutations remain
type-checked without any or repeated casts.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: eef8f0aa-9c8a-4bd5-9215-a1231a77f32b

📥 Commits

Reviewing files that changed from the base of the PR and between f883164 and 6c1e9a7.

📒 Files selected for processing (8)
  • .github/brutalist-allowed-signers
  • .github/workflows/brutalist-review.yml
  • docs/strategy/public-discovery-release-hypergraph/docs/BRUTALIST-ATTESTATION.md
  • scripts/finalize-brutalist-launch-review.mjs
  • scripts/run-brutalist-launch-review.mjs
  • scripts/sign-brutalist-evidence.mjs
  • scripts/verify-brutalist-attestation.mjs
  • tests/unit/scripts/brutalist-attestation.test.ts

Comment thread .github/workflows/brutalist-review.yml Outdated
@github-actions

Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Health
packages.sdk-typescript.src 74% 64%
src 0% 0%
src.lib 100% 100%
src.lib.components.action 0% 0%
src.lib.components.activation 0% 0%
src.lib.components.auth 0% 0%
src.lib.components.auth.address-steps 0% 0%
src.lib.components.auth.parts 0% 0%
src.lib.components.automation 0% 0%
src.lib.components.billing 0% 0%
src.lib.components.crypto 0% 0%
src.lib.components.debate 0% 0%
src.lib.components.error 0% 0%
src.lib.components.events 0% 0%
src.lib.components.fundraising 0% 0%
src.lib.components.geographic 0% 0%
src.lib.components.identity 0% 0%
src.lib.components.layout 0% 0%
src.lib.components.layout.header 0% 0%
src.lib.components.modals 0% 0%
src.lib.components.networks 0% 0%
src.lib.components.onboarding 0% 0%
src.lib.components.org 2% 5%
src.lib.components.org.os 17% 17%
src.lib.components.org.studio 26% 23%
src.lib.components.profile 0% 0%
src.lib.components.scorecard 0% 0%
src.lib.components.segments 0% 0%
src.lib.components.setup 0% 0%
src.lib.components.sms 0% 0%
src.lib.components.submission 0% 0%
src.lib.components.template 0% 0%
src.lib.components.template-browser 0% 0%
src.lib.components.template-browser.parts 0% 0%
src.lib.components.template-browser.relation 0% 0%
src.lib.components.template-browser.spectrum 0% 0%
src.lib.components.template.creator 0% 0%
src.lib.components.template.parts 0% 0%
src.lib.components.thoughts 0% 0%
src.lib.components.ui 0% 0%
src.lib.components.verify 0% 0%
src.lib.components.visualization 0% 0%
src.lib.components.wallet 0% 0%
src.lib.components.wallet.debate 0% 0%
src.lib.config 53% 53%
src.lib.constants 25% 100%
src.lib.core 3% 5%
src.lib.core.agents 91% 82%
src.lib.core.agents.agents 49% 40%
src.lib.core.agents.prompts 10% 0%
src.lib.core.agents.providers 29% 29%
src.lib.core.agents.types 100% 100%
src.lib.core.agents.utils 63% 55%
src.lib.core.analytics 31% 12%
src.lib.core.api 0% 0%
src.lib.core.auth 42% 40%
src.lib.core.blockchain 26% 25%
src.lib.core.census 100% 100%
src.lib.core.crypto 91% 72%
src.lib.core.email 98% 100%
src.lib.core.encoding 100% 100%
src.lib.core.gas 0% 0%
src.lib.core.identity 62% 60%
src.lib.core.legislative 100% 100%
src.lib.core.locale 0% 0%
src.lib.core.location 55% 56%
src.lib.core.location.resolvers 100% 90%
src.lib.core.near 0% 0%
src.lib.core.org 91% 92%
src.lib.core.privacy 100% 100%
src.lib.core.proof 2% 6%
src.lib.core.search 0% 0%
src.lib.core.security 60% 60%
src.lib.core.server 57% 70%
src.lib.core.server.moderation 20% 25%
src.lib.core.shadow-atlas 66% 60%
src.lib.core.shadow-atlas.shared-vectors 100% 100%
src.lib.core.targets 100% 70%
src.lib.core.thoughts 0% 0%
src.lib.core.tools 2% 0%
src.lib.core.topic 98% 79%
src.lib.core.wallet 6% 7%
src.lib.core.zkp 50% 57%
src.lib.data 98% 87%
src.lib.design 0% 0%
src.lib.server 81% 69%
src.lib.server.agents 0% 0%
src.lib.server.api-v1 68% 75%
src.lib.server.auth 96% 98%
src.lib.server.billing 50% 31%
src.lib.server.billing.providers 100% 88%
src.lib.server.calls 0% 0%
src.lib.server.delegation 100% 100%
src.lib.server.email 84% 65%
src.lib.server.events 90% 67%
src.lib.server.exa 85% 74%
src.lib.server.firecrawl 14% 0%
src.lib.server.geographic 100% 100%
src.lib.server.ground 62% 58%
src.lib.server.identity 98% 89%
src.lib.server.internal 91% 79%
src.lib.server.legislation 0% 0%
src.lib.server.legislation.ingest 100% 100%
src.lib.server.legislation.receipts 0% 0%
src.lib.server.legislation.scorecard 100% 100%
src.lib.server.platform-sync 100% 91%
src.lib.server.reducto 0% 0%
src.lib.server.shims 0% 100%
src.lib.server.sms 55% 39%
src.lib.server.smt 77% 62%
src.lib.server.tee 96% 91%
src.lib.server.workflows 0% 0%
src.lib.services 15% 3%
src.lib.services.ai 100% 86%
src.lib.stores 25% 21%
src.lib.types 12% 13%
src.lib.types.analytics 48% 0%
src.lib.utils 23% 17%
src.routes 0% 0%
src.routes..well-known.jwks.json 0% 0%
src.routes.about.integrity 0% 0%
src.routes.accountability.[id] 0% 0%
src.routes.api.(dev).dev-login 0% 0%
src.routes.api.admin.backfill-embeddings 0% 0%
src.routes.api.admin.reconcile-registrations 0% 0%
src.routes.api.agents.generate-subject 0% 0%
src.routes.api.agents.message-jobs.[jobId] 0% 0%
src.routes.api.agents.stream-decision-makers 0% 0%
src.routes.api.agents.stream-message 77% 71%
src.routes.api.agents.stream-subject 78% 64%
src.routes.api.agents.traces.[traceId] 0% 0%
src.routes.api.analytics.increment 0% 0%
src.routes.api.auth.passkey 100% 83%
src.routes.api.auth.passkey.authenticate 0% 0%
src.routes.api.auth.passkey.current 0% 0%
src.routes.api.auth.passkey.register 0% 0%
src.routes.api.automation.process 0% 0%
src.routes.api.billing.checkout 0% 0%
src.routes.api.billing.checkout-individual 0% 0%
src.routes.api.billing.portal 0% 0%
src.routes.api.blast.[blastId].dispatch-claim 0% 0%
src.routes.api.blast.[blastId].unsubscribe-tokens 0% 0%
src.routes.api.c.[slug].stats 0% 0%
src.routes.api.c.[slug].verify-district 0% 0%
src.routes.api.campaigns.[id].debate 0% 0%
src.routes.api.d.[campaignId].checkout 0% 0%
src.routes.api.d.[campaignId].stats 0% 0%
src.routes.api.debates.[debateId].ai-resolution 0% 0%
src.routes.api.debates.[debateId].appeal 0% 0%
src.routes.api.debates.[debateId].arguments 0% 0%
src.routes.api.debates.[debateId].claim 0% 0%
src.routes.api.debates.[debateId].commit 0% 0%
src.routes.api.debates.[debateId].cosign 0% 0%
src.routes.api.debates.[debateId].governance-resolve 0% 0%
src.routes.api.debates.[debateId].position-proof 0% 0%
src.routes.api.debates.[debateId].resolve 0% 0%
src.routes.api.debates.[debateId].reveal 0% 0%
src.routes.api.debates.[debateId].settle 0% 0%
src.routes.api.debates.[debateId].stream 0% 0%
src.routes.api.debates.by-template.[templateId] 0% 0%
src.routes.api.debates.create 0% 0%
src.routes.api.delegation 0% 0%
src.routes.api.delegation.[id] 0% 0%
src.routes.api.delegation.parse-policy 0% 0%
src.routes.api.delegation.review.[reviewId] 0% 0%
src.routes.api.deliveries.record 82% 78%
src.routes.api.dm.[id].scorecard 0% 0%
src.routes.api.dm.scorecard.compare 0% 0%
src.routes.api.e.[id].checkin 0% 0%
src.routes.api.e.[id].rsvp 0% 0%
src.routes.api.e.[id].stats 0% 0%
src.routes.api.email.confirm.[token] 0% 0%
src.routes.api.emails.report-bounce 0% 0%
src.routes.api.embed.scorecard.[id] 100% 61%
src.routes.api.embeddings.generate 0% 0%
src.routes.api.geographic.infer-scope 92% 100%
src.routes.api.geographic.resolve 0% 0%
src.routes.api.ground.bundle 0% 0%
src.routes.api.ground.restore-state 0% 0%
src.routes.api.ground.state 0% 0%
src.routes.api.ground.wrapper 0% 0%
src.routes.api.health 0% 0%
src.routes.api.identity.delete-blob 0% 100%
src.routes.api.identity.retrieve-blob 0% 100%
src.routes.api.identity.store-blob 0% 100%
src.routes.api.identity.verify-address 69% 56%
src.routes.api.identity.verify-mdl 0% 0%
src.routes.api.identity.verify-mdl.start 76% 69%
src.routes.api.identity.verify-mdl.verify 51% 38%
src.routes.api.internal.alert 0% 0%
src.routes.api.internal.anchor-incidents 0% 0%
src.routes.api.internal.anchor-proof 0% 0%
src.routes.api.internal.billing.report-usage 82% 30%
src.routes.api.internal.dev-login 95% 63%
src.routes.api.internal.emit-revocation 87% 87%
src.routes.api.internal.health.empty-tree-root 88% 82%
src.routes.api.internal.identity.mdl-readiness 92% 73%
src.routes.api.internal.metrics.client-event 88% 79%
src.routes.api.internal.revocation-root 0% 0%
src.routes.api.location.ip-lookup 0% 0%
src.routes.api.location.resolve 0% 0%
src.routes.api.location.resolve-address 96% 75%
src.routes.api.location.search 0% 0%
src.routes.api.moderation.check 92% 92%
src.routes.api.moderation.personalization 0% 0%
src.routes.api.org 0% 0%
src.routes.api.org.[slug] 0% 0%
src.routes.api.org.[slug].alerts 0% 0%
src.routes.api.org.[slug].alerts.[id] 0% 0%
src.routes.api.org.[slug].bills.[billId].watch 0% 0%
src.routes.api.org.[slug].bills.browse 0% 0%
src.routes.api.org.[slug].bills.search 0% 0%
src.routes.api.org.[slug].bills.watching 0% 0%
src.routes.api.org.[slug].branding 0% 0%
src.routes.api.org.[slug].calls 0% 0%
src.routes.api.org.[slug].campaigns 0% 0%
src.routes.api.org.[slug].campaigns.[campaignId].receipts 0% 0%
src.routes.api.org.[slug].campaigns.[campaignId].responses 0% 0%
src.routes.api.org.[slug].campaigns.[campaignId].stream 0% 0%
src.routes.api.org.[slug].campaigns.targeting 0% 0%
src.routes.api.org.[slug].decision-makers.[dmId].activity 0% 0%
src.routes.api.org.[slug].decision-makers.[dmId].follow 0% 0%
src.routes.api.org.[slug].decision-makers.feed 0% 0%
src.routes.api.org.[slug].decision-makers.following 0% 0%
src.routes.api.org.[slug].dm.receipts 0% 0%
src.routes.api.org.[slug].dm.receipts.export.csv 0% 0%
src.routes.api.org.[slug].endorsements 0% 0%
src.routes.api.org.[slug].events 0% 0%
src.routes.api.org.[slug].events.[id] 0% 0%
src.routes.api.org.[slug].fundraising 0% 0%
src.routes.api.org.[slug].fundraising.[id] 0% 0%
src.routes.api.org.[slug].fundraising.[id].donors 0% 0%
src.routes.api.org.[slug].invites 0% 0%
src.routes.api.org.[slug].issue-domains 0% 0%
src.routes.api.org.[slug].issue-domains.rescore 0% 0%
src.routes.api.org.[slug].members 0% 0%
src.routes.api.org.[slug].networks 0% 0%
src.routes.api.org.[slug].networks.[networkId] 0% 0%
src.routes.api.org.[slug].networks.[networkId].accept 0% 0%
src.routes.api.org.[slug].networks.[networkId].decline 0% 0%
src.routes.api.org.[slug].networks.[networkId].invite 0% 0%
src.routes.api.org.[slug].networks.[networkId].leave 0% 0%
src.routes.api.org.[slug].networks.[networkId].members.[orgId] 0% 0%
src.routes.api.org.[slug].networks.[networkId].report 0% 0%
src.routes.api.org.[slug].profile 0% 0%
src.routes.api.org.[slug].representatives 0% 0%
src.routes.api.org.[slug].representatives.resolve 0% 0%
src.routes.api.org.[slug].scorecards 0% 0%
src.routes.api.org.[slug].scorecards.export 85% 84%
src.routes.api.org.[slug].segments 0% 0%
src.routes.api.org.[slug].ses-token 0% 0%
src.routes.api.org.[slug].settings.alert-preferences 0% 0%
src.routes.api.org.[slug].sms 0% 0%
src.routes.api.org.[slug].sms.[id] 0% 0%
src.routes.api.org.[slug].sms.[id].messages 0% 0%
src.routes.api.org.[slug].sms.audience-count 0% 0%
src.routes.api.org.[slug].workflows 89% 88%
src.routes.api.org.[slug].workflows.[id] 100% 90%
src.routes.api.org.[slug].workflows.[id].executions 100% 50%
src.routes.api.org.check-slug 0% 0%
src.routes.api.positions.batch-register 0% 0%
src.routes.api.positions.confirm-send 0% 0%
src.routes.api.positions.count.[templateId] 0% 0%
src.routes.api.positions.engagement-by-district.[templateId] 0% 0%
src.routes.api.positions.register 0% 0%
src.routes.api.proofs.revocation-witness 0% 0%
src.routes.api.shadow-atlas.engagement 0% 0%
src.routes.api.shadow-atlas.register 0% 0%
src.routes.api.submissions.[id].retry 0% 0%
src.routes.api.submissions.[id].status 0% 0%
src.routes.api.submissions.create 62% 54%
src.routes.api.tee.public-key 0% 0%
src.routes.api.tee.resolve 92% 89%
src.routes.api.templates 0% 0%
src.routes.api.templates.check-slug 0% 0%
src.routes.api.templates.search 0% 0%
src.routes.api.user.profile 0% 0%
src.routes.api.user.templates 0% 0%
src.routes.api.v1 100% 100%
src.routes.api.v1.activity 0% 0%
src.routes.api.v1.calls 0% 0%
src.routes.api.v1.campaigns 18% 9%
src.routes.api.v1.campaigns.[id] 0% 0%
src.routes.api.v1.campaigns.[id].actions 0% 0%
src.routes.api.v1.docs 67% 50%
src.routes.api.v1.donations 0% 0%
src.routes.api.v1.donations.[id] 0% 0%
src.routes.api.v1.events 0% 0%
src.routes.api.v1.events.[id] 0% 0%
src.routes.api.v1.keys 0% 0%
src.routes.api.v1.keys.[id] 0% 0%
src.routes.api.v1.networks 0% 0%
src.routes.api.v1.networks.[id] 0% 0%
src.routes.api.v1.networks.[id].stats 0% 0%
src.routes.api.v1.orgs 0% 0%
src.routes.api.v1.representatives 0% 0%
src.routes.api.v1.resolve-address 100% 89%
src.routes.api.v1.sms 0% 0%
src.routes.api.v1.stream 0% 0%
src.routes.api.v1.supporters 30% 18%
src.routes.api.v1.supporters.[id] 0% 0%
src.routes.api.v1.tags 0% 0%
src.routes.api.v1.tags.[id] 0% 0%
src.routes.api.v1.usage 0% 0%
src.routes.api.v1.webhooks 0% 0%
src.routes.api.v1.webhooks.[id] 0% 0%
src.routes.api.v1.webhooks.[id].rotate-secret 0% 0%
src.routes.api.v1.webhooks.[id].test-fire 0% 0%
src.routes.api.v1.workflows 100% 88%
src.routes.api.v1.workflows.[id] 100% 58%
src.routes.api.waitlist 0% 0%
src.routes.api.wallet 0% 0%
src.routes.api.wallet.balance 0% 0%
src.routes.api.wallet.connect 0% 0%
src.routes.api.wallet.disconnect 0% 0%
src.routes.api.wallet.near.sponsor 0% 0%
src.routes.api.wallet.nonce 0% 0%
src.routes.api.wallet.sponsor-userop 99% 77%
src.routes.api.wallet.status 0% 0%
src.routes.auth.coinbase 0% 0%
src.routes.auth.coinbase.callback 0% 0%
src.routes.auth.discord 0% 100%
src.routes.auth.discord.callback 0% 100%
src.routes.auth.facebook 0% 0%
src.routes.auth.facebook.callback 0% 100%
src.routes.auth.google 0% 0%
src.routes.auth.google.callback 0% 100%
src.routes.auth.linkedin 0% 0%
src.routes.auth.linkedin.callback 0% 100%
src.routes.auth.logout 0% 0%
src.routes.auth.prepare 0% 0%
src.routes.auth.twitter 0% 100%
src.routes.auth.twitter.callback 0% 100%
src.routes.browse 0% 0%
src.routes.c.[slug] 0% 0%
src.routes.d.[campaignId] 0% 0%
src.routes.deliberation 0% 0%
src.routes.developers 0% 0%
src.routes.directory 0% 0%
src.routes.dm.[id] 0% 0%
src.routes.dm.[id].scorecard 0% 0%
src.routes.e.[id] 0% 0%
src.routes.embed 0% 100%
src.routes.embed.campaign.[slug] 0% 0%
src.routes.governance 0% 0%
src.routes.help.verification 0% 0%
src.routes.migrate 0% 0%
src.routes.n.[slug] 0% 0%
src.routes.og.campaign.[id] 0% 0%
src.routes.og.integrity 0% 100%
src.routes.og.org 0% 100%
src.routes.og.org-for.[segment] 0% 0%
src.routes.org 0% 0%
src.routes.org.[slug] 0% 0%
src.routes.org.[slug].calls 0% 0%
src.routes.org.[slug].campaigns 0% 0%
src.routes.org.[slug].campaigns.[id] 0% 0%
src.routes.org.[slug].campaigns.[id].report 0% 0%
src.routes.org.[slug].campaigns.[id].report.email-html 0% 0%
src.routes.org.[slug].campaigns.new 0% 0%
src.routes.org.[slug].emails 0% 0%
src.routes.org.[slug].emails.[blastId] 0% 0%
src.routes.org.[slug].emails.[blastId].receipts 0% 0%
src.routes.org.[slug].emails.compose 0% 0%
src.routes.org.[slug].events 0% 0%
src.routes.org.[slug].events.[id] 0% 0%
src.routes.org.[slug].events.[id].attendees.csv 0% 0%
src.routes.org.[slug].events.[id].calendar.ics 0% 0%
src.routes.org.[slug].events.new 0% 0%
src.routes.org.[slug].fundraising 0% 0%
src.routes.org.[slug].fundraising.[id] 0% 0%
src.routes.org.[slug].fundraising.new 0% 0%
src.routes.org.[slug].legislation 0% 0%
src.routes.org.[slug].networks 0% 0%
src.routes.org.[slug].networks.[networkId] 0% 0%
src.routes.org.[slug].networks.new 0% 0%
src.routes.org.[slug].representatives 0% 0%
src.routes.org.[slug].representatives.[repId] 0% 0%
src.routes.org.[slug].results 0% 100%
src.routes.org.[slug].scorecards 0% 0%
src.routes.org.[slug].settings 0% 0%
src.routes.org.[slug].settings.webhooks 0% 0%
src.routes.org.[slug].sms 0% 0%
src.routes.org.[slug].sms.[id] 0% 0%
src.routes.org.[slug].sms.new 0% 0%
src.routes.org.[slug].studio 0% 0%
src.routes.org.[slug].supporters 0% 0%
src.routes.org.[slug].supporters.[id] 0% 0%
src.routes.org.[slug].supporters.import 0% 0%
src.routes.org.[slug].supporters.import.action-network 0% 100%
src.routes.org.[slug].supporters.import.platform-api 0% 0%
src.routes.org.[slug].workflows 0% 0%
src.routes.org.[slug].workflows.[id] 0% 0%
src.routes.org.[slug].workflows.new 0% 0%
src.routes.org.for 0% 100%
src.routes.org.for.agency-rulemaking 0% 0%
src.routes.org.for.local-government 0% 0%
src.routes.org.for.state-legislature 0% 0%
src.routes.org.invite.[token] 0% 0%
src.routes.org.new 0% 0%
src.routes.profile 5% 8%
src.routes.profile.receipts 0% 0%
src.routes.profile.security 5% 6%
src.routes.record 100% 100%
src.routes.record.vol-1.issue-1 0% 0%
src.routes.s.[slug] 0% 0%
src.routes.s.[slug].debate.[debateId] 0% 0%
src.routes.s.[slug].og-image 0% 0%
src.routes.settings.delegation 0% 0%
src.routes.spec 0% 0%
src.routes.template-modal.[slug] 0% 0%
src.routes.unsubscribe 0% 0%
src.routes.unsubscribe.[supporterId].[orgId].[token] 0% 0%
src.routes.v.[hash] 0% 0%
src.routes.verify.[hash] 0% 0%
src.routes.verify.receipt.[id] 0% 0%
Summary 19% (9399 / 50053) 17% (6462 / 39133)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant