Fill the demo book's motion: eight engagements, one at every stage
CI / verify (push) Successful in 7m20s
CI / publish (push) Has been skipped

The Motion half of the demo book was two engagements, which was enough to show
that the loop works and not enough to show what the product is for. The page
that matters asks whether the motion is repeating, and a stage rail of zeroes
cannot answer it.

Eight engagements now, one at every open stage, hanging off demand deals the
demand book already creates — the pipeline happened to have exactly one open
deal at each of the eight, so no deal was invented and the quoted pipeline
counts are unchanged. Forty-four artefacts, nineteen scores, one promotion.

Three things the book is laid out to prove that a folder of templates cannot.

Every stage is occupied, and every one of the twelve starter templates is
instantiated at least once, so "stages covered 8/8" is a measurement rather
than a claim about the seed.

Scores move, and sometimes move down. Nineteen scores across eight
trajectories, with nine dimensions regressing somewhere — the Verity
fine-tuning record runs 62.5 -> 60.5 -> 84.0 -> 80.8, because a scorecard that
only ever rises is a ratchet and teaches a reader to distrust it. Every score
is computed with `motionScoreBasisPoints` and banded with `motionBand` rather
than written as a literal, so the seed and the product cannot disagree about
what the same dimensions are worth.

The artefact bodies are the customer's own facts — named people, real volumes,
the specific thing going wrong, and a live unresolved risk in each. An artefact
whose body is the template with the blanks still in it is precisely what this
data exists to disprove. Six of the forty-four have no template at all, which
is the honest shape of an engagement and the reason `kind` is carried on the
artefact rather than derived: `engagement_artifacts.kind` is NOT NULL and a
derived kind would have been null for exactly those six.

The bodies live in JSON beside the loader for the same reason the starter
library's do — forty-four markdown bodies as backtick strings is a module
nobody can review.

The promotion copies `body` from the artefact verbatim, as `promoteArtifact`
does, rather than writing a hand-authored version 2. A demo that produced a row
the real path could not have produced would teach the wrong shape of the table.

