Skip to main content

Rulebook 1.0.0

Every threshold, and where it is applied

The same record and the same situation produce the same verdict every time, and a verdict is only worth reading because it fails closed rather than in the venue's favor. Those are claims. A claim nobody can check is a slogan, so here is the whole thing — the arithmetic, the constants, and the file that implements each one.

A rulebook says how a record is read. It says nothing about how much record there is, and on that the honest answer is: not much, and here is exactly how much — the state of the record publishes my own coverage numbers and what happens when a venue sends a document.

rules published
26
of them my position
23
judgments, kept out
6

Two kinds of number, kept apart

Calling everything a rule would be the fastest way to lose this argument. The first person to ask why a multiplier is 0.8 would decide the rest of the book is the same thing wearing a formula, and they would be wrong — but that is the inference they would draw.

Computed
A comparison or a piece of arithmetic. Nothing to trust me about: more guests than the drawn layout holds is more guests than the drawn layout holds. 3 of the 26 rules here are this.
Stated position
Deterministic in the code, but the constant or the policy is a judgment rather than a fact — the last eight percent of a room, two blockers, half a point for something a person said. Published with the number and the reasoning so you can disagree with it precisely.

No rule here cites an outside authority, because there is no published standard for how many people fit in a barn or for when a sentence on a marketing page becomes a fact. The third kind of number — taste — is deliberately absent, and is listed at the bottom so you can see exactly what is being kept out.

Evidence

What class a piece of information is held at, and what that class is allowed to do.

Four classes of confidence, never blended

EVID-01

Stated position

Every line on a brief carries which of four things it is. Nothing on this site is presented at a confidence it does not hold.

documented — the venue issues it in writing stated — someone at the venue said it patterned — the typology behaves this way, or the venue's own copy says so absent — no source of any kind addresses it
Needs
The source class recorded against each finding
Where you meet it
Any finding, anywhere · Sources and confidence · Record depth
My position
My position. A record that holds a license and a record that holds a phrase off a home page are not the same record, and one label covering both would make the stronger one worthless. The classes never average and never combine into a single grade.
What it does not claim
Documented is the strongest class this instrument holds and it is still not a promise about your date. A document describes practice at the time it was written.

src/lib/venues/types.ts — type Confidence, CONFIDENCE_LABEL, type CapabilityProvenance

Absence is recorded as absence

EVID-02

Stated position

If nobody has answered something, the brief says nobody has answered it. It is never filled in from the venue type, from a similar property, or from what would be normal.

no source of any kind addresses the point → status unknown, source not-established
Needs
Which layers the record actually speaks to
Where you meet it
By topic · Capabilities not established · Still to confirm with the venue
My position
My position, and the one the rest of the book rests on. A blank field is the most common thing in this catalog, and the cheapest error available is to read it as a yes.
What it does not claim
An absence is not a finding against the venue either. It says this instrument does not know, which is a different thing from the venue lacking it.

src/lib/venues/types.ts — canonicalEvidenceSource(), SOURCE_MEANING['not-established']; src/lib/venues/patterns.ts — typologyPatternFindings()

Evidence readiness

EVID-03

Stated position

The share of what is on file that is actually attributable to the venue. A high number means the record is well sourced, not that the venue is good.

readiness = round(((documented + stated x 0.5) / findings) x 100)
Needs
Confidence class of every finding on the record
Where you meet it
Information on file · Record depth · Comparison matrix
My position
My position. Documented counts whole because it survives the person who said it; stated counts half because it does not; patterned and absent count nothing, because a typology and a blank are not evidence about this property.
What it does not claim
It measures the record, not the room. A venue nobody has asked much about can score the same as one that answered everything, if both were asked little.

src/lib/venues/evidence.ts — evidenceBreakdown(), const readiness

A finding with no authored trail gets a derived one

EVID-04

Stated position

Older records show an evidence trail marked as derived from their source class rather than as something the venue said.

first-party → documented · operator-stated → stated · third-party → patterned · marketing-claim → patterned · not-established → absent
Needs
The finding's source class
Where you meet it
Evidence trail · By topic
My position
My position. Records authored before the evidence model still have a source class, and mapping it downward is honest where inventing an observation would not be. Marketing copy maps to patterned, never higher.
What it does not claim
A derived trail carries no observation the venue made. It is labeled as derivation everywhere it appears.

src/lib/venues/evidence.ts — DERIVED_CONFIDENCE, DERIVED_SOURCE_DETAIL, evidenceFor()

Percentages are floored

EVID-05

Stated position

Nothing here is ever rounded up. A figure you read is a floor.

