Skip to main content

Rulebook 1.0.0

Every number, and the rule that produced it.

Atmosphere OS is not generative. The same inputs produce the same brief every time. That repeatability is useful only if a planner can also see which figures are arithmetic, which are my conservative planning positions, which come from an outside standard, and which still require the real venue or responsible professional to decide.

Accuracy review · 2026-09-07

The published language now explicitly separates cross-jurisdiction screening policies from code requirements. In particular, the blanket 80% power allowance is described as Atmosphere's conservative planning policy rather than a universal NEC/IEC rule, and the 5 mm/person egress figure is a screening floor rather than a legal occupancy answer. Color-difference and physical-signage language has also been narrowed to what the underlying standards actually support.

9

computed rules

13

stated positions

5

judgments, kept out

Three 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 weight is 0.26 would decide the rest of the book is the same, and they would be wrong — but that is the inference they would draw. So:

Computed
Arithmetic, geometry, or a named external method: beam geometry, critical-path arithmetic, the Sakasegawa/Allen-Cunneen queue approximation, CIEDE2000, WCAG. The method can be checked independently of my taste. 8 of the 22 published entries have a basis that is independently checkable against mathematics, a published method or an outside authority.
Stated positions
Deterministic in the code, but the constant, safety margin or model choice is mine — 0.65 m a cover, the conservative 25% electrical headroom screen, or a saturating budget-effect curve. Published with the number and the reasoning so you can disagree with them precisely.
Judgements
Taste. The energy curve, the fit scores, the readiness rubrics. Deliberately not in this book, and listed at the bottom so you can see exactly what I am keeping out of it.

Power

Electrical planning current precedence

POWER-AMPS-01

Stated position

Give the pull list nameplate amps when you have them. If amps are missing, declared VA can be converted to current. Watts are the last fallback and are visibly labeled an estimate because AC equipment can draw more current than real watts alone imply.

per line: nameplate amps; else VA / supply volts; else watts / supply volts estimate · working amps = SUM(line amps x qty)
Needs
Per-line quantity · Nameplate amps, VA, or watts · Supply voltage for VA/watt conversions
Where you meet it
Vendor Pack · Pull list & power · Lighting role sheet
My position / screening policy
Atmosphere's input-precedence policy uses manufacturer/nameplate current first, then apparent power divided by voltage, and only then real watts divided by voltage as an estimate. The electrical relationships are standard; choosing this precedence and aggregating them as a planning screen is a product policy.
What it does not claim
Not an electrical design calculation. It does not model phase, power factor beyond a declared VA value, inrush, harmonics, non-sinusoidal loads, phase balance, conductor ampacity, voltage drop, connector ratings or protective-device coordination. Manufacturer data and the responsible electrical professional take precedence.

src/lib/vendor-pack/equipment.ts

Conservative 25% planning headroom

POWER-DERATE-01

Stated position

The pack adds 25% headroom to its current estimate before comparing it with declared venue capacity. That is a conservative house screen, not a statement that every event load is legally a continuous load.

ampsWithHeadroom = amps / 0.8
Needs
Amps from POWER-AMPS-01
Where you meet it
Vendor Pack · Pull list & power
My position / screening policy
My conservative planning policy: apply 25% headroom to the whole working current estimate. NEC 210.19(A) / 210.20(A) use 125% sizing for continuous loads; the NEC definition is tied to maximum current expected for 3 hours or more and includes exceptions. Atmosphere OS deliberately applies the allowance more broadly as an early planning screen. It does not claim IEC equivalence.
What it does not claim
The result is not a branch-circuit design, code determination or permission to load a circuit to the displayed value. Continuous/noncontinuous classification, 100%-rated equipment, local code and the actual protective device are outside this model.

src/lib/vendor-pack/equipment.ts

Planning circuit-count screen

POWER-CIRCUIT-01

Stated position

A quick count for whether the declared supply deserves a closer look. It does not assign loads to circuits or prove those circuits can serve the equipment.