Two name collisions the authors could not see are fixed: a Quillon contact
shared a full name with a demo seller, and an Aurelian one shared a surname
with another. `usage_count` is raised once per template rather than once per
artefact, so it stays symmetrical with the decrement `clear()` already does —
verified by tearing the book down and confirming the library returns to twelve
templates with every counter back at zero, since a counter left above zero
makes a starter template permanently un-editable.
This commit is contained in:
2026-08-19 01:05:48 -07:00
parent b7d1ffd2d8
commit 666310b264
10 changed files with 2013 additions and 340 deletions
@@ -0,0 +1,257 @@
{
"key": "verity-eu-inference",
"dealName": "DEMO — EU inference endpoint",
"accountName": "DEMO — Verity Health AI",
"stage": "scoping",
"status": "open",
"summary": "DEMO — Verity needs EU-resident inference for a fourteen-hospital German pilot going live 12 January 2027; we scoped down from the fine-tuning programme they asked for and sold the endpoint that has to exist first. The architecture is drafted and defensible at sixteen GPUs rather than the eight I first quoted, and Katrin Vogel, the fractional DPO, has been silent for the nine days since she flagged the hash-based pseudonymisation on 10 August — she is the gate on every EU conversation at this account.",
"openedDaysAgo": 126,
"artefacts": [
{
"templateSlug": "technical-discovery",
"stage": "qualification",
"title": "DEMO — First technical discovery: Verity Scribe in the EU",
"status": "final",
"authoredDaysAgo": 105,
"body": "DEMO — *Playbook stage: qualification.* Ninety minutes, 6 May 2026, Verity's Lisbon office. Present: Priya Raghunathan (VP Platform Engineering, champion), Tomas Lindqvist (Director of Clinical NLP, owns the metric), Owen McCabe (Head of Security and Compliance). Marisol Okonjo (CTO) joined for the last twenty minutes.\n\n## The workflow\n\nVerity Scribe turns an ambient consultation recording into a structured clinical note. One encounter is one unit of work: roughly 9,400 input tokens of transcript, 1,100 output tokens of structured note against their own schema. The clinician accepts, edits, or rejects. Acceptance — first pass, no edit beyond typographical — is the number the business runs on, and it is instrumented per speciality and per site.\n\nRepeatable: yes, 1.9M encounters a year in the US. Traced: yes, every request and the clinician's disposition, retained 400 days. Checkable: only by a human today. Tomas has no computable verifier, and said so without being asked twice, which is a good sign.\n\n## The failed attempt and the real problem\n\nThey are not here because the model is bad. They are here because of geography. Rheinklinik Verbund, a fourteen-hospital group, signed in March for a pilot going live 12 January 2027. The DPA Rheinklinik's counsel wrote forbids any processing of patient data outside the EU, including inference, including transient. Verity currently serves `verity-scribe-v4` — a 70B open-weights base SFT'd on 240,000 consented US encounters — from a single US region. Their separate coding pipeline runs on a prompted frontier API rather than on anything of their own, which will matter when we get to the training conversation. There is no EU serving path today and no in-house capacity to build one before January.\n\nSecond problem, discovered in the same hour: the model is worse in German. Their internal pilot on 412 consented and synthetic German encounters returned 58.2% acceptance against 73.6% in US English. Tomas has not published this number internally.\n\n## Data\n\nPHI throughout. Pseudonymisation happens in Verity's own tenant before anything leaves it — a hash-based identifier replacement Owen described as \"good enough for the US, untested against a German DPO\". Rights to use EU transcripts for model improvement are not in the Rheinklinik MSA at all; Priya believes they are addable, Owen does not.\n\n## Environment and economics\n\nServing, not training, is what they are buying first. Load: 6,000 encounters in pilot month one, 38,000 a month at full rollout in month six. Peak concurrency estimated at 140 requests in flight between 08:00 and 11:00 CET, extrapolated from US clinic patterns — Rheinklinik will not share scheduling data before signature, so treat this as ±40%. Latency budget: p95 time-to-first-token 700 ms, p95 complete note 25 s. Their current US p95 is 19 s on shorter US-English transcripts, so do not assume it transfers.\n\n## Org and counterfactual\n\nPriya owns uptime and latency. Tomas owns acceptance. Marisol wants the weights running inside Verity's own Azure EU tenant eventually and said so unprompted — flag this, it is a deployment-expectation risk, not a preference. Budget sits on an EU expansion line Priya could not name the owner of. Katrin Vogel, who took the Data Protection Officer role in February when Elena Duarte left, is fractional at two days a week and was not in the room.\n\nThe counterfactual is the incumbent's managed endpoint, which Priya priced at roughly twice our per-token rate, and no route to the fine-tuning they will need once the 15-point German gap becomes visible to Rheinklinik.",
"kind": "discovery"
},
{
"templateSlug": "trainability-qualification",
"stage": "qualification",
"title": "DEMO — Qualification read-out: why we scoped down to inference first",
"status": "final",
"authoredDaysAgo": 102,
"body": "DEMO — *Playbook stage: qualification.* Scored from the 6 May discovery notes, three days after the call. Result 52 of 100 — Scope down.\n\n## What the score says\n\nScored as the fine-tuning programme Verity walked in asking for, this deal does not clear. Three dimensions carry the damage and all three are real:\n\n**Verifier availability (1).** Clinician acceptance is a human disposition. There is no computable check on a clinical note today and no adjudicated set to build a judge against. Not a disqualifier — there is a visible path — but it is a quarter of work nobody has started.\n\n**Traces and rights (1).** The Rheinklinik MSA grants no model-improvement rights over EU transcripts. Owen McCabe reads the omission as deliberate on their counsel's part. Until that is amended we have no lawful training corpus in the EU, and the US corpus cannot be used to fix a German-language gap under a DPA that forbids the data crossing at all.\n\n**Security and legal path (1).** No DPA with us, no EU processing today, and the person who has to approve any of it — Katrin Vogel, DPO — works two days a week and has not yet been introduced.\n\n## What is strong\n\nForcing function (3) is the best I have seen this quarter: a signed customer contract with a fixed 12 January go-live and an EU-residency clause that Verity cannot engineer around. Metric owner (3) is Tomas Lindqvist, who volunteered a number that makes his own team look bad, which is the behaviour you want. Exec sponsor (3) is Marisol. Expansion surface (3) is the fine-tuning work the German gap will force within two quarters.\n\n## What the score does not cover\n\nBaseline (2) and headroom (2) are scored here on the serving side, not the model side. What is measured is a US p95 of 19 s on US-English transcripts. Nothing has been measured in region, at German transcript lengths, against the 700 ms and 25 s budgets in Rheinklinik's schedule. The 58.2% German acceptance figure is not evidence for this deal — the endpoint does not fix it — it is evidence for the expansion surface.\n\n## The decision\n\nScope down, and be specific about what to. Split the engagement in two. Sell the EU-resident inference endpoint now — it is the only thing that has to exist by January, it is the only thing the score supports, and it puts our infrastructure inside the boundary that every later conversation depends on. Open the fine-tuning conversation as a separate demand record once the German acceptance gap is published internally and the MSA amendment is on someone's desk.\n\nThis is not a consolation prize. The endpoint deal is $433,382 and it makes us the incumbent inside the compliance boundary before anyone competes for the training work.\n\n## What must be true before legal\n\nPriya names the budget owner. Tomas commits to a German-language baseline measurement on our endpoint in pilot month one. Owen introduces Katrin Vogel. If Katrin cannot be got into a room within three weeks, that is the finding, not a scheduling problem — she gates this deal and every EU conversation after it.",
"kind": "qualification"
},
{
"templateSlug": "data-and-security-brief",
"stage": "legal",
"title": "DEMO — Data and security brief: the PHI boundary for the EU endpoint",
"status": "final",
"authoredDaysAgo": 60,
"body": "DEMO — *Playbook stage: legal.* Filled in with Priya Raghunathan and Owen McCabe on 12 June, taken into the first joint counsel call on 19 June and written up the following day. Fifteen decisions; eleven resolved, four named below as open.\n\n## Legal basis and roles\n\nVerity is controller for encounter data and processor for Rheinklinik. Prime Intellect is a sub-processor, appointed under Verity's existing sub-processor notification obligation to Rheinklinik — which requires thirty days' notice, so the notice must go out by 13 December for a 12 January go-live. Our paper starts. Verity's counsel (Ana Beltrán, external, Lisbon) accepted the standard DPA with two redlines, both on breach-notification timing.\n\n## Permitted use, and what Owen's questionnaire actually forced\n\nOwen's questionnaire runs to 214 items. Three wrote this section.\n\nItem 3.11 asks whether any vendor employee can read a payload, including during a live incident. Our support terms allow a named engineer to, with customer consent. Owen refused a consent-based carve-out, because Rheinklinik's DPA does not give Verity standing to grant that consent. So it is cut: no human review of payloads under any circumstance including support. It costs us — a customer-reported bad note is reproducible only from Verity's audit log — and Priya accepted that trade in writing on 12 June.\n\nItem 3.14 asks whether payloads train anything. No model improvement, no retention of request or response bodies. The rights a future fine-tuning engagement needs are explicitly NOT granted here and must be a separate amendment; do not let anyone conflate the two documents.\n\nItem 9.6 asked for Rheinklinik's auditor to have a right of physical inspection of our Frankfurt racks on five business days' notice. We refused it — we cannot grant a third party site access on that notice in a shared facility. Counter-offer: audit exercisable through Verity, once a year, thirty days' notice, at Verity's cost, plus our C5 attestation. Ana Beltrán accepted. Rheinklinik's counsel has not answered. That is open decision four and it is ours, not theirs.\n\n## Data classes and boundary\n\nPseudonymised consultation transcripts: free text, containing residual PHI by construction — no pseudonymisation survives a clinician saying a patient's name mid-sentence. Treat every payload as special-category health data under Article 9. Verity applies hash-based identifier replacement in their own Azure EU tenant before egress.\n\nOpen decision one: Katrin Vogel, Verity's fractional DPO, has not validated that method, and Rheinklinik's own DPO may hold it to a stricter standard. If it is judged insufficient nothing changes technically — the boundary already assumes residual PHI — but Verity's controller analysis for the German entity shifts and their notice to Rheinklinik has to be rewritten.\n\n## Residency and egress\n\nAll inference in the Frankfurt region. No cross-region failover, no US read replica, no support access from outside the EU. Egress limited to aggregate metrics: request counts, token counts, latency histograms, error codes.\n\n## Retention and deletion\n\nZero retention of payloads, in-memory only. Owen treated that as table stakes and spent his time on error paths instead: item 5.9 asks what a stack trace contains. Our default triage log keeps the first 200 characters of a failing request. Off for this tenant — that is a code change in the Frankfurt gateway, not a setting, and it sits with Jonas Neubauer for the September build. Aggregate metrics retained thirteen months for billing dispute; Owen asked for six, we held at thirteen because it is our own dispute window, and he took it.\n\n## Certifications\n\nRheinklinik's schedule 4 enumerates two by name: ISO/IEC 27001 with a Statement of Applicability covering cloud processing, and BSI C5 Type 2. We hold both, C5 attested March 2026 for the Frankfurt region. Verity holds neither. Owen is mid ISO 27001, stage 1 audit booked November 2026, certification expected February 2027 — one month after go-live. Open decision two: he is planning to ask Rheinklinik for a waiver. Our exposure is a slipped go-live, not a compliance failure, but a slipped go-live moves our revenue start.\n\n## Ownership\n\nVerity owns `verity-scribe-v4` and every derivative. We serve it, we do not hold rights in it. Open decision three: Marisol wants a contractual exit that lets Verity take the serving stack in-house at renewal. Commercially answerable; not answered.",
"kind": "discovery"
},
{
"templateSlug": "technical-narratives",
"stage": "scoping",
"title": "DEMO — Narrative for Marisol Okonjo: you are buying a boundary, not GPUs",
"status": "final",
"authoredDaysAgo": 15,
"body": "DEMO — *Playbook stage: scoping, used wherever it is needed.* Written for Marisol Okonjo, CTO. Delivered on the 4 August call after she asked, for the third time, why she cannot just run the weights herself.\n\n**Audience.** Marisol Okonjo, CTO, Verity Health AI. She is judged on gross margin per encounter and on not being locked in. She has been through one vendor migration that cost her team a quarter, and she is currently raising, which makes every recurring line item on a slide an argument she has to have with someone else. What she loses by agreeing with me: optionality, in her framing, and a line on the infrastructure slide.\n\n**The belief, in her words.** \"It is our checkpoint and open weights. Serving a 70B model is a solved problem. If we are going to end up running this in our own EU tenant anyway, paying you to run it for a year is a detour with a bill attached.\"\n\n**The narrative.** She is right that serving a 70B model is solved. She is wrong about what she is buying, and the date is what makes the difference.\n\nYou have 161 days until 12 January. In that window your team has to stand up EU-resident capacity, pass Rheinklinik's schedule 4, get an ISO 27001 stage 1 audit through in November, and rewrite the pseudonymisation path if Katrin rules against the hash method. Three of those four are things only your team can do. The fourth is the only one you can buy, and it is the one with the longest lead time if you do it yourself, because the hard part is not the inference server — it is being able to answer a German hospital group's DPO in writing about single-tenancy, payload retention, and support access, with an audit trail, in December.\n\nWhat you are buying is a compliance boundary that already exists, with our name on the sub-processor notice thirty days before go-live. Not GPUs.\n\nOn lock-in: the weights are yours, the checkpoint is yours, and the exit is a DNS change and a config push, because the gateway that talks to us is code your team wrote and controls. There is no proprietary format in the path. If at renewal you want it inside your tenant, we should write that path into the contract now rather than argue about it in eleven months.\n\nAnd the thing I would not say if I were only trying to close this: the endpoint is not what fixes your German acceptance rate. 58.2% against 73.6% is a model problem, not an infrastructure problem, and it becomes Rheinklinik's problem around pilot month two. Getting the endpoint live in January is what buys you the time to deal with it.\n\n**The tell that it landed.** She stops arguing about price and asks who writes the renewal exit clause. She did, on 4 August. Piotr Sawicki was asked to model both paths the following week.",
"kind": "narrative"
},
{
"templateSlug": "reference-architectures",
"stage": "scoping",
"title": "DEMO — Architecture selection: EU-resident inference endpoint, Frankfurt",
"status": "draft",
"authoredDaysAgo": 8,
"body": "DEMO — *Playbook stage: scoping.* Draft for the 27 August architecture review with Priya and Owen. Not shown to Marisol.\n\n## Which shape this is\n\nThe serving edge of **architecture 2, SFT on traces**, training loop absent because the rights do not exist yet, with **architecture 1, eval-first** alongside at Verity's cost. This is the substrate the fine-tuning deal attaches to.\n\n## The diagram\n\n```mermaid\nflowchart LR\n subgraph EU[Verity Azure EU tenant]\n C[Clinic app]\n Ps[Pseudonymise]\n Gw[Gateway]\n Au[Audit log]\n Ev[Eval harness]\n end\n subgraph PI[PI Frankfurt region]\n Ep[Dedicated endpoint]\n W[v4 weights]\n Mt[Metrics only]\n end\n subgraph US[Verity US]\n Cp[Control plane]\n Bi[Billing]\n end\n C --> Ps --> Gw --> Ep\n W --> Ep\n Ep -- note --> Gw\n Gw --> C\n Gw --> Au\n Au --> Ev\n Ep --> Mt --> Bi\n Cp -. config only .-> Gw\n```\n\n## Component ownership\n\n| Component | Who runs it | Why it is there |\n| --- | --- | --- |\n| Gateway | Verity | The only thing that talks to us; holds the audit log, so a bad note is reproducible their side, not ours. |\n| Dedicated endpoint | PI | Single-tenant, sixteen reserved H200s as eight TP2 replicas, Frankfurt. Single-tenancy is questionnaire item 3.2, not an upsell. |\n| v4 weights | Verity, hosted by PI | Their IP; copy deleted on termination. |\n| Metrics only | PI | Counts, tokens, latency, errors. No payload fragments. |\n| Eval harness | Verity | German acceptance, measured against the endpoint. Tomas owns it. |\n\n## Where PHI crosses a boundary\n\nOnce, in one direction, never leaving the EU. Pseudonymisation and clinic-to-gateway are internal to Verity; gateway to endpoint is the only external hop, and the one the DPA governs; the return path carries the note, also PHI. The US control plane pushes config and reads nothing — keep that line dotted and one-way, Owen will interrogate it.\n\n## Sizing, including the number I got wrong\n\nRun-rate: 38,000 encounters a month, 9,400 in and 1,100 out — 456,000 a year, about 500M output tokens and 4.3B in. Year one rides the ramp (6k to 38k over pilot months one to six): 355,000 encounters, ~390M out. Reserve on run-rate; forecast on the ramp.\n\nMy first model said eight GPUs. It was wrong: I took the US p95 of 19 s and assumed it transferred, so I sized on decode alone. Decode is the easy half — memory-bound at ~68 tokens/s per in-flight request, so 1,100 output tokens is ~16 s, ~8 s under the 25 s note budget at 140 concurrent. TTFT binds: a 9,400-token German transcript is prefill-bound. At 140 in flight, ~16.5 s each, we retire ~8.5 requests/s — ~80,000 prefill tokens/s. A TP2 H200 replica sustains ~11,000 with chunked prefill. Four replicas is 44,000 and TTFT never converges. Eight is 88,000, 91% loaded at peak, modelled p95 640 ms — modelled, not measured. Load test booked 3 September; under 9,000 per replica this is wrong again. At 196 concurrent, demand is ~112,000: eleven replicas, six GPUs beyond the reservation.\n\nOwn goal, stated because Priya will ask: the eight-GPU figure sits inside the $433,382 quoted in May. I am not repricing at scoping over my own arithmetic. The delta comes out of our margin; Nils Ekström signed it off as boundary-entry cost.\n\nWho pays for burst: $32,102 of the $433,382 is held as pre-purchased on-demand — 7,465 GPU-hours at our $4.30 rate, six extra GPUs across the CET peak for about 400 working days. If concurrency lands nearer 196, that pool absorbs two quarters and Verity tops up at list after. Clause drafted; Priya has seen it.\n\n## Three decisions that redraw this\n\n**Payload logging.** Off, in-memory only. On, it puts a retention node holding Article 9 data in our region and reopens the DPA. Off; we debug blind.\n\n**Where pseudonymisation sits.** If Katrin rules the hash method insufficient it moves into the clinic app and Verity's German controller analysis changes. The diagram survives; their notice does not.\n\n**Hosted versus weights in Verity's tenant.** Marisol wants the second at renewal. That deletes the PI subgraph and makes this a support deal at another price. Not answered here.",
"kind": "architecture"
}
],
"scores": [
{
"daysAgo": 102,
"note": "DEMO — First score, off the 6 May discovery. 52, Scope down: no computable verifier, no EU training rights in the Rheinklinik MSA, and no DPA with us. Baseline and headroom are scored on the serving side only — a US p95 of 19 s and nothing measured in region. Splitting the engagement: sell the inference endpoint now, open fine-tuning as a separate record once the German acceptance gap is published internally.",
"dimensions": [
{
"id": "task_definability",
"weight": 10,
"score": 3
},
{
"id": "verifier_quality",
"weight": 13,
"score": 1
},
{
"id": "trace_data_rights",
"weight": 8,
"score": 1
},
{
"id": "baseline_measured",
"weight": 8,
"score": 2
},
{
"id": "headroom",
"weight": 10,
"score": 2
},
{
"id": "env_constructibility",
"weight": 8,
"score": 2
},
{
"id": "metric_owner",
"weight": 9,
"score": 3
},
{
"id": "budget_source",
"weight": 9,
"score": 2
},
{
"id": "exec_sponsor",
"weight": 4,
"score": 3
},
{
"id": "security_legal_path",
"weight": 8,
"score": 1
},
{
"id": "forcing_function",
"weight": 8,
"score": 3
},
{
"id": "expansion_surface",
"weight": 5,
"score": 3
}
]
},
{
"daysAgo": 58,
"note": "DEMO — Rescored 22 June, three days after the joint counsel call. 65, Qualified conditional — over the line for the first time. Piotr Sawicki named the $2.3M FY27 EU expansion line, Rheinklinik's go-live is contractually fixed with a service credit attached, Ana Beltrán has a model-improvement amendment drafted and sitting with Rheinklinik's counsel, and the fine-tuning conversation is now a separate demand record with its own scorecard, which is what moves expansion surface. Baseline and headroom do not move: Tomas publishing 58.2% is evidence for the training deal, not this one, and we still have no in-region latency measurement. Still open: DPO validation of the pseudonymisation method.",
"dimensions": [
{
"id": "task_definability",
"weight": 10,
"score": 3
},
{
"id": "verifier_quality",
"weight": 13,
"score": 2
},
{
"id": "trace_data_rights",
"weight": 8,
"score": 2
},
{
"id": "baseline_measured",
"weight": 8,
"score": 2
},
{
"id": "headroom",
"weight": 10,
"score": 2
},
{
"id": "env_constructibility",
"weight": 8,
"score": 2
},
{
"id": "metric_owner",
"weight": 9,
"score": 3
},
{
"id": "budget_source",
"weight": 9,
"score": 3
},
{
"id": "exec_sponsor",
"weight": 4,
"score": 3
},
{
"id": "security_legal_path",
"weight": 8,
"score": 2
},
{
"id": "forcing_function",
"weight": 8,
"score": 4
},
{
"id": "expansion_surface",
"weight": 5,
"score": 4
}
]
},
{
"daysAgo": 6,
"note": "DEMO — 71, Qualified conditional. Architecture drafted, Tomas has signed the German acceptance target in writing, and the Frankfurt single-tenant shape is now drawn and costed against measured German token lengths, so task definability, metric owner, environment constructibility, baseline and headroom all move — 17 s modelled against a 25 s budget is the first serving evidence this deal has had. Three things got worse. My first sizing model undercounted the GPUs by half and the correction comes out of our margin. Katrin Vogel flagged the hash-based pseudonymisation as possibly insufficient on 10 August and has not answered since, which stalls the MSA amendment and leaves the ISO waiver unresolved with the 13 December sub-processor notice inside the window — security and legal path drops to 1 and traces and rights back to 1. Marisol has missed two reviews since the Series C process started.",
"dimensions": [
{
"id": "task_definability",
"weight": 10,
"score": 4
},
{
"id": "verifier_quality",
"weight": 13,
"score": 2
},
{
"id": "trace_data_rights",
"weight": 8,
"score": 1
},
{
"id": "baseline_measured",
"weight": 8,
"score": 3
},
{
"id": "headroom",
"weight": 10,
"score": 3
},
{
"id": "env_constructibility",
"weight": 8,
"score": 3
},
{
"id": "metric_owner",
"weight": 9,
"score": 4
},
{
"id": "budget_source",
"weight": 9,
"score": 3
},
{
"id": "exec_sponsor",
"weight": 4,
"score": 2
},
{
"id": "security_legal_path",
"weight": 8,
"score": 1
},
{
"id": "forcing_function",
"weight": 8,
"score": 4
},
{
"id": "expansion_surface",
"weight": 5,
"score": 4
}
]
}
],
"promote": null
}