Skip to main content

API and SDK Client Parity Audit

Audit date: 2026-09-11. This is a static, capability-level comparison. It evaluates whether an n3 plugin author can accomplish the same task as in comparison clients, rather than verifying identical class names or synchronous blocking semantics. Current n3 standing reflects RuneLite 1.12.38, game revision 240, suite version 5.5, and Java 11.

Executive result

n3 covers the automation core shared across historical and modern clients: entity and widget queries, inventory/equipment/bank/deposit-box/GE/shop/trade operations, dialogue, combat/prayer/magic, local and global walking, transports and teleports, action dispatch, input, and plugin execution primitives. Its typed InteractionResult, central pacing, workflow supervision, deterministic event fixtures, revision health checks, and Agent Server provide capabilities that older APIs do not expose as one coherent contract.

Recent implementations closed several significant functional gaps:

  1. Account, login, and session automation (P0-2): Delivered in com.n3plugins.n3Profiles. ProfileLoginService manages legacy auto-login via Enter key simulation, Jagex account session application via ReflectionJagexLoginAdapter, reset to legacy mode, profile directory isolation, and SOCKS5 proxy routing per profile. ProfileStore secures credentials with PBKDF2/AES-GCM encryption and provides bulk import.
  2. Consumer-facing geometry and spatial areas (P0-4): Delivered in com.n3plugins.sdk.area. Area, RectangleArea, PolygonArea, SceneArea, and RegionArea provide plane-aware point containment, immutable tile enumeration, coordinate conversion, and spatial-query integration via SpatialQuerySupport.
  3. Script ergonomics and quest automation: Delivered in com.n3plugins.questscript. The framework provides QuestScript, QuestScriptStep (DialogueStep, InteractObjectStep, TalkToNpcStep, UseItemStep, WaitStep, WalkStep), QuestScriptPlayer, and QuestScriptRecorder, complementing AutomationLoop and TaskPipeline.
  4. Input and trajectory modeling: Delivered in com.n3plugins.sdk.input.mouse. MouseTrajectoryRepository, MouseTrajectoryPlanner, MousePathPlanner, MouseRecorder, and MouseLandingSelector provide recorded trajectory analysis and synthetic execution alongside humanizer profiles.
  5. Session statistics and telemetry: Delivered in com.n3plugins.telemetry and CompanionUplinkPlugin. Telemetry collectors stream live session metrics, XP, health, prayer, inventory, and tasks over WebSockets, while AioSessionSnapshot tracks task and session rates.
  6. Specialist production and activities: ProductionActions supports both Make-X and legacy Smithing interfaces; AioSmithingWorkflow automates smelting and anvil smithing; JewelleryEnchanterPlugin and EnchantingWorkflowBuilder manage jewellery enchanting; UpkeepPlugin manages supply resolution; BlockingEventActions provides welcome screen and death dialogue handling.

The remaining functional gaps are concentrated:

  1. Player-owned-house automation (P0-1): Walker pathfinding routes through POH portal nexus and jewellery box tiers via PathfinderConfig, but n3 does not yet expose a public House query or house-options UI interaction facade.
  2. Sailing depth (P0-3): SailingActions defines direction, speed, and sail operations, but operations return unsupported results pending live sailing release and navigation graph modeling.
  3. Specialized activity facades: TanningActions, CannonActions, SlayerRewardsActions, and the shared EssencePouchWorkflowBuilder/EssencePouchPlan deliver the tanning, cannon, Slayer rewards, and essence-pouch facades; friend list mutation convenience remains open under query breadth.
  4. Query breadth: Fluent ProjectileQuery/GraphicsObjectQuery and the container-agnostic ItemContainers/ItemContainerQuery are delivered; friend list mutation conveniences remain open.
  5. Transport network breadth: Quetzal and Quetzal Whistle transports are consolidated with cost thresholds, and vessel gangplank/disembarkation is repaired; canoes and Dwarven carts still lack first-class models.

The target remains functional completion, not source compatibility. Copying boolean-returning, blocking, or public raw packet APIs would weaken n3's result, pacing, revision, and client-thread contracts.

Comparison set and provenance

The audit pinned each reference tree before inspection, cross-checked against the local research trees in C:\Users\n3\Desktop\Research.

