{
  "key": "tessellate-burst-inference",
  "dealName": "DEMO — Inference burst capacity",
  "accountName": "DEMO — Tessellate Labs",
  "stage": "proposal",
  "status": "open",
  "summary": "DEMO — Proposal is drafted for Marek Sowa at $178,675 for a committed inference floor plus burst overflow, and goes out once Ilse Fossum has had the forecast call; engineering wants it on the strength of an 11-miss quarter on archive windows. Finance has not conceded: against the incumbent's counter of $60,000 in credits and a 12% per-token cut we are about $8,500 dearer on forecast volume and about $10,400 cheaper if volume stays flat, and the forecast that settles it has not been produced.",
  "openedDaysAgo": 112,
  "artefacts": [
    {
      "templateSlug": "technical-discovery",
      "stage": "qualification",
      "title": "DEMO — First technical discovery: burst inference for drawing extraction",
      "status": "final",
      "authoredDaysAgo": 96,
      "body": "# First technical discovery: burst inference for drawing extraction\n\nCall with Marek Sowa (co-founder and CTO) and Devi Prasad (staff engineer, serving layer). 55 minutes, no slides.\n\n## What Tessellate actually does\n\nTessellate Labs sells structured quantity takeoffs to architecture and construction firms. A customer uploads a drawing set as PDF; a fine-tuned 12B vision-language model reads each sheet and emits structured line items. 41 paying accounts today.\n\nThe unit of work, because everything below depends on it: a drawing sheet is tiled into roughly twenty crops, so a sheet is not one forward pass. One replica sustains about **120 sheets an hour** at batch 8, call it 30 GPU-seconds a sheet. Devi's figure, from their own dashboards, and the first thing I want to re-measure on our hardware.\n\nTwo load shapes share one endpoint:\n\n- The **interactive path**, a few sheets at a time while someone is at their desk. Median day is about 17,800 sheets across all accounts, which is 148 replica-hours. Their end-to-end p95 target is 45 seconds a sheet and they run at 38.\n- The **archive path**, where a new customer dumps their entire back catalogue. The window they sell is 90 minutes for any archive up to 5,000 sheets. That is 42 replica-hours of work, so it needs about 28 replicas held for the whole hour and a half. Largest observed day was 62,000 sheets, one account migrating eleven years of projects; they wanted it done over an afternoon and it finished at 04:00.\n\nConcurrency across all hours: p50 is 5.8 replica-equivalents, one top-tier accelerator per replica. p90 is 11. p99 is 34. That ratio is the whole engagement.\n\n## What is going wrong\n\nThey serve on per-token serverless endpoints. Two constraints bite. The provider caps them at 40 concurrent replicas, which is only just above the 28 an archive needs, and cold starts on their custom weights run 90 to 210 seconds. When two archives land in the same afternoon the queue backs up behind cold starts rather than behind compute, and the 90-minute window slips.\n\nDevi says they missed it 11 times in Q2. Ferrand and Coe, their second-largest account, have written a service credit into their renewal as a direct result. Marek's words: \"we are not compute-poor, we are compute-shaped-wrong.\"\n\n## Measurement\n\nExtraction quality is measured per sheet against adjudicated labels produced by two internal raters with a third adjudicating disagreements, on a held-out set of 3,400 sheets. That number is stable and is not what this deal is about, and nobody could tell me the inter-rater agreement rate when I asked. The metric that moves here is archive completion within 90 minutes, which they track but nobody currently owns as a target.\n\n## Spend today\n\nTrailing twelve months on the incumbent is $224,000. The last quarter run-rate is $21,800 a month, so $261,600 annualised. Three of the last twelve months were under $9,000. Both facts are true and Marek and their finance lead read them differently, which I expect to be the central argument of this deal.\n\n## Open questions\n\n1. Who owns the 90-minute number as a target rather than a dashboard? Marek said \"probably Devi\" and Devi did not agree in the room.\n2. Ilse Fossum joined as Head of Finance six weeks ago and has not been in a call yet. Nobody has told me what budget line inference sits on.\n3. Their customers' drawings are commercially sensitive. Retention, training rights and who owns the fine-tuned adapter need writing down before anything else moves.\n\nNext: get 90 days of concurrency traces from Devi, and get Ilse into a room.",
      "kind": "discovery"
    },
    {
      "templateSlug": "data-and-security-brief",
      "stage": "legal",
      "title": "DEMO — Data and security brief: drawing archives, retention and adapter custody",
      "status": "final",
      "authoredDaysAgo": 74,
      "body": "# Data and security brief: drawing archives, retention, and adapter custody\n\nWritten with Devi Prasad and reviewed by Tessellate's outside counsel (Halbeck Freen). This covers what crosses the boundary, what may be retained, what may not be learned from, and who owns the weights when this ends.\n\n## What the data is\n\nArchitectural and structural drawing sets belonging to Tessellate's customers, not to Tessellate. A single set may contain unbuilt designs, client names, tender pricing on the title block, and in two accounts the layouts of buildings with physical security requirements. Tessellate's own customer agreements grant them a processing licence only. They have no right to sublicense the content for model training, and they said so plainly rather than making us find out at redline.\n\n## Consequences for the deal\n\n- **No training on customer content, by either party.** Written into the order form, not left to policy. It closes off any future post-training expansion that depends on their production traffic, and both sides should stop pretending otherwise.\n- **Retention is 24 hours.** Sheets are rendered to images, inferred, and the images deleted. Only the structured output and a request-level log survive. Our serving layer must not persist request or response bodies beyond completion of the request, and the log we keep is metadata: timestamp, account hash, sheet count, latency, GPU-seconds.\n- **Metadata we may keep and use.** Concurrency, queue depth, token counts, error classes. Enough to run capacity planning and to build a demand forecast; not enough to reconstruct a drawing, which is the test counsel applied.\n- **Region.** Two accounts, both UK practices, require processing in the EEA or UK. Everything else is unrestricted. We commit to a UK region for the whole workload rather than splitting it, because splitting it doubles the operational surface for 4% of volume.\n\n## Weights ownership, exit, and the base licence\n\nThe base model is open-weight and licensed to each party independently. The fine-tuned adapter is **Tessellate's property**, created before us and unchanged by us; we hold it as a processor and gain no licence to it beyond serving their traffic. Three things follow, and only the first is currently drafted:\n\n1. Adapter artefacts are exportable on request at any time, in the format supplied, within five working days.\n2. On non-renewal or termination we delete resident copies within 30 days and confirm in writing. Egress of their stored adapter versions is free; there is no exit fee and I want that written rather than assumed.\n3. If we ever produce a derived artefact — a quantised or compiled build of their adapter for our runtime — it is theirs too, and it should be named as such. This is the clause counsel has not yet seen and it is the one I expect to take a round.\n\n## Position on subprocessors\n\nTessellate publish a subprocessor list to their own customers with 30 days' notice. Adding us triggers that clock. Marek started it on day 27 without being asked, which is the single most useful thing anyone on their side has done for the schedule.\n\n## Where we landed\n\nDPA agreed on day 36 with two edits: deletion confirmation on request rather than on a fixed report, and 72-hour breach notification rather than 24, which counsel accepted. No penetration test was requested. No SOC 2 report was requested, which surprised me; Ilse may yet ask, and if she does it arrives as a procurement delay rather than a technical one.\n\n## Residual risk\n\nThe 24-hour retention promise is ours to keep in the serving layer, and our default request logging is more verbose than that. It needs a named configuration, verified once before go-live and again after any serving upgrade. Owner: our side, not theirs. I have asked Sunil Nandakumar on the platform team for it and it is not done. If we breach this quietly it shows up in no metric either party watches, which is exactly the kind of risk that surfaces at renewal.",
      "kind": "discovery"
    },
    {
      "templateSlug": "reference-architectures",
      "stage": "scoping",
      "title": "DEMO — Serving architecture: committed floor with burst overflow",
      "status": "final",
      "authoredDaysAgo": 61,
      "body": "# Serving architecture: committed floor with burst overflow\n\nReviewed with Devi Prasad on day 49. This is the shape we are proposing, why it is that shape, and what it does not solve.\n\n## The load, restated in capacity terms\n\nFrom 90 days of Devi's traces, at their measured 120 sheets per replica-hour:\n\n| Measure | Value |\n| --- | --- |\n| Median concurrent replicas, all hours | 5.8 |\n| p90 | 11 |\n| p99 | 34 |\n| Peak sustained, 60 minutes | 31 |\n| Hours per week above 12 replicas | 9.4 |\n| Sheets, median day | 17,800 |\n| Sheets, largest day observed | 62,000 |\n| Replica-hours a year, both paths | about 60,000 |\n\nNine and a half hours a week above 12 replicas. That is the entire problem in one row: paying for 34 replicas continuously is absurd, and having 40 available only after a three-minute cold start is what is losing them archive windows.\n\n## Proposed shape\n\n**A committed floor of ten accelerators, held warm, plus on-demand burst above it.**\n\n- The floor is reserved capacity with the base model and their adapter already resident. No cold start, ever, for the first ten replicas. It absorbs the interactive path outright and the first third of any archive.\n- Burst above the floor is on-demand, autoscaled on queue depth rather than on GPU utilisation, because the queue signals an archive before utilisation does. Devi's dashboards already emit queue depth, but at 30-second granularity, which is too coarse to scale on; taking it to five seconds is about a week of their work and is not yet scheduled. This is currently the largest unowned item in the plan.\n- Burst instances start from a pre-baked image with weights on local NVMe. Measured start on our side is 38 to 55 seconds, against the 90 to 210 they see today. That is the number the technical case rests on and it is the one they should test in week one.\n- A 5,000-sheet archive is 42 replica-hours. Inside a 90-minute window that is 28 replicas: ten warm from the floor, eighteen burst, of which the burst arrives inside a minute rather than inside four. One region, UK, for the whole workload. See the security brief.\n\n## What this does not solve\n\nBurst start is 38 to 55 seconds, not zero. An archive that arrives with no warning still has a first minute where the queue grows. If Ferrand and Coe's service credit clause triggers on the first sheet rather than the last, this architecture does not fully protect them and we should not imply that it does. Devi and I both think the fix is a 60-second pre-announce hook in their upload flow, which is their work, not ours, and it is not in scope here.\n\nSecond, the floor is sized on concurrency, not on utilisation. Against roughly 60,000 replica-hours of demand a year, of which about 6,400 land above the floor, the floor supplies 87,480 and runs at about 61%. Roughly 39% of floor hours are unused. That is deliberate — it is what buys the reserved rate and the warm start — and it is the exact fact their finance lead will fasten onto. The pricing artefact has to meet it head on rather than hide it in a blended number.\n\nThird, none of this improves extraction quality. Their held-out accuracy is what it is. The headroom in this engagement is in the serving shape and nowhere else. If someone at Tessellate is quietly hoping this deal also makes the model better, that expectation needs killing now, and the no-training clause in the brief means it cannot be revisited later either.",
      "kind": "architecture"
    },
    {
      "templateSlug": "pricing-and-packaging",
      "stage": "proposal",
      "title": "DEMO — Pricing and packaging: what Tessellate pays today and what changes",
      "status": "final",
      "authoredDaysAgo": 24,
      "body": "# Pricing and packaging: what Tessellate pays today and what changes\n\n## What they pay today\n\nPer-token serverless. Three numbers, all true, all as at day 88:\n\n- Trailing twelve months, re-pulled with Devi this week: **$250,700**. At discovery on day 16 it was $224,000. Two sub-$9,000 months have rolled off and two months above $21,800 have rolled on, so the metric moves about $13,000 a month in our favour and only one of the last twelve is now under $9,000.\n- Last quarter run-rate: **$21,800 a month, $261,600 annualised**.\n- The incumbent's counter, made on day 81: **$60,000 in credits over twelve months and a 12% per-token reduction**. On the same volume that is about $170,200 next year, all of it variable.\n\nIlse Fossum used the trailing twelve until the re-pull; she now uses the counter, which is a better argument and I should say so out loud. Marek and Devi use the run-rate. Nobody is being dishonest.\n\n## Proposed shape\n\nA committed floor with burst above it, twelve-month term.\n\n| Line | Basis | Annual |\n| --- | --- | --- |\n| Committed floor | $12,250 a month, 7,290 GPU-hours a month at the reserved rate of $1.68 per GPU-hour, which is ten accelerators held continuously | $147,000 |\n| Burst above the floor | Forecast 6,400 GPU-hours at $2.95, against a public on-demand rate of $3.40 | $18,880 |\n| Migration and onboarding | Two weeks, image bake, autoscaler integration, one-off | $12,795 |\n| **Total contract value** | | **$178,675** |\n\nThe contracted minimum is **$159,795**. The burst line is a forecast and must be labelled as one in the proposal; if their volume flattens they pay the minimum and nothing else. Blended across compute the forecast is **$1.77 per GPU-hour** over 93,880 hours; $1.90 if you amortise the one-off migration fee over year one, which is a presentation, not a rate.\n\n## What is being traded, not given away\n\nThe reserved rate of $1.68 is 51% off our on-demand rate, and burst at $2.95 is 13% off. Both are bought with five things, each written into the order form:\n\n1. **Twelve-month term, not six.** They asked for six. Six at this rate is a discount with no consideration behind it.\n2. **Unused floor rolls forward one month, capped at one month's value.** This answers the 39% idle problem directly. It costs us the option value of that capacity and is worth more to them than another ten cents on the rate.\n3. **Burst at $2.95 exists only above a live floor and only for the term.** Cancel the floor and burst reverts to $3.40 list on the next invoice. Burst is the capacity that is expensive to hold, so it is the discount least defensible on its own.\n4. **A named public reference and a joint write-up after 90 days of production**, subject to their customers' consent. Joris Talbot, who runs their customer marketing, has agreed in principle.\n5. **Two engineers on their side for the migration fortnight**, named in the order form. Devi plus one. Without this the two weeks becomes six and the fee is fiction.\n\nNot moving: no rate below $1.68, and no month-to-month.\n\n## The argument we have not yet won\n\nAgainst the run-rate we save them $82,925. Against the re-pulled trailing twelve, $72,025. Against the incumbent's counter we are **$8,467 more expensive** on forecast volume — and $10,413 cheaper if volume never grows and they pay the minimum. So the finance case inverts on the volume question, and Ilse is right that nobody has shown her the forecast on paper. That forecast is what I owe them, and it should come from Devi's ingestion numbers rather than from us.",
      "kind": "pricing"
    },
    {
      "templateSlug": "proposal-blocks",
      "stage": "proposal",
      "title": "DEMO — Proposal to Marek Sowa: burst inference capacity",
      "status": "draft",
      "authoredDaysAgo": 9,
      "body": "# Proposal: burst inference capacity for Tessellate Labs\n\nFor Marek Sowa, CTO. Copied to Devi Prasad, Ilse Fossum and Joris Talbot.\n\n## The problem, as you described it\n\nTessellate serves two workloads through one endpoint. The interactive path is steady, about 17,800 sheets on an ordinary day at roughly 120 sheets per replica-hour, and it works. The archive path is not steady: a single account migrating eleven years of drawings produced 62,000 sheets in a day, and your concurrency goes from a median of 5.8 replicas to 34. The 90-minute window you sell on a 5,000-sheet archive needs 28 replicas held for the whole hour and a half. On per-token serverless you are capped at 40 and your custom weights cold-start in 90 to 210 seconds, so when two archives land together the queue grows behind cold starts rather than behind compute. You missed that window 11 times in Q2, and Ferrand and Coe have put a service credit into their renewal because of it. In your words, you are not compute-poor, you are compute-shaped-wrong.\n\n## What we propose\n\nA committed floor of ten accelerators, held warm with your adapter resident, and on-demand burst above it that scales on queue depth rather than GPU utilisation. Nothing in the first ten replicas ever cold-starts. Burst instances start from a pre-baked image with weights on local NVMe; we measure 38 to 55 seconds, against the 90 to 210 you see now. Single UK region, on the terms in the data brief we agreed with Halbeck Freen on day 36, including the adapter custody and exit-egress clauses.\n\n## What this does and does not fix\n\nIt removes cold start as the cause of a missed archive window and it removes the 40-replica ceiling. It does not make burst start instantaneous. An unannounced archive still has a first minute where the queue grows, and if Ferrand and Coe's credit clause triggers on the first sheet rather than the last, this alone will not protect you. Devi and I think the answer is a short pre-announce hook in your upload flow, plus queue-depth metrics at five-second granularity rather than thirty. Both are your work and neither is in this proposal. Nor does any of this change extraction accuracy; your held-out numbers stay where they are.\n\n## What it costs\n\n$12,250 a month committed, 7,290 GPU-hours a month at $1.68 per GPU-hour, which is 51% off our on-demand rate. Burst above the floor at $2.95 against a $3.40 list, for the term and above a live floor. A one-off $12,795 for the migration fortnight. On Devi's forecast volumes that is $178,675 for the year, blended $1.77 per GPU-hour across compute; the contracted minimum, if your volume never grows, is $159,795. Unused floor rolls forward one month, capped at one month's value, which is our answer to the fact that your median load leaves about 39% of the floor unused on an ordinary week.\n\n## The number Ilse should see\n\nAgainst your last quarter's run-rate this saves $82,925 a year. Against your trailing twelve, re-pulled a fortnight ago at $250,700, it saves $72,025. Against your incumbent's counter of $60,000 in credits and a 12% per-token cut, we are about $8,500 more expensive on forecast volume, and about $10,400 cheaper if your volume stays flat and you pay the minimum. I am not going to pretend that first comparison away. The deal turns on your own ingestion forecast for the two accounts that onboarded in March, not on our arithmetic.\n\n## What we need from you\n\nDevi plus one engineer for the migration fortnight, named. A named owner for the 90-minute archive number — a person, not a dashboard. Ilse in a 30-minute call on the forecast. A decision by day 124, because the floor we have held for you releases then and the reserved rate goes with it.",
      "kind": "proposal"
    }
  ],
  "scores": [
    {
      "daysAgo": 92,
      "note": "DEMO — First pass after discovery: 184 of 400, 46.0, Scope down and only just. The load shape is clear and the pain is real, but there are no traces yet, no named owner for the 90-minute archive window, no inter-rater agreement figure for the 3,400-sheet held-out set, and no idea which budget line inference sits on now that a Head of Finance has started six weeks ago. Headroom is a 1 deliberately: the headroom in this engagement is in the serving shape, not in extraction quality, which is already where it is going to be, and scoring it as though a post-training upside exists would be the easiest way to mis-sell this deal.",
      "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": 1
        },
        {
          "id": "headroom",
          "weight": 10,
          "score": 1
        },
        {
          "id": "env_constructibility",
          "weight": 8,
          "score": 2
        },
        {
          "id": "metric_owner",
          "weight": 9,
          "score": 2
        },
        {
          "id": "budget_source",
          "weight": 9,
          "score": 2
        },
        {
          "id": "exec_sponsor",
          "weight": 4,
          "score": 2
        },
        {
          "id": "security_legal_path",
          "weight": 8,
          "score": 1
        },
        {
          "id": "forcing_function",
          "weight": 8,
          "score": 2
        },
        {
          "id": "expansion_surface",
          "weight": 5,
          "score": 2
        }
      ]
    },
    {
      "daysAgo": 20,
      "note": "DEMO — Re-scored after the traces, the DPA and the incumbent's counter: 238 of 400, 59.5, still Scope down, which is the honest reading: the offer on the table is the scoped-down shape, a floor of ten and burst, inference only, no post-training. Up: baseline 1 to 4 on 90 days of concurrency traces at a measured 120 sheets per replica-hour; traces and rights 2 to 3 because the metadata we need for capacity planning is explicitly ours to keep; environment 2 to 4 on a pre-baked burst start measured at 38 to 55 seconds on our own hardware; security 1 to 3 on the DPA signed day 36 with adapter custody drafted, though the exit-egress and derived-artefact clauses have not been through counsel; sponsor 2 to 3 because Marek put his own name on the internal case and took it to their board's operating review. Down: budget 2 to 1, since Ilse Fossum has reclassified inference as run-rate cost and the incumbent has come back with $60,000 of credits and a 12% per-token cut, so nobody at Tessellate will yet state a number they will defend; expansion 2 to 1, because the no-training clause removes the post-training path entirely and what is left is more inference volume and a second region, which is a smaller surface than we scored at discovery. Held: verifier at 2 (nobody has produced an agreement rate or an adjudication rate for the held-out set, and this deal has not asked them to), metric owner at 2 (still nobody owns the 90-minute number, which is why the proposal asks for a person by name), forcing function at 2 (the Ferrand and Coe renewal credit was already known at discovery and nothing new has landed), headroom at 1. The no-rights-to-train disqualifier is triggered on the page and does not bite here, because this is an inference engagement; it would kill any post-training follow-on, which is exactly why expansion drops. Still open on our side: the 24-hour retention logging configuration asked of Sunil Nandakumar on day 34 and not done as of today, day 92. One dimension moves this into Qualified conditional and it is budget: at a 3 the total is 256 of 400, 64.0, and everything else can stay exactly where it is.",
      "dimensions": [
        {
          "id": "task_definability",
          "weight": 10,
          "score": 3
        },
        {
          "id": "verifier_quality",
          "weight": 13,
          "score": 2
        },
        {
          "id": "trace_data_rights",
          "weight": 8,
          "score": 3
        },
        {
          "id": "baseline_measured",
          "weight": 8,
          "score": 4
        },
        {
          "id": "headroom",
          "weight": 10,
          "score": 1
        },
        {
          "id": "env_constructibility",
          "weight": 8,
          "score": 4
        },
        {
          "id": "metric_owner",
          "weight": 9,
          "score": 2
        },
        {
          "id": "budget_source",
          "weight": 9,
          "score": 1
        },
        {
          "id": "exec_sponsor",
          "weight": 4,
          "score": 3
        },
        {
          "id": "security_legal_path",
          "weight": 8,
          "score": 3
        },
        {
          "id": "forcing_function",
          "weight": 8,
          "score": 2
        },
        {
          "id": "expansion_surface",
          "weight": 5,
          "score": 1
        }
      ]
    }
  ],
  "promote": null
}
