{"id":51025394,"url":"https://github.com/edycutjong/litmus","last_synced_at":"2026-06-21T19:01:55.612Z","repository":{"id":364678103,"uuid":"1268347253","full_name":"edycutjong/litmus","owner":"edycutjong","description":"🧪 Output-grading quality gate agent — grades any deliverable 0-100 with a rubric, on-chain","archived":false,"fork":false,"pushed_at":"2026-06-14T02:32:34.000Z","size":13376,"stargazers_count":0,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T03:14:13.815Z","etag":null,"topics":["a2a","agent","croo","grading","quality"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/edycutjong.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-13T12:27:09.000Z","updated_at":"2026-06-14T02:32:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/edycutjong/litmus","commit_stats":null,"previous_names":["edycutjong/litmus"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/edycutjong/litmus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flitmus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flitmus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flitmus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flitmus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edycutjong","download_url":"https://codeload.github.com/edycutjong/litmus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flitmus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34622271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a","agent","croo","grading","quality"],"created_at":"2026-06-21T19:01:53.905Z","updated_at":"2026-06-21T19:01:55.602Z","avatar_url":"https://github.com/edycutjong.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/icon-animated.svg\" alt=\"Litmus Logo\" width=\"120\"\u003e\n\n  \u003ch1\u003eLitmus 🧪\u003c/h1\u003e\n  \u003cp\u003e\u003cem\u003eOutput-grading quality gate agent — grades any deliverable 0-100 with a rubric, on-chain\u003c/em\u003e\u003c/p\u003e\n  \u003cimg src=\"docs/readme-hero-animated.svg\" alt=\"Litmus\" width=\"100%\"\u003e\n\n  \u003cbr/\u003e\n\n  [![Live Demo](https://img.shields.io/badge/🚀_Live-Demo-06b6d4?style=for-the-badge)](https://mock.croo.network)\n  [![Built for CROO Hackathon](https://img.shields.io/badge/DoraHacks-CROO_Hackathon_2026-8b5cf6?style=for-the-badge)](https://dorahacks.io)\n\n  \u003cbr/\u003e\n\n  ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat\u0026logo=typescript\u0026logoColor=white)\n  ![Node.js](https://img.shields.io/badge/Node.js-339933?style=flat\u0026logo=node.js\u0026logoColor=white)\n  [![CI](https://github.com/edycutjong/litmus/actions/workflows/ci.yml/badge.svg)](https://github.com/edycutjong/litmus/actions/workflows/ci.yml)\n\n\u003c/div\u003e\n\n---\n\n## 📸 See it in Action\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/see-in-action.png\" alt=\"Litmus Demo\" width=\"100%\"\u003e\n\u003c/div\u003e\n\n\u003e **The Quality Gate Workflow.** Deliverable Received → Litmus Applies Grading Rubric → Score (0-100) Calculated → Feedback \u0026 On-Chain Grade Delivered.\n\n---\n\n## 💡 The Problem \u0026 Solution\nIn an autonomous agent economy, output quality varies wildly. How do you trust an agent's work without manual human review?\n**Litmus** is an AI Quality Gate Agent. It acts as an automated, impartial grader that evaluates deliverables against strict, predefined rubrics. If an agent submits subpar code, writing, or analysis, Litmus rejects it, ensuring only high-quality work passes the gate.\n\n**Key Features:**\n- ⚖️ **Objective Grading:** Evaluates work across multiple rubric categories, assigning a deterministic score from 0-100.\n- 🚧 **Quality Gatekeeper:** Automatically rejects work that falls below the acceptable threshold.\n- ⛓️ **On-Chain Attestation:** Cryptographically signs the grade to ensure the evaluation is immutable and verifiable.\n\n## 🌌 The Constellation — On-Chain A2A Graph\n\nLitmus is the constellation's **quality oracle**: other agents pay it on-chain to grade a deliverable 0–100 against a rubric. A two-model \"tribunal\" (with a tiebreaker) keeps scoring stable (σ \u003c 4). Verifiable, paid, impartial grading-as-a-service is a primitive a normal API marketplace can't offer.\n\n```mermaid\ngraph LR\n    User([Any Agent / User]) --\u003e|hires to grade| L[Litmus 🧪]\n    M[Maestro 🎼] --\u003e|grade + re-grade in its reflection loop| L\n    G[Gauntlet 🧤] -.-\u003e|certifies| L\n    classDef hot fill:#F59E0B,stroke:#111,color:#111,font-weight:bold;\n    class L hot;\n```\n\n- **Depth:** Maestro hires Litmus **twice** per pipeline — once to grade, once to re-grade the self-corrected draft — making it a high-traffic A2A node.\n- **Anti-gaming:** rubric weights are validated and Format/Clarity is capped at 15% so agents can't farm a passing grade on style alone.\n\n## 🔗 Live Run Log — On-Chain Proof (Base Mainnet)\n\nReal CAP grading orders Litmus fulfilled as a **provider**.\n\n**Total real CAP orders: _0_** · _last updated: 2026-06-__\n\n| # | Date | Counterparty (requester) | Amount (USDC) | Order ID | Tx (BaseScan) | Score |\n|---|------|--------------------------|---------------|----------|---------------|-------|\n| 1 | _2026-06-__ | _Maestro / external_ | _0.00_ | `_ord_…_` | [0x…](https://basescan.org/tx/0x…) | _N_/100 |\n\n\u003e Order IDs + pay tx are in the provider logs and the CROO dashboard. Delete this note once populated.\n\n## 🏗️ Architecture \u0026 Tech Stack\n\n| Layer | Technology |\n|---|---|\n| **Runtime** | Node.js (TypeScript) |\n| **Ecosystem** | Constellation A2A (croo-core) |\n| **Testing** | Vitest |\n\n## 🚀 Getting Started\n\n### Prerequisites\n- Node.js ≥ 20\n- npm\n\n### Installation\n1. Clone: `git clone https://github.com/edycutjong/litmus.git`\n2. Install: `npm install`\n3. Configure: `cp .env.example .env.local` and fill in your service ID + an LLM key (skip for mock mode)\n\n### ▶️ Run it now — offline mock mode (no wallet, no USDC)\n```bash\nnpm install\nCROO_MOCK=true npm run dev   # boots the grader provider with no on-chain calls\n```\nGrading works with **no API key** (deterministic mock grade); set `OPENAI_API_KEY` and/or `ANTHROPIC_API_KEY` to enable the live LLM tribunal. Run `npm run stability` to reproduce the σ \u003c 4 scoring-variance harness.\n\n## 🧪 Testing \u0026 CI\n\n**4-stage pipeline:** Quality → Security → Build → Deploy Gate\n\n```bash\n# ── Code Quality ────────────────────────────\nmake lint          # ESLint\nmake typecheck     # TypeScript check\nmake test          # Run tests\nmake test-coverage # Coverage report\nmake ci            # Full quality gate\n\n# ── Security ────────────────────────────────\nmake security-scan # npm audit + license check\n```\n\n| Layer | Tool | Status |\n|---|---|---|\n| Code Quality | ESLint + TypeScript | ✅ |\n| Unit Testing | Vitest | ✅ |\n| Security (SAST) | CodeQL | ✅ |\n| Security (SCA) | Dependabot + npm audit | ✅ |\n| Secret Scanning | TruffleHog | ✅ |\n\n## 📁 Project Structure\n```text\ndorahacks-croo-litmus/\n├── docs/              # README assets (hero, screenshots)\n├── src/               # Application source code\n├── scripts/           # Build and run scripts\n├── __tests__/         # Vitest test suites\n├── .github/           # CI workflows\n└── README.md          # You are here\n```\n\n## 🚢 Deploy\nContainerized for any PaaS. Litmus is a background **worker** (connects out to the CROO WebSocket — no inbound port):\n```bash\ndocker build -t litmus .\ndocker run --env-file .env.local litmus\n```\n\n## 📄 License\n[MIT](LICENSE) © 2026 Edy Cu\n\n## 🙏 Acknowledgments\nBuilt for the DoraHacks CROO Hackathon 2026.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedycutjong%2Flitmus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedycutjong%2Flitmus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedycutjong%2Flitmus/lists"}