ReferencePinned snapshotRole in this auditImportant limitation
OpenOSRS RuneLite915fb55c0a2a1c000dc04a431e68f3bbb29a40cf (2022-06-28)Historical client/API baseline from which later clients diverged.Primarily extends RuneLite's client API; not a high-level automation SDK.
Unethicalite16c90eeeb4c37f21616f2bce6fa647a78c7ff51a (2022-08-22)Original high-level net.unethicalite.api automation surface. Verified in Research/clients/unethicalite.Archived historical surface; packet and revision details are obsolete.
Devious Client / devlite895727a26d5e0dd61475bac0c1b74299aa650710 (2023-11-08) / 63187b0d77dd2e9e0dacd57de0bb0c5397e23e9bLater Unethicalite-derived surface and incremental additions. Verified in Research/clients/devlite.Historical tree; revision and packet details differ from modern upstream.
VitaLitebdad782b73335516974e092ff41d04cd70340556 (2026-03-11, 1.12.20_0) / 59a518b723438046fd896d707f64cf2d1afece65Independent current API with handlers, loadouts, pathfinders, specialist widgets, and sailing support. Verified in Research/clients/VitaLite.API shape differs substantially; matching class-for-class would be misleading.
MicrobotLocal reference tree (Research/microbot)Ecosystem benchmark for high-level automated plugins, task loops, and activity coverage (160+ plugins).Modular plugin suite rather than an injected client fork; serves as migration source for n3 modules (VarrockCleaner, CrabKiller).

Devious and Unethicalite share one lineage in the tables, with Devious-only additions noted where relevant (such as ItemContainerSnapshot, charter ships, gnome gliders, ignored doors, world requirements, and bank-tutorial blocking events).

Method

Included

  • Public or plugin-consumable automation APIs, queries, models, handlers, pathing, input, script lifecycle, and state helpers.
  • n3 live source under Api and sdk, plus the shared runtime that makes those APIs usable.
  • Capability equivalence even when n3 deliberately uses another abstraction.

Excluded

  • Ordinary RuneLite API types already available to every external RuneLite plugin.
  • Bundled plugins, UI cosmetics, deobfuscator/build infrastructure, generated constants, and raw gamepack interfaces.
  • A class-count score. One broad utility class and ten narrow types are not ten times as capable.
  • Claims of live correctness. No comparison client or RuneLite game session was executed.

Ratings

RatingMeaning
Completen3 provides the same practical operation/read surface, sometimes with stronger semantics.
PartialThe common path exists, but meaningful reference-client operations or models are missing.
MissingNo supported, reusable n3 surface was found for the capability.
Beyondn3 materially exceeds the comparison set in this domain.
N/AThe reference exposes no additional high-level capability beyond the shared RuneLite baseline.

Capability matrix

Entities, scene, queries, and game state

CapabilityOpenOSRSUnethicalite / DeviousVitaLiten3 assessment and evidenceRating
NPC and player queryRuneLite queriesNPCs, Players, actor queriesNpcAPI, PlayerAPI, builders and queriesNPCs, Players, NPCQuery, and PlayerQuery cover named/id/action/distance selection.Complete
Tile objects and ground itemsRuneLite scene/query typesTileObjects, TileItems, scene queriesAPIs, builders, wrappers, and queriesTileObjects, TileItems, spatial query support, and dedicated action APIs cover lookup and action.Complete
Projectile and graphics lookupRaw client collections/eventsProjectiles; no equal graphics facadeMostly raw RuneLiten3 has ProjectileActions and GraphicsObjectActions predicate reads plus fluent ProjectileQuery/GraphicsObjectQuery facades with Projectiles/GraphicsObjects entry points in sdk.query.Complete
Inventory, bank, equipment item queriesRuneLite item/widget queriesShared Items plus per-container APIsInventory/shop queries and wrappersn3 provides ItemQuery, EquipmentItemQuery, Inventory, Bank, ShopInventory, and the container-agnostic ItemContainers/ItemContainerQuery over immutable snapshots.Complete
WidgetsWidget API/queryWidgets, WidgetQueryWidgetAPI, query, extended catalogWidgets, WidgetQuery, Widgets, WidgetCatalog, addresses, mappings, explorer, and interaction resolver provide equivalent or greater depth.Beyond
Coordinates and areasRuneLite WorldArea, coordinatesrectangle, polygon, scene and region areaslocation query, distance and world-point helperscom.n3plugins.sdk.area provides immutable, plane-aware RectangleArea, PolygonArea, SceneArea, and RegionArea with containment, stable tile enumeration, coordinate conversion, and spatial-query integration via SpatialQuerySupport.Complete
Scene, tiles, collision, reachabilityRaw scene/collision mapsTiles, Reachable, local/global mapsSceneAPI, collision maps and flagsn3 exposes reachability and line of sight, and its walker owns collision, but low-level scene/tile diagnostics are not a standalone public facade.Partial
Camera and map stateRaw clientMostly raw clientCamera, minimap and world-map APIsn3 has camera snapshots/actions, screenshots, WorldMapApi, and minimap run/special-attack orb actions in UtilityEventActions/CombatActions.Complete
Vars, skills, quests and worldsRuneLite APIsconvenience facadesdedicated APIsGameVarsRegistry, SkillsActions, QuestActions, progress APIs, and world snapshots cover core usage.Complete
Prices and item informationHTTP/client managersPriceslimitedItemInfoApi and PricesApi provide typed item and price reads; market buy-limit tracking adds depth.Complete
Friends/socialRuneLite friend APIsFriends widget helperno broad equivalentcom.n3plugins.sdk.social provides FriendsApi, ClanApi, ChatApi, and snapshot listeners; friend list mutation conveniences remain unmodeled.Partial

