Agent Fabric: added the Data-Sharing / TEFCA Interoperability agent — deterministic cross-org PHI exchange with HIPAA §164.506 TPO gate + TEFCA participant verification + consent-scope enforcement (the 46th agent)
ShippedAdded the forty-sixth agent on the fabric — data-sharing-tefca-agent, the Salesforce 'Agentforce for Health' / Health Cloud interoperability analog. Registered on the care-coordination tier as the cross-organization PHI-exchange gateway paired with the Consent & Preferences Management agent (consent scopes), the Provider Credentialing agent (participant registry — same source-integrity discipline), and the Care Coordination Handoff agent (transfer-consent sibling for same-org handoffs). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/data-sharing-tefca.ts, evaluateDataSharingRules(req) applies five catalog rules — rule.tpo-release-authorized (fires release-authorized for HIPAA §164.506 TPO purposes), rule.non-tpo-consented-release (fires release-authorized when a matching consent scope is on file for a non-TPO purpose), rule.non-tpo-consent-missing (fires blocked-consent-required-non-tpo when consent is absent for non-TPO), rule.non-catalog-purpose (fires blocked-non-catalog-purpose for off-catalog purposes), rule.participant-unverified (fires blocked-participant-unverified when the requester is not on the TEFCA / Carequality / CommonWell registry); evaluateDataSharing(req) returns the full DataSharingDecision with primary reason from DS-100/101/200/300/400, isTpo flag pinned from the purpose catalog, and routing to auto-release / privacy-officer-review / consent-capture / participant-registry-verification / blocked-hold. Every non-release decision is requiresPrivacyOfficerCosign:true / cosigned:false — the agent NEVER autonomously releases PHI for a non-TPO purpose without an active consent scope. EXCHANGE_NETWORKS catalog holds four networks (TEFCA QHIN, Carequality, CommonWell, Direct Secure Messaging); EXCHANGE_PURPOSES holds six illustrative purposes (treatment, payment, operations, patient-request, public-health, research), with the first three flagged as isTpo (the HIPAA §164.506 consent-not-required exception). It is a pure function of the request + catalog + caller-provided asOfDate (no randomness, no clock; timestamps and consent scope lists accepted as data), so the same context always yields the same decision + isTpo + primary reason, with a documented decision precedence (blocked-participant-unverified > blocked-non-catalog-purpose > blocked-consent-required-non-tpo > pend-purpose-verification > release-authorized) and stable rule-id ordering. Distinct from the Consent & Preferences Management agent (which owns the consent LEDGER — this agent reads consent scopes) and the Care Coordination Handoff agent (which handles same-org cross-setting transitions — this handles cross-org PHI exchanges over federated networks). THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.data-sharing.purpose-catalog-sourced (signal purposesTraceToCatalog, violating value false) blocks a decision citing an off-catalog exchange purpose, network, rule, or reason code — a bespoke exchange purpose doesn't map to a HIPAA disclosure permission and would open the network to unauthorized aggregation (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the FWA Agent's pattern-catalog-sourced, the Trial Payments Agent's schedule-catalog-sourced, the UR Agent's criteria-catalog-sourced, the Handoff Agent's SBAR-completeness, and the Adverse Event Reporting Agent's event-catalog-sourced posture), backed by the pure guard purposesTraceToCatalog which validates the purpose + network + applied rules + reason codes all trace to the catalog; policy.data-sharing.no-autonomous-non-tpo-release (signal releaseHonorsNonTpoConsent, violating value false) blocks a release-authorized decision for a non-TPO purpose without an active consent scope on file for that exact purpose — this is the load-bearing HIPAA §164.506 boundary (TPO = treatment / payment / operations doesn't need consent; everything else does), and unauthorized non-TPO disclosures are the documented breach pattern behind the majority of OCR HIPAA enforcement actions (mirroring the Consent & Preferences Management Agent's no-scope-override, the Grievance & Appeals Agent's no-phi-in-routing-summary, and the Handoff Agent's transfer-consent posture), backed by the guard releaseHonorsNonTpoConsent which treats decision:'blocked-consent-required-non-tpo' as the safe path, trivially passes on non-release decisions (no PHI leaves), exempts TPO purposes (isTpo:true), and rejects only lies that claim release-authorized for a non-TPO purpose without a matching consent scope; and policy.data-sharing.participant-verified (signal participantIdentityVerified, violating value false) blocks a release-authorized decision to an unverified requester — under 45 CFR 171 + the TEFCA Common Agreement a QHIN / participant / sub-participant must be identity-attested before a cross-org exchange is authorized (mirroring the Provider Credentialing Agent's source-integrity, the Adverse Event Reporting Agent's reporter-verified, and the Handoff Agent's receiving-clinician-credentialed posture), backed by the guard participantIdentityVerified which treats decision:'blocked-participant-unverified' as the safe path and rejects only lies that claim a release-authorized despite an unverified requester. It also reuses, by extending appliesTo, the HIPAA-audit policy (it handles cross-org PHI exchanges — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/data-sharing-tefca/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — data-sharing-tefca.evaluate-rules → data-sharing-tefca.decide — with phiAccessed:true, returning the DataSharingDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Data-Sharing / TEFCA panel (eight presets: TPO treatment release over TEFCA QHIN, non-TPO research release over Carequality with consent, blocked non-TPO research without consent, blocked unverified requester on TPO treatment, patient right-of-access release over Direct Secure Messaging, plus off-catalog-purpose / non-TPO-release-lie / unverified-participant-lie governance-block presets), a seeded data-sharing-tefca.evaluate-rules→data-sharing-tefca.decide trace showing a TPO treatment release-authorized over TEFCA (isTpo:true, phiAccessed:true), the console subtitle, and the investor brief (now 'forty-six agents across three planes', with the Data-Sharing / TEFCA agent on the patient/clinical plane paired with Consent + Provider Credentialing + Care Coordination Handoff) all reflect it. Frontend tests green (+ data-sharing-tefca catalog/determinism/rule-precedence/TPO-vs-non-TPO-branching/consent-scope-matching/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across all five decision tiers, the panel's request-body + view-lift, and the registry drift guards raised to forty-six agents); the exchange-network catalog, exchange-purpose catalog, rules, and reason codes are clearly-labeled illustrative synthetics, NOT an actual TEFCA QHIN implementation, the Carequality Interoperability Framework, the CommonWell Health Alliance node stack, or a certified ONC data-sharing gateway. Lint + build clean.
Agent Fabric: added the Adverse Event Reporting agent (FDA MedWatch / VAERS analog) — deterministic pharmacovigilance classification with regulatory-team-cosign-gated FDA submissions + reporter-identity verification (the 45th agent)
ShippedAdded the forty-fifth agent on the fabric — adverse-event-reporting-agent, the Salesforce 'Agentforce for Health' / Health Cloud pharmacovigilance / device-safety-reporting analog. Registered on the care-coordination tier as the FDA-channel drafting engine that pairs with the Medication Adherence agent (nudge-only refill), the Formulary & DUR agent (drug utilization review), and the Clinical Trials Matching + Trial Payments agents (research pharmacovigilance signal). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/adverse-event-reporting.ts, evaluateAdverseEventRules(req) applies four catalog rules — rule.medwatch-eligible (fires draft-medwatch for drug ADRs / device malfunctions / medication errors / therapeutic failures), rule.vaers-eligible (fires draft-vaers for vaccine reactions), rule.non-catalog-event (fires blocked-non-catalog-event for off-catalog events), rule.reporter-unverified (fires blocked-reporter-unverified when the reporter identity is not attested); computeSeriousnessTier(input) classifies the 21-CFR-314.80 seriousness tier from caller-provided outcome flags (resultedInDeath > isLifeThreatening > requiredHospitalization / causedDisability / causedBirthDefect / medicallyImportant → serious → non-serious) with strict precedence; evaluateAdverseEvent(req) returns the full AdverseEventDecision with primary reason from AE-100/101/300/400, seriousness tier, and routing to regulatory-team-medwatch-queue / regulatory-team-vaers-queue / blocked-hold. Every draft-medwatch or draft-vaers decision is requiresRegulatoryTeamCosign:true / cosigned:false — the agent NEVER autonomously files to the FDA. ADVERSE_EVENT_TYPES catalog holds five event types (drug-adr, vaccine-reaction, device-malfunction, medication-error, therapeutic-failure), each pinned to its target FDA channel (MedWatch vs VAERS); SERIOUSNESS_TIERS holds four illustrative tiers (non-serious, serious, life-threatening, death) aligned with 21 CFR 314.80 criteria; illustrative ReporterType covers clinician / patient / consumer / manufacturer / other-health-professional. It is a pure function of the request + catalog + caller-provided asOfDate (no randomness, no clock; timestamps and outcome flags accepted as data), so the same context always yields the same decision + channel + seriousness + primary reason, with a documented decision precedence (blocked-reporter-unverified > blocked-non-catalog-event > draft-medwatch / draft-vaers) and stable rule-id ordering. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.adverse-event.event-catalog-sourced (signal eventsTraceToCatalog, violating value false) blocks a decision citing an off-catalog event type, seriousness tier, rule, or reason code — a bespoke event doesn't map to an FDA channel and poisons the pharmacovigilance signal (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the FWA Agent's pattern-catalog-sourced, the Trial Payments Agent's schedule-catalog-sourced, the UR Agent's criteria-catalog-sourced, and the Handoff Agent's SBAR-completeness posture), backed by the pure guard eventsTraceToCatalog which validates the event + seriousness + applied rules + reason codes all trace to the catalog; policy.adverse-event.no-autonomous-submission (signal submissionRequiresRegulatoryTeamCosign, violating value false) blocks an autonomously-cosigned FDA submission — MedWatch (3500 / 3500A) and VAERS submissions are legally consequential under 21 CFR 314.80 (mandatory reporting) with sponsor / manufacturer / clinician liability (mirroring the Claims Adjudication Agent's no-autonomous-denial, the UR Agent's no-autonomous-denial, the Formulary Agent's no-autonomous-override, the FWA Agent's no-autonomous-denial, the Trial Payments Agent's no-autonomous-irb-deviation, and the HEDIS Agent's no-autonomous-submission posture), backed by the guard submissionRequiresRegulatoryTeamCosign which trivially passes on blocked decisions and enforces requiresRegulatoryTeamCosign:true / cosigned:false on every draft; and policy.adverse-event.reporter-verified (signal reporterIdentityVerified, violating value false) blocks a draft with an unattested reporter identity — an anonymous or unverified reporter is not admissible under FDA reporting requirements and poisons the surveillance signal, backed by the guard reporterIdentityVerified which treats decision:'blocked-reporter-unverified' as the safe path and rejects only lies that claim a draft despite unverified reporter. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient / reporter context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/adverse-event-reporting/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — adverse-event-reporting.evaluate-rules → adverse-event-reporting.decide — with phiAccessed:true, returning the AdverseEventDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Adverse Event Reporting panel (eight presets: MedWatch draft for a serious hospitalized drug ADR (fezolinetant), VAERS draft for a vaccine reaction (seasonal flu), MedWatch draft for a life-threatening estradiol reaction, MedWatch draft for a non-serious voluntary paroxetine report, blocked-unverified-reporter for an anonymous consumer report, plus off-catalog-event / autonomous-cosign / unverified-reporter-lie governance-block presets), a seeded adverse-event-reporting.evaluate-rules→adverse-event-reporting.decide trace showing a MedWatch draft for a serious drug ADR routed to the regulatory-team queue, the console subtitle, and the investor brief (now 'forty-five agents across three planes', with the Adverse Event Reporting agent on the patient/clinical plane paired with Medication Adherence + Formulary & DUR + Clinical Trials Matching + Trial Payments) all reflect it. Frontend tests green (+ adverse-event-reporting catalog/determinism/seriousness-precedence/channel-selection/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across all four decision tiers, the panel's request-body + view-lift, and the registry drift guards raised to forty-five agents); the event-type catalog, seriousness tiers, rules, and reason codes are clearly-labeled illustrative synthetics, NOT FDA MedWatch, VAERS, EudraVigilance, an actual sponsor's pharmacovigilance database, or a certified 21 CFR 314.80 submission pipeline. Lint + build clean.
Agent Fabric: added the Care Coordination Handoff agent (cross-setting) — deterministic Joint-Commission-NPSG-2 SBAR with receiving-clinician credentialing + transfer-consent gates (the 44th agent)
ShippedAdded the forty-fourth agent on the fabric — care-coordination-handoff-agent, the Salesforce 'Agentforce for Health' / Health Cloud cross-setting care-coordination analog. Registered on the care-coordination tier as the GENERAL cross-setting handoff engine that pairs with the Provider Credentialing agent (network gate on the receiving clinician), the Consent & Preferences Management agent (transfer-consent scope), and the Transitions of Care agent (post-discharge hospital→home + med reconciliation, the sibling — this is the general case). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/care-coordination-handoff.ts, evaluateHandoffRules(req) applies four catalog rules — rule.sbar-complete (fires handoff-accepted when all four SBAR sections populated + no other rules fire), rule.sbar-incomplete (pend-sbar-incomplete when any of situation/background/assessment/recommendation missing), rule.clinician-not-credentialed (blocked-clinician-not-credentialed when receiving credentialing is expired/incomplete/sanctioned), rule.transfer-consent-missing (blocked-no-consent when the transition requires consent and none is on file); evaluateHandoff(req) classifies as handoff-accepted / pend-sbar-incomplete / blocked-clinician-not-credentialed / blocked-no-consent with primary reason from HO-100/200/300/400, computes missingSbarSections from the caller's structured SBAR (SBAR is structured labels — NOT free-text PHI), and routes to receiving-clinician-inbox / sending-clinician-completion / credentialing-remediation / consent-capture. Every accepted handoff is requiresReceivingClinicianCosign:true / cosigned:false — the agent NEVER autonomously accepts on behalf of the receiving clinician. CARE_SETTINGS catalog holds eight settings (hospital inpatient, ED, SNF, home health, hospice, PCP clinic, specialist clinic, behavioral health clinic); TRANSITION_TYPES catalog holds six illustrative transitions (hospital→SNF, SNF→home, home→hospice, ED→PCP, PCP→specialist, PCP→behavioral-health), each flagged for whether it typically requires documented transfer consent (all cross-facility PHI-sharing transitions do; intra-system ED→PCP and PCP→specialist do not). It is a pure function of the request + catalog + caller-provided asOfDate (no randomness, no clock; SBAR fields and consent flags accepted as data), so the same context always yields the same decision + missing-sections list + primary reason, with a documented decision precedence (blocked-no-consent > blocked-clinician-not-credentialed > pend-sbar-incomplete > handoff-accepted) and stable rule-id ordering. Distinct from the Discharge & Transitions of Care agent (which is POST-DISCHARGE hospital→home only, and owns the medication reconciliation — this agent is any cross-setting handoff, no med reconciliation) and the Referral Management agent (which drafts an outbound specialist referral to be sent by a clinician — this agent is the SBAR handoff on an in-progress transition). THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.handoff.sbar-completeness (signal sbarIsComplete, violating value false) blocks a handoff-accepted claim that admits any missing SBAR section — the Joint Commission National Patient Safety Goal 2 requires standardized handoff communication (situation, background, assessment, recommendation), and incomplete SBAR is a well-documented patient-safety failure — backed by the pure guard sbarIsComplete which treats decision:'pend-sbar-incomplete' as the safe path (agent surfaced the gap) and rejects only lies that claim acceptance despite missing sections; policy.handoff.receiving-clinician-credentialed (signal receivingClinicianIsCredentialed, violating value false) blocks a handoff-accepted claim to a receiving clinician whose credentialing status is expired / incomplete / sanctioned — this is a ghost-network variant and a Section 1557 / due-process failure (mirroring the Provider Credentialing Agent's no-referral-to-expired-or-sanctioned posture), backed by the guard receivingClinicianIsCredentialed which treats decision:'blocked-clinician-not-credentialed' as the safe path and enforces current-unsanctioned status on every acceptance; and policy.handoff.consent-on-file (signal handoffHasConsent, violating value false) blocks a handoff-accepted claim without transfer consent on a transition type that requires it (hospital→SNF, SNF→home, home→hospice, PCP→behavioral-health) — sharing PHI with a new setting without patient consent is a HIPAA disclosure failure (mirroring the Consent & Preferences Management Agent's consent-scope posture), backed by the guard handoffHasConsent which treats decision:'blocked-no-consent' as the safe path, exempts transitions that don't require consent (ED→PCP, PCP→specialist), and rejects only lies that claim acceptance without documented consent. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient / receiving-clinician context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/care-coordination-handoff/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — care-coordination-handoff.evaluate-rules → care-coordination-handoff.decide — with phiAccessed:true, returning the HandoffDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Care Coordination Handoff panel (eight presets: handoff-accepted hospital→SNF SBAR-complete happy path, pend-sbar-incomplete SNF→home missing assessment+recommendation, blocked-uncredentialed ED→PCP with expired credentialing, blocked-no-consent home→hospice without transfer consent, handoff-accepted ED→PCP without consent (not required), plus SBAR-lie / uncredentialed-lie / no-consent-lie governance-block presets), a seeded care-coordination-handoff.evaluate-rules→care-coordination-handoff.decide trace showing an accepted hospital→SNF handoff routed to receiving-clinician-inbox, the console subtitle, and the investor brief (now 'forty-four agents across three planes', with the Care Coordination Handoff agent on the patient/clinical plane paired with Provider Credentialing + Consent + Transitions of Care) all reflect it. Frontend tests green (+ care-coordination-handoff catalog/determinism/rule-precedence/missing-SBAR-detection/consent-not-required-transitions/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across all four decision tiers, the panel's request-body + view-lift, and the registry drift guards raised to forty-four agents); the care-setting catalog, transition-type catalog, SBAR rule set, and reason codes are clearly-labeled illustrative synthetics, NOT Epic Care Everywhere, Cerner CareAware, an actual health system's handoff protocol, or a certified Joint Commission / ONC-approved handoff module. Lint + build clean.
Agent Fabric: added the Provider Contracting & VBC Terms agent — deterministic commercial-plane contract classification with account-owner-cosign-gated term changes + catalog-sourced VBC benchmarks (the 43rd agent)
ShippedAdded the forty-third agent on the fabric — provider-contracting-agent, the Salesforce 'Agentforce for Health' / Health Cloud provider-contracting analog. Registered on the commercial-operations tier as the CONTRACT-SIDE engine paired with the Pipeline Management and Account Management agents (and the Quality-Measure Attribution + HEDIS agents on the clinical plane, which read the resulting contract terms). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/provider-contracting.ts, evaluateContractingRules(req) applies five catalog rules — rule.quality-and-spend-in-band (in-good-standing), rule.quality-gate-missed (benchmark-drift review), rule.spend-drift-exceeded (benchmark-drift review), rule.term-change-requested (draft-term-change), rule.non-catalog-contract (blocked-non-catalog-contract); evaluateContract(req) classifies as in-good-standing / benchmark-drift-review / draft-term-change / blocked-non-catalog-contract with primary reason from PC-100/200/201/300/400, computes the spend drift (actual − benchmark) / benchmark against the methodology's tolerance, and routes to auto-continue / account-manager-drift-review / account-owner-cosign / blocked-hold. Every draft-term-change decision is requiresAccountOwnerCosign:true / cosigned:false — the agent NEVER autonomously commits a contract-term change. CONTRACT_TYPES holds six payment models (fee-for-service, capitation, shared-savings, bundled-payment, MA-value-based, commercial-VBC), each flagged for whether it has a VBC quality-gate + spend-benchmark shape; BENCHMARK_METHODOLOGIES holds four illustrative methodologies (Medicare MSSP MY2026 with 0.7 quality gate + 5% spend tolerance, MA Star VBC MY2026 with 0.75 gate + 3% tolerance, Commercial VBC MY2026 with 0.65 gate + 5% tolerance, Bundled-episode flat-benchmark with 0.6 gate + 10% tolerance) — each drives the quality-gate threshold + spend-drift tolerance for its contracts. It is a pure function of the request + catalog + caller-provided reporting-period (no randomness, no clock), so the same context always yields the same decision + drift + reason code, with a documented decision precedence (blocked-non-catalog-contract > draft-term-change > benchmark-drift-review > in-good-standing) and stable rule-id ordering. Distinct from the Quality-Measure Attribution agent (which decides whose panel a patient counts on) and the HEDIS agent (which scores measures against a contract's methodology) — this one handles the CONTRACT ITSELF. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.contracting.contract-type-catalog-sourced (signal contractsTraceToCatalog, violating value false) blocks a decision citing an off-catalog contract type, methodology, rule, or reason code (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the Formulary Agent's catalog-sourced, the FWA Agent's pattern-catalog-sourced, the Trial Payments Agent's schedule-catalog-sourced, and the UR Agent's criteria-catalog-sourced posture), backed by the pure guard contractsTraceToCatalog which validates the contract type + methodology + applied rules + reason codes all trace to the catalog; policy.contracting.no-autonomous-term-change (signal contractChangeRequiresOwnerCosign, violating value false) blocks an autonomously-cosigned term change — contract-term changes are legally consequential under state insurance code, provider-contract law, and CMS Medicare Advantage (mirroring the Claims Adjudication Agent's no-autonomous-denial, the UR Agent's no-autonomous-denial, the Formulary Agent's no-autonomous-override, the FWA Agent's no-autonomous-denial, the Trial Payments Agent's no-autonomous-irb-deviation, and the Account Management Agent's human-owner-before-contract-change posture), backed by the guard contractChangeRequiresOwnerCosign which trivially passes on non-term-change decisions and enforces requiresAccountOwnerCosign:true / cosigned:false on every draft-term-change; and policy.contracting.benchmark-methodology-catalog-sourced (signal benchmarksTraceToMethodology, violating value false) blocks a bespoke / opaque / 'we-picked-a-number' benchmark that doesn't derive from the methodology catalog — an opaque benchmark polluts every downstream shared-savings / bonus / clawback calculation, mirroring the Quality-Measure Attribution Agent's methodology-catalog-sourced posture, backed by the guard benchmarksTraceToMethodology which recomputes the expected quality-gate threshold + spend-drift tolerance from the methodology catalog and rejects any mismatch. Because it operates on business-side contract terms rather than patient PHI, this agent is on the commercial-operations plane and shares the commercial-plane policy.commercial.no-phi-in-commercial-plane (with its appliesTo extended to include the new agent); it is NOT on the HIPAA-audit policy (it never touches PHI), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/provider-contracting/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — provider-contracting.evaluate-rules → provider-contracting.decide — with phiAccessed:false (commercial plane), returning the ProviderContractDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Provider Contracting panel (eight presets: in-good-standing MA VBC quality+spend-in-band, quality-gate-missed MSSP shared-savings, spend-drift-exceeded commercial VBC, term-change-drafted MA VBC quality-gate lower proposal, non-VBC FFS good-standing, plus off-catalog-contract / autonomous-cosign / opaque-benchmark governance-block presets), a seeded provider-contracting.evaluate-rules→provider-contracting.decide trace showing a benchmark-drift review for a shared-savings quality miss on the commercial plane (phiAccessed:false), the console subtitle, and the investor brief (now 'forty-three agents across three planes', with the Provider Contracting agent on the commercial plane paired with Pipeline + Account Management) all reflect it. Frontend tests green (+ provider-contracting catalog/determinism/rule-precedence/spend-drift-computation/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across all four decision tiers, the panel's request-body + view-lift, and the registry drift guards raised to forty-three agents); the contract-type catalog, methodology catalog, rules, and reason codes are clearly-labeled illustrative synthetics, NOT Salesforce Health Cloud Provider Network Management, Optum Contract Manager, or a real payer's contract-lifecycle system. Lint + build clean.
Agent Fabric: added the Utilization Review agent (MCG/InterQual analog) — deterministic pre-service medical-necessity screen with clinician-cosign-gated denials + catalog-sourced SLA deadlines (the 42nd agent)
ShippedAdded the forty-second agent on the fabric — utilization-review-agent, the Salesforce 'Agentforce for Health' / Health Cloud utilization-management analog. Registered on the care-coordination tier as the PRE-SERVICE medical-necessity engine paired with the Prior Authorization agent (assembly), the Claims Adjudication Assistant (post-service edits), and the Grievance & Appeals agent (post-denial intake). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/utilization-review.ts, evaluateUrRules(req) evaluates catalog criteria evidence against the service-type's criteria set and applies five catalog rules — rule.all-required-met (clean-approve), rule.missing-required-criterion (pend for clinical review), rule.partial-criteria-p2p (escalate to peer-to-peer when provider requests it), rule.non-covered-service (blocked at first pass), rule.sla-window-required (every non-approved case carries a catalog SLA); reviewUtilization(req) classifies as approves-meets-criteria / pend-for-clinical-review / require-peer-to-peer / blocked-non-covered with primary reason from UR-100/200/201/300, computes the SLA deadline from catalog urgency window + received asOfDate (standard 72h, urgent 24h, concurrent-review 24h), and routes to auto-approve / clinical-reviewer-queue / peer-to-peer-scheduling / blocked-non-covered-appeal. Every non-approved decision is requiresClinicianCosign:true / cosigned:false — the agent NEVER autonomously denies. The illustrative service-type catalog holds five menopause-relevant services: DEXA bone-density (age gate + interval + symptom documentation), hysterectomy for abnormal uterine bleeding (bleed pattern + first-line failure + malignancy workup), inpatient medical admission (severity-of-illness + intensity-of-service + observation-insufficient), sleep-study for OSA workup (symptoms + home-test-inappropriate), and an illustrative cosmetic non-covered example. It is a pure function of the request + criteria evidence + urgency + catalog + caller-provided asOfDate (no randomness, no clock; timestamps and evidence flags accepted as data), so the same context always yields the same decision + met/missing criteria lists + primary reason + SLA deadline, with a documented decision precedence (blocked-non-covered > require-peer-to-peer > pend-for-clinical-review > approves-meets-criteria) and stable rule-id ordering. Distinct from the Prior Authorization Agent (which ASSEMBLES a clinician-gated PA submission for a specific payer), the Claims Adjudication Assistant (which decides POST-SERVICE clean-pay vs deny with mechanical NCCI-style edits), and the Grievance & Appeals Agent (POST-DENIAL intake) — this is the first-pass PRE-SERVICE medical-necessity engine. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.ur.criteria-catalog-sourced (signal criteriaTraceToCatalog, violating value false) blocks a decision citing an off-catalog service, an off-catalog criterion, an off-catalog rule, or an off-catalog reason code (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the Formulary Agent's catalog-sourced, the FWA Agent's pattern-catalog-sourced, and the Trial Payments Agent's schedule-catalog-sourced posture), backed by the pure guard criteriaTraceToCatalog which validates the service + criteria met/missing lists + applied rules + reason codes all trace to the catalog; policy.ur.no-autonomous-denial (signal denialRequiresClinicianCosign, violating value false) blocks an autonomously-cosigned non-approved decision — UR denials are legally consequential under Medicare Advantage / state utilization-review-agent codes with notice + due-process rights, and denying medical necessity on the agent's own authority is a Section 1557 / state-code violation (mirroring the Claims Adjudication Agent's no-autonomous-denial, the Formulary Agent's no-autonomous-override, the FWA Agent's no-autonomous-denial, and the Trial Payments Agent's no-autonomous-irb-deviation posture), backed by the guard denialRequiresClinicianCosign which trivially passes on approved decisions and enforces requiresClinicianCosign:true / cosigned:false on every non-approved decision; and policy.ur.sla-integrity (signal slaTracesToCatalog, violating value false) blocks a case deadline that doesn't match the catalog urgency window applied against the received asOfDate OR one that's been silently extended past the regulatory maximum — silently extending a UR deadline breaches Medicare Advantage Chapter 4 / state UR-agent timelines (mirroring the Grievance & Appeals Agent's deadline-integrity posture), backed by the guard slaTracesToCatalog which recomputes the expected deadline from urgency + asOfDate and rejects any mismatch. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches member context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/utilization-review/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — utilization-review.evaluate-criteria → utilization-review.decide — with phiAccessed:true, returning the UtilizationReviewDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Utilization Review panel (eight presets: approves-meets-criteria DEXA all-required-met, pend-for-clinical-review hysterectomy missing first-line, require-peer-to-peer inpatient with provider-requested P2P, urgent-pend sleep-study with 24h SLA, blocked-non-covered cosmetic case, plus off-catalog-service / autonomous-cosign / silently-extended-SLA governance-block presets), a seeded utilization-review.evaluate-criteria→utilization-review.decide trace showing a pend-for-clinical-review for a hysterectomy with a 72h standard SLA, the console subtitle, and the investor brief (now 'forty-two agents across three planes', with the Utilization Review agent on the patient/clinical plane paired with PA + Claims Adjudication + Grievance & Appeals) all reflect it. Frontend tests green (+ utilization-review catalog/determinism/rule-precedence/SLA-deadline-computation/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across all four decision tiers, the panel's request-body + view-lift, and the registry drift guards raised to forty-two agents); the service-type catalog, criteria sets, rules, reason codes, and SLA windows are clearly-labeled illustrative synthetics, NOT MCG (Milliman Care Guidelines / Indicia), InterQual, an actual payer's UR rule set, or a certified medical-necessity engine. Lint + build clean.
Agent Fabric: added the Clinical Trial Payments & Stipends agent — deterministic IRB-schedule payment engine with study-coordinator cosign + participant-consent gate (the 41st agent)
ShippedAdded the forty-first agent on the fabric — trial-payments-agent, the Salesforce 'Agentforce for Health' / Health Cloud clinical-trial payments analog. Registered on the care-coordination tier as the payments-side counterpart to the Clinical Trials Matching agent (which selects candidates). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/trial-payments.ts, evaluateTrialPaymentRules(req) applies five catalog rules — rule.standard-visit-completed (schedule stipend applies), rule.missed-visit-partial-comp (pend for coord review), rule.travel-out-of-range (pend when miles exceed IRB max), rule.extra-procedure-comp (pend when extra procedure requested), rule.consent-missing (blocked when no research-payment consent); evaluatePayment(req) classifies as schedule-approved / pend-coordinator-review / blocked-no-consent with primary reason from FORMULARY-style TP-100/200/201/202/300 codes, computes the stipend + travel reimbursement (per-mile rate capped at maxReimbursableMiles), and routes to schedule-auto-pay / study-coordinator-review / blocked-hold. Every non-schedule-approved decision is requiresCoordinatorCosign:true / cosigned:false — the agent NEVER autonomously deviates from an IRB-approved schedule. The illustrative schedule catalog holds three menopause trials: menopause vasomotor fezolinetant Phase 3, menopause HRT transdermal Phase 4 observational (with a follow-up stipend override), and menopause bone-density Phase 3 — each with an IRB approval ref, travel rate, and max reimbursable miles. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.trial-payments.schedule-catalog-sourced (signal paymentsTraceToCatalog, violating value false) blocks a payment citing an off-catalog trial, visit type, or rule (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the Formulary Agent's catalog-sourced, and the FWA Agent's pattern-catalog-sourced posture), backed by the pure guard paymentsTraceToCatalog; policy.trial-payments.no-autonomous-irb-deviation (signal deviationRequiresCoordinatorCosign, violating value false) blocks an autonomously-cosigned deviation — IRB deviations require study-coordinator human review because autonomous deviations could invalidate the study (mirroring the Claims Adjudication Agent's no-autonomous-denial, the Formulary Agent's no-autonomous-override, and the FWA Agent's no-autonomous-denial posture), backed by the guard deviationRequiresCoordinatorCosign; and policy.trial-payments.participant-consented (signal paymentHasParticipantConsent, violating value false) blocks a payment to a non-consented participant — Common Rule / 45 CFR 46 requires informed consent for research payments — with the safe answer of decision:'blocked-no-consent' with zero payment, backed by the guard paymentHasParticipantConsent which validates consent OR the safe-blocked state. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches participant context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/trial-payments/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — trial-payments.evaluate-rules → trial-payments.decide — with phiAccessed:true, returning the TrialPaymentDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Trial Payments panel (eight presets: schedule-approved standard visit ($150 stipend + $8.40 travel), missed-visit pend, travel-out-of-range pend, extra-procedure pend, blocked-no-consent case, plus off-catalog-trial / autonomous-cosign / no-consent-lied-about governance-block presets), a seeded trial-payments.evaluate-rules→trial-payments.decide trace showing a $150 + $8.40 auto-pay, the console subtitle, and the investor brief (now 'forty-one agents across three planes', with the Trial Payments agent on the patient/clinical plane paired with Clinical Trials Matching) all reflect it. Frontend tests green (+ trial-payments catalog/determinism/rule-precedence/stipend-computation/travel-capping/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across all decision tiers, the panel's request-body + view-lift, and the registry drift guards raised to forty-one agents); the trial catalog, IRB payment schedules, visit types, rules, and travel rate are clearly-labeled illustrative synthetics, NOT IRBNet, WCG IRB, Advarra IRB, or an actual sponsor's payment protocol. Lint + build clean.
Agent Fabric: added the Fraud, Waste & Abuse Detection agent — deterministic pattern-based SIU screening with no autonomous denials + no protected-class factors (the 40th agent)
ShippedAdded the fortieth agent on the fabric — fwa-detection-agent, the Salesforce 'Agentforce for Health' / Health Cloud FWA analog. Registered on the care-coordination tier as the payer-side pattern-based screener paired with the Claims Adjudication Assistant (mechanical edits) and Prior Authorization (pre-service). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/fwa-detection.ts, evaluateFwaPatterns(req) applies six pattern rules — pattern.unbundling (repeated-unbundling history), pattern.upcoding (E/M level > peer median+1), pattern.duplicate-billing (same DOS + CPT in prior submissions), pattern.quantity-outlier (units-per-member > 3× peer baseline), pattern.impossible-day-billing (total daily service minutes > 1440), pattern.phantom-service (no matching EHR encounter); screenClaim(req) classifies as clear or flag-for-siu-review with a primary pattern chosen by severity precedence (high > medium > low, lexical tie-break by pattern-id), routes to clear-no-action / siu-standard-queue / siu-priority-queue, and hardcodes investigationOpened:false / paymentFrozen:false on every report — the agent NEVER autonomously acts on suspicion. PROTECTED_CLASS_ATTRIBUTES catalog (race, ethnicity, religion, national origin, disability, gender identity, sexual orientation, marital status + provider-demographic proxies) is checked against the factor list to enforce the load-bearing fairness guard; DEFAULT_FWA_FACTORS is the pattern-id list + non-protected peer-baseline metrics. It is a pure function of the claim + baseline + catalog + caller-provided asOfDate (no randomness, no clock), so the same context always yields the same flags + primary + severity + routing. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.fwa.pattern-catalog-sourced (signal patternsTraceToCatalog, violating value false) blocks a fabricated / off-catalog flag or category-of-one 'we-just-don't-like-this-provider' pattern (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the Formulary Agent's catalog-sourced, the ACP Agent's directive-source-integrity, and the CCM Agent's eligibility-catalog-sourced posture), backed by the pure guard patternsTraceToCatalog; policy.fwa.no-autonomous-denial (signal reportRequiresSiuReview, violating value false) blocks an autonomous investigation opening or payment freeze — suspected fraud requires SIU human review because denying on unproven suspicion is a Section 1557 / state code / due-process failure (mirroring the Claims Adjudication Agent's no-autonomous-denial, the PA Agent's no-autonomous-submission, and the CCM Agent's no-autonomous-billing posture), backed by the guard reportRequiresSiuReview which validates the requiresSiuReview flag matches the decision AND investigationOpened + paymentFrozen are both false; and policy.fwa.no-protected-class-factors (signal noProtectedClassFactors, violating value false) blocks a factor list that includes any protected-class attribute or provider-demographic proxy — bias in FWA is a well-documented compliance failure (algorithmic-audit reports of payer systems that disproportionately targeted minority-owned clinics led to consent decrees), mirroring the Population Health Agent's no-protected-class-factors posture, backed by the guard noProtectedClassFactors. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient / member context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/fwa-detection/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — fwa.evaluate-patterns → fwa.decide — with phiAccessed:true, returning the FwaScreeningReport as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new FWA Detection panel (eight presets: clear happy path, upcoding-medium routed to SIU standard queue, impossible-day-high routed to SIU priority queue, phantom-service-high, multi-flag with precedence example (duplicate-billing high wins), plus off-catalog-pattern / autonomous-investigation / protected-class-factor governance-block presets — rendering the classified decision + primary pattern + severity + routing + applied patterns + hard invariants, synthetic labels, and a trace deep link), and a seeded fwa.evaluate-patterns→fwa.decide trace showing an impossible-day flag routed to SIU priority queue, the console subtitle, and the investor brief (now 'forty agents across three planes', with the FWA Detection agent on the patient/clinical plane paired with Claims Adjudication + Prior Auth) all reflect it. Frontend tests green (+ fwa-detection catalog/determinism/severity-precedence/multi-flag-ordering/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across clear/upcoding/impossible-day/phantom/multi, the panel's request-body + view-lift, and the registry drift guards raised to forty agents); the pattern catalog, peer baselines, severity thresholds, and detection windows are clearly-labeled illustrative synthetics, NOT SAS Detection and Investigation, LexisNexis Provider Insight, an actual payer SIU rule set, or a certified fraud-detection engine. Lint + build clean.
Agent Fabric: added the Formulary & Drug Utilization Review agent — deterministic first-pass DUR: tier + step-therapy + quantity + interactions + clinician-cosign-gated formulary exceptions (the 39th agent)
ShippedAdded the thirty-ninth agent on the fabric — formulary-review-agent, the Salesforce 'Agentforce for Health' / Health Cloud formulary + drug-utilization-review analog. Registered on the care-coordination tier as the first-pass DUR piece paired with the Prior Authorization agent (broader UM), the Medication Adherence agent (nudge-only refill), and the Claims Adjudication Assistant (post-service). It is a DETERMINISTIC, no-Claude agent: in a new pure lib/formulary-review.ts, evaluateFormularyRules(req) applies four catalog rules against a proposed drug — rule.step-therapy-required (verifies a documented prior-therapy trial from STEP_THERAPY_CHAINS, ignoring self-reported / undocumented history), rule.quantity-limit-exceeded (compares requested quantity vs. plan quantity limit), rule.drug-drug-interaction (matches against INTERACTION_PAIRS on the member's current-medication list), and rule.non-formulary (fires when the drug's tier is non-formulary); reviewFormularyRequest(req) classifies each request as preferred-approved / pend-step-therapy / pend-quantity-limit / pend-interaction-review / pend-non-formulary with a specific reason code from FORMULARY_REASON_CODE_CATALOG (PF-100 preferred / PF-200 step / PF-201 quantity / PF-202 interaction / PF-203 non-formulary), routes pends to a clinician (or pharmacist for interactions), and sets requiresClinicianCosign:true / cosigned:false on every non-preferred decision — the agent NEVER autonomously overrides a formulary exception. Menopause-relevant: FORMULARY_DRUG_CATALOG includes estradiol (oral, patch, vaginal cream), progesterone, paroxetine (Brisdelle), venlafaxine, fezolinetant (Veozah), alendronate, zolpidem, warfarin — with tier placements that model the SHAPE of a real payer's formulary (transdermal estradiol Tier 2, fezolinetant non-formulary, etc.). It is a pure function of the request + patient history + payer catalog + caller-provided asOfDate (no randomness, no clock; timestamps and quantities accepted as data), so the same context always yields the same decision + applied rules + reason code, with a documented decision precedence (pend-non-formulary > pend-step-therapy > pend-interaction-review > pend-quantity-limit > preferred-approved) and stable rule-id ordering. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.formulary.catalog-sourced (signal rulesTraceToCatalog, violating value false) blocks a fabricated drug or rule (mirroring the Claims Adjudication Agent's edit-catalog-sourced, the ACP Agent's directive-source-integrity, the HEDIS Agent's measure-catalog-sourced, and the CCM Agent's eligibility-catalog-sourced posture), backed by the pure guard rulesTraceToCatalog; policy.formulary.step-therapy-honored (signal stepTherapyIsHonored, violating value false) blocks a preferred-approved decision on step-therapy-required drugs when only undocumented / self-reported history is on file (approving on claimed-but-unverified history is a common payer-audit finding), backed by the guard stepTherapyIsHonored — trivially satisfied when the decision is a pend (agent isn't claiming step therapy is satisfied); and policy.formulary.no-autonomous-override (signal exceptionRequiresClinicianCosign, violating value false) blocks an autonomously-cosigned override — formulary exceptions are legally consequential under Medicare Advantage Chapter 6 + Part D and must have a prescriber's documented rationale (mirroring the Claims Adjudication Agent's no-autonomous-denial, the PA Agent's no-autonomous-submission, and the CCM Agent's no-autonomous-billing posture), backed by the guard exceptionRequiresClinicianCosign. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient / member context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/formulary-review/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — formulary.evaluate-rules → formulary.decide — with phiAccessed:true, returning the FormularyReviewDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Formulary & DUR panel (eight presets: preferred-approved Tier 1 estradiol oral, pend-step-therapy on patch with self-reported oral trial, pend-quantity-limit on 60 units vs 30 limit, pend-interaction-review on estradiol + warfarin routed to pharmacist, pend-non-formulary on fezolinetant with multi-rule precedence, plus off-catalog-rule / step-therapy-lied-about / auto-cosign governance-block presets — rendering the classified decision + tier + primary reason + routing + applied catalog rules + clinician-cosign flags, synthetic labels, and a trace deep link), and a seeded formulary.evaluate-rules→formulary.decide trace showing a pend-step-therapy decision, the console subtitle, and the investor brief (now 'thirty-nine agents across three planes', with the Formulary & DUR agent on the patient/clinical plane paired with PA + Medication Adherence + Claims Adjudication) all reflect it. Frontend tests green (+ formulary-review catalog/determinism/single-and-multi-rule-precedence/step-therapy-documentation-guard/off-catalog-behaviors/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across preferred/step-therapy/quantity/interaction/non-formulary, the panel's request-body + view-lift, and the registry drift guards raised to thirty-nine agents); the drug catalog, rule catalog, reason-code catalog, step-therapy chains, and interaction pairs are clearly-labeled illustrative synthetics, NOT Medi-Span, First Databank, RxNorm, an actual payer's formulary file, or a certified DUR engine. Lint + build clean.
Agent Fabric: added the Claims Adjudication Assistant — deterministic first-pass payer-side edits + catalog reason codes + adjudicator-cosign-gated denials (the 38th agent)
ShippedAdded the thirty-eighth agent on the fabric — claims-adjudication-agent, the Salesforce 'Agentforce for Health' / Health Cloud claims-adjudication analog. Registered on the care-coordination tier as the FIRST-PASS PAYER-SIDE adjudicator paired with the Prior Auth (pre-service), Member Service (billing self-service), Grievance & Appeals (post-denial intake), and HEDIS + Attribution + CCM (quality/reimbursement) agents. It is a DETERMINISTIC, no-Claude agent: in a new pure lib/claims-adjudication.ts, evaluateClaimEdits(req) applies eight payer-side edits from the CLAIM_EDIT_CATALOG catalog (NCCI-PTP unbundling, LCD coverage, NCD coverage, benefit-limit exhausted, prior-auth missing, duplicate submission, out-of-network, timely-filing-window), each with a documented default decision tier (deny-drafted / pend-clinical-review / pend-adjudicator-review) and a mapping to a specific catalog reason code (illustrative CO-97, CO-50, CO-96, CO-119, CO-197, CO-18, CO-242, CO-29); summarizeDecision() picks the highest-severity edit and routes accordingly (deny → adjudicator, pend-clinical → clinical-reviewer, pend-adjudicator → adjudicator, clean-pay → auto-post); adjudicateClaim(req) returns the full ClaimAdjudicationDecision with cosigned:false and requiresAdjudicatorCosign:true on every deny-drafted — the agent NEVER autonomously finalizes a denial. It is a pure function of the claim + member benefits + edit-catalog + caller-provided asOfDate (no randomness, no clock; timestamps and windows accepted as data), so the same context always yields the same decision + applied edits + primary reason code, with a documented decision precedence (deny > pend-clinical > pend-adjudicator > clean-pay) and stable edit-id ordering. It is distinct from the Prior Authorization agent (pre-service utilization management), the Member Service / Billing agent (member-facing self-service), and the Grievance & Appeals agent (post-denial intake) — this one is the first-pass PAYER-SIDE adjudicator that decides which claims are clean-pay and which need human review. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.claims.edit-catalog-sourced (signal editsTraceToCatalog, violating value false) blocks a fabricated / off-catalog edit (mirroring the ACP Agent's directive-source-integrity, the HEDIS Agent's measure-catalog-sourced, the Credentialing Agent's source-integrity, the Attribution Agent's methodology-catalog-sourced, and the CCM Agent's eligibility-catalog-sourced posture), backed by the pure guard editsTraceToCatalog; policy.claims.no-autonomous-denial (signal denialRequiresAdjudicatorCosign, violating value false) blocks an autonomously-cosigned denial — denial letters are legally consequential under CMS / ERISA / state insurance code and must have an adjudicator sign-off (mirroring the PA Agent's no-autonomous-submission, the HEDIS Agent's no-autonomous-submission, and the CCM Agent's no-autonomous-billing posture), backed by the guard denialRequiresAdjudicatorCosign which trivially passes on non-denial decisions; and policy.claims.reason-code-integrity (signal decisionsCiteReasonCodes, violating value false) blocks a non-clean-pay decision that doesn't cite a specific catalog reason code — under Section 1557 / state insurance code / CMS, a denial notice must state the specific reason, backed by the guard decisionsCiteReasonCodes which enforces the primary reason code AND every applied edit's reason code trace to CLAIM_REASON_CODE_CATALOG. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient / member context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/claims-adjudication/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — claims.evaluate-edits → claims.decide — with phiAccessed:true, returning the ClaimAdjudicationDecision as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Claims Adjudication panel (seven presets: clean-pay office visit + DEXA happy path, deny-drafted duplicate-submission (CO-18), pend-clinical-review LCD (CO-50), multi-edit precedence example (timely-filing CO-29 wins over PA + OON pends), plus off-catalog-edit, auto-cosign-denial, and reasonless-denial governance-block presets — rendering the classified decision + primary reason + routing + applied catalog edits + billed amount + cosign flags, synthetic labels, and a trace deep link), and a seeded claims.evaluate-edits→claims.decide trace showing a CO-18 duplicate-submission deny-drafted decision, the console subtitle, and the investor brief (now 'thirty-eight agents across three planes', with the Claims Adjudication Assistant on the patient/clinical plane paired with PA + Member Service + Grievance & Appeals) all reflect it. Frontend tests green (+ claims-adjudication catalog/determinism/single-edit-and-multi-edit-precedence/decision-severity/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths across clean-pay/pend/deny, the panel's request-body + view-lift, and the registry drift guards raised to thirty-eight agents); the edit catalog, reason-code catalog, and benefit-rule shape are clearly-labeled illustrative synthetics, NOT CMS X12 837 claim spec, an NCCI PTP edit table, an LCD/NCD medical-necessity registry, or a real payer's benefit configuration. Lint + build clean.
Agent Fabric: added the Complex Care Management (CCM) agent — deterministic reimbursable time-tracking with catalog-sourced eligibility + CPT-coded billing + human-approval gate + phantom-minute integrity (the 37th agent)
ShippedAdded the thirty-seventh agent on the fabric — complex-care-management-agent, the Salesforce 'Agentforce for Health' / Health Cloud CCM analog. Registered on the care-coordination tier as the REIMBURSABLE TIME-TRACKING piece paired with the Care Team + Care Plan agents. It is a DETERMINISTIC, no-Claude agent: in a new pure lib/complex-care-management.ts, evaluateCcmEligibility(ctx) confirms Medicare CCM eligibility by tracing chronic conditions to CHRONIC_CONDITION_CATALOG (illustrative synthetic — hypertension, T2DM, osteoporosis, chronic anxiety/depression, chronic migraine, hypothyroidism, CKD, hyperlipidemia; ≥ 2 required), checking the Medicare age gate (MEDICARE_ELIGIBLE_AGE = 65), the Medicare-coverage flag, and the CCM consent flag; summarizeCcmTime(entries) rolls up per-activity minutes against CCM_ACTIVITY_CATALOG (medication reconciliation, care-plan update, patient communication, referral follow-up, care-team coordination, patient education, resource navigation — the 'we-just-called-it-care-coord' catch-all is deliberately excluded), sorts activities by activityId ascending for a stable display, and reports whether every logged activity is catalog-sourced; pickCptCode(totalMinutes, complexity) maps the monthly total to the CPT ladder (99490 non-complex 20-39min → 99491 non-complex 40-59min → 99487 complex 60-89min → 99489 complex ≥ 90min with moderate/high complexity; non-complex complexity never escalates to 99487/99489; complex complexity under 60min falls back to the non-complex ladder); assembleCcmBillingPackage() produces a package that is ALWAYS requiresQualityTeamApproval:true / submitted:false — the agent NEVER autonomously submits a CMS claim. Eligibility, time totals, and CPT selection are pure functions of the caller-provided context (no randomness, no clock; timestamps and per-activity minutes accepted as data), so the same context always yields the same eligibility + time summary + CPT selection + billing package. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.ccm.eligibility-catalog-sourced (signal eligibilityTracesToCatalog, violating value false) blocks a fabricated chronic-condition claim (mirroring the ACP Agent's directive-source-integrity, the HEDIS Agent's measure-catalog-sourced, the Credentialing Agent's source-integrity, and the Attribution Agent's methodology-catalog-sourced posture), backed by the pure guard eligibilityTracesToCatalog; policy.ccm.no-autonomous-billing (signal billingRequiresHumanApproval, violating value false) blocks an autonomous CMS submission — every package requires human quality-team approval (mirroring the HEDIS Agent's no-autonomous-submission, the Prior Authorization Agent's no-autonomous-submission, and the ACP Agent's no-autonomous-directive-change posture), backed by the guard billingRequiresHumanApproval which trivially passes on a null package (no submission possible); and policy.ccm.time-integrity (signal timeEntriesAddUp, violating value false) blocks a time report where entries don't sum to the reported total OR where any entry cites an off-catalog activity — the guard against the classic CCM audit finding of phantom-minute inflation, backed by the guard timeEntriesAddUp. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/complex-care-management/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — ccm.evaluate-eligibility → ccm.summarize-time → ccm.assemble-billing-package — with phiAccessed:true, returning the CcmMonthReport as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Complex Care Management panel (six presets: non-complex 99490 happy path, complex 99487 happy path, ineligible-under-Medicare-age case, plus off-catalog-condition, autonomous-CMS-submit, and phantom-minutes governance-block presets — rendering the per-patient eligibility outcome + qualifying conditions, per-activity time summary + total, CPT selection with billing state, synthetic labels, and a trace deep link), and a seeded ccm.evaluate-eligibility→ccm.summarize-time→ccm.assemble-billing-package trace, the console subtitle, and the investor brief (now 'thirty-seven agents across three planes', with the Complex Care Management agent on the patient/clinical plane paired with Care Team + Care Plan) all reflect it. Frontend tests green (+ complex-care-management catalog/determinism/eligibility-branching/CPT-ladder-boundaries/off-catalog-condition-not-counted/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths + eligible/complex/ineligible flows, the panel's request-body + view-lift, and the registry drift guards raised to thirty-seven agents); the chronic-condition catalog, CCM activity catalog, CPT thresholds, and Medicare-eligibility flags are clearly-labeled illustrative synthetics, NOT CMS Chapter 12 / MLN Booklet 909188 CCM billing, an actual CPT coding manual, or a live Medicare claim-submission system. Lint + build clean.
Agent Fabric: added the Quality-Measure Attribution agent — deterministic patient-to-provider / -to-contract attribution with catalog-sourced methodologies + contract-terms enforcement + documented tie-breaks (the 36th agent)
ShippedAdded the thirty-sixth agent on the fabric — quality-attribution-agent, the Salesforce 'Agentforce for Health' / Health Cloud attribution analog and the OTHER HALF of the HEDIS story: HEDIS computes the rates; this agent decides WHOSE PANEL each patient counts on. Registered on the care-coordination tier as a quality-accountability agent, paired with hedis-quality-agent. It is a DETERMINISTIC, no-Claude agent modeled on the HEDIS Quality + Care Team + Grievance & Appeals agents: in a new pure lib/quality-attribution.ts, attributePatient(ctx) picks a provider/clinic under one of four catalog-sourced methodologies — plurality-of-visits (counts primary-care visits inside the contract's attribution window, breaks ties with a documented chain: most-recent-visit-wins → provider-ref-lexical-ascending), pcp-of-record (uses the patient's designated PCP regardless of visits), prospective-medicare-advantage (uses the payer's prospective assignment), contract-defined-window (plurality against the contract's own window) — and evaluates the VBC contract's explicit exclusion terms (age band, network status, exclusion codes) so a patient whose contract excludes them is flagged excludedByContract:true and dropped from the downstream HEDIS denominator; attributePanel(panel) rolls up per-provider counts (attributed / excluded / tie-broken), sorted by provider ref ascending for a stable display. It is a pure function of the visit history + contract terms + caller-provided asOfDate (no randomness, no clock; timestamps and windows accepted as data), so the same context always yields the same attribution + rollup. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.attribution.methodology-catalog-sourced (signal attributionsTraceToCatalog, violating value false) blocks a bespoke / off-catalog methodology or contract (mirroring the HEDIS Agent's measure-catalog-sourced, the ACP Agent's directive-source-integrity, and the Credentialing Agent's source-integrity posture), backed by the pure guard attributionsTraceToCatalog; policy.attribution.no-conflicting-contract-terms (signal attributionsHonorContractTerms, violating value false) blocks a caller-asserted excludedByContract:false on a patient the contract actually excludes — the guard against polluting a contract's scorecard with patients the contract never covered, backed by the guard attributionsHonorContractTerms which re-checks each asserted attribution against the actual contract terms; and policy.attribution.tie-break-documented (signal attributionTieBreaksAreDocumented, violating value false) blocks a coin-flip / opaque / undocumented tie-break rule — turning tie-break resolution from gameable non-determinism into a fabric-verifiable invariant, backed by the guard attributionTieBreaksAreDocumented. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/quality-attribution/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — attribution.attribute → attribution.rollup — with phiAccessed:true, returning the QualityAttributionReport as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Quality-Measure Attribution panel (a five-patient demo panel happy path spanning three methodologies with one tie-break and one contract-exclusion, plus off-catalog-methodology, contract-terms-lied-about, and opaque-tie-break governance-block presets — rendering the per-patient attribution with provider/clinic/contract/exclusion/tie-break, the per-provider rollup with attributed/excluded/tie-broken counts, synthetic labels, and a trace deep link), and a seeded attribution.attribute→attribution.rollup trace, the console subtitle, and the investor brief (now 'thirty-six agents across three planes', with the Quality-Measure Attribution agent on the patient/clinical plane paired with HEDIS) all reflect it. Frontend tests green (+ quality-attribution catalog/determinism/four-methodology-behavior/tie-break-chain/contract-exclusion-precedence/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths with override-based block demonstrations, the panel's request-body + view-lift, and the registry drift guards raised to thirty-six agents); the methodology catalog, contract catalog, tie-break rules, and refs are clearly-labeled illustrative synthetics, NOT CMS Shared Savings Program attribution, an ACO REACH prospective assignment, an NCQA HEDIS attribution appendix, or a real payer's VBC contract terms. Lint + build clean.
Agent Fabric: added the Provider Credentialing & Directory agent — deterministic network-integrity gate: verify credentials against approved sources + block referrals to expired / sanctioned providers + enforce No-Surprises-Act directory freshness (the 35th agent)
ShippedAdded the thirty-fifth agent on the fabric — provider-credentialing-agent, the Salesforce 'Agentforce for Health' / Health Cloud provider-credentialing / provider-directory analog — as a first-class INTEGRATION-plane agent (sitting alongside the data substrate, not the patient-care plane). It is a DETERMINISTIC, no-Claude agent modeled on the HEDIS Quality, ACP, and TOC agents: in a new pure lib/provider-credentialing.ts, verifyProvider(request) computes the credentialing status against a defined CREDENTIAL_KINDS catalog (state-license, DEA, board-certification, sanctions-clearance, NPI) and APPROVED_VERIFICATION_SOURCES list (state-medical-board, DEA-registry, ABMS-board, OIG-LEIE-sanctions, NPI-registry; self-reported / verbal deliberately excluded), applying a stable precedence — sanctioned > incomplete > expired > verified — so a sanctioned provider never slips through even when other credentials look complete; the directoryProfile carries a No-Surprises-Act 90-day freshness flag (verifiedAsOf vs. asOfDate); the record emits three gate flags — canReferPatient / canBookAppointment / canReturnInDirectoryResponse — that the Referral Management, Appointment Scheduling, and Transitions of Care agents can consult before every handoff. It is a pure function of the credentials + directory profile + caller-provided asOfDate (no randomness, no clock; timestamps are accepted as data), so the same context always yields the same status + gates. This is where the GHOST-NETWORK problem gets fixed at the network boundary: the fabric never hands a referral or scheduled appointment to an expired / incomplete / sanctioned provider. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.credentialing.source-integrity (signal credentialsTraceToVerifiedSource, violating value false) blocks a credential citing a self-reported / verbal / off-catalog source (mirroring the ACP Agent's directive-source-integrity, the HEDIS Agent's measure-catalog-sourced, and the TOC Agent's reconciliation-source-integrity posture), backed by the pure guard credentialsTraceToVerifiedSource; policy.credentialing.no-referral-to-expired-or-sanctioned (signal noReferralToExpiredOrSanctioned, violating value false, intent-gated to referral / scheduling calls) blocks a referral or booking to an expired / incomplete / sanctioned provider — the load-bearing ghost-network guard — backed by the guard noReferralToExpiredOrSanctioned; and policy.credentialing.no-surprises-act-directory-accuracy (signal directoryIsFresh, violating value false, intent-gated to directory-lookup calls) blocks a stale directory record returned as authoritative past the NSA 90-day window, backed by the guard directoryIsFresh. Intent-aware enforcement means a stale directory record can still support a referral (the provider IS verified) — only the directory-response gate closes on NSA freshness; conversely a directory-lookup on a verified-but-stale record is blocked at NSA even when the provider itself is fine. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient-adjacent context — a provider's status is required to safely refer a patient), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/provider-credentialing/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace span — credentialing.verify — with phiAccessed:true — returning the ProviderCredentialingRecord as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Provider Credentialing & Directory panel (a verified-MSCP happy path → all gates open, plus expired-license, sanctioned-provider, and stale-directory governance-block presets — rendering the per-credential state with source / expiry pills, the directory profile with an NSA freshness flag, the overall status and gate flags, synthetic labels, and a trace deep link), and a seeded credentialing.verify trace, the console subtitle, and the investor brief (now 'thirty-five agents across three planes', with the Provider Credentialing & Directory agent on the integration plane alongside the MCP server, MCP Bridge, MuleSoft, and Data 360) all reflect it. Frontend tests green (+ provider-credentialing catalog/determinism/status-precedence/stale-directory-vs-verified/off-source-not-counted/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow + intent-aware happy paths, the panel's request-body + view-lift, and the registry drift guards raised to thirty-five agents); the credential-kind catalog, verification sources, NSA freshness window, and directory schema are clearly-labeled illustrative synthetics, NOT NCQA / CAQH credentialing, a real state-medical-board API, an OIG-LEIE sanction feed, or a live directory. Lint + build clean.
Agent Fabric: added the Grievance & Appeals agent — deterministic regulated-intake: classify + route to a human queue + stamp a regulatory deadline with a PHI-safe routing summary (the 34th agent)
ShippedAdded the thirty-fourth agent on the fabric — grievance-appeals-agent, the Salesforce 'Agentforce for Health' / Health Cloud grievance-and-appeals analog — as a first-class patient-facing member-service intake agent that REUSES the existing patient-facing governance tier. It is a DETERMINISTIC, no-Claude agent modeled on the Care Team, ACP, and HEDIS agents: in a new pure lib/grievance-appeals.ts, classifyCase(intake) is a pure keyword-rule pipeline — coverage-denial + expedited request → expedited coverage-denial appeal (3d deadline, clinical-review queue); coverage-denial by flag or keyword → standard coverage-denial appeal (30d, clinical-review); billing keywords → billing-dispute grievance (30d, member-services); everything else → quality-of-service grievance (30d, member-services); the CASE_TYPES catalog holds every case type's kind (grievance / appeal), default urgency, target queue, deadlineDays, and maxDeadlineDays (regulatory ceiling), all illustrative synthetics that model the SHAPE of Medicare Advantage Chapter 13 / state-insurance-code timelines without being certified; assembleGrievanceCase() stamps the deadline (receivedDate + deadlineDays), assigns a stable case id, and emits a STRUCTURED PhiSafeRoutingSummary (memberRef + caseType + urgency + queue + deadlineDate + phiSafe:true) — never free-text PHI. proposeCaseResolution() returns a proposal that is ALWAYS requiresHumanQueueAction:true, applied:false — the agent NEVER resolves, approves, or denies a case on its own. It is a pure function of the intake keywords + flags + receivedDate (accepted as data, no clock, no randomness), so the same intake always yields the same case type / urgency / queue / deadline / summary. It is distinct from the Member Service / Billing agent (billing self-service one-shot answers) and the Prior Authorization agent (pre-service utilization management) — this one runs the regulated grievance-and-appeals INTAKE workflow. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.grievance.no-autonomous-resolution (signal caseResolutionRequiresHumanQueue, violating value false) blocks a resolution bypassing the human queue (mirroring the ACP Agent's no-autonomous-directive-change, the HEDIS Agent's no-autonomous-submission, the Prior Authorization Agent's no-autonomous-submission, and the Care Team Agent's no-autonomous-assignment posture), backed by the pure guard caseResolutionRequiresHumanQueue; policy.grievance.deadline-integrity (signal deadlineTracesToCatalog, violating value false) blocks a deadline that doesn't trace to the case-type catalog OR that exceeds the regulatory maximum — the load-bearing regulatory-compliance guard against breaching Chapter 13 / state timelines, backed by the guard deadlineTracesToCatalog; and policy.grievance.no-phi-in-routing-summary (signal routingSummaryIsPhiSafe, violating value false) blocks a routing summary containing free-text PHI or an extra free-text key beyond the structured allow-list (memberRef / caseType / urgency / queue / deadlineDate / phiSafe) — a heuristic PHI-safety check that lets the routing summary be delivered via lower-trust channels (Slack, email, ticketing) without leaking PHI, backed by the guard routingSummaryIsPhiSafe. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient/member context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/grievance-appeals/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — grievance.classify → grievance.route-to-queue, every span phiAccessed:true — returning the GrievanceAppealCase + a human-queue-action-gated ResolutionProposal as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Grievance & Appeals panel (an expedited HRT-denial happy path → 3-day deadline + clinical-review queue + PHI-safe routing summary, a billing-dispute grievance → 30-day member-services routing, plus autonomous-resolve, deadline-extension, and PHI-in-routing governance-block presets — rendering the case classification, urgency, queue, deadline, the structured PHI-safe routing summary, the human-queue-action-gated proposal, synthetic labels, and a trace deep link), and a seeded grievance.classify→grievance.route-to-queue trace, the console subtitle, and the investor brief (now 'thirty-four agents across three planes', with the Grievance & Appeals agent on the patient/clinical plane) all reflect it. Frontend tests green (+ grievance-appeals catalog/determinism/four-way-classification/deadline-math/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow + billing happy paths, the panel's request-body + view-lift, and the registry drift guards raised to thirty-four agents); the case-type catalog, deadline windows, expedited-eligibility rules, and queue mapping are clearly-labeled illustrative synthetics, NOT Medicare Advantage Chapter 13 or a real appeal-adjudication engine. Lint + build clean.
Agent Fabric: added the Discharge & Transitions of Care agent — deterministic close-the-loop after a hospitalization: medication reconciliation + scheduled follow-up + PCP handoff (the 33rd agent)
ShippedAdded the thirty-third agent on the fabric — transitions-of-care-agent, the Salesforce 'Agentforce for Health' / Health Cloud transitions-of-care analog — as a first-class patient/clinical-plane agent that REUSES the existing care-coordination governance tier. It is a DETERMINISTIC, no-Claude agent modeled on the HEDIS Quality, ACP, and Care Team agents: in a new pure lib/transitions-of-care.ts, assembleTransitionOfCare(ctx) runs the close-the-loop workflow after a hospitalization / ED / observation encounter — reconcileMedications() classifies each medication as added / removed / dose-changed / unchanged (sorted by medication id for a stable display; entries with an unapproved / verbal / ad-hoc source are FILTERED from the reconciliation lines but surface via the source-integrity signal — a fabricated med cannot slip in), the follow-up is either a real scheduled slot (with slotStart + providerRef + modality) or explicitly state:'awaiting-schedule' with a handoff body pointing at the Appointment Scheduling agent — NEVER a text recommendation, the red-flag warning signs come from an illustrative RED_FLAG_CATALOG keyed by encounter-reason category (vasomotor / cardiovascular / behavioral / musculoskeletal / general, with an off-catalog category falling through to general so the demo still exercises the pipeline), the teach-back checklist is a rule-based UNIVERSAL_TEACH_BACK, and the PCP handoff summary + package note are rule-based / templated; proposeMedicationChange() returns a proposal that is ALWAYS requiresClinicianSignoff:true, applied:false — the agent NEVER autonomously commits a medication change. It is a pure function of the context + discharge date + provided medication lists (no randomness, no clock; timestamps are accepted as data), so the same context always yields the same reconciliation + red-flag list + teach-back checklist + PCP summary. It is distinct from the Care Plan agent (active treatment planning), the Medication Adherence agent (nudge-only refill / adherence prompts), and the Referral Management agent (specialist triage) — this one runs the CLOSE-THE-LOOP workflow after an acute event. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.toc.reconciliation-source-integrity (signal medicationsTraceToApprovedSource, violating value false) blocks a reconciliation with a verbal / ad-hoc / undocumented medication source — the load-bearing safety guard against a fabricated med slipping in, backed by the pure guard medicationsTraceToApprovedSource; policy.toc.no-autonomous-medication-change (signal reconciliationChangeRequiresClinician, violating value false) blocks a medication change bypassing clinician sign-off (mirroring the Medication Adherence Agent's no-autonomous-refill, the ACP Agent's no-autonomous-directive-change, the Prior Authorization Agent's no-autonomous-submission, and the HEDIS Agent's no-autonomous-submission posture), backed by the guard reconciliationChangeRequiresClinician; and policy.toc.follow-up-scheduled-not-recommended (signal followUpScheduledNotRecommended, violating value false) blocks a follow-up marked scheduled/complete without a real slot — the load-bearing 30-day-readmission guard against 'recommended' follow-ups masquerading as complete, backed by the guard followUpScheduledNotRecommended (which also accepts the safe awaiting-schedule interim answer). It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/transitions-of-care/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — toc.reconcile → toc.assemble-package, every span phiAccessed:true — returning the TransitionOfCarePackage + a clinician-signoff-gated ReconciliationChangeProposal for the first added / dose-changed medication as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Discharge & Transitions of Care panel (a CV-hospitalization happy path → dose-changed Metoprolol + added Apixaban + scheduled cardiology follow-up in 7 days, a behavioral ED → awaiting-schedule interim answer, plus verbal-source, autonomous-med-change, and fake-scheduled governance-block presets — rendering the medication reconciliation with change kinds, the follow-up with slot/provider/days, the red-flag warning-sign list, the teach-back checklist, the sign-off-gated proposal, the PCP handoff summary, synthetic labels, and a trace deep link), and a seeded toc.reconcile→toc.assemble-package trace, the console subtitle, and the investor brief (now 'thirty-three agents across three planes', with the Discharge & Transitions of Care agent on the patient/clinical plane) all reflect it. Frontend tests green (+ transitions-of-care catalog/determinism/reconciliation-classification/off-source-filter/awaiting-schedule-safe-answer/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow + awaiting-schedule happy paths, the panel's request-body + view-lift, and the registry drift guards raised to thirty-three agents); the encounter categories, red-flag catalog, follow-up window, approved-source labels, and teach-back items are clearly-labeled illustrative synthetics, NOT a certified TOC schema or a real ADT / discharge system. Lint + build clean.
Agent Fabric: added the Care Team & Case Management agent — deterministic multi-disciplinary team assembly + case-manager assignment + PCP-anchor invariant (the 32nd agent)
ShippedAdded the thirty-second agent on the fabric — care-team-management-agent, the Salesforce 'Agentforce for Health' / Health Cloud care-team / case-management analog — as a first-class patient/clinical-plane agent that REUSES the existing care-coordination governance tier. It is a DETERMINISTIC, no-Claude agent modeled on the Population Health, HEDIS Quality, and ACP agents: in a new pure lib/care-team-management.ts, assembleCareTeam(ctx) reasons over a SINGLE high-need menopause/midlife patient (distinct from the panel-level Population Health & Risk Stratification agent, which prioritizes people across a whole panel), resolves needed roles from the patient's active clinical needs against a CARE_ROLES catalog + ROLE_TRIGGERS condition→role trigger map (PCP + MSCP universally required; cardiology / endocrinology / bone-health / pelvic-floor PT / behavioral health triggered by cardiovascular / bone-health / pelvic-floor / behavioral needs), orders the roster in role catalog order, ranks gaps (PCP → urgent, universal → elevated, conditional → routine), and emits a shared team snapshot; assignCaseManager(patientRef) picks a case manager from a synthetic CASE_MANAGERS pool via a stable djb2-style hash on the patient ref, so the same patient always yields the same manager (no randomness, no clock); proposeTeamChange() returns a proposal that is ALWAYS requiresCaseManagerApproval:true, applied:false — the agent NEVER autonomously adds, removes, or reassigns a team member. It is a pure function of the context + asOfDate (no randomness, no clock), so the same context always yields the same team + case manager + snapshot with a stable, documented gap ordering. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.careteam.role-catalog-sourced (signal rolesTraceToCatalog, violating value false) blocks a roster or needed-role set that includes an off-catalog / fabricated discipline label — the guard against padding a team with an invented role, backed by the pure guard rolesTraceToCatalog; policy.careteam.no-autonomous-assignment (signal teamChangeRequiresCaseManager, violating value false) blocks a team-change that bypasses case-manager sign-off (mirroring the ACP Agent's no-autonomous-directive-change, the HEDIS Agent's no-autonomous-submission, and the Prior Authorization Agent's no-autonomous-submission posture), backed by the guard teamChangeRequiresCaseManager; and policy.careteam.pcp-required (signal teamIncludesPcp, violating value false) blocks a roster shipping without a PCP anchor — the continuity-of-care invariant every specialist coordinates around, backed by the guard teamIncludesPcp. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/care-team/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — careteam.assemble → careteam.draft-proposals, every span phiAccessed:true — returning the CareTeamAssembly + a case-manager-approval-gated TeamChangeProposal for the first open gap as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Care Team & Case Management panel (a high-need happy path → 4-of-6-role coverage + stable case-manager assignment + 2-gap flag, plus off-catalog-role, autonomous-assign, and missing-PCP governance-block presets — rendering the roster in role catalog order, per-role coverage, the flagged gaps, the assigned case manager, the shared team snapshot, the sign-off-gated team-change proposal, synthetic labels, and a trace deep link), and a seeded careteam.assemble→careteam.draft-proposals trace, the console subtitle, and the investor brief (now 'thirty-two agents across three planes', with the Care Team & Case Management agent on the patient/clinical plane) all reflect it. Frontend tests green (+ care-team-management catalog/determinism/roster-order/coverage-and-gap-ordering/off-catalog-filter/case-manager-stable-hash/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths, the panel's request-body + view-lift, and the registry drift guards raised to thirty-two agents); the care-role catalog, condition→role triggers, case-manager pool, member refs, and responsibility labels are clearly-labeled illustrative synthetics, NOT a certified care-team schema or a real provider directory. Lint + build clean.
Agent Fabric: added the Advance Care Planning agent — deterministic midlife-touchpoint directive assessment + human-signoff-gated proposals + LEP-safe conversation prompts (the 31st agent)
ShippedAdded the thirty-first agent on the fabric — advance-care-planning-agent, a whole-person-care ACP TOUCHPOINT agent for the midlife/menopause patient, and the Salesforce 'Agentforce for Health' / Health Cloud advance-care-planning analog — as a first-class patient/clinical-plane agent that REUSES the existing whole-person-care governance tier (an equity / preventive whole-person activity, not a new clinical decision). It is a DETERMINISTIC, no-Claude agent modeled on the HEDIS Quality and Language Access agents: in a new pure lib/advance-care-planning.ts, assessAdvanceCarePlanning(ctx) surfaces which advance directives are on file (living will, DPOA-HC; POLST only when a serious-illness flag is on) against an illustrative ACP_DIRECTIVES catalog + an APPROVED_SOURCES list (verbal-not-documented deliberately excluded so it fails source-integrity), applies a stable staleness threshold (5 years) and per-directive denominator narrowing, and drafts a consent-gated ConversationPrompt for the care team — WITHHOLDING the active prompt (a safe completed answer, not a block) for an LEP patient with no qualified-interpreter plan, deferring in copy to the Language Access & Health Equity agent; proposeDirectiveChange() returns a proposal that is ALWAYS requiresClinicianAndPatientSignoff:true, applied:false — the agent NEVER autonomously creates, updates, or overrides a directive. It is a pure function of the caller-provided asOfDate + directives-on-file (no randomness, no clock), so the same context always yields the same assessment (with a stable, documented flag ordering). It is distinct from the Consent & Preferences Management agent (data-use consent, not directive-of-care) and the Care Plan agent (active treatment planning) — this one is about preserving the patient's voice if they lose decisional capacity, held at a midlife touchpoint rather than during acute illness. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.acp.directive-source-integrity (signal directivesTraceToCatalog, violating value false) blocks a claimed directive that doesn't trace to the catalog + an approved source + a recorded execution date — the guard against fabricating a directive on file to inflate ACP completeness, backed by the pure guard directivesTraceToCatalog; policy.acp.no-autonomous-directive-change (signal directiveChangeRequiresHumanSignoff, violating value false) blocks a directive change bypassing clinician + patient sign-off (mirroring the Prior Authorization Agent's no-autonomous-submission, the Medication Adherence Agent's no-autonomous-refill, the HEDIS Agent's no-autonomous-submission, and the Clinical Trials Agent's no-autonomous-enrollment posture), backed by the guard directiveChangeRequiresHumanSignoff; and policy.acp.language-access-integrity (signal languageAccessSatisfied, violating value false) blocks an active ACP conversation for an LEP patient with no documented qualified-interpreter plan — an ACP conversation is legally consequential and must not be held in a language the patient cannot participate in, backed by the guard languageAccessSatisfied. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/advance-care-planning/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — acp.assess → acp.draft-conversation, every span phiAccessed:true — returning the AcpAssessment + a clinician + patient sign-off gated DirectiveChangeProposal as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Advance Care Planning panel (an English happy path → drafted conversation prompt with a missing-universal-directive flag, an LEP-withheld case → withheld active prompt + language-access-required flag as a safe answer, plus verbal-source, autonomous-apply, and LEP-active governance-block presets — rendering the per-directive status, the illustrative completeness percentage, the flagged ACP gaps, the conversation prompt with its language + interpreter metadata, the sign-off gated directive-change proposal, synthetic labels, and a trace deep link), and a seeded acp.assess→acp.draft-conversation trace, the console subtitle, and the investor brief (now 'thirty-one agents across three planes', with the Advance Care Planning agent on the patient/clinical plane) all reflect it. Frontend tests green (+ advance-care-planning catalog/determinism/staleness-threshold/POLST-conditional/LEP-withheld-vs-actionable/off-catalog-source-flag/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow + LEP-withheld happy paths, the panel's request-body + view-lift, and the registry drift guards raised to thirty-one agents); the directive catalog, approved-source labels, staleness threshold, and language handling are clearly-labeled illustrative synthetics, NOT a certified advance-directives registry, a POLST/MOLST program, or a legal instrument. Lint + build clean.
Agent Fabric: added the HEDIS & Quality Reporting agent — deterministic panel-level HEDIS measure rollup + catalog-sourced exclusions + human-approved submission (the 30th agent)
ShippedAdded the thirtieth agent on the fabric — hedis-quality-agent, the Salesforce 'Agentforce for Health' / Health Cloud quality-reporting analog — as a first-class patient/clinical-plane agent that REUSES the existing care-coordination governance tier (a quality / care-management activity, not a new clinical decision). It is a DETERMINISTIC, no-Claude agent modeled on the Population Health and Clinical Trials agents: in a new pure lib/hedis-quality.ts, rollUpPanel(panel, asOfPeriod) rolls a panel of menopause/midlife patients up against a synthetic HEDIS_MEASURES catalog covering the menopause-relevant preventive-and-screening (OSW, BCS), cardiovascular (CBP, SPC), and behavioral (TCC) domains — computing eligible / excluded / denominator / numerator / rate per measure with a per-measure gap list, applying only exclusions that trace to that measure's allowedExclusions spec, with a stable, documented per-measure denominator narrowing (an unknown / ineligible patient is 'not-in-denominator', a catalog-sourced exclusion shrinks the denominator, everything else is compliant vs. non-compliant per the numerator criterion); assembleSubmission(report) assembles a submission package whose state is ALWAYS 'ready-for-quality-team-review' — requiresQualityTeamApproval:true, submitted:false, a stable illustrative packageId derived from the period. It is a pure function of the panel + the caller-provided asOfPeriod accepted as data (no randomness, no clock), so the same panel + period always yields the same rates and gap lists. Unlike the single-patient Care Gap Closure Agent (which drafts outreach for one patient's gaps) and the panel-level Population Health & Risk Stratification Agent (which prioritizes people), this one reports a whole PANEL against a defined HEDIS measure catalog — the artifact provider organizations owe payers under value-based-care contracts. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.hedis.measure-catalog-sourced (signal measuresTraceToCatalog, violating value false) blocks a report scoring an off-catalog / fabricated measure — backed by the pure guard measuresTraceToCatalog; policy.hedis.exclusion-integrity (signal exclusionsTraceToCatalog, violating value false) blocks an ad-hoc / unlisted denominator exclusion — the load-bearing rate-integrity guard against inflating a rate by shrinking the denominator with an unlisted exclusion, backed by the guard exclusionsTraceToCatalog; and policy.hedis.no-autonomous-submission (signal submissionRequiresHumanApproval, violating value false) blocks any autonomous submission — the agent may only assemble a human-approval-gated draft (mirroring the Prior Authorization Agent's no-autonomous-submission, the Population Health Agent's no-autonomous-care-decision, and the Clinical Trials Agent's no-autonomous-enrollment posture), backed by the guard submissionRequiresHumanApproval. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/hedis-quality/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — hedis.rollup → hedis.assemble-submission, every span phiAccessed:true — returning the PanelQualityReport + submission package as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new HEDIS Quality panel (a roll-up-the-demo-panel happy path plus off-catalog-measure, ad-hoc-exclusion, and autonomous-submission governance-block presets — rendering per-measure eligible / excluded / denominator / numerator / rate with a gap list, the submission package with its human-approval gate, synthetic labels, and a trace deep link), and a seeded hedis.rollup→hedis.assemble-submission trace, the console subtitle, and the investor brief (now 'thirty agents across three planes', with the HEDIS & Quality Reporting agent on the patient/clinical plane) all reflect it. Frontend tests green (+ hedis-quality catalog/determinism/denominator-narrowing/exclusion-integrity/submission-human-approval/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow happy paths, the panel's request-body + view-lift, and the registry drift guards raised to thirty agents); the HEDIS measure catalog, denominator windows, numerator thresholds, and exclusion lists are clearly-labeled illustrative synthetics, NOT NCQA-certified specifications, real value sets, or a certified HEDIS engine. Lint + build clean.
Agent Fabric: added the Language Access & Health Equity agent — deterministic qualified-interpreter-only language access + approved-source materials + equity-gap flagging (the 29th agent)
ShippedAdded the twenty-ninth agent on the fabric — language-access-agent, a patient-care HEALTH-EQUITY agent that ensures limited-English-proficiency (LEP) patients can actually understand their care — as a first-class patient/clinical-plane agent that REUSES the existing whole-person-care governance tier (the SDOH / equity tier — a health-equity / access activity, not a new clinical decision). It is a DETERMINISTIC, no-Claude agent modeled on the Clinical Trials and Care Gap Closure agents: in a new pure lib/language-access.ts, assessLanguageAccess(patient) determines the patient's PREFERRED LANGUAGE (deferring in copy to the Consent & Preferences Management agent's preferred-language preference — English is the clinical default), decides whether a QUALIFIED MEDICAL INTERPRETER is required and of which modality (in-person / video / phone) against a synthetic SUPPORTED_LANGUAGES catalog, checks whether the needed patient materials exist in that language against an APPROVED_MATERIALS catalog (each translation carrying an approved-source / translation-provenance label), and FLAGS EQUITY / ACCESS GAPS (no qualified interpreter available for a language, a consent form only in English) with a stable, documented severity ordering; arrangeInterpreter(assessment) returns a request that is always qualified:true — when no qualified interpreter is available it is an EQUITY-GAP ESCALATION to a human language-access coordinator, never a fallback to an unqualified option. It is a pure function of the context (no randomness, no clock), so the same context always yields the same assessment. It NEVER substitutes machine translation or an untrained / family interpreter for clinical communication or consent. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.langaccess.qualified-interpreter-only (signal usesQualifiedInterpreter, violating value false) blocks a plan that would use an untrained / ad-hoc / family interpreter (or machine translation) for clinical communication — backed by the pure guard usesQualifiedInterpreter, with a missing qualified interpreter surfaced as an equity-gap escalation (a safe completed answer, not a block); policy.langaccess.translated-material-source-integrity (signal materialsTraceToApprovedSource, violating value false) blocks an in-language material presented as official that doesn't trace to the approved translated-materials catalog (an unverified / ad-hoc translation), backed by the guard materialsTraceToApprovedSource; and policy.langaccess.no-machine-translation-for-consent (signal noMachineTranslationForConsent, violating value false) blocks machine / auto translation of clinical consent or clinical decision communication, backed by the guard noMachineTranslationForConsent. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/language-access/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — langaccess.detect-language → langaccess.assess → langaccess.arrange-interpreter, every span phiAccessed:true — returning the LanguageAccessAssessment + interpreter request as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Language Access panel (a Spanish-patient happy path → qualified video interpreter + full in-language materials, an equity-gap case → rare language with no qualified interpreter → escalation, plus family-interpreter, unapproved-translation, and machine-translated-consent governance-block presets — rendering the preferred language, the interpreter modality + qualified flag, the in-language materials with provenance, the equity gaps, synthetic labels, and a trace deep link), and a seeded detect-language→assess→arrange-interpreter trace with an equity-gap example, the console subtitle, and the investor brief (now 'twenty-nine agents across three planes', with the Language Access & Health Equity agent on the patient/clinical plane) all reflect it. Frontend tests green (+ language-access catalog/determinism/qualified-interpreter-only/approved-source-materials/equity-gap-escalation/three-signal-true-and-false guards, the route's envelope/three governance blocks/allow + equity-gap-completes happy paths, the governance-evaluate passthrough for the three new signals, the panel's request-body + view-lift, and the registry drift guards raised to twenty-nine agents); the supported-language list, interpreter availability, materials, and translation provenance are clearly-labeled illustrative synthetics, NOT a certified language-access system. Lint + build clean.
Agent Fabric: added the Clinical Trials & Research Matching agent — deterministic criteria-sourced trial-eligibility matching + consent-gated outreach (the 28th agent)
ShippedAdded the twenty-eighth agent on the fabric — clinical-trials-agent, the Salesforce 'Agentforce for Health' / Health Cloud clinical-trials / research-matching analog — as a first-class patient/clinical-plane agent that REUSES the existing care-coordination governance tier (research matching is a care-navigation / coordination activity, not a new clinical decision). It is a DETERMINISTIC, no-Claude agent modeled on the Care Gap Closure and Population Health agents: in a new pure lib/clinical-trials.ts, matchTrials(patient, {researchConsent}) evaluates a single menopause/midlife patient's STRUCTURED context (age band, symptom profile, comorbidities, geography, prior therapy, HRT status, postmenopausal status) against a synthetic STUDY_CATALOG whose eligibility is composed from a defined TRIAL_CRITERIA catalog (inclusion + exclusion criteria), returns the matching studies ranked with per-criterion match explanations (eligible first, then match score, then studyId — a stable, documented tie-break), and draftTrialOutreach(recommended, researchConsent) drafts a CONSENT-GATED outreach that NEVER auto-enrolls. It is a pure function of the context + research-consent flag (no randomness, no clock), so the same inputs always yield the same matches + ranking + outreach state. It ties thematically to the Consent & Preferences Management agent's `research` consent scope (withheld by default in that agent's demo ledger) — deferring to that authoritative research-consent state before any outreach — but does its own eligibility logic. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.trials.eligibility-criteria-sourced (signal eligibilityTracesToCriteria, violating value false) blocks a fabricated / ad-hoc / off-catalog eligibility determination that doesn't trace to a defined study criterion (the pure guard eligibilityTracesToCriteria backs it); policy.trials.research-consent-required (signal researchConsentPresent, violating value false) blocks an active trial outreach drafted without the patient's research consent — and when consent is absent the agent WITHHOLDS outreach (a safe completed answer, not a block) via the guard outreachHasResearchConsent; and policy.trials.no-autonomous-enrollment (signal enrollmentRequiresHuman, violating value false) blocks any attempt to enroll a patient autonomously — enrollment requires informed consent AND a human (every outreach is requiresHuman:true / enrolled:false, there is no 'enrolled' state), backed by the guard enrollmentRequiresHuman. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient clinical context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/clinical-trials/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — trials.load-catalog → trials.match → trials.draft-outreach, every span phiAccessed:true — returning the TrialMatchResult as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Clinical Trials panel (match-with-consent and match-no-consent-withheld happy-path presets plus fabricated-eligibility, outreach-without-consent, and autonomous-enrollment governance-block presets — rendering the per-study matched/failed criteria, the recommended studies, the consent-gated outreach state, synthetic labels, and a trace deep link), and a seeded load-catalog→match→draft-outreach trace, the console subtitle, and the investor brief (now 'twenty-eight agents across three planes', with the Clinical Trials & Research Matching agent on the patient/clinical plane) all reflect it. Frontend tests green (+ clinical-trials catalog/criteria-integrity/determinism/ranking-tie-break/consent-gated-outreach/never-enrolled/traces-to-criteria-true-and-false/consent-and-enrollment guards, the route's envelope/three governance blocks/allow + withheld-outreach happy paths, the governance-evaluate passthrough for the three new signals, the panel's request-body + view-lift, and the registry drift guards raised to twenty-eight agents); the study catalog, sponsors, criteria, and patient references are clearly-labeled illustrative synthetics, NOT real studies or a certified trial-eligibility engine. Lint + build clean.
Agent Fabric: added the Consent & Preferences Management agent — the authoritative consent ledger + deterministic consent-decision service (the 27th agent)
ShippedAdded the twenty-seventh agent on the fabric — consent-management-agent, the MuleSoft control-plane / data-substrate consent service — as the AUTHORITATIVE, cross-cutting consent & communication-preferences service the rest of the fabric's consent-before-outreach / consent-before-referral / consent-to-monitor gates logically defer to. Unlike every other agent (which CONSUMES consent), this one is the SOURCE OF TRUTH FOR consent, so it REUSES the existing data-plane governance tier (platform plane — a control-plane / data-substrate service) rather than inventing one, and is a DETERMINISTIC, no-Claude agent. In a new pure lib/consent-management.ts it holds, per patient, a consent LEDGER (a set of consent scopes — contact-outreach, data-sharing, remote-monitoring, research, marketing — each with a status granted / withheld / revoked, a recorded basis/source, a timestamp, and an optional expiry) and communication PREFERENCES (allowed channels sms/email/voice, quiet hours, preferred language, frequency cap), and evaluateConsent(ledger, {scope, channel, atTime, priorTouches}) DETERMINISTICALLY answers one question — may this patient be contacted / have data used for this scope over this channel at this time? — denying a withheld / revoked / expired / unrecorded scope, an unpermitted channel, a quiet-hours touch (quiet hours are read from the query's own atTime, not a clock), or a frequency-cap breach (priorTouches is taken as data), and otherwise allowing, always citing the consent record it relied on (matchedConsentEventId). It is a pure function of the ledger + the query's own atTime + priorTouches (no randomness, no clock), so the same inputs always yield the same decision. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.consent.recorded-source (signal consentTracesToRecord, violating value false) blocks an asserted-but-unrecorded consent that doesn't trace to a recorded event/basis — an off-catalog scope, an unrecognized status, or a missing recorded source (the pure guard consentTracesToRecord backs it); policy.consent.honor-revocation (signal honorsRevocation, violating value false) blocks any decision that would ALLOW outreach against a revoked / expired scope — a revocation must be honored immediately (the guard honorsRevocation backs it); and policy.consent.no-scope-override (signal respectsConsentScope, violating value false) blocks any decision that overrides a withheld scope or borrows consent for a scope the patient never granted — an allow requires a granted, current record for that exact scope (the guard respectsConsentScope backs it). It also reuses, by extending appliesTo, the HIPAA-audit policy (it holds patient consent data — it is NOT a commercial-plane agent even though it's on the platform plane), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/consent-management/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — consent.load-ledger → consent.evaluate → consent.decision, every span phiAccessed:true — returning the ConsentDecision + ledger as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Consent & Preferences Management panel (granted→allowed, withheld→denied, and quiet-hours→denied happy-path presets plus unrecorded-consent, allow-against-revoked, and scope-override governance-block presets — rendering the consent ledger, the decision with its reason + matched consent record, the comms preferences, synthetic labels, and a trace deep link), and a seeded load-ledger→evaluate→decision trace, the console subtitle, and the investor brief (now 'twenty-seven agents across three planes', with the Consent & Preferences Management agent on the platform & data substrate) all reflect it. Frontend tests green (+ consent-management catalog/time-helper/resolve-latest/determinism/decision-order/traces-to-record-true-and-false/honor-revocation-true-and-false/no-scope-override guards, the route's envelope/three governance blocks/allow + honored-denial happy paths, the governance-evaluate passthrough for the three new signals, the panel's request-body + view-lift, and the registry drift guards raised to twenty-seven agents); the consent scopes, recorded sources, preferences, and patient references are clearly-labeled illustrative synthetics, NOT a certified consent-management system. Lint + build clean.
Agent Fabric: added the Population Health & Risk Stratification agent — deterministic panel-level risk tiering + prioritized outreach worklist (the 26th agent)
ShippedAdded the twenty-sixth agent on the fabric — population-health-agent, the Salesforce 'Agentforce for Health' / Health Cloud population-health / risk-stratification analog — as a first-class patient/clinical-plane agent that REUSES the existing care-coordination governance tier (population health / care-management triage, not a new clinical decision). It is a DETERMINISTIC, no-Claude agent modeled on the Care Gap Closure and Remote Patient Monitoring agents, and introduces a NEW granularity: unlike every other patient-plane agent (which reasons over a SINGLE patient), it reasons over a whole PANEL/COHORT at once. In a new pure lib/population-health.ts, stratifyPanel(panel) DETERMINISTICALLY scores each patient from already-produced per-patient signals (intake severity, validated-assessment band, open care gaps, positive SDOH domains, medication-adherence status, monitored-symptom trend) with a TRANSPARENT additive/weighted risk model — a defined RISK_FACTORS spec (each factor carrying a synthetic weight + rationale) and fixed TIER_CUTOFFS mapping a numeric score to a low / rising / high tier — a pure function of the signals (no randomness, no clock), so the same panel always yields the same tiers + worklist ordering with a stable, documented tie-break (score desc, then patientRef asc), and every patient's tier cites the contributing factors that produced it. It then emits a prioritized outreach worklist (which patients to reach first, and why) for a human care manager. THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.pophealth.transparent-risk-model (signal riskScoreTracesToFactors, violating value false) blocks an opaque / off-spec / black-box score whose tier doesn't trace to the documented risk-factor spec (the pure guard riskScoreTracesToFactors backs it); policy.pophealth.no-protected-class-factors (signal excludesProtectedAttributes, violating value false) blocks any attempt to score on a protected-class attribute (race, ethnicity, gender identity, religion, national origin, disability status, sexual orientation, marital status) — a fairness / responsible-AI requirement (the guard excludesProtectedAttributes backs it); and policy.pophealth.no-autonomous-care-decision (signal tierReviewedByHuman, violating value false) blocks any attempt to let a risk tier trigger an autonomous care action — a tier is a prioritization signal only, every tier→action requires human / care-manager review. It also reuses, by extending appliesTo, the HIPAA-audit policy (panel-level PHI — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/population-health/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — pophealth.ingest-panel → pophealth.score → pophealth.stratify → pophealth.build-worklist, every span phiAccessed:true — returning the PanelStratification as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Population Health panel (mixed-panel and high-risk-cohort happy-path presets producing a mix of low/rising/high tiers + a prioritized worklist, plus opaque-score, protected-class-factor, and autonomous-care-decision governance-block presets — rendering the tier counts, the per-patient tiers with their contributing factors, the ordered worklist, synthetic labels, and a trace deep link), and a seeded ingest-panel→score→stratify→build-worklist trace, the console subtitle, and the investor brief (now 'twenty-six agents across three planes', with the Population Health & Risk Stratification agent on the patient/clinical plane) all reflect it. Frontend tests green (+ population-health catalog/cutoff-integrity/determinism/tier-mapping/worklist-ordering/traces-to-factors-true-and-false/excludes-protected-true-and-false/human-review guards, the route's envelope/three governance blocks/happy-path, the governance-evaluate passthrough for the three new signals, the panel's request-body + view-lift, and the registry drift guards raised to twenty-six agents); the risk factors, weights, cutoffs, and patient references are clearly-labeled illustrative synthetics, NOT a certified risk-stratification model. Lint + build clean.
Agent Fabric: added the Remote Patient Monitoring & Symptom-Trend Tracking agent — deterministic longitudinal trend detection + clinician-routed escalation (the 25th agent)
ShippedAdded the twenty-fifth agent on the fabric — remote-monitoring-agent, the remote-patient-monitoring (RPM) analog — as a first-class patient/clinical-plane agent that REUSES the existing care-coordination governance tier (longitudinal monitoring + coordinating a clinician escalation, not a new clinical decision). It is a DETERMINISTIC, no-Claude agent modeled on the Care Gap Closure and Medication Adherence agents, and is distinct from all four: it ingests longitudinal (time-series) symptom/vital readings — self-reported or from wearables/devices — for a menopause/midlife patient (hot-flash frequency, sleep hours, mood score, resting heart rate, weight). In a new pure lib/remote-monitoring.ts, assessMonitoring(readings) DETERMINISTICALLY detects a per-metric trend (improving / stable / worsening) by comparing a recent window against a baseline window against a defined monitored-metrics catalog (each metric carrying a synthetic unit, stable band, worsening direction, and red-flag cutoff), then raises escalations for worsening or red-flag trends — a pure function of the reading series (timestamps are accepted as data, no randomness, no clock), so the same series always yields the same trend + escalation decision, and every escalation cites the metric + the threshold rule that triggered it and is routed to a clinician (routedTo:'clinician-review'). THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.rpm.reading-source-integrity (signal readingsTraceToSource, violating value false) blocks a fabricated / off-source reading or an off-catalog metric (the pure guard readingsTraceToSource backs it); policy.rpm.no-autonomous-escalation (signal escalationRoutedToHuman, violating value false) blocks any attempt to act on a trend autonomously — every escalation must be routed to a human clinician, never an autonomous clinical action (no auto-ordering, auto-medication, auto-titration); and policy.rpm.consent-to-monitor (signal monitoringHasConsent, violating value false) blocks longitudinal monitoring / trend outreach without the patient's consent. It also reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient clinical context — it is NOT a commercial-plane agent), and is deliberately NOT on the live-Claude model allow-list (no Claude). A runnable A2A endpoint (POST /api/agents/remote-monitoring/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — rpm.ingest → rpm.detect-trends → rpm.route-to-clinician, every span phiAccessed:true — returning the MonitoringAssessment as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Remote Patient Monitoring panel (improving/stable/worsening multi-metric, benign, and red-flag happy-path presets plus fabricated-reading, autonomous-escalation, and no-consent governance-block presets — rendering the per-metric trends, escalations with their triggering rule + 'routed to clinician review', synthetic labels, and a trace deep link), and a seeded ingest→detect→route-to-clinician trace, the console subtitle, and the investor brief (now 'twenty-five agents across three planes', with the Remote Patient Monitoring & Symptom-Trend Tracking agent on the patient/clinical plane) all reflect it. Frontend tests green (+ remote-monitoring catalog-integrity/determinism/trend-classification/red-flag/escalation-routing/source-guard-true-and-false, the route's envelope/three governance blocks/happy-path, the governance-evaluate passthrough for the three new signals, the panel's request-body + view-lift, and the registry drift guards raised to twenty-five agents); the monitored-metric catalog, thresholds, and red-flag cutoffs are clearly-labeled illustrative synthetics, NOT a certified remote-monitoring or clinical-alerting engine. Lint + build clean.
Agent Fabric: added the Patient Education & Health Coaching agent — evidence-sourced education + live-Claude coaching (the fourth live-Claude agent)
ShippedAdded the twenty-fourth agent on the fabric — patient-education-agent, the Salesforce 'Agentforce for Health' patient-education / health-coaching analog — as a first-class patient/clinical-plane agent that REUSES the existing patient-engagement governance tier (patient-facing education + coaching, not a new clinical decision). It is distinct from the clinician-authored Care Plan agent and the refill-focused Medication Adherence agent: it turns already-produced signals (intake symptoms/severity, an optional validated-instrument assessment, Care Plan focus areas, and detected care gaps) into a personalized, evidence-sourced menopause/midlife education curriculum and a warm coaching message. In a new pure lib/patient-education.ts, buildEducationCurriculum(context) DETERMINISTICALLY selects modules from a defined evidence-sourced catalog (bone health, cardiovascular risk, sleep hygiene, vasomotor self-management, mood/stress, nutrition, physical activity — each carrying a synthetic source label: The Menopause Society, USPSTF, NAMS/ACOG-style) — a pure function of the inputs (no randomness, no clock), so the same context always yields the same curriculum. coachEducation(curriculum) then phrases a motivational coaching message with live Anthropic Claude — the FOURTH live-Claude agent after the Care Router, Care Plan, and Clinical Summary agents — falling back to a DETERMINISTIC scripted message (scriptedCoachEducation, with a recorded fallbackReason) when ANTHROPIC_API_KEY is unset or the API call fails, exactly like the Care Plan agent, returning an EducationCoachingResult (coachingMessage, moduleIds, via: 'claude-api' | 'scripted-fallback', optional fallbackReason, synthetic:true). THREE load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.education.evidence-sourced (signal educationTracesToEvidenceSource, violating value false) blocks a fabricated / off-catalog topic that doesn't trace to a defined evidence source (the pure guard curriculumTracesToEvidenceSource backs it); policy.education.no-medical-advice (signal staysWithinEducationScope, violating value false) blocks content that strays beyond general education into diagnosis, medication dosing, or individualized medical advice; and policy.education.consent-before-outreach (signal coachingOutreachHasConsent, violating value false) blocks a coaching push without the patient's consent — every outreach is consent-gated and human-approval-gated. It also reuses, by extending appliesTo, the anthropic-claude-sonnet model allow-list (live-Claude) and the HIPAA-audit policy (it touches patient clinical context — it is NOT a commercial-plane agent). A runnable A2A endpoint (POST /api/agents/patient-education/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — patient-education.curate → patient-education.coach, every span phiAccessed:true, the coach span carrying via + any fallbackReason and the consent/human-approval/never-sent flags — returning the curriculum + coaching as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is surfaced on /demo/intake via a new Patient Education panel (vasomotor, postmenopausal-prevention, and mood-dominant happy-path presets plus off-catalog, medical-advice, and no-consent governance-block presets — rendering the selected modules with their source labels, the coaching message with a via/fallbackReason badge, the evidence-source signal, and a trace deep link), and a seeded curate→coach (scripted-fallback) trace, the console subtitle, and the investor brief (now 'twenty-four agents across three planes', with the Patient Education & Health Coaching agent on the patient/clinical plane) all reflect it. Frontend tests green (+ patient-education determinism/module-selection/evidence-source-guard-true-and-false/scope-guard/live-Claude-success-via-mocked-SDK + SDK-error + missing-key fallback with fallbackReason, the route's envelope/three governance blocks/model-allow-list/happy-path, the governance-evaluate passthrough for the three new signals, the panel's request-body + view-lift, and the registry drift guards raised to twenty-four agents); the education modules + source labels are clearly-labeled illustrative synthetics, NOT a certified patient-education engine. Lint + build clean.
Intake: the assistant greets the patient by name
ShippedMade the intake experience address the patient by name across both surfaces. The scripted intake assistant (agentforce-fallback.tsx) now greets and closes using the name typed at step 0 — a subtle acknowledgment on the next turn ("Thanks, Maggie! …") and the completion / red-flag messages ("Thanks, Maggie. I've drafted your intake…"), with a graceful fallback to the name-less copy when no usable name is captured. Name parsing lives in pure, unit-tested helpers in lib/agentforce.ts (firstNameFromInput, withNameAcknowledgment, intakeCompletionMessage, intakeRedFlagMessage). For the LIVE Salesforce Agentforce agent, the intake stage now forwards the Salesforce-standard _firstName/_lastName hidden prechat fields in-band (auto-accepted, no org registration), and — because a static welcome message can't interpolate a name and the LLM may not see the standard field in its reasoning — a durable context-variable route was wired end to end, mirroring the Patient_Zip plumbing exactly: a new MessagingSession.Pause_Patient_First_Name__c field (Text 80), a Patient_First_Name input + assignment on the Pause_Intake_Prechat_Router Flow, a Patient_First_Name channel customParameter, FLS on the Pause_Health_Intake_Prechat_Dossier permission set, both package manifests + deploy.sh inventory + README track-table, and /api/intake/prechat-context emitting Patient_First_Name (intake-patient-stage forwards it in-band) so the agent can greet by $Context.Pause_Patient_First_Name. Deployable XML is comment-free (the documented deploy trap) and validates with xmllint; frontend tests + lint + build green. Org-side remainder (documented in docs/AGENTFORCE_PROVIDER_ACTION_RUNBOOK.md "Greeting the patient by name"): deploy the metadata, register Patient_First_Name as a hidden prechat field, add the Pause_Patient_First_Name bot context variable, reference it in the Agent-Level Instructions, then re-Publish the Embedded Service Deployment + Deactivate → Save → Activate the agent.
Agent Fabric: added the SDOH Screening agent — validated social-needs screening + consent-gated community referral (whole-person care)
ShippedAdded the twenty-third agent on the fabric — sdoh-screening-agent, the Salesforce 'Agentforce for Health' whole-person-care analog — as a first-class patient/clinical-plane agent on a NEW whole-person-care governance tier (screening + referral for social determinants of health is a distinct kind of work from the clinical-decision and care-coordination agents, so it warrants its own tier rather than overloading an existing one; the tier maps to the patient-care plane so the console/proposal grouping and drift guards render it). In a new pure lib/sdoh.ts it screens a patient for health-related social needs / social determinants of health with a validated, public-domain instrument — the CMS Accountable Health Communities HRSN (AHC-HRSN) screening tool's five CORE domains (housing instability, food insecurity, transportation needs, utility needs, interpersonal safety) — where screenSocialNeeds(response) DETERMINISTICALLY flags the positive social-need domains with real rule-based scoring (the Hunger Vital Sign two-item food screen; the HITS interpersonal-safety cutoff of >10) — no LLM, no randomness, no clock, so the same responses always screen identically — and returns an SdohScreeningResult (per-domain positive/negative, a count of positive domains, and any interpersonal-safety red flag). Like the Assessment Agent's validated-instrument allow-list, it refuses to administer any screener not on ALLOWLISTED_SDOH_SCREENERS. draftCommunityReferralsForResult(result, {patientConsent}) then drafts CONSENT-GATED, catalog-sourced community-resource referrals (211, food bank, housing assistance, utility/LIHEAP assistance, a domestic-violence hotline for the safety domain) — each referencing a defined community-resource catalog id, human-approval-gated, and never an autonomous enrollment. TWO load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.sdoh.validated-screener-only (signal usesValidatedSdohScreener, violating value false) blocks a screener outside the validated allow-list, and policy.sdoh.consent-before-referral (signal sdohReferralHasConsent, violating value false) blocks a community referral drafted without the patient's explicit consent. A positive interpersonal-safety screen is a mandatory escalation to a human social worker (mirroring the Assessment Agent's PHQ-9 item 9 handling), recorded as its own trace span. SDOH is SEPARATE from clinical severity — sdohToIntakeSignal(result) raises a whole-person care-coordination flag (and a safety escalation), NOT an intake clinical severity — so it composes with the intake spine WITHOUT ever changing IntakeRecord.severity. It reuses, by extending appliesTo, the HIPAA-audit policy (it touches patient social/clinical context — it is NOT a commercial-plane agent). A runnable A2A endpoint (POST /api/agents/sdoh-screening/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — sdoh.screen → sdoh.safety.escalate (when the red flag fires) → sdoh.refer, every span phiAccessed:true — returning the result + consent-gated referral drafts as an artifact with metadata.agentFabric carrying the trace ids and the honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is also threaded ADDITIVELY into POST /api/intake/route-to-care-router (when a body.sdoh is present it screens + drafts consented referrals, attaching _sdoh to the response meta with its own spans, and never mutates the routing decision), surfaced on /demo/intake via a new SDOH Screening panel (multi-domain positive screen with consented referrals, an interpersonal-safety escalation, a consent-withheld governance block, and a non-allow-listed screener block — rendering the positive domains, the safety escalation, the consent/human-approval/no-autonomous-enrollment referral flags, synthetic labels, and a trace deep link), and a seeded screen→refer + safety-escalation trace, the console subtitle, and the investor brief (now 'twenty-three agents across three planes', with the SDOH Screening agent on the patient/clinical plane) all reflect it. Frontend tests green (+ sdoh determinism/per-domain-scoring/safety-red-flag-escalation/allow-list-rejection/referral-draft-shape-and-consent-gating, the route's envelope/consent-block/allow-list-block/safety-escalation/happy-path, the panel's request-body + view-lift, and the registry drift guards raised to twenty-three agents with the new whole-person-care tier covered); the community-resource catalog is a clearly-labeled illustrative synthetic, NOT a live directory of real programs. Lint + build clean.
Agent Fabric: added the Clinical Summary agent — after-visit summary + clinician handoff (the third live-Claude agent)
ShippedAdded the twenty-second agent on the fabric — clinical-summary-agent, the Salesforce 'Agentforce for Health' After-Visit Summary / clinical-documentation analog — as a first-class patient/clinical-plane agent on the existing care-coordination governance tier (it is a documentation/coordination artifact, not a new clinical decision, so it REUSES a tier rather than proliferating one). It runs POST-VISIT, downstream of the whole lifecycle, and COMPOSES the outputs the other agents already produced — the intake severity/symptoms, the Care Router pathway, and (optionally) a validated-instrument assessment, an instantiated care plan, and detected care gaps — into TWO artifacts: a patient-friendly After-Visit Summary and a clinician handoff note. In a new pure lib/clinical-summary.ts, assembleClinicalSummaryContext(inputs) DETERMINISTICALLY gathers ONLY the facts present in the provided lifecycle inputs and records the exact sourceRecords the context was assembled from (intake, care-router:<pathway>, assessment:<instrument>, care-plan:<id>, care-gap:<id>) — the agent never invents a clinical fact or a source. summarizeClinical(context, opts?) then phrases the two artifacts with live Anthropic Claude — the THIRD live-Claude agent after the Care Router and the Care Plan agent — falling back to a DETERMINISTIC scripted composition (scriptedSummarizeClinical, with a recorded fallbackReason) when ANTHROPIC_API_KEY is unset or the API call fails, exactly like the Care Plan agent, and returns a ClinicalSummaryResult (patientSummary, clinicianHandoff, sourceRecords, via: 'claude-api' | 'scripted-fallback', optional fallbackReason, synthetic:true). The load-bearing honesty property — every summary must trace to the defined source records the context was assembled from — is genuinely governance-enforced by a NEW enforced-block policy, policy.clinical-summary.source-record-sourced, with its matching boolean signal (summaryTracesToSourceRecords, violating value false) wired into the shared governance-signals metadata so evaluateGovernance() blocks a fabricated / off-context summary that cites a record absent from the assembled context; the pure guard summaryTracesToSourceRecords(result, context) backs it and the route sets the signal honestly from the domain. It also reuses, by extending appliesTo, the anthropic-claude-sonnet model allow-list (live-Claude), the no-prescribing, consent-before-grounding, and HIPAA-audit policies (it touches clinical data — it is NOT a commercial-plane agent) and commits no clinical action. A runnable A2A endpoint (POST /api/agents/clinical-summary/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — clinical-summary.assemble → clinical-summary.summarize, every span phiAccessed:true, the summarize span carrying via + any fallbackReason — returning both artifacts + the sourceRecords as an artifact with metadata.agentFabric carrying the trace ids and the grounding signal, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. It is also threaded ADDITIVELY into POST /api/intake/route-to-care-router (when clinicalSummary is present it assembles + summarizes after the care-router decision and any care plan, attaching _clinicalSummary to the response meta with its own spans), surfaced on /demo/intake via a new Clinical Summary panel (happy-path + governance-blocked 'ungrounded summary' presets, both artifacts, the sourceRecords provenance, via/fallbackReason badges, a synthetic label, and a trace deep link), and a seeded assemble→summarize (scripted-fallback) trace, the console subtitle, and the investor brief (now 'twenty-two agents across three planes', with the Clinical Summary agent on the patient/clinical plane) all reflect it. Frontend tests green (+ clinical-summary determinism/grounding-guard-true-and-false/live-Claude-success-via-mocked-SDK/SDK-error + missing-key fallback with fallbackReason, the route's envelope/governance-block-on-ungrounded-summary/model-allow-list/happy-path, the panel's request-body + view-lift, and the registry drift guards raised to twenty-two agents); both artifacts are clearly-labeled illustrative synthetics — a composition of already-synthetic records for two audiences that requires clinician review — NOT a certified clinical-documentation engine. Lint + build clean.
Agent Fabric: added the Prior Authorization agent — clinician-gated, documentation-complete PA assembly
ShippedAdded the twenty-first agent on the fabric — prior-authorization-agent, the Salesforce 'Agentforce for Health' / Health Cloud CareRequest + Utilization Management analog — as a first-class clinical-plane agent that REUSES the Care Router / Care Plan clinical-decision governance tier (PA is a clinical / utilization decision). It is the HEAVIEST agent and, deliberately, the LEAST demo-honest of the set: real prior authorization is a genuinely multi-system X12 278 (or FHIR PAS / Da Vinci) EDI workflow against a payer's utilization-management system, so the mock is labeled especially clearly, and — per Salesforce's own guidance to do PA last — we did it last. In a new pure lib/prior-auth.ts a small catalog of PA-requiring menopause items (systemic HRT / compounded estradiol, a bone-density DEXA scan, and a specialized hormone lab panel), each carrying the payer medical-necessity criteria it must satisfy and its required supporting-documentation checklist, backs assemblePriorAuth(request), which DETERMINISTICALLY matches the criteria against the (synthetic) clinical context, assembles the required-documentation checklist (present vs missing), and returns a PriorAuthPackage — matched criteria (every one referencing a defined catalog id), documentation completeness, a synthetic Health Cloud CareRequest / authorization id (hashed from stable request keys — no randomness, no clock), a status (draft / ready-for-clinician / submitted / approved / denied), requiresClinicianApproval:true, submitted:false, and a source/provenance block marked synthetic:true. TWO load-bearing honesty properties are genuinely governance-enforced, each with its own NEW enforced-block policy + matching boolean signal wired into the shared governance-signals metadata: policy.pa.no-autonomous-submission (signal paHasClinicianApproval, violating value false) blocks a caller-asserted submit-without-clinician-approval — the agent may only assemble a clinician-gated draft, and a clinician must approve before submission; and policy.pa.documentation-integrity (signal paDocumentationComplete, violating value false) blocks a submission missing a required supporting document — assembling a DRAFT with missing docs is fine (it honestly lists what's outstanding), only a submission must be documentation-complete. The route sets both signals honestly from the domain (priorAuthHasClinicianApproval / priorAuthDocumentationComplete), and submitPriorAuth() refuses (throws) on either violation as defense in depth. It also reuses, by extending appliesTo, the no-prescribing, consent-before-grounding, and HIPAA-audit policies. A runnable A2A endpoint (POST /api/agents/prior-authorization/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — priorauth.criteria.match → priorauth.docs.assemble → priorauth.await-clinician (the human-approval gate; a clinician-approved + documentation-complete submit instead advances to priorauth.submit) — returning the PA package as an artifact with metadata.agentFabric carrying the trace ids and the two honesty signals, failed-task on a block) and a /.well-known/agent.json card whose policies derive from the registry round it out. As a standalone agent (downstream of the Care Plan / clinical decision) a seeded criteria-match→docs-assemble→await-clinician trace (drafted, not submitted), the console subtitle, and the investor brief (now 'twenty-one agents across three planes', with a Prior Authorization card noting it's the heaviest, deliberately-last workflow and the two new policies in the enforcement paragraph) all reflect it. Frontend tests green (+ prior-auth determinism/criteria-matching/documentation-completeness/clinician-gated-package-shape/off-catalog-rejection, the route's envelope/governance-block-for-both-policies/happy-path + submit, and the registry drift guards raised to twenty-one agents); the payer criteria + document checklists are clearly-labeled illustrative synthetics, NOT a certified utilization-management engine — and no PA assembled here is a real coverage determination or a real 278/EDI / payer PA portal submission. Lint + build clean.
Agent Fabric: added the Member Service / Billing agent — claim-sourced billing answers + human routing
ShippedAdded the twentieth agent on the fabric — member-service-agent, the Salesforce 'Agentforce for Health' Claims & Coverage / patient-service analog — as a first-class, patient-facing self-service agent on the patient/clinical plane that REUSES the intake agent's patient-facing governance tier. It answers a member's BILLING & COVERAGE self-service questions — claim status, copay / patient responsibility, outstanding balance, and EOB explanation — grounded on the member's synthetic claim/EOB records, and routes anything out of scope (a clinical, prescription, or scheduling request) to a human member-services specialist with a PII-safe billing context bundle, keeping it scoped to billing/coverage self-service so it stays distinct from the Engagement Agent. In a new pure lib/member-service.ts a ClaimRecord model (claim id, date-of-service, provider, billed / allowed / plan-paid / patient-responsibility, and a submitted / adjudicated / paid / denied status) is generated DETERMINISTICALLY by hashing the member/claim key (FNV-1a) into realistic figures (billed $150–$1,025; allowed 55–70% of billed; member coinsurance 10–30%; dates counted back from a fixed anchor — no randomness, no clock), so the same member always yields the same claims. classifyIntent() maps a free-text question to one of the four in-scope billing intents or out-of-scope, and answerBillingQuestion(query, claims) returns a structured BillingAnswer that ALWAYS cites the specific ClaimRecord(s) it derived from (a source + citedClaims block, synthetic:true) plus a routeToHuman escalation path with a PII-safe context bundle when out of scope. The critical honesty property is that a billing/claim answer must trace to a synthetic claim/EOB record — the agent may NOT fabricate claim data. That is genuinely enforced by a NEW enforced-block policy, policy.billing.claim-data-sourced, with its matching boolean signal (billingTracesToClaim, violating value false) wired into the shared governance-signals metadata so evaluateGovernance() blocks a caller-asserted billing answer that cites no claim — the route sets the signal honestly from the domain's answerTracesToClaim() (a route-to-human handoff asserts no billing figure, so it is source-clean; an in-scope answer must cite a claim). It also reuses, by extending appliesTo, the no-free-text-pii policy (structured, claim-referenced answers only) and the HIPAA audit. A runnable A2A endpoint (POST /api/agents/member-service/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — billing.claim.lookup → billing.answer → an optional billing.route-to-human handoff — returning the answer + cited claims as an artifact with metadata.agentFabric carrying the trace ids, the intent, the cosign signal, and nextAgent on a handoff) and a /.well-known/agent.json card whose policies derive from the registry round it out. As a standalone patient-service node (not threaded into route-to-care-router) a seeded claim-lookup→answer→route-to-human trace, the console subtitle, and the investor brief (now 'twenty agents across three planes', with a Member Service / Billing card and the new policy in the enforcement paragraph, noting it's scoped to billing/coverage self-service) all reflect it. Frontend tests green (+ member-service determinism/claim-generation-ranges/every-answer-cites-a-claim/route-to-human-context-bundle/unsourced-rejection, the route's envelope/governance-block/happy-path + route-to-human, and the registry drift guards raised to twenty agents); the claim/EOB records are clearly-labeled illustrative synthetics, NOT a real claims / 835-ERA / payer system. Lint + build clean.
Agent Fabric: added the Referral Management agent — clinician-cosigned outbound referrals
ShippedAdded the nineteenth agent on the fabric — referral-management-agent, the Salesforce 'Agentforce for Health' Referrals ('Create Referral') analog — as a first-class care-coordination agent on the patient/clinical plane that REUSES the Scheduling agent's care-coordination governance tier. It GENERALIZES the Care Router's behavioral-health-handoff into a full outbound-referral node: rather than expressing a single handoff pathway, it triages a patient's intake + Care Router routing signals into referrals across the adjacent specialists menopause commonly touches — cardiology / CVD risk, endocrinology, bone health, pelvic-floor PT, and behavioral health. In a new pure lib/referrals.ts a small illustrative ReferralSpecialty catalog (each with an id, label, and typical trigger) backs triageReferrals(context), which DETERMINISTICALLY derives recommended referral(s) from age/cycle/symptom/severity/red-flag signals + explicit risk flags (red-flag mood → behavioral-health; osteoporosis / high-fracture-risk → bone-health; high cholesterol / CVD signals → cardiology; GSM / pelvic-floor dysfunction → pelvic-floor-PT; menopause-pattern symptoms under 40 → endocrinology for a POI workup) — no randomness, no clock — so the same context always yields the same recommendations. The load-bearing integrity property is that EVERY recommended referral references a defined specialty-catalog id AND carries a documented reason (never fabricated, never reasonless), and draftReferral(specialty, context) builds a referral request marked requiresClinicianCosign:true, status:'drafted', sent:false. The critical honesty property is that it can only DRAFT: an outbound referral requires a clinician's sign-off before it is sent — a human-in-the-loop clinical action. That is genuinely enforced by a NEW enforced-block policy, policy.referral.clinician-cosign, with its matching boolean signal (referralHasClinicianCosign, violating value false) wired into the shared governance-signals metadata so evaluateGovernance() blocks a caller-asserted send-without-cosign — the route sets the signal honestly from the domain's referralHasClinicianCosign(); a draft (or a clinician-cosigned send) passes. It also reuses, by extending appliesTo, the rationale-required policy (adapted so a referral must carry a documented reason) and the HIPAA audit. A runnable A2A endpoint (POST /api/agents/referral-management/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — referral.triage → per-referral referral.draft → a referral.await-cosign marker — returning recommendations + referrals as an artifact with metadata.agentFabric carrying the trace ids and the cosign signal) and a /.well-known/agent.json card whose policies derive from the registry round it out. As a standalone agent (it complements the Care Router; not threaded into route-to-care-router) a seeded triage→draft→await-cosign trace, the console subtitle, and the investor brief (now 'nineteen agents across three planes', with a Referral Management card and the new policy in the enforcement paragraph, noting it generalizes the behavioral-health handoff) all reflect it. Frontend tests green (+ referrals determinism/triage/catalog-integrity/off-catalog-rejection/cosign-signal, the route's envelope/governance-block/happy-path, and the registry drift guards raised to nineteen agents); the specialties + triage rules are clearly-labeled illustrative synthetics, NOT a certified clinical referral engine. Lint + build clean.
Agent Fabric: added the Medication Adherence agent — nudge-only HRT/SSRI adherence + refill prompts
ShippedAdded the eighteenth agent on the fabric — medication-adherence-agent, the Salesforce 'Agentforce for Health' / Health Cloud MedicationRequest + MedicationTherapyReview analog — as a first-class, PROACTIVE patient-care agent on the patient-engagement tier (patient/clinical plane), a sibling of the Care Gap Closure agent. In a new pure lib/medication-adherence.ts it tracks menopause-medication adherence + refill timing across a small illustrative catalog — transdermal estradiol + oral micronized progesterone (HRT) and paroxetine (SSRI) / venlafaxine (SNRI) for vasomotor symptoms or mood, each with a days-supply — and DETERMINISTICALLY computes a good / at-risk / lapsed adherence status and a refill-due call from days-since-fill vs supply against an EXPLICIT as-of date (no randomness, no clock), so the same inputs always yield the same assessment. It drafts consent- and quiet-hours-aware refill/adherence NUDGES (draftAdherenceNudges) for each medication due or off-track, and flags adherence drop-off (a lapsed medication) to the care team. The load-bearing honesty property is that it can only NUDGE: every nudge is marked requiresHumanApproval:true, sent:false, nudgeOnly:true, and the agent must NEVER autonomously submit or order a refill — a refill is a clinical action that requires a human-in-the-loop. That is genuinely enforced: a NEW enforced-block policy, policy.medication.no-autonomous-refill, with its matching boolean signal (refillRequiresHumanApproval, violating value false) wired into the shared governance-signals metadata so evaluateGovernance() blocks a caller-asserted autonomous refill (a submit-refill without human approval) — the route sets the signal honestly from the domain's refillRequiresHumanApproval(), and an autonomous refill also trips the reused no-prescribing block (an autonomous refill is a clinical action committed without a clinician). It also reuses the engagement outreach guards extended onto the agent — contact-consent-required, human-approval-before-send, quiet-hours + channel preference, and the HIPAA audit. A runnable A2A endpoint (POST /api/agents/medication-adherence/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — medication.adherence.assess → per-med medication.nudge.draft → a medication.dropoff.flag routed to the care team → an engagement.outreach.handoff span attributed to the Engagement Agent — returning assessments + nudges as an artifact with metadata.agentFabric carrying the trace ids and nextAgent) and a /.well-known/agent.json card whose policies derive from the registry round it out. As a proactive agent it isn't threaded into route-to-care-router; a seeded assess→nudge→dropoff→engagement-handoff trace, the console subtitle, and the investor brief (now 'eighteen agents across three planes', with a Medication Adherence card and the new policy in the enforcement paragraph) all reflect it. Frontend tests green (+ medication-adherence determinism/status-computation/refill-due/nudge-shape/drop-off, the route's envelope/governance-block/happy-path + engagement-handoff, and the registry drift guards raised to eighteen agents); the medications + refill intervals are clearly-labeled illustrative synthetics, NOT a certified pharmacy / e-prescribing system. Lint + build clean.
Demo: front doors for the Scheduling, Care Gap, and Care Plan agents on the intake demo
ShippedThe three newest agents (Appointment Scheduling, Care Gap Closure, Care Plan) shipped as runnable A2A endpoints but had no UI; this adds their front doors on /demo/intake, mounted after the Benefits panel as exact siblings of the Assessment and Benefits panels (five panels now read as one coherent set). All presentational + client-fetch only — no changes to any agent, domain logic, governance, or API route. components/scheduling-panel.tsx: book / reschedule presets plus BOTH governance blocks — policy.scheduling.no-double-book and policy.scheduling.honor-provider-availability (taken/open slots are derived from getProviderAvailability so the block presets are honest, not hard-coded) — rendering the confirmed slot, the synthetic ServiceAppointment provenance, and the engagement-reminder handoff (nextAgent = engagement-agent, drafted / quiet-hours-aware / human-approval-gated / never auto-sent). components/care-gap-panel.tsx: gap-detection presets (postmenopausal-on-HRT; perimenopausal with partial history, where an up-to-date mammogram is skipped while an overdue lipid panel surfaces) plus consent-required and off-catalog-gap (policy.caregap.clinical-measure-sourced) blocks, rendering per-gap cards (measure, status + priority, rationale, measure id) with their consent-/quiet-hours-aware, human-approval-gated outreach drafts, the grounding/integrity note, and the engagement handoff. components/care-plan-panel.tsx: template-selection presets (vasomotor / on-HRT / behavioral-mood) plus the policy.careplan.template-sourced block, rendering the instantiated plan (goals, interventions, follow-up cadence) and the summary with a green 'live Claude' vs amber 'scripted fallback' badge and, on fallback, the fallbackReason — both branches unit-tested (the sandbox with no ANTHROPIC_API_KEY renders the scripted-fallback branch; a keyed environment renders the claude-api branch). Every panel carries a deep link to the multi-agent trace and honest 'synthetic / illustrative / not a certified engine' framing. 1007 frontend tests green (+35: 11 scheduling, 11 care-gap, 13 care-plan), mirroring the repo's node-env panel-test style; lint + build clean.
Agent Fabric: added the Care Plan agent — template-instantiated plan + live-Claude progress summary (second Claude agent)
ShippedAdded the seventeenth agent on the fabric — care-plan-agent, the Salesforce 'Agentforce for Health' / Health Cloud CarePlan + care-plan-summarization analog — as a first-class clinical-plane sibling of the Care Router that REUSES the existing clinical-decision governance tier. Post-visit, it does two things in a new lib/care-plan.ts. First, instantiateCarePlan() DETERMINISTICALLY instantiates a menopause care plan from a defined template catalog — HRT-management, vasomotor/lifestyle, bone-health, and mood/behavioral, each with structured goals, interventions, and a follow-up cadence — selected from the Care Router's pathway/severity + intake with an explicit precedence order and a severity-adjusted cadence (no randomness, no clock), so the same context always yields the same plan and every plan references a defined template id. Second, summarizeCarePlan() is the SECOND live-Claude agent after the Care Router: it mirrors lib/care-router.ts EXACTLY — a dynamic @anthropic-ai/sdk import gated by ANTHROPIC_API_KEY, the same model + PAUSE_CARE_PLAN_MODEL override, a via: 'claude-api' | 'scripted-fallback' discriminator, and a non-clinical fallbackReason stamped on every fallback branch (missing key + any SDK error) — producing a concise, NON-PRESCRIPTIVE patient/clinician progress summary that falls back to a deterministic scripted summary. The honest core is governance: a NEW enforced-block policy, policy.careplan.template-sourced, with its matching boolean signal (planTracesToTemplate) wired into the shared governance-signals metadata so evaluateGovernance() genuinely blocks a caller-asserted off-template (fabricated) plan, PLUS the Care Router's model allow-list, no-prescribing, rationale-required, consent-before-grounding, and HIPAA-audit policies reused by extending appliesTo. A runnable A2A endpoint (POST /api/agents/care-plan/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate INCLUDING the model allow-list, real parented trace spans — careplan.instantiate (deterministic) → careplan.summarize (records via + a conditional fallbackReason attribute exactly like the Care Router route) — returning the plan + summary as an artifact with metadata.agentFabric) and a /.well-known/agent.json card whose policies derive from the registry round it out. It also threads into the spine the light way: POST /api/intake/route-to-care-router accepts an optional carePlan request and, after the Care Router hop, instantiates a plan and attaches a summary to the trace + response meta — additive, so absent = today's behavior unchanged. A seeded router→instantiate→summarize trace shows a deterministic scripted-fallback summary (so it never implies a live call happened at seed time), and the console subtitle + investor brief (now 'seventeen agents across three planes', with a Care Plan card noting it's the second live-Claude agent and the new policy in the enforcement paragraph) reflect it. Tests mirror care-router.test.ts (vi.mock('@anthropic-ai/sdk'): a mocked success yields via: claude-api; a mocked SDK error and the missing-key path both yield via: scripted-fallback WITH a fallbackReason), plus deterministic instantiation + template-integrity, the route's envelope/governance/block/model-allow-list/happy paths, and the registry drift guards raised to seventeen agents — none require a real ANTHROPIC_API_KEY. Lint + build clean.
Agent Fabric: added the Care Gap Closure agent — proactive, Data-360-grounded, clinical-measure-sourced
ShippedAdded the sixteenth agent on the fabric — care-gap-closure-agent, the Salesforce 'Agentforce for Health' / Health Cloud care-gap-closure analog — as a first-class, PROACTIVE patient-care agent on the patient/clinical plane (its own NEW care-gap governance tier). Unlike the reactive intake→router spine, it grounds on the patient's Data 360 context + age/cycle/symptom signals and DETERMINISTICALLY detects menopause-relevant preventive-care gaps in a new pure lib/care-gaps.ts: a small catalog of illustrative clinical measures (bone-density/DEXA for osteoporosis risk, lipid panel, screening mammogram, HRT follow-up visit — each with an id, label, guideline/rationale, and recommended interval), the CareGap type (referencing a clinical-measure catalog id, open/overdue status, dueSince/lastDone, priority), and detectCareGaps(context) that derives gaps against an EXPLICIT as-of date (no randomness, no clock) so the same context always yields the same gaps. The load-bearing property is integrity, not clinical authority: every detected gap references a defined clinical-measure catalog id — never a fabricated one — and the clinical measures + intervals are clearly-labeled illustrative synthetics, NOT a certified guideline engine. It also drafts consent- and quiet-hours-aware outreach per gap (draftGapOutreach), always human-approval-gated and never auto-sent, for handoff to the Engagement Agent. The honest core is governance: a NEW enforced-block policy, policy.caregap.clinical-measure-sourced, with its matching boolean signal (gapsTraceToClinicalMeasure) wired into the shared governance-signals metadata so evaluateGovernance() genuinely blocks a caller-asserted off-catalog gap (the drift guards would have failed otherwise), plus the reused engagement/outreach guards extended onto the agent — contact-consent-required, human-approval-before-send, quiet-hours + channel preference, consent-before-grounding, and the HIPAA audit. A runnable A2A endpoint (POST /api/agents/care-gap-closure/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans — data360.grounding → caregap.detect → per-gap caregap.outreach.draft → an engagement.outreach.handoff span attributed to the Engagement Agent — returning detected gaps + drafts as an artifact with metadata.agentFabric carrying the trace ids and nextAgent) and a /.well-known/agent.json card whose policies derive from the registry round it out. As a proactive agent it isn't threaded into route-to-care-router; a seeded grounding→detect→draft→engagement-handoff trace, the console subtitle, and the investor brief (now 'sixteen agents across three planes', with a Care Gap Closure card and the new policy in the enforcement paragraph) all reflect it. Frontend tests green (+ care-gaps determinism/detection/catalog-integrity/outreach-consent/off-catalog-rejection, the route's envelope/governance/happy-path + engagement-handoff, and the registry drift guards raised to sixteen agents); lint + build clean.
Demo: gave the Benefits & Coverage Verification (EBV) agent a front door on the intake demo
ShippedThe EBV agent shipped as a runnable A2A endpoint but had no UI; this adds its front door on /demo/intake, mounted directly under the Assessment panel and mirroring its look and honest framing. A new client component (components/benefits-panel.tsx) leads with one-click presets that each POST a coverage query to /api/agents/benefits-verification/tasks: an in-network plan with the deductible met (Aetna Choice PPO, $1,500 met, 20% coinsurance on a $420 visit → ~$84 patient responsibility); a high-deductible plan not yet met (UnitedHealthcare Saver HDHP, $0 of $6,000 met → the full $260 visit lands on the patient); self-pay / no active coverage (inactive, but still a sourced no-active-coverage EBV response); and a caller-asserted coverage object with no source that trips policy.benefits.eligibility-source-integrity so the governance block renders in the UI (blocking policy + reason + policies evaluated). A tidy 'build your own query' affordance (payer / member id / ZIP / service type) rounds it out. Results render the plan name + eligibility/network status pills, deductible met/total/remaining, cost share (copay or coinsurance %), estimated visit cost and estimated patient responsibility, and a labeled SYNTHETIC payer/clearinghouse provenance block (payer, clearinghouse, transaction type/id, response code, honesty note) so the mock nature of the EBV round-trip is explicit. A deep link (Open the multi-agent trace →) jumps to /demo/agent-fabric?taskId=<id>, and an optional 'Carry this coverage into the Care Router →' follow-on POSTs the query to /api/intake/route-to-care-router and shows the returned pathway + acuity, noting the routing was preceded by a verified coverage check. Presentational + client-fetch only — no changes to the agent, domain logic, governance, or API routes. 911 frontend tests green (+14, mirroring the repo's node-env panel-test style); lint + build clean.
Agent Fabric: added the Appointment Scheduling agent — closes the intake→routing→booking loop
ShippedAdded the fifteenth agent on the fabric — appointment-scheduling-agent, the Salesforce 'Agentforce for Health — Book/Reschedule/Update Appointment' analog — as a first-class care-coordination agent on the patient/clinical plane (its own NEW care-coordination governance tier). It books (and can reschedule) the MSCP menopause-specialist visit the Care Router recommends, honoring the requested modality (telehealth / in-person) against a deterministic synthetic provider availability calendar, and returns a structured AppointmentBooking in a new pure lib/scheduling.ts: a synthetic Salesforce ServiceAppointment id, the confirmed slot start/end, modality, provider, status (booked / rescheduled), and a source provenance block marked synthetic:true. It is DETERMINISTIC on its inputs — getProviderAvailability() hashes providerId + date + slot index into a stable set of 30-minute business-hours slots (09:00–16:30, weekdays only), ~a third pre-'booked', each offered in telehealth and/or in-person, with no randomness and no clock — so the same provider + date always produces the same calendar, and it is clearly NOT a real Salesforce Scheduler / ServiceAppointment write. The honest core is governance: TWO NEW enforced-block policies with matching boolean signals wired into the shared governance-signals metadata so evaluateGovernance() genuinely blocks — policy.scheduling.no-double-book (signal requestedSlotIsFree; the scheduler refuses an already-taken slot) and policy.scheduling.honor-provider-availability (signal slotWithinProviderAvailability; the scheduler refuses a time outside the provider's published availability for the modality) — set honestly by the route from the domain layer's checks, with bookAppointment() also throwing on either violation as defense in depth; plus the reused HIPAA-audit policy extended onto the agent. A runnable A2A endpoint (POST /api/agents/appointment-scheduling/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans, and a handoff span to the Engagement Agent for reminders) and a /.well-known/agent.json card whose policies derive from the registry round it out. It wires into the existing spine the light way: POST /api/intake/route-to-care-router now accepts an optional scheduling request and, when the routing decision recommends MSCP provider(s), books the top recommendation (modality defaulted from the pathway) and attaches the booking summary to the trace + response meta after the Care Router hop — additive, so absent = today's behavior unchanged. A seeded care-router→booking→engagement trace, the console subtitle, and the investor brief (now 'fifteen agents across three planes', with an Appointment Scheduling card and the two new policies in the enforcement paragraph) all reflect the closed loop: acquisition → intake → routing → booking → engagement. Frontend tests green (+ scheduling determinism/availability/no-double-book/honor-availability/reschedule/source-provenance, the route's envelope/governance/happy-path + engagement-handoff, and the registry drift guards raised to fifteen agents); lint + build clean.
Agent Fabric: added the Benefits & Coverage Verification (EBV) agent
ShippedAdded the fourteenth agent on the fabric — benefits-verification-agent, the Salesforce 'Agentforce for Health — Eligibility & Benefit Verification' analog — as a first-class patient-access agent on the patient/clinical plane (its own new benefits-verification governance tier). It verifies a patient's insurance coverage for a menopause specialist (MSCP) visit and returns a structured, DEMO-HONEST synthetic eligibility result in a new pure lib/benefits.ts: plan status (active/inactive), in/out-of-network, deductible + amount met + remaining, coinsurance/copay, and an estimated visit cost + patient out-of-pocket, plus a source provenance block naming a MOCK payer/clearinghouse and a synthetic EBV transaction id. It is DETERMINISTIC on its inputs — the member/plan string is hashed to pick a plausible-but-fake plan profile (deductible $1,500–$6,000, coinsurance 10–30%, visit $180–$420, $500-increment amount-met), with no randomness and no clock — and it is clearly NOT a real 270/271 EDI transaction or FHIR CoverageEligibilityResponse; a known-payer allow-list (Aetna, BCBS, Cigna, UnitedHealthcare, Kaiser in-network; Humana/Medicare and unrecognized payers out-of-network; self-pay → inactive) drives the network logic. The honest core is governance: a NEW enforced-block policy, policy.benefits.eligibility-source-integrity, with its matching boolean signal (eligibilityTracesToSource) wired into the shared governance-signals metadata so evaluateGovernance() genuinely blocks a returned coverage result that doesn't trace to a payer/clearinghouse EBV response — the agent may not fabricate coverage without a source — plus the reused consent-before-grounding and HIPAA-audit policies extended onto the agent. A runnable A2A endpoint (POST /api/agents/benefits-verification/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans) and a /.well-known/agent.json card whose policies derive from the registry round it out. It wires into the existing spine the light way: POST /api/intake/route-to-care-router now runs a coverage check when the intake carries patientInsurance (or an explicit coverageQuery) and attaches the eligibility summary to the trace + response meta before the Care Router hop — additive, so absent = today's behavior unchanged. A seeded coverage→intake→routing trace, the console subtitle, and the investor brief (now 'fourteen agents across three planes', with a Benefits & Coverage Verification card and the new policy in the enforcement paragraph) all reflect it. Frontend tests green (+ benefits scoring/range/network/source-provenance/allow-list determinism, the route's envelope/governance/happy paths, and the registry drift guards raised to fourteen agents); lint + build clean.
Demo: gave the Assessment Agent a front door on the intake demo
ShippedThe Assessment Agent shipped as a runnable A2A endpoint but had no UI; this adds its front door on /demo/intake, mirroring the acquisition-funnel panel's look and honest framing. A new client component (components/assessment-panel.tsx) leads with one-click presets that each POST a valid response vector to /api/agents/assessment/tasks: a moderate PHQ-9; a PHQ-9 whose item-9 (self-harm) red flag escalates intake severity to severe even though the total band stays moderate — the escalation gap made visible; a severe multi-domain MRS with per-domain subscore bands; and an off-allow-list GAD-7 that trips policy.assessment.validated-instrument-only so the governance block renders in the UI (blocking policy + reason + policies evaluated). A 'build your own responses' toggle reveals the four-instrument picker and compact per-item segmented 0..max controls (Greene's 21 items gated behind the toggle so the default view stays tidy). Results render the instrument name, total/maxTotal · band, normalized + intake-severity pills, subscore bands, and a calm role=note 'safety escalation' callout for red flags, plus a deep link (Open the multi-agent trace →) to /demo/agent-fabric?taskId=<id>. An optional 'Carry this score into the Care Router →' follow-on POSTs the assessment to /api/intake/route-to-care-router and shows the returned pathway + acuity, noting when severity was assessment-driven. Presentational + client-fetch only — no changes to the agent, domain logic, governance, or API routes. 836 frontend tests green (+11, mirroring the repo's node-env panel-test style); lint + build clean.
UI: layered surface tokens + a restrained sans-serif polish pass (no display serif)
ShippedA cohesive, presentational-only polish of the shared design language — done entirely in globals.css, with all text staying on Inter (an earlier pass that introduced a Fraunces display serif was rejected, so this one adds no serif/display typeface at all). The load-bearing part is a real bug fix: --surface-2 and --surface-3 were referenced by page.tsx, the roadmap, and the changelog itself but were never defined, so those raised panels and borders silently resolved to nothing. This defines a proper layered surface scale (bg → surface → surface-2 → surface-3) plus --line-strong / --brand-soft and a radius scale, so those planes finally read as distinct depths. On top of that: tighter heading letter-spacing with balanced heading wrap and pretty paragraph wrap, tabular + lining figures on stat/metric values so number columns stop jittering, a comfortable hero measure and 1.6 body line-height (elegance through weight/size/spacing, not a new face); softer layered card shadows where only interactive a.card/button.card earn a 2px lift + brand-tinted border on hover; refined button hover/active/:focus-visible states; and — the one deliberate accessibility call — primary button text moved to dark plum on the pink brand, lifting contrast from ~2.8:1 (failing) to ~6:1 (WCAG AA). Rounded out with a crisper sticky nav (blur+saturate + hairline highlight), a softened hero glow, and a site-wide prefers-reduced-motion safeguard. No content, routes, component APIs, or logic changed; 825 tests still green, lint + build clean.
Agent Fabric: added the Assessment Agent — validated-instrument scoring feeds intake severity
ShippedAdded the thirteenth agent on the fabric — assessment-agent, the Salesforce 'Agentforce for Health — Assessments' analog — as a first-class patient-facing agent on the patient/clinical plane. It administers and DETERMINISTICALLY scores an allow-listed set of validated instruments (Menopause Rating Scale, Greene Climacteric Scale, PHQ-9, Insomnia Severity Index) in a new pure lib/assessments.ts: real cutoff-based math, no LLM, producing per-instrument subscores, a total, and a severity band normalized onto intake's mild/moderate/severe vocabulary. Cutoffs are faithful to each instrument's published scoring (PHQ-9 0-4/5-9/10-14/15-19/20-27; ISI 0-7/8-14/15-21/22-28; MRS 0-4/5-8/9-16/17+ plus the published subscale cutoffs); the Greene scale has no agreed total-score band, so its three total cutoffs are marked // inferred. Red-flag items are handled explicitly — PHQ-9 item 9 (self-harm ideation) on any non-zero response escalates as its own trace span and forces the intake severity to severe regardless of band. The honest core of the change is governance: a NEW enforced-block policy, policy.assessment.validated-instrument-only, with its matching boolean signal wired into the shared governance-signals metadata so evaluateGovernance() genuinely blocks any instrument off the allow-list (the drift guards would have failed otherwise), plus the reused no-free-text-PII, red-flag-mandatory, and HIPAA-audit policies extended onto the agent. A runnable A2A endpoint (POST /api/agents/assessment/tasks, JSON-RPC tasks/send validated with parseTasksSendEnvelope, a pre-flight governance gate, real parented trace spans) and a /.well-known/agent.json card whose policies derive from the registry round it out. The result wires into the existing spine the light way: POST /api/intake/route-to-care-router now accepts an optional assessment, and when present the scored severity drives IntakeRecord.severity (and the red-flag screen) before the Care Router hop — a real instrument score behind the routing decision instead of a self-report — additive, so absent = today's behavior unchanged. A seeded assessment→intake→routing trace, the console subtitle, and the investor brief (now 'thirteen agents across three planes', with an Assessment Agent card and the new policy in the enforcement paragraph) all reflect it. 825 frontend tests green (+32: instrument scoring correctness, band cutoffs, red-flag handling, allow-list rejection, the route's envelope/governance/happy paths, and the registry drift guards); lint + build clean.
Home: promoted the Care Router card to a “live” status pill
ShippedWith the Care Router's live Claude Sonnet 4.5 path confirmed working in production (provider: anthropic / via: claude-api), the homepage's 'Anthropic-backed Care Router agent' card graduated from 'partial' to a new, distinct 'live' status. Added a `live` variant to StatusPillStatus (label 'Today · live', rendered TODAY · LIVE) backed by a saturated emerald --live tone in globals.css — visually distinct from the mint tone that prototype/partial share, so 'genuinely live in production' reads at a glance while the graceful scripted fallback still exists. Purely additive: audited every StatusPill consumer (homepage, changelog, ~25 proposal/marketing pages) and none needed changes. 793 frontend tests green; lint + build clean.
Intake: routed a completed Agentforce chat intake to the Care Router
ShippedThe live Agentforce Embedded Messaging chat on /demo/intake never handed off to the Pause Care Router. Because the V2 SDK exposes no dependable end-of-conversation event on this deployment (only onEmbeddedMessagingReady / onEmbeddedMessagingInitError are confirmed to fire — trusting an unverified 'closed' event would repeat the prechatAPI no-op-Proxy mistake), a new <ChatToCareRouterHandoff/> renders an explicit 'Complete intake → route to Care Router' affordance beneath the chat. It POSTs the selected persona's deterministic intake to the existing /api/intake/route-to-care-router handoff and renders the live decision inline (pathway, acuity, provider/model/via, and any fallbackReason) with a deep link to the multi-agent trace. An optional origin — sanitized to a strict ^[a-z0-9-]{1,40}$ slug so no free text or PHI leaks — is threaded through the handoff and stamped on every span in the parented tree (intake → Data 360 identity/grounding → care-router → mcp-bridge), so the chat-originated route reads origin=agentforce-chat and stays one continuous task in the viewer, distinct from the /demo/routing button. 793 frontend tests green (+7); lint + build clean.
Care Router: hardened the Claude response parsing and surfaced the fallback reason
ShippedOnce the production key was live, the Care Router's Claude call was firing (a ~6s span, vs ~250ms when the key was absent) but still landing on the deterministic fallback: the model wraps its JSON in markdown fences or a lead-in sentence, so a bare JSON.parse threw and the catch swallowed it — and the 800-token cap risked truncating the JSON outright. Added extractJsonObject() to strip code fences and pull the first balanced {…} object, normalized the returned pathway, and raised max_tokens to 1500. Crucially, the scripted-fallback path now records a non-clinical fallbackReason attribute on the care-router trace span (the leading 'Claude API call failed (…)' / 'ANTHROPIC_API_KEY not set…' sentence only — no patient text), present only on fallback and absent on a live claude-api success, so a fallback's cause is visible in the Agent Fabric trace viewer instead of invisible. Verified live on production: the care-router span now reads provider=anthropic / via=claude-api with no fallbackReason. 786 frontend tests green; lint + build clean.