circuits = ceil(ampsWithHeadroom / ampsPerCircuit)
Needs
Derated amps · Amps per circuit at the venue
Where you meet it
Vendor Pack · Pull list & power
My position / screening policy
My planning screen divides the headroom-adjusted aggregate current by the venue-declared amps per circuit and rounds up. The arithmetic is deterministic; treating aggregate amps this way is not a circuit design.
What it does not claim
Does not account for voltage, phase, phase balance, shared neutrals, connector type, load diversity, inrush, branch-circuit topology, existing house loads or local electrical requirements. The responsible electrical professional designs and approves distribution.

src/lib/vendor-pack/equipment.ts

Aggregate supply-margin screen

POWER-MARGIN-01

Stated position

A negative result is a red flag. A positive result is not electrical approval, because real circuits, phases and existing loads are not one interchangeable bucket.

supplyAmps = circuits x ampsPerCircuit · margin = supplyAmps - ampsWithHeadroom · over when margin < 0
Needs
Declared circuits · Amps per circuit · Derated amps
Where you meet it
Vendor Pack · Pull list & power · Vendor Pack · Still undeclared
My position / screening policy
My aggregate screen multiplies the declared number of circuits by declared amps per circuit, then subtracts the headroom-adjusted planning current. The subtraction is exact; treating those circuit ratings as one interchangeable pool is only a first-pass product screen.
What it does not claim
Does not prove that individual circuits, phases, connectors, feeders or conductors can carry the proposed loads. It also does not establish voltage compatibility or available capacity after house loads.

src/lib/vendor-pack/equipment.ts

Undeclared draw stays undeclared

POWER-FLOOR-01

Stated position

Missing electrical data stays missing. Assumed watts can help size a planning scenario, but they remain outside the declared-current floor and are printed as assumptions until replaced by real equipment data.

declared-current floor excludes assumed-watt lines · working current may include explicitly labeled assumptions · lines with no A / VA / W remain unknown
Needs
Which lines declare A / VA / W · Which watt values are explicitly assumed
Where you meet it
Vendor Pack · Pull list & power · Every role sheet
My position / screening policy
My evidence policy: the application may carry an explicitly labeled planning assumption, but it never invents an unlabelled 'typical' draw for a line with no electrical declaration.
What it does not claim
The working total is still short by every line that declares no amps, VA or watts. An assumed wattage also remains weaker evidence than manufacturer/nameplate current or VA.

src/lib/vendor-pack/equipment.ts

Light

Beam coverage at a distance

LIGHT-BEAM-01

Computed

How wide the pool of light is by the time it reaches the table.

d = 2 x throw x tan(beamAngle / 2)
Needs
Throw distance · Beam angle
Where you meet it
Vendor Pack · derived lighting · Room elevation
Basis
Trigonometry of a cone.

src/lib/spatial/room.ts

Hotspot is not average illuminance

LIGHT-LUX-01

Stated position

Use this to catch the common mistake of quoting a bright pin-spot center as though the whole table receives that illuminance. It is a comparison model, not a photometric calculation.

centreLux = lumens / poolArea · averageLux = (lumens / max(poolArea, tableArea)) + (12 x candles / tableArea)
Needs
Fixture lumens · Beam pool area · Table area · Candle count
Where you meet it
Vendor Pack · derived lighting · Room elevation
My position / screening policy
My photometric planning approximation: fixture lumens are spread over the larger of beam-pool or table area, with a small candle-light allowance. The center-vs-average distinction is physically real; the simplified distribution model and candle term are mine.
What it does not claim
It ignores candela distribution, beam falloff, fixture efficiency, tilt, overlap, reflectance, spectrum, obstructions and measured room contribution. Verify lighting with fixture photometry / manufacturer data and the lighting professional.

src/lib/spatial/room.ts

Room

Seats from table perimeter

SEAT-COVER-01

Stated position

A 1.8 m round seats eight, not ten. Ten is the banqueting squeeze, and you can declare it - but you have to declare it.

perimeter = pi*d (round) | 4s (square) | 2s (long, ends left for service) · seats = max(2, floor(perimeter / 0.65))
Needs
Table shape · Table size
Where you meet it
Every module that counts tables
My position / screening policy
My position: 0.65 m is the elbow-to-elbow width one diner needs to eat without apologizing. Below about 0.60 m people knock each other's glasses. Hotel banqueting will plan to 0.55 m and the room feels it all night.

src/lib/spatial/seating.ts

One table count for the whole plan

