# Deck joist span sheet — catching the transposed digit before the framer does
Deck joist span sheet — catching the transposed digit before the framer does
A residential deck design lives in a calculation sheet that gets copied, retyped and re-approved several times between the engineer, the permit office and the contractor. Every retyping is a chance to move a decimal point or swap two digits, and the failure mode is not a compile error — it is a deck that looks fine on paper and fails a live-load test years later. This is the kind of document where a human error verifier earns its keep independently of whether anyone ever asked for a spreadsheet.
A residential deck design lives in a calculation sheet that gets copied, retyped and re-approved several times between the engineer, the permit office and the contractor. Every retyping is a chance to move a decimal point or swap two digits, and the failure mode is not a compile error — it is a deck that looks fine on paper and fails a live-load test years later. This is the kind of document where a human error verifier earns its keep independently of whether anyone ever asked for a spreadsheet.
## Loads
Loads
Two units are defined once, so the checker knows a pressure in `psf` is pounds per square foot and a stress in `psi` is pounds per square inch:
Two units are defined once, so the checker knows a pressure in psf is
pounds per square foot and a stress in psi is pounds per square inch:
```vmark [psf] = [lb/ft²] [psi] = [lb/in²] ```
[psf] = [lb/ft²]
[psi] = [lb/in²]
| Component | Load [psf] | |---------------|-----------:| | Dead load | 10.0 | | Live load | 40.0 | | Snow load | 0.0 |
| Component | Load [psf] |
|---|---|
| Dead load | 10.0 |
| Live load | 40.0 |
| Snow load | 0.0 |
```vmark #loads total [psf] = SUM(Load) ```
total [psf] = SUM(Load)
The design load for this deck, in a snow-free region, is **50.0**<!--vmark=loads.total--> psf — dead plus live, snow left at zero rather than omitted, so the column still reads as a complete accounting of every load case considered.
The design load for this deck, in a snow-free region, is 50.0 psf — dead plus live, snow left at zero rather than omitted, so the column still reads as a complete accounting of every load case considered.
## Joist sizing
Joist sizing
Joists are `2x10` Douglas fir-larch, allowable bending stress `Fb = 875 psi`, section modulus `S = 21.39 in³` for the actual (dressed) dimension. Spacing is 16 inches on center.
Joists are 2x10 Douglas fir-larch, allowable bending stress
Fb = 875 psi, section modulus S = 21.39 in³ for the actual (dressed)
dimension. Spacing is 16 inches on center.
```vmark #joist Fb [psi] = 875 S [in³] = 21.39 spacing_in [in] = 16 w_plf [lb/ft] precision 2 = loads.total * spacing_in / 12 [in/ft] ```
Fb [psi] = 875
S [in³] = 21.39
spacing_in [in] = 16
w_plf [lb/ft] precision 2 = loads.total * spacing_in / 12 [in/ft]
Tributary load per joist comes to **66.67**<!--vmark=joist.w_plf--> lb/ft.
Tributary load per joist comes to 66.67 lb/ft.
The maximum allowable span for a simply-supported joist under uniform load, governed by bending, is the standard beam formula solved for length:
The maximum allowable span for a simply-supported joist under uniform load, governed by bending, is the standard beam formula solved for length:
```vmark #span Mallow [lb⋅ft] precision 2 = joist.Fb * joist.S / 12 [in/ft] Lmax [ft] = SQRT(8 * Mallow / joist.w_plf) Lmax_ft [ft] = ROUND(Lmax, 2) proposed_span [ft] = 11.83 assert proposed_span <= Lmax_ft ```
Mallow [lb⋅ft] precision 2 = joist.Fb * joist.S / 12 [in/ft]
Lmax [ft] = SQRT(8 * Mallow / joist.w_plf)
Lmax_ft [ft] = ROUND(Lmax, 2)
proposed_span [ft] = 11.83
assert proposed_span <= Lmax_ft
Allowable bending moment is **1559.69**<!--vmark=span.Mallow--> lb-ft, giving a maximum span of **13.68**<!--vmark=span.Lmax_ft--> feet. The drawing calls out a joist span of **11.83**<!--vmark=span.proposed_span--> feet, which the assertion confirms is inside the allowable limit.
Allowable bending moment is 1559.69 lb-ft, giving a maximum span of 13.68 feet. The drawing calls out a joist span of 11.83 feet, which the assertion confirms is inside the allowable limit.
## The transcription this catches
The transcription this catches
The permit set gets redrawn by a second party who copies figures off the engineer's sheet by hand. Suppose "16 inches on center" is retyped as "1.6 inches on center" — a single misplaced decimal, the kind spellcheck has no opinion about:
The permit set gets redrawn by a second party who copies figures off the engineer's sheet by hand. Suppose "16 inches on center" is retyped as "1.6 inches on center" — a single misplaced decimal, the kind spellcheck has no opinion about:
```console $ sed -i 's/spacing_in \[in\] = 16/spacing_in [in] = 1.6/' deck.md $ visimark check deck.md STALE joist.w_plf 66.67 ≠ 6.67 STALE span.Lmax_ft 13.68 ≠ 43.25 STALE 2 prose anchors bound to the values above 4 problems (4 stale, 0 errors) ```
$ sed -i 's/spacing_in \[in\] = 16/spacing_in [in] = 1.6/' deck.md
$ visimark check deck.md
STALE joist.w_plf 66.67 ≠ 6.67
STALE span.Lmax_ft 13.68 ≠ 43.25
STALE 2 prose anchors bound to the values above
4 problems (4 stale, 0 errors)
Notice what is absent: no `ASSERT` finding. `proposed_span <= Lmax_ft` is still `11.83 <= 43.25` — true, and truer than before, because a spacing typo that shrinks `w_plf` makes the allowable span look *more* generous, not less. A verifier that only re-checked "does the assertion still pass" would wave this mistake straight through. What actually catches it is the two `STALE` findings: the retyped `16` no longer produces the `66.67 lb/ft` and `13.68 feet` already printed in the prose above, so `check` fails on the drift itself before anyone reasons about whether a passing-but-wrong assertion is suspicious. The anchored numbers disagreeing with their own formula are the first line of defense; the assertion is the second, and between them a spacing error that happens to make the assertion look better is still caught.
Notice what is absent: no ASSERT finding. proposed_span <= Lmax_ft is
still 11.83 <= 43.25 — true, and truer than before, because a spacing typo
that shrinks w_plf makes the allowable span look more generous, not less.
A verifier that only re-checked "does the assertion still pass" would wave
this mistake straight through. What actually catches it is the two STALE
findings: the retyped 16 no longer produces the 66.67 lb/ft and
13.68 feet already printed in the prose above, so check fails on the
drift itself before anyone reasons about whether a passing-but-wrong
assertion is suspicious. The anchored numbers disagreeing with their own
formula are the first line of defense; the assertion is the second, and
between them a spacing error that happens to make the assertion look better
is still caught.
## The mistake units catch instead
The mistake units catch instead
The retyped decimal is a *value* error: `1.6 in` is as good a spacing as `16 in` as far as dimensions go, so the unit check has nothing to say about it and the anchored prose has to. Units catch the other family, where the digits are right and the conversion is wrong. The bracketed units above (`[psf]`, `[in]`, `[lb/ft]`) are declarations the checker verifies against each formula. `w_plf` is pounds per foot because `psf * in / (in/ft)` reduces to `lb/ft`. A second party who "simplifies" the formula by dropping the `/ 12 [in/ft]` conversion:
The retyped decimal is a value error: 1.6 in is as good a spacing as
16 in as far as dimensions go, so the unit check has nothing to say about it
and the anchored prose has to. Units catch the other family, where the
digits are right and the conversion is wrong. The bracketed units above
([psf], [in], [lb/ft]) are declarations the checker verifies against each
formula. w_plf is pounds per foot because psf * in / (in/ft) reduces to
lb/ft. A second party who "simplifies" the formula by dropping the
/ 12 [in/ft] conversion:
```console $ visimark check deck.md UNIT joist.w_plf w_plf declares lb/ft but its formula derives in⋅psf 1 problem (0 stale, 1 error) ```
$ visimark check deck.md
UNIT joist.w_plf w_plf declares lb/ft but its formula derives in⋅psf
1 problem (0 stale, 1 error)
The formula still looks plausible and the result is off by a factor of twelve, which is easy to miss in a column of figures. The declared `lb/ft` no longer follows from it, so `check` fails before the span is trusted. The two checks are complementary: anchored numbers catch a wrong value, units catch a wrong relationship between values.
The formula still looks plausible and the result is off by a factor of twelve,
which is easy to miss in a column of figures. The declared lb/ft no longer
follows from it, so check fails before the span is trusted. The two checks are
complementary: anchored numbers catch a wrong value, units catch a wrong
relationship between values.
## Why this is a verifier, not a calculator
Why this is a verifier, not a calculator
A calculator (a spreadsheet, a script, a slide-rule) gets the arithmetic right the moment it is run and says nothing about whether it is still right the next time a figure is retyped by hand. This document's numbers are printed in the prose a reviewer actually reads — `66.67 lb/ft`, `13.68 feet` — and those exact bytes are what `check` recomputes against, so the review that a permit office already does (reading the sentence, checking the number against the drawing) is the same act that catches the transcription error, with no second tool and no separate "audit script" to keep in sync with the calculation it audits.
A calculator (a spreadsheet, a script, a slide-rule) gets the arithmetic
right the moment it is run and says nothing about whether it is still right
the next time a figure is retyped by hand. This document's numbers are
printed in the prose a reviewer actually reads — 66.67 lb/ft, 13.68 feet
— and those exact bytes are what check recomputes against, so the review
that a permit office already does (reading the sentence, checking the number
against the drawing) is the same act that catches the transcription error,
with no second tool and no separate "audit script" to keep in sync with the
calculation it audits.