Page Media Guidelines · sarasota.fish Page Audit →Media Map →

What a page needs, and what it must never do. Every rule here came out of a real problem found on this site, and every one of them is checked automatically by node scripts/media-map.mjs and shown in the Page Audit. Build new page types against this list and the pass does not have to happen twice.

How to work — read this first

Do not change a finished page unless Steve points at it.
Most damage on this site has come from "improvements" nobody asked for — swapping a photo off an old note, adding a clip because an asset was unused, restructuring a page that was already signed off. A note in the media map is a suggestion, not a work order. Corrections are always allowed: wrong species, false statement, watermark, duplicate, broken layout. Everything else waits to be asked for.
Never invent a fact to fill a headline or caption.
Real examples that shipped and had to be pulled: "a flounder won't chase up the water column" (false — the page's own copy says it comes off the bottom to eat); "the captain picks the day, not the calendar" (false — customers book a date and we go); a lateral-line ID caption on a stock scale texture. If a fact is not already on the page or verified at a source, do not write it. When unsure, describe the tactic, not the certainty.
No overstatement. No editorializing.
Steve's call, after a breaker shipped reading "Whitebait shows for one hour around sunrise, then sinks out of reach"FALSE. The page says the half hour either side of sunrise is the easiest window, and the same page explains how chum brings bait back up all morning. A true fact was inflated into an absolute and became a lie.

Known false "fact" — never reinstate: "one bait per gallon" as a livewell density rule. Steve (a working captain): "one bait per gallon is a FANTASY." A round well on a strong pump carries far more than that; what keeps bait alive is FLOW (GPH) and reading the bait, not a per-gallon headcount. It had propagated to 10 spots across the three bait pages — all pivoted to flow. Do not write a per-gallon density number again.

The patterns to strike, all found on this site and all now fixed:

  • Absolutes built from tendencies. "only", "never", "always", "sinks out of reach" — when the source said "usually", "best", "easiest".
  • Guarantees. "guaranteed viewing", "near-guaranteed dolphins". Nothing in nature is guaranteed and the site must never imply it. The honest version already existed on the dolphin page and is the model: "Sightings aren't guaranteed; here, they're close."
  • Self-praise. "The Complete Masterclass", "the complete field guide", "the ultimate no-boat species". The page either is thorough or it isn't; saying so is a tell that it isn't.
  • Unverifiable superlatives. "the cheapest world-class fly fishing in Florida", "the best natural bait on the Gulf coast", "nothing beats them", "hands down".
  • Ranking stated as fact. "the single best X" appeared ten times. A hedge — "arguably", "one of" — is honest and stays; an unhedged ranking is an opinion wearing a fact's clothes.
  • Invented sociology. "the one that sells out first", "plenty of locals never tie on anything else". Nobody counted.
  • Emotional promises. "changes how you fish forever", "the most addictive way to fish this coast", "make-or-break".
  • Backwards causation — a human habit described as animal behaviour. The site said whitebait "is a first-light game" and that by mid-morning it "sees you and sinks". Steve: "you can catch bait all day — people catch it early because they fish early. That's not accurate." The dawn pattern was the anglers' schedule, not the bait's. Before writing that fish or bait "do" something at a time of day, ask whether that is the animal or the fisherman. The tell is a habit that lines up suspiciously well with when people leave the dock.
Numbers, months, depths and tactics carry the writing. If a sentence would still be true with the adjective removed, remove the adjective. If it would be false, it was doing the work a fact should have been doing.
Keep a record. Every change gets a before/after.
Commit messages lead with what changed and the measured before/after, so any single line can be vetoed without hunting for it. If a change came from an agent, say so — agents apply the generic rules and will "correct" a specific instruction Steve gave. His explicit call always wins over anything in this document.
Verify geography before you place a picture.
Shipped and caught: a Miami night skyline on the Sarasota tarpon page, a Belize (caye-caulker) tarpon in a Sarasota gallery, a Bali beach in a Gulf set. Filenames carry place names — read them. If the frame shows a skyline, a mountain, or coral that is not Gulf coast, it does not go on a Sarasota page.

Running a section as its own session

Each section (species, charters, areas, techniques, resources, months) can be worked in a fresh session. The order that works:

  1. npx astro build, then node scripts/page-rhythm.mjs dist/<path>/index.html for each page in the section — that gives you the layout defects as numbers before you touch anything.
  2. node scripts/media-map.mjs → open Page Audit and Media Map for repeats, clusters, hero-fit and unused assets.
  3. Fix defects only unless Steve has given notes for that section: false facts, wrong species, wrong geography, watermarks, duplicates, walls and fragments, stacked visuals.
  4. Rebuild, re-measure, confirm the numbers moved, then commit with the before/after.

What a page needs

SlotRule
HeroOne, landscape, and about the page's subject. A species page leads with that fish; a month page leads with what is biting that month.
BreakerAt least one full-bleed band with an eyebrow + headline that matches the picture and the page. Video beats a still where a clip exists.
BodySomething visual roughly every 400–600 words. Under ~2 assets per 1,000 words a page reads as a wall of text.
VideoAim for at least one moving image per page. 18 pages currently have none.
MixA fish, an underwater scene, a weather or water pad, and a person. Not all four every time — but not four of the same thing.
GalleryOptional, and usually wrong. See below.
A good picture never goes in a gallery.
Galleries are where good frames go to be 800px wide and ignored. If a picture is strong enough to look at, it belongs big, in the copy — as a breaker, a feature, or a sized inline figure next to the paragraph it illustrates. A gallery is only justified when a page has far more good frames than it has copy to hang them on, which is almost never true here. Two tiles is not a gallery; it is two pictures you gave up on. Before adding one, ask what each tile would do if it were a breaker instead.
One picture, many uses — never two copies of one picture.
When the same frame exists under two filenames, the map reports two assets at five uses each instead of one asset at ten, so nothing looks overused and the real distribution is invisible. Duplicates also end up on the same page under different names, which is how a page ships the identical photo twice. The scanner clusters near-identical frames by perceptual hash and flags them as dupe-of-used. When you find a pair: pick the better file, repoint every reference to it, git rm the loser's variants, and note the swap. Do not leave an orphan behind "just in case".

Phone first — the hero has to work at both sizes

The hero is the one thing that must look right on a phone AND on a desktop.
A hero is a wide band on a laptop and a tall one on a phone. Cover-cropping a 16:9 photo into a 390×540 phone hero throws away about 60% of its width — so a fish sitting off-centre is simply not on the screen most people use. The rest of the page can degrade as it scrolls; the intro cannot.
The audit measures this.
Each hero is scored for how much of its visual detail survives the phone crop and the desktop crop — the hero 📱/🖥 column, flag hero-fit below 40%. Where a better crop exists the audit prints the exact heroFocusMobile to paste; where no crop works it says so, and that page needs a different picture.

Page rhythm — the sections must be roughly equal

A map on the page will fake a wall.
page-rhythm.mjs only treats section.sf-cine, figure, picture, video and img as visuals. A map renders as a div, and it emits a <noscript> SEO fallback listing every spot — 1,025 words on the artificial-reef page, 1,952 on the fishing-spots page. The script counts all of it as copy that no reader ever sees. Both pages measured a 1,000w+ “wall” that does not exist. Strip the map div before measuring, or subtract the noscript by hand, and say which you did.
Copy blocks between visuals: 150–350 words. Never a 1,000-word wall, never a two-sentence fragment.
A page should read as even visual chunks. The failure looks like this — measured on the dive page before the fix: 190w → picture → 33w → picture → 52w → picture → 1137w → picture → 95w → picture picture → 389w. Two-sentence fragments wedged between stacked pictures at the top, then the entire body dumped in one wall with nothing in it. Cause: every breaker sat in the template before <Content />, so the article itself got none.

The same page after redistributing the breakers into the content at section boundaries: 275w → 302w → 270w → 159w → 236w → 265w → 389w — min 159, max 389. That is the target shape.

CheckRule
Copy block150–350 words between visuals; ~250 is the sweet spot
WallNever a block over 500 words with no visual in it
FragmentNever a block under ~120 words wedged between two full-bleed visuals
StackedNever two visuals adjacent with no copy between
EvennessLargest block ÷ smallest block ≤ ~3
Put the breakers inside the content, not all before it.
On a bespoke template the breakers live in the .astro and the article renders through <Content />. If every breaker is placed before that call, the article gets zero visuals no matter how many the page has. Convert the .md to .mdx and place breakers at ## boundaries so the body splits into even chunks.
Measure it, don't eyeball it.
node scripts/page-rhythm.mjs dist/<path>/index.html prints the actual sequence of visuals and the word count of the copy between them, plus min/median/max. Run it after a build; if the max block is over 500 or the min is under 120, the page is not done.

Hard rules

Never the same picture twice on one page.
A gallery tile repeating the hero is the single most noticeable defect — it reads as "they only have one photo". 13 pages had it. Audit flag: repeat.
Never a tall picture in a wide slot.
Hero and breaker are wide bands; a portrait frame crops to a meaningless strip. 29 were doing it, mostly because the random breaker pool was 21 portrait files deep. Tall frames go inline, at ~380–460px.
Never two visual blocks back to back.
A breaker, gallery or full-bleed figure needs real copy between it and the next one. The copy should earn its place — bridge the two ideas, don't pad.
Never claim where a photo came from.
No "shot on our own trips", "from our boat", "real fish, real days". The library mixes owned photography with licensed stock and galleries contain both, so the claim is false for the frame beside it. Describe what is in the picture.
Never caption a fish you have not looked at.
Filenames in this library lie. One called barracuda… is a grouper. One called …spanish-mackerel… is spotted seatrout. One called colorful-sea-life… is a school of tarpon. Open the file before you write the alt text.

Distribution — spread, not ban

Within a section matters far more than across sections.
Steve's rule, verbatim: "repeating within sections is not as big a deal as repeating across sections." A geography page may reuse a strong species or nature asset when it genuinely matches that place — tarpon on Boca Grande, redfish and snook on Charlotte Harbor, nature on Englewood. The limit is that the same picture must not land on every page of one section, and nothing gets used twenty times. Cross-section reuse of a good frame is not a defect; it is the point of having good frames.
Let the copy pick the picture.
Section by section: a kids paragraph gets the kids photo, a bait paragraph gets crab or shrimp, a tarpon paragraph gets a tarpon, a mangrove paragraph gets the mangroves. The image answers the words next to it. Geography first, then whether the frame is any good.
No picture may dominate one section.
Sections are charters, species, techniques, areas, months, resources, blog. The same picture on a charter and an area and a resource is fine — that is spread. The same picture on four charter pages is a cluster, and that section starts to look like one shoot. Audit flag: cluster; the map shows sections per asset.
Bait is exempt. Repeat it freely.
Steve, verbatim: "repeating a bait ball is different than repeating a person over and over again. It's not as recognizable, and it's more in the noise of the pattern." Across every bait page — catching live bait, white bait, pinfish, shrimp and crabs, bait and tackle shops — reuse bait balls, cast nets, jumping bait and shallow-water frames as much as the copy wants. The goal is vibe and volume: "lots of different bait and lots of stuff going on." Match the copy and do not worry about the repeat count. People, boats and recognizable faces are the opposite — those still spread.
Small is a real size. Use it.
Steve: "little photos are a nice touch. Inset photos are a nice touch." Mix the sizing on a page instead of running every visual at band width — a 300–460px inset figure between two full-bleed breakers is a rhythm tool, not a compromise. It also unlocks the library's wobblers: "you can spread in things that are kind of wobblers. If they're small, they don't matter as much." A frame that is too weak, too soft or too oddly cropped to carry a band is often perfectly good at 380px. This is the one case where a mediocre asset earns a place.
An inset is not a repeat.
Steve: "it's okay to use people small you used before, because small you can't tell who they are. So insets add flavor to the page without adding a lot of confusing repetition… you repeat them because they don't really read, because they're small." A photograph used at 300–460px does not register as the same picture the way a full-bleed band does, so the distribution rule relaxes for insets — a person or a fish already used elsewhere can come back small to add texture. It does NOT relax for heroes, feature images or bands. Practical read: if you want the variety but the frame is already spent at full width, run it small.
Abstract water is the fallback, not a failure.
Steve: "abstract elements work in absence of good, appropriate, copy-fitted examples… our abstract videos of water make a lot of sense with headlines on it." When no honest literal frame exists, a surface-of-the-water clip under a teaching headline beats a stretched or wrong-geography literal shot. The headline carries the fact; the water carries the mood. Never reach for abstract when a correct literal frame exists.

Type & overlays — how a breaker must render

A breaker headline is Oswald 700, uppercase, clamp(1.8rem, 4.5vw, 3.4rem). If it renders as body text, it is broken.
The headline is a <p>, and every template that renders markdown carries its own paragraph rule — .of-md p, .in-md p, .svc-md p, .sf-prose p — at (0,2,1) specificity, while the component's scoped rule is only (0,2,0). So a breaker inside a rendered <Content /> silently lost its type and came out Lato 300 at 16.8px, while the same component outside the markdown body rendered correctly at 54px. components.css now re-asserts the type at (0,3,0). If you ever see a small thin headline, that guard has been broken.
No coloured overlay on any photograph, anywhere on the site.
The washes came in three different colours and each had to be hunted separately: navy (rgba(5,13,28,…), rgba(7,19,40,…)), ocean blue (rgba(17,74,120,…)) and teal (rgba(127,214,230,…)). The worst was in underwater.css — a teal sun-glow radial plus a 50% ocean-blue gradient applied to every .sf-hero--underwater background, which is most heroes on the site. They were sitting on hero backgrounds and breaker bands. They desaturate the photograph — the colour gets sucked out and the image goes hard to see. Every photo overlay is now neutral black and bottom-weighted, purely so text has a base to sit on. The breaker's flat tint layer and radial wash are gone entirely; legibility comes from the headline's own text-shadow. If you ever need more contrast, reach for the shadow, never a coloured wash. Body figures and inline video carry no overlay at all.
Overlay budget: the picture must still read.
A breaker stacks three darkening layers — the top/bottom blend gradients, a soft radial behind the text, and the flat tint prop. Stacked too heavy the photo turns into a blue-black smear. Current settings: radial peaks at 0.34, flat tint 0.25–0.35 typical. The headline carries its own text-shadow, so reach for the shadow before more tint. Body figures get no overlay at all — if an inline photo looks blue and murky, that is the footage, not the site.
Full-bleed breakers inside prose need their own escape and their own air.
The prose column is max-width and LEFT-aligned inside a centred container, so the usual margin-left: calc(50% - 50vw) centres on the wrong point and the band shifts left, clipping its own headline off-screen. prose.css re-escapes from the container geometry and adds margin-block: 2.75rem so the band does not butt against the paragraph above.
A frame stored sideways is a defect in the FILE, not in the placement. Rotate the file.
`scenes/img-0546` — a great blue heron in gold sunset water — sat on this site rotated 90° for its entire life. It kept resurfacing because it was landscape-shaped (2400×1600), so it passed every "breakers must be landscape" check and the random breaker pool kept dealing it out as a full-bleed band with the bird lying on its side. Steve called it out repeatedly. The fix is not to re-place it or crop around it: rotate the source and regenerate every variant, then re-check its shape — this one became 1600×2400 portrait, which means it had to come out of the breaker pool as well. A shape check alone will never catch this; someone has to look at the frame.

Craft

A breaker headline is not a caption.
Describing the photo is the laziest possible headline — the reader can already see the picture. "Green water funnels out of a pass past a white sand point" says nothing; "The passes turn on hard through a falling tide" teaches. Every headline must ADD a fact the image doesn't give: a tactic, a season or month, a depth, a spot, a behaviour, a rule. One plain sentence, under ~90 characters, tied to the copy beside it. And never over-promise — if a thing is hard (finding a big shark tooth, a permit eating a fly), say so honestly.

Technical notes

Known bad assets — do not re-litigate these

Every one of these was opened, zoomed and confirmed by eye. Four separate sessions have now independently rediscovered items on this list and spent real time on it. If you are about to place one of these, stop. If you confirm a new bad asset, add it here — that is the whole point of the list.

Wrong ocean / wrong geography

FileWhat it actually is
stock-new/sunset-sky-clouds-over-sea-in-the-evening-with-oraMountain ridge across the horizon. Was live on sunset-cruises directly under copy reading "the horizon with no condos in it."
stock-new/horizon-sea-sky-background-sunset-sky-clouds-overLand on a horizon that should be open Gulf. Retired from the breaker pool.
stock-new/vibrant-underwater-seagrass-posidonia-habitat-inMediterranean Posidonia — long strap blades, brown basal sheaths. Not Florida turtle grass. Was captioned "the staple food of manatees on the Sarasota flats."
stock-new/neptune-grass-field-cabo-cope-puntas-del-calnegreSame Posidonia, Spain.
stock-new-vid/golden-fish-swimming-in-seagrass-in-oceanPosidonia with sea bream. Mediterranean.
stock-new/dramatic-colorful-sunset-sky-over-mediterranean-seFine, despite the name. Sky and empty water only — nothing in the frame contradicts the Gulf. Left in use deliberately.
scenes-pano/img-2078 (downtown skyline)Real, but it is downtown Sarasota. Do not put it on a page whose copy says undeveloped.
Belize / Caribbean tarpon: caye-caulker, cayman, xcalakPalms and reef. Still live as heroes on the tarpon pages — flagged for Steve, not changed.

Filename lies about the species

FileWhat is actually in it
stock-new-vid/fast-caribbean-reef-sharkTarpon. Confirmed three times independently. Was the breaker on the shark-tooth diving page.
barracuda-fish-and-other-fishGrouper.
boy-at-night-…-spanish-mackerelTwo seatrout.
large-green-fish-caught-with-plastic-lureMahi.
striking-close-up-of-striped-shrimpMantis shrimp.
shark-chasing-a-large-bait-ballNo shark in frame.
backgrounds/big-skyMangrove creek, and portrait.
stock-new/colorful-sea-life-underwater-shallow-underwater-sTarpon in open blue water. No “colorful sea life” in it at all.
stock-new/large-grouper-and-school-of-fish-underwaterAquarium. Tank seam visible top-left, flat gradient backdrop, and the fish is a goliath. Was the featureImage on the artificial-reefs page until Steve called it.
species-mixed/img-2161Real gag grouper, but the angler is at a dock with a marina behind him — inshore, not reef fishing. Steve pulled it off the artificial-reefs page for exactly that.

Checked and CORRECT — do not re-flag: kids/kid-pompano-dock was once reported as jacks or blue runners. Zoomed on the deck fish, they are Florida pompano: deep compressed near-circular body, blunt rounded snout, small mouth, yellow wash on the throat and anal fin, and — decisively — no black opercular spot and no bony scutes on the caudal peduncle. A jack crevalle has all three. It is correct as the featureImage on the pompano species page. The lesson generalises: a claim that a filename lies is itself a claim, and it needs the same zoom-in evidence as any other.

Burned-in text and watermarks

FileProblem
video/snook-redfish-inshore-actionVertical 960×1706 with a "SARASOTA FLORIDA / DECEMBER INSHORE FISHING" title card. Never a breaker.
species-mixed/live-baitBurned-in "LIVE BAIT FISHING" title card. Removed from the live-bait page.
scenes/2014-7-10-osprey-at-squadron-sunriseSCHADT.COM watermark. Uncroppable — the stamp is 131px tall and the bird's head starts at 148px. Retired from the pool.
scenes-pano/downtown6:1 sliver, too thin to crop the stamp off. Retired.
scenes-pano/myakka-lakeBIG SHOTS / Steve Schadt Photography / BigShotsArt.com stamp, top-left, on plain storm sky. Croppable (~22% off the left, or ~14% off the top). Pulled off sarasota-fishing-spots 2026-07-23; still live on resources/rivers-and-backcountry and in breaker-pool.json.
scenes/2012-7-17-myakka-weeds-lake-hdrSame stamp, bottom-left this time — which is why a top-corner-only check missed it. Croppable. Check both left corners on every scenes* file.
snook-flagship/snook-dock-light-nightHeavy grain, blown flash, and a burned-in torn/Instagram border.
abstract/storm-skyBanned by Steve — "don't ever use that cloud picture anywhere." Green-cast HDR storm cloud pano with a burned-in torn/Instagram border. Was the grouper-season hero; removed. Its breaker-pool slot was swapped in place (not deleted — deleting an element reshuffles every page) for stock-new/radiant-sky-at-sunset-with-golden-orange-colors.
spots/mote-fleet-nightFIXED. Had a BIG SHOTS / Steve Schadt Photography stamp, but on plain sky at the left — cropped 345px off the left edge, all variants regenerated. Now clean and usable.
spots/bait-shop-new-passFIXED. Cropped. Was live as a page image on two pages.

Unusable geometry

Is it Steve?

Confirmed him: video/redfish-video-loop-nice-simple-works-anywhere, video/redfish-loop-cool-simple (also has a house roofline). Confirmed not him: video/tarpon-night-jump-sm and its matching still tarpon/tarpon-night-silver — full head of light/reddish hair, clean-shaven, same man and same fish in both. Reads as him, so treated as him: video/tarpon-night-boatside (bald, camo, smiling with a night tarpon) and species-gallery-redfish/12872012-04-06 (bald under a cap, 2012 filename). Both are otherwise good frames; if Steve confirms either is a customer they go straight back in.

Duplicate pairs — pick one, repoint, git rm the loser

Bad posters (the clip is fine, the .webp is not)

The photo plan — what the library can and cannot do

SituationWhat to do
Page needs a fish photoUse a real one. Check it is that species by eye first — filenames lie constantly.
Only portrait frames exist for that fishIt cannot be a hero or a breaker. Use the featureImage slot (renders large and uncropped) or a sized inline figure. Do not force it into a wide band.
No real photo exists at allAI is the last resort, and never a hero where a real photograph exists. Six pages still run AI heroes purely because every real frame of that fish is portrait — sheepshead, flounder, black drum, gag grouper, king mackerel, mangrove snapper. Real landscape photos of those six is the single highest-value shoot list.
Asset is unused and looks goodThat is not a reason to place it. See the working agreement.
Asset is overusedReduce by swapping it out of the weakest placement, not by adding a near-duplicate.
Two files look like the same photoThey probably are. Keep the better file, repoint every reference, git rm the loser. Three duplicate pairs were found this way.
Frame has a BIG SHOTS / BigShotsArt stampCrop it before use. Nine were found stamped, four of them live as page heroes. Slivers too thin to crop get retired instead.
Clip has no .webp posterGenerate one, or it flashes black. Pick a frame where the subject actually reads, not frame 0.

Holes in the library — verified by search, not assumed

These were each looked for properly and are genuinely not there. Do not spend another session hunting. Every one is a page whose central subject has no honest photograph behind it.

MissingWhich page it breaks
A real kayak on the water. The only kayak assets are one AI hero, one AI underwater illustration, and a snapshot of two kids in a wooden canoe.The whole kayak-fishing page. Steve believed there were more; there are not.
Any real photograph of a person wading. The only wading frame on the site is AI.Wade fishing — its hero is currently a man on a boat deck, on a page whose premise is leaving the boat.
A stingray. Zero ray assets of any kind.The stingray shuffle is the wade page's loudest safety instruction and has no image.
A dock light shot from outside the halo. Every halo asset is shot from directly above or below the light.Dock lights — the page turns on "the shadow edge, not the bright centre", and nothing in the library shows the edge.
A red headlamp at work on deck.Dock lights — repeated three times in the copy, pictured zero times.
A tailing redfish on a drained flat. Closest is an underwater redfish.Bokeelia, sight fishing, and every flats page.
A bald eagle. We have ospreys, egrets, herons, spoonbills, cormorants, skimmers, pelicans.Bokeelia — Steve named eagles specifically.
The US-41 twin spans from the water (Barron Collier / Gilchrist). All bridge footage is Sarasota or a bascule drawbridge.Punta Gorda — the first landmark Steve named for that page.
A largemouth bass on a Florida river. The only real bass frames are Lake Okeechobee, portrait, one angler.Punta Gorda — the salt-to-fresh gradient is the page's best story and has no picture.
A poled skiff, two anglers, no development on the horizon. FILLEDvideo/stock-aerial-view-of-men-fishing-from-boat is exactly that shot: one poling from the platform, one on the bow, mangrove shoreline, no buildings. Verified by eye.Struck. Was wrong when written.

The tools

CommandWhat it answers
node scripts/page-rhythm.mjs dist/<path>/index.htmlThe visual/copy rhythm of a built page — walls, fragments, stacked visuals, min/median/max.
node scripts/media-map.mjsRebuilds the usage map: repeats, section clusters, duplicates, hero-fit, unused assets.
/media-audit.htmlPage-by-page audit with the flags.
/media-map.htmlEvery asset, where it is used, notes and TODOs.
node scripts/media-audit.mjsFinds watermarks and sideways frames.

Before you call a page done

Derived from the July 2026 media pass. Keep it current: when a new rule is learned, add it here and add the check to scripts/media-map.mjs so the audit enforces it rather than relying on memory.