SEAT-TABLES-01

Computed

Linen, covers, centerpieces, pin spots, stem counts and the service pass all count the same tables. They used to disagree.

tables = ceil(guests / seatsPerTable), where seatsPerTable is declared, or SEAT-COVER-01, in that order
Needs
Guest count · Declared table count or seat count · Table geometry
Where you meet it
Floral · Arc Studio · Vendor Pack · Room elevation
Basis
Ceiling, because a fractional table does not exist. Precedence, because a declared number always beats a derived one.

src/lib/spatial/seating.ts

The centerpiece dead zone

ROOM-SIGHT-01

Stated position

The displayed band is a quick sightline screen for low-versus-elevated centerpieces, not a universal human dimension. Test the actual vessel and arrangement from occupied chairs before production.

maxLow = seatedEye - tableHeight - 0.06 · minTall = standingEye - tableHeight + 0.05
Needs
Table height · Seated eye height · Standing eye height
Where you meet it
Floral brief · Room elevation · Moodboard proportions
My position / screening policy
A house sightline screen built from adult eye-height anthropometry plus explicit 60 mm / 50 mm planning margins. The anthropometric inputs are population summaries; the margins and the resulting dead-zone recommendation are Atmosphere OS planning positions.
What it does not claim
Eye height varies by person, chair, posture and mobility device. Vessel width, stem density and table geometry also affect visibility. The field test in the real seating layout wins.

src/lib/spatial/room.ts

Guest flow

Queue wait at a service point

GJP-QUEUE-01

Computed

A planning estimate of queue wait from arrival rate, service rate and number of servers. It is useful for comparing staffing scenarios; it does not predict the exact line at a particular minute.

rho = lambda / (c*mu) · Wq ~= rho^(sqrt(2(c+1)) - 1) / (c*mu*(1 - rho))
Needs
Arrival rate · Service rate · Number of servers
Where you meet it
Guest Journey · capacity
Basis
The Sakasegawa / Allen-Cunneen multi-server waiting-time approximation with arrival and service variability factors fixed to the exponential case. It is a published approximation, not exact Erlang-C M/M/c queueing arithmetic.
What it does not claim
Assumes stationary average rates and identical servers. Burst arrivals, batching, priority service, blocked stations, changing menus and correlated service times can move the real queue materially. At utilization >= 1 the steady-state estimate is refused and backlog is reported instead.

src/lib/gjp/capacity.ts

Conservative egress-width screening floor

EGRESS-WIDTH-01

Stated position

The figure is a red-flag screen for whether décor, furniture or production may be consuming too much exit width. It is not the venue's legally required egress width.

egressM = max(1.1, guests x 0.005)
Needs
Guest count
Where you meet it
Moodboard · proportions · Guest Journey
My position / screening policy
My cross-jurisdiction screening policy, informed by but not identical to building code. 2024 IBC 1005.3.2 uses 5.1 mm/person for non-stair egress components, with a 3.8 mm/person exception for qualifying sprinkler + emergency-voice conditions. England's Approved Document B Table 2.3 uses discrete minimum widths through 220 people and 5 mm/person only above 220, with exit-discounting rules. Atmosphere therefore uses 5 mm/person plus a 1.1 m floor only as an early conservative prompt.
What it does not claim
Never use this figure for occupancy approval, exit-count design or code sign-off. Jurisdiction, occupancy, sprinkler/voice provisions, stairs, exit count and distribution, door clear width, travel distance, accessibility, exit discounting and the authority having jurisdiction determine the real requirement.

src/lib/moodboard/tablescape.ts

Timing

Meal service window

SERVICE-PASS-01

Stated position

A forty-person dinner and a four-hundred-person gala do not take the same time to serve. This is why.

teams = clamp(round(tables / 3), 1, 12) · passMinutes = round(2.5 x tables / teams) · window = SUM (pass + dwell + clear) per course
Needs
Guest count · Seats per table · Service style · Course count
Where you meet it
Arc Studio · act maths · Run sheet
My position / screening policy
My position: roughly 2.5 minutes of service per course per table, and one service team covers about three tables before the pass stops being one pass.

src/lib/arc/acts.ts

Critical path through the build

PROD-CPM-01

Computed