Interaction, widgets, and production

CapabilityOpenOSRSUnethicalite / DeviousVitaLiten3 assessmentRating
NPC/player/object/item interactionMenu invocation primitivesentity methods and packet helperswrapper interaction and buildersDedicated action APIs plus ActionResolver, reachability, pacing, and typed InteractionResult cover the domain without exposing raw packets.Beyond
Inventory and equipmentRuneLite menu/widget baselineinventory/equipment APIs and packetsAPIs/builders/loadoutsRead, use, drop patterns, equipment, use-item combinations, loadouts, and depletion listeners are present.Complete
Bank and deposit boxWidget baselinebank/deposit APIsbank/deposit APIs, cache, buildern3 covers bank inventory/equipment modes, placeholders, quantities, deposit box, access selection, restock plans, and BankWorkflowBuilder.BankCycle.Beyond
Grand ExchangeRuneLite GE typeshigh-level GEAPI, handler, threaded helpern3 covers view/state, slots, buy/sell/collect/abort, market planning, GeBuyerPlugin, and FlipperPlugin.Complete
Shop and tradeWidget baselineboth high-levelboth high-level/buildersQuery, inventory, and action surfaces exist for both.Complete
DialogueWidget baselinedialog helper/packetsAPI, builder, threaded dialoguesDialogActions handles continue/options/input; QuestHelperDialogOptionResolver resolves quest options; DialogueStep in questscript provides declarative step execution.Complete
Tabs and standard widgetsWidget baselinetabs, prayers, production, minigamestabs, prayer, magic, Make-X, emotes and specialist widgetsTabActions covers all tabs including Tab.EMOTES. Make-X and legacy Smithing interfaces are handled by ProductionActions. Jewellery enchanting is handled by EnchantingWorkflowBuilder.Complete
Magic and rune pouchRuneLite widget baselinespell/rune/pouch modelsextensive spellbooks/runes/staves/tomesn3 covers spellbooks, spells, runes, RunePouch, PouchWorkflowBuilder, teleport spells/items/scrolls, and spellbook workflows.Complete
CombatRaw actor and combat widgetsCombatCombatAPI, attack styles, cannonn3 provides combat plans/workflows, styles, prayers, special-attack orbs, target actions, and the CannonActions lifecycle (place/load/pick-up/repair plus placed, broken, and partial build-state reads; ammo state is unmodeled because rev240 evidence exposes no ammo varbit).Complete
Production/activity helpersRaw widgetsgeneric productionMake-X plus smithing/tanning/Slayer rewards/runecrafting pouch typesProductionActions covers Make-X and Smithing; EnchantingWorkflowBuilder covers jewellery enchanting; TanningActions covers the tanner interface; SlayerRewardsActions covers the Slayer Rewards window; EssencePouchWorkflowBuilder shares runecrafting pouch capacity/fill/empty planning; UpkeepPlugin manages supply resolution.Complete
Blocking eventsEvents onlydeath/login/resizable/welcome and, in Devious, bank tutorialno matching managerBlockingEventActions handles welcome screens, death dialogue, and viewport mode detection/setting; TaskPipeline yields on events without blocking thread sleeps.Complete
CapabilityOpenOSRSUnethicalite / DeviousVitaLiten3 assessmentRating
Local pathingCollision primitiveslocal pathfinder/reachabilitymultiple algorithms and local collisionn3 provides reachability, local collision/path calculation through its walker, and action integration.Complete
Global walkingNo high-level walkerglobal map, teleports, transportsstrategic/global walkern3 has managed walking, shortest-path data, transport requirements, route state, and bank routing.Complete
Transport requirementsN/Aitem/quest/skill/var; Devious world requirementsitem/quest/skill/var/world/othern3 transport parsing covers items, quests, skills, vars, and consolidated Quetzal thresholds. Public world/other requirement models are narrower.Partial
Standard transport networksN/Afairy rings; Devious charter/glider modelsfairy rings, gliders, charters, canoes, minecarts, carts, spirit trees, long transportsn3 provides fairy ring, gnome glider, charter, minecart, spirit tree, magic carpet, bird flight, quetzal (QUETZAL), minigame, and repaired vessel transports. Canoes and Dwarven carts lack dedicated facades.Partial
POH traversalN/Aportal nexus, jewellery box, house portalshouse and house-options APIsWalker pathfinder routes through POH portal nexus and jewellery box tiers via PathfinderConfig. A public House query and house-options UI interaction facade remain absent.Partial
Sailing navigationN/A at pinned revisionN/A at pinned revisionsboat collision/pathing, graph, ports, cargo, boarding, tasks, heading, statsSailingActions provides typed direction/speed/sail methods returning unsupported stubs; full navigation graphs and boat collision remain unmodeled.Partial
Route observability and safetyN/Amostly boolean/state helpersoverlays/debug pathsn3 adds explicit route snapshots, pacing/readiness failures, revision fail-closed behavior, terminal telemetry event archiving, and walker audit tooling.Beyond

