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-01Stated 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-01Stated 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-01Stated 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-01Stated 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-01Stated 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-01Computed
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-01Stated 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-01Stated 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-01Computed
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-01Stated 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-01Computed
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-01Stated 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-01Stated 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-01Computed
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-01Computed
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-01Computed
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-01Stated 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-01Stated 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-01Stated 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-01Computed
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-01Computed
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-01Computed
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