pct = floor((documented / findings) x 100)
Needs
Documented findings · Total findings
Where you meet it
Provenance reading · Record depth
My position
My position. Rounding half upward would report a record with 49.6% documented evidence as half documented, and every rounding on this site would then be one that flatters the record.

src/lib/evaluation/depth.ts — provenanceReading()

First-party only withholds rather than resolves

EVID-06

Stated position

Switch to first-party only and almost nothing survives. That is the state of the record, not a fault in the filter.

mode = first-party → keep findings where source = first-party, withhold the rest · capabilities kept only where provenance = documented · usableSeated / usableStanding kept only where a first-party capacity finding exists · readSeated / readStanding = null
Needs
Evidence mode · Source class of every finding · Capability provenance
Where you meet it
Evidence sources counted · Every brief, when the mode is on
My position
My position. A strict reading has to remove things, not reinterpret them: everything it declines returns as an open question rather than as a negative finding.
What it does not claim
No figure on a record is pinned to a single source, so the capacity test is the honest one available: does any first-party finding on this record address capacity at all.

src/lib/evaluation/depth.ts — applyEvidenceMode(), WITHHELD_STATUS, withhold()

Capacity

How many people a room is established to hold, and what happens when nobody knows.

Usable and read are different fields

CAP-01

Stated position

A number a venue publishes about itself never becomes the number this instrument sizes your event against.

layout proved it → usableSeated / usableStanding venue published it → readSeated / readStanding neither is ever copied into the other
Needs
Where the figure came from
Where you meet it
Capacity by format · Quick facts · Every room on record
My position
My position. A posted figure is the room as described by the party trying to let it. The field named usable means a drawing with service aisles and egress paths on it established the number, and a pass is only ever read from that field.
What it does not claim
A read figure still carries the sentence, the page and the date it was read, so it can be judged. It is visible; it is not authoritative.

src/lib/venues/types.ts — Venue.usableSeated / Venue.readSeated; src/lib/venues/capacity-read.ts — applyReadCapacity()

Headcount above the usable figure

CAP-02

Computed

More guests than the drawn layout holds. Nothing about that is arguable.

guests > usable → blocker capacity-exceeded
Needs
Your headcount · The layout-proven figure for your format
Where you meet it
Quick facts · Blockers
Basis
Comparison. The verdict is the sign of the difference.

src/lib/evaluation/engine.ts — assess(), blocker id "capacity-exceeded"

The margin of error is eight percent

CAP-03

Stated position

Sitting inside the top eight percent of a room's usable figure is flagged as tight rather than blocked — it can work, and any late change removes the margin.

guests > usable x 0.92 → blocker capacity-tight
Needs
Your headcount · The layout-proven figure for your format
Where you meet it
Quick facts · Blockers · Capacity by format
My position
My position. A usable figure is an estimate carrying furniture, service routes and a fire officer's opinion, and the last eight percent of it is the part that disappears when four people are added or a band takes a corner.
What it does not claim
Tight is the only blocker excluded from the verdict arithmetic (VERD-01). It is a warning about your headcount, not a finding about the room.

src/lib/evaluation/engine.ts — assess(), blocker id "capacity-tight"

A published figure can contradict a headcount, never clear one

CAP-04

Stated position

A room sized only by its own website is unmeasured, not sized. Either way it cannot qualify.

no usable figure and a read figure exists → guests > read → blocker capacity-read-exceeded guests <= read → caution capacity-read-only (verdict at best unverified, never qualified) both also raise an unknown capacity finding
Needs
Your headcount · The figure read off the venue's own pages
Where you meet it
Quick facts · Blockers · Capacity by format
My position
My position, and the asymmetry is deliberate. Sitting under a marketing number establishes nothing, because the number was written to be attractive. Sitting over one is a contradiction the venue has published about itself, and worth naming.

src/lib/evaluation/engine.ts — assess(), blocker ids "capacity-read-exceeded" and "capacity-read-only"

No figure of any kind is a blocker

CAP-05

Stated position

If nobody has established how many people fit, the brief says so and the room does not qualify for your headcount.

usable = null and read = null → posted headline exists and guests > posted → blocker capacity-posted-exceeded posted headline exists and guests <= posted → caution capacity-posted-only (verdict at best unverified) no posted headline → blocker capacity-unknown
Needs
The capacity fields on the record
Where you meet it
Quick facts · Blockers · Every room on record
My position
My position. Most of this catalog arrived from a mapping listing with no capacity of any kind, and the alternative to blocking is guessing from the venue type.