Runtime, input, scripting, and operations

CapabilityOpenOSRSUnethicalite / DeviousVitaLiten3 assessmentRating
Client-thread executionRuneLite ClientThreadGameThread helpersasync task/delaysClientThreadBridge, tick plans, automation loop, and non-blocking workflows cover safe scheduling.Beyond
Script/task lifecyclePlugin lifecyclelooped plugin, script, task pluginscript interfaces and compiled script buildercom.n3plugins.questscript provides a declarative script engine (QuestScript, QuestScriptStep, QuestScriptPlayer, QuestScriptRecorder) alongside AutomationLoop, TaskPipeline, and TypesafeCarouselStateMachine.Complete
InputAWT/client baselinekeyboard, mouse, natural mouseclick manager and mouse visualizationcom.n3plugins.sdk.input.mouse provides MouseTrajectoryRepository, MouseTrajectoryPlanner, MousePathPlanner, MouseRecorder, and MouseLandingSelector, alongside keyboard, input lock, and synthetic backends.Beyond
Action pacing/humanizationNo unified automation contractrandom/time/natural mousedelays and break handlern3 centralizes pacing, fatigue, breaks, behavior profiles, and stochastic interval/gesture planning.Beyond
Login/account/sessionRuneLite login fieldsGameAccount, local player/account helpersLoginServicecom.n3plugins.n3Profiles provides ProfileLoginService (legacy auto-login via Enter dispatch, Jagex reflection adapter, legacy reset), ProfileStore (PBKDF2/AES-GCM encryption), StoredProfile, bulk import, isolated profile directories, and proxy selection.Complete
Plugin reload/hot swapPlugin manager internalsplugin helpersplugin context/reloaderCodeConsolePlugin and JavaShellPlugin support dynamic code execution for development; runtime classloader reloading is not an SDK feature.Partial
Paint/statisticsOverlay frameworkpaint and XP/statistic helpersoverlay baselineCompanionUplinkPlugin and com.n3plugins.telemetry stream live session metrics (XP, health, prayer, inventory, tasks); AioSessionSnapshot tracks task/session rates; overlay utilities are provided.Complete
Networking/remote controlOpenOSRS HTTP modulesHTTP utilitylogin/SDN-related servicesn3 adds WebSocket primitives and authenticated REST/direct-MCP Agent Server with operation convergence and SDK discovery.Beyond
Events, replay, and deterministic validationRuneLite event busblocking event managerhandlers/listenersn3 adds typed event snapshots, timelines, replay, transactional fixtures, dispatch verification, and deterministic scenarios.Beyond
Revision/packet diagnosticsInjected client/mixinspublic packet helpersclick manager/client internalsn3 centralizes dispatch in Packet Utils, validates revision evidence, traces packets, and fails closed instead of exposing unstable public packet builders.Beyond

