{"name":"Storm Commercial Metering Platform","version":"0.4.0","description":"Commercial qualification, deterministic rating, exact currency authorization, and rated-statement infrastructure for AI engineering.","documentation_urls":{"llms_txt":"https://stormbilling.dev/llms.txt","llms_full":"https://stormbilling.dev/llms-full.txt","openapi_core":"https://stormbilling.dev/api/openapi.core.json","openapi":"https://stormbilling.dev/api/openapi.json","site":"https://stormbilling.dev/","overview":"https://stormbilling.dev/home"},"install":{"command":"pip install storm-billing","required":false,"method":"pypi","published_to_public_index":true,"python_requires":">=3.10","npm_package":null,"custom_install_hooks":false,"notes":"Optional. The integration itself requires no package: a product runtime calls four authenticated HTTPS operations from its existing HTTP client, and single-file dependency-free reference clients for TypeScript and Python are published to copy. `pip install storm-billing` adds the Python SDK and the agent-led `storm` onboarding CLI — a pure wheel with no custom install hook. Nothing is published to npm, so a TypeScript integration uses the reference client or plain fetch. The digest-pinned projector is deployed during white-glove onboarding rather than pulled by the customer."},"cli":{"entrypoint":"storm","commands":[{"name":"storm init","purpose":"Write the agent onboarding kit into the project."},{"name":"storm agent-guide","purpose":"Print the runbook + interview for the coding agent (--json for machine form)."},{"name":"storm doctor","purpose":"Read-only check of configuration and reachability."},{"name":"storm provision","purpose":"Transparent plan/apply provisioning of resources + scoped keys (--apply to create)."},{"name":"storm verify","purpose":"Authorization smoke test against the control plane."},{"name":"storm adapter inspect","purpose":"Offline: propose a source mapping from a sample of the customer’s own events and name the commercial signals the stream does not carry."},{"name":"storm cloudspend export","purpose":"Offline: normalize an AWS CUR CSV or GCP billing-export NDJSON into Storm cloud-spend lines, with scopes derived from storm_scope resource tags."}],"single_file_distributions":[{"command":"storm adapter inspect","url":"https://stormbilling.dev/tools/storm-adapter-inspect.py","sha256":"https://stormbilling.dev/tools/storm-adapter-inspect.py.sha256","notes":"Stdlib-only, offline, read-only copy of `storm adapter inspect` — check a telemetry sample before any package, index, or credential exists. Verify the download against the published SHA-256."},{"command":"storm cloudspend export","url":"https://stormbilling.dev/tools/storm-cloud-spend-export.py","sha256":"https://stormbilling.dev/tools/storm-cloud-spend-export.py.sha256","notes":"Stdlib-only, offline, read-only copy of `storm cloudspend export` — normalize a provider bill you already have into Storm cloud-spend lines and a scopes payload. Nothing is uploaded; pushing is a separate explicit command. Verify against the published SHA-256."}]},"onboarding":{"model":"agent_led","summary":"The SDK and CLI support agent-led onboarding. The first production-shaped deployment separately deploys a registered, digest-pinned projector in the customer account; provisioning remains reviewable and approval-gated.","steps":["Read /llms.txt, then /api/openapi.core.json. Do not select operations from the full OpenAPI surface — it includes compatibility and administration operations a product runtime must not call.","Locate where in the host application a customer-requested engineering operation begins. Authorization belongs at that exact point, before any work starts.","Build the canonical operation-started event. Take the type and dataschema URIs from the contract, and populate declared_complexity_inputs from real locked inputs — never invent complexity values.","Emit the v2 envelope and carry requested_stage (EXPLORE, PROVE or REALIZE) from the explicit product action where the customer chose it. Storm must never infer the stage from mesh size, fidelity, tokens, resource cost, or model output. Under a stage-aware contract a v1 envelope is refused with 422 requested_stage_required, so this is the difference between an integration that can be billed and one that cannot.","Call POST /api/v1/authorizations/operations synchronously. Treat a 402 as a denial decision and stop; do not retry it as a transport error.","Publish the four workflow observations to the customer’s existing Kafka/MSK topic. Do not POST telemetry to Storm — control-plane ingest is disabled and will return 410.","Do not implement a settle or capture call. Qualification, rating, and settlement are Storm-side, driven by the customer-hosted projector. If your plan contains a client-side settle, it is wrong.","Ask the human every question in the onboarding interview you cannot answer from the codebase — cloud, region, topic, consumer group, SCRAM principal, result types, evidence signing key, contract identity. Guessing any of these produces a plan that cannot be applied.","Present the plan for approval before changing anything."],"interview":["Do you already produce an event stream covering engineering job lifecycle (start, resource usage, completion, availability)? If yes, Storm adapts to it (Shape B) and you change no product code beyond one authorization call. If no, your application emits Storm's canonical four-event envelope (Shape A). Which is it?","Shape B only: can you provide a representative sample (JSON or NDJSON) of the events you already publish, covering every lifecycle type — including terminal failures and any cancellation or cache-hit dispositions?","Confirm the organization identity Storm provisions under: the customer external id and display name.","Confirm the commercial contract external id for this pilot.","What is the Storm control-plane URL to integrate against — an existing pilot, or should we provision a new one?","Do you have an ADMIN-scoped Storm API key available for provisioning? It is used only by `storm provision` and must be removed from the environment afterward.","Which authoritative source produces billing evidence, and where does its Ed25519 signing key live (KMS/HSM/env)? Storm needs the PUBLIC key reference only.","Which topic will the projector read, and what are its partition count and retention?","What are the TLS bootstrap broker endpoints, and is the listener TLS + SASL/SCRAM (SCRAM-SHA-512)?","Which SCRAM username will the projector use, and what is the Secrets Manager secret ARN (AmazonMSK_*, CMK-encrypted) holding its password?","Confirm the read-only ACL grant for that principal: Describe + Read on the topic, Read on the consumer group, and nothing else. No write, no cluster admin, no other topic.","Where does the projector run — ECS (VPC, subnets, security group) or Kubernetes via the Helm chart? It needs egress to the brokers and to Storm's control plane, plus a durable volume for its local state.","Which registered projector image digest and source-adapter mapper name will this deployment run? Storm supplies both; the digest must be an ACTIVE registered release.","Confirm the Storm organization id and the projector edge id this deployment reports as.","Which cloud and region does the projector run in, and which region should Storm's control plane serve?","Does this deployment require contractual US-only data residency? If yes, confirm the compute, database, and log surfaces are all declared US.","Which qualified result types are in scope: DESIGN_GENERATION, SIMULATION_ANALYSIS, or both?","At what explicit product action or workflow boundary does the customer choose EXPLORE, PROVE, or REALIZE for an engineering operation?","What language/runtime is the application, and where in it is an engineering operation submitted? That single call site is the only product code Storm needs to touch."]},"api_surface":{"note":"Every OpenAPI operation carries x-storm-lifecycle. Select from the core subset; treat compatibility operations as belonging to the earlier Storm-managed data plane and administration operations as commercial tooling outside the product runtime.","core_operations":["getWorkflowProfile","authorizeEngineeringOperation","getEngineeringOperationAuthorization","registerEvidenceRecord","verifyEvidenceRecord","listEvidenceSources","createEvidenceSource","listCostMetrics","createCostMetric","listCostAttributionScopes","createCostAttributionScope","ingestCloudSpend","getCostAttributionReport","getInventionVelocityReport","submitCommercialFactCandidates","reportProjectorVolume","listProjectorReleases","createProjectorRelease","getProjectorRelease","updateProjectorReleaseStatus","listQualificationDecisions","getQualificationDecision","listCommercialFacts","downloadStatementReconciliationCsv"],"product_runtime_operations":["authorizeEngineeringOperation","registerEvidenceRecord","verifyEvidenceRecord","getQualificationDecision"],"projector_operations":["submitCommercialFactCandidates","reportProjectorVolume"]},"deployment_boundary":{"authorization":"Applications call the central control plane synchronously at operation start. Storm derives the price and reserves exact currency micro-units.","customer_account":"A read-only, digest-pinned projector consumes the existing Kafka/MSK log and persists local replay state. Raw customer telemetry stays in that log.","storm_control_plane":"The projector sends accumulated workflow state plus paired event-id/payload-hash lineage. Storm re-runs qualification, rates the governed result, and settles or releases the reservation.","deferred":"Embedded local WAL ingestion is experimental/deferred and not required by the first deployment. The offline lease authorizer was removed on 2026-07-30; central synchronous authorization is the only admission path."},"capabilities":[{"feature":"Customer-Hosted Metering Projector","specification":"Read-only consumer of an existing Kafka/MSK topic; raw telemetry remains in the customer account."},{"feature":"Qualified Outcome Billing","specification":"Meter on qualified_engineering_result (DESIGN_GENERATION & SIMULATION_ANALYSIS)."},{"feature":"Deterministic Complexity Rating","specification":"Rate on domain, component count, mesh cells, DoF, fidelity, and constraints."},{"feature":"Exact Currency Authorization","specification":"Central synchronous operation authorization reserves integer currency micro-units; qualification settles or releases that exposure."},{"feature":"Replayable Audit Lineage","specification":"The customer log remains the raw replay source; Storm records verified state, event lineage, immutable contract versions, and rated statements."}],"commercial_meter":{"slug":"qualified_engineering_result","result_types":[{"type":"DESIGN_GENERATION","description":"Generative 3D CAD models, topology optimizations, generative assembly design.","complexity_factors":["domain","component_count","constraint_count","fidelity_tier"]},{"type":"SIMULATION_ANALYSIS","description":"FEA structural analysis, CFD fluid dynamics, acoustic & thermal solver runs.","complexity_factors":["domain","mesh_cell_count","degrees_of_freedom","scenario_duration_steps"]}]},"settlement_unit":"CURRENCY","pricing_model":{"invention_stages":{"EXPLORE":"Free exploration is not a free plan: it is free by the absence of a price inside the enterprise contract, while remaining metered, qualified, entitlement-gated, and visible on statements at zero amount.","PROVE":"Draws contract credits at rates denominated in the contracted currency, optionally down per-class declining-block volume curves.","REALIZE":"Draws hardest; one customer-visible production-intent package earns one agreed charge when it satisfies the locked evidence requirements. External physical testing and certification are outside Storm’s qualification boundary."},"fixed_fee_components":"MILESTONE and NRE components carry one-time fixed fees released on their scheduled date, alongside usage, under the same statement lineage.","commitment_guards":"Contracted overage ceiling and trailing-window spend-velocity limit, each refusing with a distinct machine-readable reason.","value_share":"Refused structurally at contract creation, at rating, and by database constraint. Storm is metering infrastructure, not a commission on outcomes."},"out_of_scope":["Legal invoicing, tax calculation, payment collection, and accounting posting.","Seat-based metering, and value-share pricing (refused structurally, no enabling configuration).","Prepaid credit ledgers or any settlement unit other than currency.","Client-side settlement: there is deliberately no settle or capture operation."],"integration_targets":["HTTPS REST — the whole product-runtime surface, no package required","Single-file TypeScript reference client (any fetch runtime)","Single-file Python reference client (3.10+, standard library only)"],"agent_instructions":"Build the canonical engineering operation-started event, taking its type and dataschema URIs from /api/openapi.core.json rather than retyping them. Call POST /api/v1/authorizations/operations synchronously before starting work and treat 402 as a denial decision. Publish the four lifecycle observations to the customer Kafka/MSK log — never POST telemetry to Storm. Do not implement a client-side settlement method: Storm qualifies, rates, and settles from projector state and verified evidence. Ask the human for every identifier, region, and result type you cannot read out of the codebase."}