src/lib/evaluation/engine.ts — assess(), blocker id "capacity-unknown"

Capability

What clears something you marked as required, and what withdraws a claim.

A hard constraint clears only on documented or stated

CABL-01

Stated position

Marking something as required means a claim about it has to be attributable. A yes nobody is attached to reads as a question, and a question is conditional rather than qualified.

constraint required and capability asserted → provenance in (documented, stated) → cleared otherwise → blocker, plus an unknown finding recording that it is asserted rather than established
Needs
Your hard constraints · The record's capabilities · Capability provenance
Where you meet it
Blockers · Arrival to leaving · By topic
My position
My position. The list of capabilities records that something was asserted, not who asserted it. The reason a constraint exists — one unestablished step on the guest route can exclude people you invited — is not answered by a sentence on a marketing page.
What it does not claim
Stated clears a constraint and is still only what someone said. The brief asks you to get it in writing in the same breath.

src/lib/evaluation/engine.ts — assess(), blocker id suffix "-unsourced"; src/lib/venues/types.ts — capabilityEstablished()

A capability read off the venue's own pages is stamped patterned

CABL-02

Stated position

Reading a venue's website makes a claim visible and attributable. It does not make it true, and it never clears a hard constraint on its own.

site copy establishes or confirms a capability → capabilitySources[capability] = patterned capability the pass never reached → left out of the map, which reads as unknown
Needs
Copy captured from the venue's own site · The capability the phrase names
Where you meet it
Capability source · Blockers · Sources and confidence
My position
My position. A venue's own page is the venue talking about itself: quotable, dated, and still a claim. Being absent from the provenance map means no source of any kind was recorded, which is weaker still and is not the same thing.

src/lib/venues/capability-read.ts — READ_PROVENANCE, PROVENANCE_RANK, applyReadCapabilities()

A venue's own denial withdraws the capability

CABL-03

Stated position

Where a venue's page says it is not accessible and the record said it was, the record loses the claim and the brief says which way it went.

site copy denies a capability the record asserted → capability removed, recorded as contradicted and marked withdrew
Needs
Copy captured from the venue's own site · The capabilities the record holds
Where you meet it
Capability source · Capabilities not established
My position
My position. Six hundred records carried an identical seeded trio of step-free route, accessible restroom and on-site parking that no source ever established. An unevidenced yes that the venue itself denies is worse than a blank: it is the one kind of error this instrument exists to avoid.
What it does not claim
A withdrawal is not a finding that the venue lacks the thing. It removes an assertion this instrument should never have carried.

src/lib/venues/capability-read.ts — readCapabilities() stanceOf loop, applyReadCapabilities() read.withdrawn

Some constraints are satisfied only by absence

CABL-04

Stated position

If you said you need no stairs, a record asserting stairs blocks — even where the assertion is weak.

constraint is negated and the capability is asserted at any class → blocker
Needs
Your hard constraints · The record's capabilities
Where you meet it
Blockers
My position
My position. Where the requirement is that something is not the case, an assertion of any kind is the thing the constraint exists to avoid, so it blocks whatever carried it.

src/lib/evaluation/engine.ts — assess(), NEGATED_CONSTRAINTS branch

Verdict

How blockers become qualified, conditional or obstructed, and how rooms are ordered.

Blockers to verdict

VERD-01

Stated position

Qualified means nothing on record contradicts what you described. It does not mean the room is confirmed, and open questions still remain on a qualified record.

hard = blockers excluding capacity-tight (cautions are never blockers) hard = 0 and no caution → qualified hard = 0 and a caution → unverified hard <= 2 → conditional hard > 2 → obstructed
Needs
Every blocker raised against this situation
Where you meet it
Quick facts · Rooms list · Comparison matrix
My position
My position. Two open items are a conversation with a venue; three is a different venue. Qualified requires nothing outstanding at all, which is why it is rare.
What it does not claim
The count is of blockers, not of their severity. Two heavy blockers and two trivial ones both read as conditional, which is why the blockers are printed in full underneath.

src/lib/evaluation/engine.ts — assess(), const hardBlockers, const fit

A fail-closed finding becomes a blocker

VERD-02

Computed

Anything recorded as fail-closed appears in the blockers rather than in the list of things to read later.

finding.status = fail-closed → blocker carrying that finding's question
Needs
Finding status
Where you meet it
Blockers · What still needs confirming
Basis
Direct consequence. Fail-closed is the status for something that governs the decision.

src/lib/evaluation/engine.ts — assess(), blocker id prefix "finding-"

Lead time against the pattern for the type