OpenOSRS baseline parity

OpenOSRS baseline parity

OpenOSRS should not be evaluated as if every net.runelite.api interface were a separate automation feature. n3 compiles against contemporary RuneLite and plugin code consumes that upstream API directly. The relevant OpenOSRS parity question is whether n3 loses a client primitive on which later automation APIs depended.

Static inspection confirms no broad missing category: actors, scene entities, widgets, item containers, vars, events, coordinates, collision, menu entries, client thread integration, overlays, configuration, and HTTP/item/world data remain available either from RuneLite or n3. Revision-specific additions from historical forks are not copied blindly; Packet Utils owns the supported bridge to injected-client and menu-dispatch behavior.

Gap register and delivery plan

P0: required to claim core functional parity

IDGapStatusCompletion contractValidation evidence
P0-1POH APIPartialWalker pathfinder routes through POH portal nexus and jewellery box tiers. Full parity requires a public House query facade, room/context detection, and interactive house-options widget operations returning InteractionResult.Unit tests for absent widgets and destinations; route tests; live POH acceptance pending.
P0-2Login/account APIImplementedDelivered in com.n3plugins.n3Profiles. ProfileLoginService orchestrates legacy auto-login via Enter dispatch and Jagex logins via ReflectionJagexLoginAdapter. ProfileStore provides PBKDF2/AES-GCM encryption, bulk import, profile directory isolation, and SOCKS5 proxy routing.ProfileLoginServiceTest, ProfileStoreTest, StoredProfileTest, ProfileStorageCodecTest, BulkProfileImportTest, ReflectionJagexLoginAdapterTest. Live acceptance pending.
P0-3Sailing completionPartialSailingActions exposes typed direction/speed/sail methods with explicit unsupported results. Full parity requires boat state snapshots, heading/stats, collision/path planning, and navigation graph integration.Scaffolding in tree. Deterministic graph fixtures, widget tests, and live sailing routes pending game release.
P0-4Public scene/area modelImplementedDelivered in com.n3plugins.sdk.area. Area, RectangleArea, PolygonArea, SceneArea, and RegionArea provide plane-aware point containment, immutable tile enumeration, coordinate conversion, and spatial-query integration.RectangleAreaTest, PolygonAreaTest, SceneAreaTest, RegionAreaTest, SpatialQuerySupportTest. Instanced-scene live verification pending.

P1: ecosystem breadth

IDGapStatusProposed owner / Current standingNotes
P1-1Specialist widget/activity APIsImplementedApi.actions + sdk.widgetsMake-X and legacy Smithing are implemented in ProductionActions + AioSmithingWorkflow. Jewellery enchanting is implemented in EnchantingWorkflowBuilder / JewelleryEnchanterPlugin. Emotes tab mapped in Tab.EMOTES. TanningActions covers the tanner interface (rev240 InterfaceID.Tanner evidence). CannonActions covers the Dwarf multicannon lifecycle (placed/broken/partial reads, place/load/pick-up/repair). SlayerRewardsActions covers the Slayer Rewards window (group 426 evidence). EssencePouchWorkflowBuilder + EssencePouchPlan share pouch capacity, degradation, and fill/empty planning extracted from Guardians Rift.
P1-2Query completionImplementedsdk.querycom.n3plugins.sdk.social covers chat, clan, and friends-chat snapshots (FriendsApi, ClanApi, ChatApi). Fluent ProjectileQuery/GraphicsObjectQuery with Projectiles/GraphicsObjects entry points and the container-agnostic ItemContainers/ItemContainerQuery (immutable ContainerItem snapshots) are delivered. Friend list mutation conveniences remain unmodeled (covered by the Friends/social matrix row).
P1-3Transport breadthPartialwalker + movement actionsQuetzals and Quetzal Whistles consolidated as first-class categories; vessel gangplank crossings and disembarkation repaired; POH nexus and jewellery box routed in pathfinder. Canoes and Dwarven carts remain open.
P1-4Blocking-event catalogImplementedApi.actions + workflowBlockingEventActions provides welcome screen continue, death dialogue continue, and viewport mode checking/setting. Workflows yield via non-blocking events (StepResult.waitForEvent) rather than client-thread sleep loops.
P1-5Minimap parityCompleteApi.actions + sdk.walkerMinimap run orb and special-attack orb actions are supported in UtilityEventActions and CombatActions. Coordinate conversion uses Perspective.localToMinimap. Arbitrary tile walking routes safely through Walker.