Which load-in tasks have no room to slip. If one of these runs late, doors run late.

Forward pass for earliest start and finish; backward pass for latest; slack = LS - ES; a task is critical when slack <= 0
Needs
Task durations · Declared dependencies · Phase order
Where you meet it
Vendor Pack · production schedule · Derived constraints
Basis
The critical path method, unmodified. Dependency ordering uses Kahn's algorithm, and a cycle is reported rather than silently dropped.

src/lib/vendor-pack/production.ts

Does the build fit before doors

PROD-WINDOW-01

Computed

You have this many minutes between the door being unlocked and the first guest arriving. Here is whether your build fits inside them.

window = (doorsClock - startClock + 1440) mod 1440 · critical when loadInEnd > window
Needs
Access time · Doors time · Critical path length
Where you meet it
Vendor Pack · production schedule
Basis
Clock arithmetic, with the shortfall quoted in minutes.

src/lib/vendor-pack/production.ts

Floral

Blocked stems and substitution

FLORAL-GATE-01

Computed

A declared constraint can block a catalog stem and require any proposed substitute to clear the same recorded gates. The florist still verifies real cultivar, season, supply, mechanics and guest-specific sensitivities.

A stem passes when it clears every declared gate: season legality, allergy, scent, exposure, foam policy and water. A substitute must clear every gate the original failed.
Needs
Season · Declared constraints · Water availability · Stem catalog
Where you meet it
Floral Direction · blocked stems
My position / screening policy
My deterministic gate over the attributes in the current stem catalog. There is no score: a stem either clears each declared constraint recorded for it or it does not. The result is only as current and specific as those catalog attributes.
What it does not claim
Catalog seasonality, scent, allergy and hardiness are planning attributes, not a medical or sourcing guarantee. Current wholesaler availability and the florist's professional judgment take precedence.

src/lib/floral/volume.ts

Money

Diminishing return above a threshold

BUD-EFFECT-01

Stated position

Use the curve to compare where another dollar changes the plan most inside Atmosphere OS. Do not read the output as measured guest delight, market value or a promised return on spend.

effect = 0 when spend <= fixed; otherwise (spend - fixed) / ((spend - fixed) + perGuest x guests)
Needs
Spend in a category · That category's fixed cost · Per-guest cost · Guest count
Where you meet it
Budget-to-Atmosphere · sensitivity · Decision brief
My position / screening policy
My saturating comparison model. It is intentionally shaped so marginal modeled effect falls as spend rises after a category floor. The curve is a decision aid, not an empirical law of event-design value.
What it does not claim
The fixed and per-guest figures are indicative planning bands for a mid-market metro, priced as of 2026. They are comparison controls, never quotes.

src/lib/budget/costModel.ts

Distributing the envelope

BUD-ALLOC-01

Stated position

A repeatable way to expose trade-offs and shortfalls, not a claim that this is the objectively correct way to spend an event budget.

1. spread the free envelope by scenario weight · 2. repair any category below its floor by taking proportionally from donors above theirs · 3. rounding residual lands in reserve
Needs
Total budget · Scenario weights · Category floors · Guest count
Where you meet it
Budget-to-Atmosphere · Decision brief
My position / screening policy
My deterministic envelope-allocation procedure: scenario weights set the first pass, category floors repair underfunded lines, and reserve receives rounding residual. The arithmetic is repeatable; the weights and floors are product positions.

src/lib/budget/evaluate.ts

Paperwork

Certificate gaps

PAPER-COI-01

Stated position

Where your project requires a vendor COI, the pack can flag whether the record you entered includes receipt, carrier, additional-insured status and an expiry that reaches the event date. It does not decide whether those terms are legally required.

Five tests per vendor: received · names a carrier · names the host as additional insured · declares an expiry · expiry after the event date
Needs
Certificate records · Event date
Where you meet it
Vendor Pack · insurance · Vendor library alerts
My position / screening policy
My document-completeness checklist for a project that has already decided a COI is required. Requirements for certificates, limits, endorsements and additional-insured status come from the applicable contract, venue, insurer and jurisdiction; they are not universal across every vendor.
What it does not claim
This does not authenticate a certificate, verify active coverage, interpret policy language, determine required limits or endorsements, or give insurance/legal advice. Contract and venue requirements control.