VERD-03

Stated position

Well under the usual booking window for this kind of venue raises a blocker. It is not a statement that the date is unavailable.

leadWeeks < typicalLeadTimeWeeks x 0.6 → blocker lead-time
Needs
Your lead time · The typical booking pattern recorded for the venue
Where you meet it
Blockers · Planner intelligence
My position
My position. Compressing a booking pattern by up to forty percent is a hurry; past that the vendor and permit chains behind the venue start to compress too, and they are the part nobody warns you about.
What it does not claim
The typical lead time is a property of the record, and on most records it is not established at all — in which case this rule never runs.

src/lib/evaluation/engine.ts — assess(), blocker id "lead-time"

Operational burden against your tolerance

VERD-04

Computed

A venue that has to be built out further than you said you would build reads as a blocker. The difference is absorbed by someone, usually you.

venue.operationalBurden > situation.burden → blocker burden
Needs
The record's build level, 1 to 5 · The tolerance you stated, 1 to 5
Where you meet it
Blockers · Planner intelligence
Basis
Comparison of two stated levels.
What it does not claim
The comparison is arithmetic; the build level on the record is a judgment and is listed under what is deliberately not a rule.

src/lib/evaluation/engine.ts — assess(), blocker id "burden"; src/lib/venues/repair.ts — coerceBurden()

List order

VERD-05

Stated position

Rooms are ordered by how much is unresolved, not by how good they are. This is not a ranking.

order = verdictBase + hardBlockers x 200 + risks x 12 + unknowns x 8 + (100 - readiness) x 0.4 verdictBase: qualified 0 · unverified 500 · conditional 1000 · obstructed 4000
Needs
Verdict · Blocker count · Risk and unknown counts · Evidence readiness
Where you meet it
Rooms list · Documented fits
My position
My position. The gaps between the verdict bases are wide enough that no amount of thin evidence can lift an obstructed record above a conditional one — ordering within a verdict is a convenience, ordering between verdicts is a rule.
What it does not claim
Two rooms a few points apart are not meaningfully different. The order is a reading queue, not a scoreboard.

src/lib/evaluation/engine.ts — assess(), const order

Weighting

What your situation changes about the order, and what it never changes.

Status weights

WGT-01

Stated position

How heavily each class of finding pulls on the order things are shown in.

fail-closed 40 · watch 16 · field verify 14 · unknown 12 · known 2
Needs
Finding status
Where you meet it
What still needs confirming · By topic · Impact marks
My position
My position. An unknown sits close to a watch on purpose: not knowing whether a room has a curfew is nearly as expensive to your evening as knowing it has a difficult one. A known item still carries weight, because it still has to be restated in writing.

src/lib/evaluation/engine.ts — STATUS_WEIGHT

Relevance multiplier

WGT-02

Stated position

Your situation changes the order findings appear in. It never changes what they say or how strong their source is.

weight = STATUS_WEIGHT[status] x (1 + hits x 0.8) hits = tags on the finding your situation engages
Needs
Finding status · Finding tags · Your occasion, priorities and constraints
Where you meet it
What still needs confirming · Why this is here
My position
My position. Each thing you said about your evening raises a related finding by eighty percent of its base weight, which is enough to bring it to the top of a long list and not enough to let three soft matches outrank one fail-closed item.
What it does not claim
A finding nothing in your situation touches is carried at base weight, which is not the same as it being safe.

src/lib/evaluation/engine.ts — assess(), const weighted, const weight

Relevance banding

WGT-03

Stated position

Which findings are labeled as bearing directly on the evening you described.

status = fail-closed or hits >= 2 → situation-critical hits >= 1 → situation-relevant otherwise → background
Needs
Finding status · Number of matched tags
Where you meet it
What still needs confirming · By topic
My position
My position. Two independent things you said touching the same finding is the point at which it stops being a coincidence.

src/lib/evaluation/engine.ts — assess(), const relevance

Every unsettled item produces a question, and eight are shown

WGT-04

Stated position

The questions on a brief are generated from what is unresolved, so the count under them cannot disagree with the list above them.

questions = blocker questions + one per finding with status != known finding with no authored question → its label becomes one de-duplicated, first 8 shown
Needs
Blockers · Every finding not held as known
Where you meet it
Ask before booking · Site visit checklist
My position
My position. This once took only findings carrying an authored question, so a record could report eight unanswered items and then head a section “Ask these next: 0”. The cap at eight is a limit on what fits on a site visit, not on what is open.
What it does not claim
Eight is what is printed. The full set of open items is in the brief above it, and is usually longer.