P2: developer ergonomics, not gameplay blockers

IDGapStatusRecommendation / Current standing
P2-1Script compatibility facadeImplementedDelivered in com.n3plugins.questscript. Provides declarative QuestScript, QuestScriptStep (DialogueStep, InteractObjectStep, TalkToNpcStep, UseItemStep, WaitStep, WalkStep), QuestScriptPlayer, and QuestScriptRecorder alongside AutomationLoop.
P2-2Runtime compilation/hot reloadCompleteCodeConsolePlugin and JavaShellPlugin provide in-client dynamic evaluation. Classloader hotswapping is kept development-only to avoid unstable SDK dependencies.
P2-3Paint/statistics kitImplementedDelivered in com.n3plugins.ui.overlay: N3StatTracker (session duration, per-skill XP tracking, XP/hr, TTL, action/item counters & rates, profit & GP/hr), N3StatTrackerOverlay, and N3Overlay with native progress bar rendering (Content.progress and Content.stats). Live telemetry streaming also available in telemetry and CompanionUplinkPlugin.
P2-4Actor path and drawing helpersImplementedDelivered in com.n3plugins.Api.overlay.N3RenderUtils: plane-aware world & minimap rendering for Area, connected waypoint paths on canvas & minimap, actor convex hulls and server-side true tiles (with multi-tile NPC awareness), high-contrast shadowed tile text, and 3D directional target indicator arrows. Augmented by TaskPipeline ergonomics (stepIf, onStepChange) in Api.plan and mouse trajectory models in sdk.input.mouse.
P2-5Declarative dialogue builderImplementedDialogueStep in questscript provides declarative option/continue handling with NPC and text assertions. DialogActions and QuestHelperDialogOptionResolver handle interactive dialogue resolution.

Capabilities n3 should not copy

  • Public raw packet builders. They turn revision-sensitive implementation details into an unstable SDK promise. Packet Utils owns dispatch.
  • Boolean-only interaction results. They erase distinctions between paced, unavailable, unreachable, and failed actions.
  • Blocking sleeps on the client thread. Scripts adapt to tick-yielding pipelines or state machines.
  • Multiple selectable pathfinders as a product goal. Outcome coverage, requirement correctness, and route observability matter more than exposing algorithm names.
  • Mutable entity wrappers cached across ticks. Re-query or use immutable snapshots to avoid stale state.
  • Credential-bearing account objects without an explicit security model. Login parity must not leak secrets into logs, fixtures, MCP responses, or configuration exports. ProfileStore isolates encrypted credentials with PBKDF2/AES-GCM.

Exit criteria for a future “parity complete” claim

All of the following must be true:

  1. Every P0 item is implemented with public documentation and focused tests. (P0-2 and P0-4 implemented; P0-1 and P0-3 open).
  2. Every P1 item is either implemented or explicitly rejected with a documented RuneLite-native alternative achieving the same outcome.
  3. The matrix is regenerated against newly pinned upstream commits; moving branch heads are never used as evidence.
  4. Public API Javadocs and Agent Server SDK discovery include the new surfaces.
  5. Static tests pass, and revision-sensitive/widget/pathing flows have current-client postcondition evidence.
  6. At least one representative migration is completed from each distinct style: Unethicalite/Devious looped task, VitaLite handler/loadout, POH route, and VitaLite sailing route.

Audit boundary

This report is based on source-tree and contract inspection at the pinned commits. It does not prove that legacy clients still run, that their packet mappings are valid, or that n3 interactions succeed in a current live client. The class-level inventory was used to discover capabilities, then normalized into outcome domains; it was not used as a numeric quality score.

Live client verification: pending.