forge

Your pricing data in. Your proposal out — in your format, not ours.

gate cleared · phase 1 building multi-tenant proposal generation engine
The thesis

Rule R3. The one behaviour every competitor gets wrong by trying to help.

The document agrees with the source. Always.

A proposal that quietly disagrees with the spreadsheet it came from destroys trust the first time someone checks. So mirror mode never computes — it reproduces.

Source · pricing.xlsx · sheet “Budget”

LineQtyAmount
4Center-hung display128,400
5Ribbon board215,500
6Control system — alternate14,000
7Sales tax0.00
8SUBTOTAL46,400

Rendered · budget estimate · page 2

Center-hung display$28,400.00
Ribbon board$15,500.00
Control systemalternate$4,000.00
Sales tax$0.00
Subtotal$46,400.00
  • D8 is wrong. The rows above it come to 47,900. The document prints 46,400, because that is what the cell says.
  • The alternate line survived. Nothing is filtered out for looking optional.
  • The zero tax row printed. If the source carries it, the client sees it.
What it is

§2 of the brief.

The tool conforms to the customer

Generating a PDF is not the hard part. The hard part is that every company has a different spreadsheet format, a different document layout, different legal boilerplate, different vocabulary, and different rules about what is shown and what stays internal.

Every other tool solves this by making the customer conform to the tool. This one learns the customer's format from the documents they already send — and adding a customer is database rows, never a code deploy.

Upload one past proposal and the spreadsheet behind it, confirm what was inferred, and from then on every proposal generates itself in that exact format.

Why now

~80 live job posts read in August 2026.

A document industry nobody is selling software to

Seven posts on a single page of one week's listings were companies paying humans, hourly, to produce proposals, bids, tenders and decks. Not one of them mentioned AI. Deadline-driven, document-heavy, still almost entirely manual — and already in the habit of paying real money for the output.

Two things in those posts set the architecture. Buyers now ask, unprompted, for a human review step — they have been burned by confidently wrong output, so the confirmation screen is a purchasing requirement. And the highest hourly rate on the page was not for building an AI platform; it was for reviewing and fixing one. Commodity building is worth nothing. Being right is the product.

Two modes

Mode belongs to the project, not the customer. The same company uses both.

Every proposal team does exactly two jobs

Mirror

The numbers are already final. Someone did the math in a spreadsheet. Reproduce them exactly, in a document worth sending.

Can edit
Typos, intro copy, document type, payment terms, signature text.
Cannot see
Math controls. There are none.

Build

There are no final numbers yet — only costs, specs, or a requirements document. Derive the pricing, then produce the document.

Can edit
Margins, tax, bond and fee rates, line items.
Can see
A pricing audit table showing how every figure was reached.
The six laws

§4. Breaking one is a build failure, not a trade-off.

Non-negotiable

  1. R1

    One renderer. Zero per-tenant components.

    No component is ever named after a customer. Templates are JSON walked by a single generic renderer. If adding a customer needs code, the architecture failed and the business is an agency.

  2. R2

    About to hardcode a string? It is configuration.

    Addresses, legal paragraphs, column headings, document type names, currency, date format, terminology, colours, fonts — all of it belongs to the company profile.

  3. R3

    Mirror mode never computes.

    No summing, no re-derived subtotals, no inferred grand total. Source order is sacred. Nothing is filtered for looking optional. Zero-value rows print.

  4. R4

    Nothing inferred is trusted until a human confirms it.

    Every inference is shown with its evidence — which cell, which page — and confirmed or corrected on screen. This is the trust mechanism and the moat, not a debug view.

  5. R5

    Multi-tenant from the first line.

    Every table carries an organisation. Every query is scoped by it. Every stored file is namespaced by it. This cannot be retrofitted later.

  6. R6

    One canonical document model is the contract.

    Parsers only produce it, renderers only consume it, neither knows the other exists. A new input format is a new parser and zero renderer changes.

Build order

§14. Fixed sequence.

Four steps, then a hard stop

  1. 00Repository, brief and operating rulesdone
  2. 01Scaffold and the database schemadone
  3. 02The canonical pricing document, in lib/core/pricing-document.tsdone
  4. 03The template block schema and its sandboxed expression evaluatordone
  5. 04One JSON template and one fixture, rendered to a real PDFdone

The gate is cleared. A JSON template, a fixture and one generic renderer produce the two documents below. Both come from the same template file and the same figures; the only thing that differs between them is which document type was asked for.

The demo company is invented. In its spreadsheet the reading-room rows come to £79,545 and the subtotal cell says £68,445; the document prints £68,445, keeps the alternate line, and keeps both zero-value adjustment rows.

Phase 1

Mirror mode only. All of these pass, or it has not shipped.

What proves it works

  • Two demo companies with structurally different spreadsheets and visually different documents both produce correct PDFs, with no code differing between them
  • Adding a third company is database rows only — no files touched, nothing deployed
  • A deliberately wrong subtotal in the spreadsheet appears wrong in the PDF
  • Rows marked alternate or optional appear in the output
  • Zero-value tax and fee rows appear in the output
  • Section and row order match the source exactly
  • The on-screen preview and the exported PDF are the same picture
  • No demo company's name appears anywhere outside seed data and tests
  • Every database query in the application is scoped to one organisation, enforced by a test
Not yet

§13. Excluded from phase 1 on purpose.

Deliberately absent

Phase 1 is deterministic end to end. Nothing here gets built early, however tempting — the inference layer only arrives once there is a review gate to put it behind.

  • any AI feature at all
  • visual template editor
  • e-signatures
  • billing
  • real-time collaboration
  • mobile app
  • a third preset template