src/lib/evaluation/engine.ts — assess(), askFor(), const verifications

Record

What a record is allowed to infer about itself when nothing was supplied.

A record with nothing of its own is filled with its own open questions

REC-01

Stated position

Where a record has nothing of its own, every topic comes back as an unanswered question about this property rather than a description of its type. The venue type contributes no finding, no confidence and no capacity.

record carries no first-party or operator statement → one finding per layer, status unknown, source not-established, confidence absent detail names the property-level question, never what the type is usually like
Needs
Which layers exist · Whether the record holds any statement of its own
Where you meet it
By topic · What still needs confirming
My position
My position, and a correction to an earlier one. This used to carry what barns are usually like as `third-party` evidence at `patterned` confidence. A class-level pattern is real information and it is not information about this barn, so carrying it as evidence about the property was the error; 2,912 findings across the catalog were withdrawn when that was recognized. What is left is the honest half — the question the record cannot answer, named per layer.
What it does not claim
The wording of the seven questions is mine. It says what has not been established, not that the venue lacks it.

src/lib/venues/patterns.ts — typologyPatternFindings(), GENERIC, LAYER_LABEL_SHORT

An inferred typology is an open field, not a claim

REC-02

Stated position

Where the venue type was worked out from the name rather than from a venue document, the brief says so and lists it among the things to confirm.

venue type inferred from the record name → openFields gains “Venue typology” and the provenance line says the type was inferred
Needs
The record name and locale
Where you meet it
Still to confirm with the venue · Standing limitation
My position
My position. The repair pass reads a name and guesses a type so the record can be grouped and read at all. That guess drives the typology patterns above, so it is published as a guess rather than absorbed silently.

src/lib/venues/repair.ts — inferType(), TYPE_INFERENCE_NOTE, TYPOLOGY_OPEN_FIELD, repairVenue()

What is deliberately not a rule

These are mine, they do real work, and they are not measurements. Publishing them as rules would make every rule above look like one too.

Answered and confirmation-work scores

Two 0-100 figures: half the share of situation-weighted findings a record can currently answer plus half its core-field coverage, and a confirmation workload assembled from unresolved weight and build level.

They are useful for deciding what to read next and they are made of my own weights. Printed as rules they would present an editorial reading as a measurement. Neither is a quality score, and both are labeled that way wherever they appear.

The build level on each record, 1 to 5

Whether a room is turnkey or a full build-out by the planner, held as a single number per record.

The comparison against your stated tolerance is arithmetic (VERD-04). The number it compares is somebody's read of how much a venue makes you produce, and no two planners would land on the same figure for every room.

The wording of the seven open questions

The sentence each layer produces on a record that holds nothing of its own — "No retained source in this record establishes a continuous accessible route from arrival to the room, restrooms and bar", and six more like it.

This entry used to describe something else: "what barns, ballrooms, galleries and wineries are usually like, per layer". That reference is gone. The 2026-09-02 correction withdrew the typology priors entirely, because a description of a class of building is not a finding about a named property, and `patterns.ts` now emits nothing but the unanswered question at `not-established` / `absent`. The questions themselves are still mine — which topics are worth naming, and in what words — and that is editorial rather than a rule.

Whether the room is beautiful

Nothing. There is no field for it and no score containing it.

It is the first thing anyone actually decides on and the last thing an instrument like this could tell you. 54 records hold a reviewed, freely licensed photograph of the property, shown with its credit. Every other record holds none, and none is invented: a drawn mark stands in place of a picture. Illustrative or stock pictures of a venue class are not used. A picture is not a score.

Whether the room feels right for the evening

Nothing. The occasion you state re-weights which findings surface; it never scores atmosphere, and no finding says a room suits a wedding more than a wake.

That is the judgment you are making, and the reason to visit. This instrument exists to make sure the room can hold the evening, so that the judgment is the only thing left to make.

Value for money

Cost structure lists the lines that exist, the extras a quote still has to cover, and the questions a price has not answered. It never totals them into a verdict.

A low total with blanks left in it is an incomplete picture rather than a bargain, and I cannot see your alternatives. Naming what is missing from a quote is work an instrument can do; deciding whether the evening is worth it is not.

Corrections

A rule that is wrong is wrong the same way every time, across every record — that is the cost of being deterministic, and the reason this page exists rather than a sentence claiming it. Cite the identifier rather than the wording; the wording can be improved, the identifier will not move. If something here does not match what you know from a real site visit, say so: hello@tangledthistle.blog.

Rulebook 1.0.0 · published 2026-09-03 · 26 rules