src/lib/vendor-pack/paperwork.ts

Color

Perceptual color difference

COLOR-DE2000-01

Computed

CIEDE2000 reports perceptual color difference under its defined reference conditions. Lower values mean closer modeled colors; Atmosphere OS does not impose a universal 'indistinguishable' cutoff on a real event room.

dE2000 over CIELAB, with kL = kC = kH = 1
Needs
Two colors · Illuminant
Where you meet it
Theme Atelier · palette · Floral palette read
Basis
CIEDE2000, the CIE standard color-difference formula. Implemented in full.
What it does not claim
Do not reuse the often-quoted 2.3 value as a CIEDE2000 just-noticeable threshold; that number is commonly associated with older CIELAB/CIE76 discussion. Perceptibility depends on viewing condition, adaptation, sample size, surround, observer and material. Physical samples under event light remain the acceptance test.

src/lib/color/index.ts

Contrast ratio

COLOR-WCAG-01

Computed

Use this ratio for digital guest-facing interfaces, PDFs or screen assets where WCAG text contrast applies. It is a useful warning for palette pairings, not a certification of a printed menu or sign.

(L1 + 0.05) / (L2 + 0.05), where L is relative luminance
Needs
Foreground color · Background color
Where you meet it
Theme Atelier · palette · Stationery notes
Basis
WCAG 2.2 contrast-ratio arithmetic for digital text: 4.5:1 for normal text at AA, 3:1 for qualifying large text at AA, and 7:1 for normal text at AAA (with the standard's stated exceptions).
What it does not claim
WCAG is a web/digital accessibility standard. Printing process, substrate, finish, ambient illumination, type size/weight and viewing distance need their own proofing. The ratio alone does not establish accessibility of a physical sign or stationery item.

src/lib/color/index.ts

Planckian-locus chromaticity from Kelvin

COLOR-CCT-01

Computed

Turns a chosen Kelvin value into an idealized blackbody chromaticity so the palette can be stress-tested under warmer or cooler light assumptions.

Kelvin -> CIE 1931 xy on the Planckian locus via the Kim et al. polynomial; input clamped to 1667–25000 K
Needs
Chromaticity coordinates
Where you meet it
Theme Atelier · palette under light
Basis
Kim et al.'s polynomial approximation of the Planckian locus over the stated Kelvin range. The engine uses it to construct an idealized blackbody white point for simulation; it is not measuring a fixture's CCT from a spectrum or sensor reading.
What it does not claim
Real fixtures with the same nominal CCT can differ in Duv/tint and spectral power distribution, and therefore in color rendering. CRI/TM-30, metamerism, gels and fixture-specific spectra are outside this calculation.

src/lib/color/index.ts

What is deliberately not a rule

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

The energy curve and The Turn

Five intensity weights and around 120 authored role-profile numbers produce the curve, its peak, its flat middles and its faults.

The procedure that finds the sharpest change in the curve is defensible. The curve it runs on is a point of view about how evenings feel. It is mine, I stand behind it, and it is not a measurement.

Scenario fit scores

A weighted blend of goal impact, carrier coverage and band fit, minus risk penalties.

It ranks options usefully and it is legible on screen. As a published rule it would present an editorial ranking as a 0-100 measurement, which it is not.

Guest-journey and readiness rubrics

Criteria scored out of two, weighted by context, banded into ready, caution and not ready.

Professional opinion in numeric costume. Useful for structuring a walkthrough, wrong to cite as a finding.

Stem ranking

A points table that scores season, tier, palette proximity, vase life, hardiness and allergy.

Every number in it is a preference. The gate that blocks a stem is a rule (FLORAL-GATE-01); the order the survivors appear in is taste.

Moodboard confidence

A percentage assembled from brief specificity, context depth, tension load and named limits.

There is no model behind a number like that.

Corrections

A deterministic rule that is wrong is wrong the same way every time, at scale. That is why the accuracy-review date is visible and why a conservative product policy is not allowed to borrow the language of a statute or standard. If something here does not match current authority or what you know from a real load-in, tell me: hello@tangledthistle.blog.

Rulebook 1.0.0 · published 2026-09-02 · accuracy reviewed 2026-09-07 · 22 rules

Back to the desk