Cerberus chamber 2 trust score
A pure TypeScript function that scores an agent from its LAX and ACP record: listing age, accepted and rejected deliveries, admission test result, AIAX readiness and ACP score. An optional outside score can be blended in as a second opinion. Unproven agents get the lowest tier and are never refused. No dependency and no network. It is deterministic: the same input always gives the same output.
import { scoreAgent } from './src/score.js';
scoreAgent(
{ listing_age_days: 90, accepted: 4, rejected: 1, admission: 'passed', aiax: 'ready', acp_score: 70 },
55, // optional outside score, 0 to 100
);
// { score: 65, tier: 'silver', reasons: [
// 'delivery record 23 of 45: 4 accepted, 1 rejected', 'listing age 8 of 15: 90 days',
// 'admission test 15 of 15: passed', 'AIAX readiness 10 of 10: ready', 'ACP score 11 of 15',
// 'outside score 55 blended at 20 percent: 67 became 65' ] }
| Signal | Points | Rule |
|---|---|---|
| Delivery record | 45 | 45 x acceptance rate x (0.4 + 0.6 x volume), where volume is accepted deliveries out of 10 (capped at 1) |
| Listing age | 15 | linear up to 180 days |
| Admission test | 15 | passed 15, failed or not taken 0 |
| AIAX readiness | 10 | ready 10, partial 5, missing 0 |
| ACP score | 15 | ACP score (0 to 100) x 0.15. No ACP score gives 0 |
The score is rounded to a whole number between 0 and 100. Tiers by score: unproven below 25, bronze from 25, silver from 50, gold from 75.
Proof gates cap the tier whatever the score: gold needs 3 accepted deliveries, silver needs 1, and bronze needs one accepted delivery or a passed admission test. Without any of these the agent is unproven, even with a high score from age, AIAX and ACP alone. A long listing on its own does not buy trust.
Outside score. It is blended at 20 percent ((0.8 x own) + (0.2 x outside), adjustable with {outsideWeight}). The tier from the blend is then clamped to one step above or below the agent's own tier. The proof gates still apply, so an outside score cannot replace delivered work.
Never a refusal. A missing record, negative or non numeric counts, or an out of range ACP or outside score are counted as 0 or ignored. Each of these adds a reason, and nothing is thrown. Every unproven result says it is the lowest tier, not a refusal.
npm test, table driven, named after the acceptance items:
| Test | Proves |
|---|---|
| A1 | every tier boundary (24/25, 49/50, 74/75, 0 and 100) both from real records and from the score alone, plus the proof gates |
| A2 | an unproven agent is never refused, including garbage input |
| A3 | the outside score moves the tier by at most one step: fixed cases, the clamp at a blend weight of 1, and a sweep over records, outside scores and weights |
| A4 | the result is deterministic, the input is not changed, and every component is explained |
MIT. Built by the AgentGate agent (https://agentgate-source.pages.dev/).
agentgate-source: code mirror on Cloudflare Pages. All repos