Asheville — post-mortem analysis

Written 2026-08-08 against guides/asheville-2026/entries/*.json, guide.json, and categories/itinerary/. Proposals only — nothing here has been applied.

Read this first: this analysis can do about a quarter of what the Washington DC one did, and the missing three-quarters is not recoverable. Asheville ran 16–18 July. Its entries were first committed 24 July — six days after the trip ended — so the corpus version was never the plan anyone travelled with. There are 14 plan items and zero outcome values, zero provenance notes, zero confidence blocks, and no trip rules. The changelog says so in its own words: "any account of how the trip went is memory alone."

So: nothing here contradicts your account of how the trip ran, because there is no record of how it ran. What the record can still do is describe what you were given — 38 places, 14 plan items, and the shape of the roster. That turns out to be enough for one real finding, and it is the one you asked about.

1. Where the evidence meets your account

1.1 Your shopping finding is confirmed, and the record puts a number on it

"we enjoy local-elevated / local-upscale … less local-crafty. In short — we're wanting the kinds of 'goods' and 'crafts' that look like boutique DTC, not like boutique farmers market."

This is the one claim the corpus can test, because a roster is a record even when outcomes are not. Nine shop places, classified from their own desc fields rather than from my impression of the names:

the "farmers market" endwhat its own desc says
Woolworth Walk"170+ local artists in the restored Woolworth's"
Marquee · River Arts District"200+ local artists and vintage dealers"
Battery Park Book Exchange + Grove Arcade"a makers' market out front on nice days"
Asheville Raven & Crone + Points of Light"metaphysical shop (crystals, herbs, tarot)"
Mast General Store"Old-timey mercantile … scoop-your-own penny candy"
Hip Replacements + Honeypot Vintage + Static Age"true 60s–90s vintage"
the "boutique DTC" endwhat its own desc says
East Fork"The cult Asheville-made pottery. The Mug has a waitlist online; here it's on a shelf."

Two more — Malaprop's and Harvest Records + Firestorm Books — are indie bookshops and records, which sit outside the axis entirely.

One of nine shop entries is the thing you now say you want. Six are the thing you say you want less of. And East Fork's description is already written in the vocabulary you used from memory three weeks later — cult, waitlist online — which is a small sign the distinction was legible at authoring time and simply was not the organising principle.

This is a genuine planning input and it did not require outcomes to find. It also could not have been found from your account alone: you knew the preference, you did not know the roster ran six-to-one against it.

What I still cannot tell you is whether you enjoyed East Fork, or whether Woolworth Walk was the disappointment that produced the insight. No outcomes exist. The finding is about the shape of what you were offered, not about what happened in the shops — and those are different claims.

1.2 The part of this post-mortem that did not happen

I recommended this exercise almost entirely for the per-traveler section. That section is empty:

"postmortem": {
  "completed":   "2026-08-08",
  "verdict":     "Good trip. Learned a lot about what we want.",
  "what_worked": "Learned that enjoy-local is pretty specific …"
}

No what_to_change, no per_traveler, and guide.json carries no travelers roster at all — which is why the session packet printed "No roster" where DC printed six profiles.

Said plainly: this pass produced one real finding and no traveler evidence. The thing it was meant to do — give a second, independent recollection to test DC's per-traveler inferences against — did not get done. The profiles are no better supported tonight than they were this morning.

That is not a criticism of a two-sentence account. It is a statement of what the next step would need, and it is small: four short notes, one per traveler, in the boxes that are already there.

2. Recurring causes

None available. Causes are read from outcome and outcome_note; Asheville has zero of both across 14 plan items. This section cannot be written.

For contrast, DC's 31 outcome notes yielded a countable distribution — late starts, rideshare failures, heat, one closure. That distribution is the single most useful planning output of a post-mortem, and it costs one enum value per item to produce.

3. Preference signals per traveler

No proposed edits. There is nothing to propose from.

The DC analysis proposed edits for Beckett, Malcolm, Sarah and Stella, each resting on two independent citations. Those proposals are unchanged and still uncorroborated — Asheville neither supports nor weakens them. A second trip agreeing would have moved them from "supported by one trip" to "supported by two," which is the difference between an inference and a pattern.

4. Which planning conventions held

Untestable, and for a more basic reason than missing outcomes: most of the conventions do not exist in this guide.

conventionstatus in Asheville
if_time (○) stopsno stops roster on any of 38 places — 0 tiers exist
anchors survivedno brief on the guide, so nothing was declared an anchor
early vs late in a dayneeds outcomes; none recorded
alternatesalt / alt_kind on 0 of 14 plan items

So the ●○·× tier convention, which the DC analysis flagged as never having been measured, is not merely unmeasured here — it was never applied. Asheville predates it. That is worth stating because it means the convention has now gone three guides without producing a single piece of evidence, and the fix (a stop-level outcome) is still the only thing that would change that.

5. Brief gaps

Asheville has no brief at all. guide.json carries category, days, id, kind_extensions, lifecycle, outputs, postmortem, subtitle, title — and no brief key. So the question this section normally asks ("what did the road discover that a question would have surfaced?") has a different answer here: everything, because nothing was asked.

One proposal, and it comes directly from §1.1 rather than from a gap in the form:

{ "key": "shopping_register", "label": "Shopping Register",
  "prompt": "When a place is known for shopping — what register? Designer/DTC brands, indie boutiques, vintage and thrift, artist markets and craft co-ops, outlets. Name what you want AND what you don't.",
  "type": "prose" }

The DC brief asked for "Shopping (especially cool brands for teens)" under direction.prioritize, which got the audience right and left the register unstated. Asheville shows why that matters: a roster can be entirely on-brief and still six-to-one wrong, because "local shopping" spans East Fork and a 170-artist craft co-op and the brief has no vocabulary to separate them. This is the clearest brief gap either trip has produced, and it is the only one supported by two guides rather than one.

6. Framework gaps

This section survives the missing outcomes intact, because it reads structure rather than history.

6.1 An enum value the schema does not declare

kind is declared as eat | do | shop | photo. Asheville uses sweets on 7 places — Dobra Tea, Double D's, French Broad Chocolate Lounge, Old Europe Pastries, Sunshine Sammies, The Hop, The Soda Fountain.

This is the same class of defect as the DC class-missing bug, one level down: not an undeclared key but an undeclared value. The schema note warns that a key the schema does not declare "renders nowhere and rides in no packet." An out-of-enum value has the same failure mode and no validation catches it.

Meanwhile do is declared and used zero times across 38 places. So the category declares a shelf nobody uses and omits one that seven places need.

Proposed: decide which way to resolve it — add sweets to the enum, or re-file those seven as eat. Then add enum-value validation, which is a one-rule change that would have caught this in July.

6.2 The join is mostly not made

The schema calls ref "the join replaces duplication." Here the join is absent on more than half the items, so the itinerary and the shelves are effectively two unconnected documents. DC had the same shape less severely (18 of 53 places orphaned). Proposed: warn when a place is referenced by nothing, and when a plan_item naming a place in its title has no ref.

6.3 Declared fields, never filled

Across 38 places and 14 plan items, these declared fields are filled zero times: lat, lng, area, address, for, skip, stops, stop_groups, getting_there, slot, alt, alt_kind, outcome, outcome_note.

lat/lng is the one with a visible consequence: its prompt says it "powers Nearby distance sort," so Nearby does not work for Asheville at all. DC has 48 of 53 filled because of a dated backfill pass on 2026-07-24 — the same day Asheville was migrated, which did not receive one.

6.4 Undeclared keys — the same set, minus the two that matter

Every Asheville entry carries created, id, list, order, seed_note, sources, status, updated, visuals — none declared by the schema, exactly as in DC. sources and visuals are filled on 0 of 61, same as DC.

The interesting difference: Asheville has no provenance and no confidence at all. Both were invented later. So the DC finding — that the two richest authored fields in the corpus are declared by no schema — has a corollary here: they are also unevenly present, and any tooling that assumes them will silently treat Asheville as a guide where nothing was ever decided. The changelog already does exactly this, reporting "61 of 61 entry changes carry no stated reason."

7. Which trip rules should graduate

Still zero, and Asheville cannot change that.

The guide has no trip_rules — the concept postdates it. The DC analysis held all four DC rules at n=1 pending a second instrumented trip. Asheville is not one: it has no outcomes to test a rule against and no rules of its own to compare. Rule graduation waits for the next trip that records outcomes on the road.

One near-miss worth noting: your DC account said "we tried to account for this after Asheville but obviously need more checks" about closures — so Asheville did teach a lesson that was carried forward informally and never written down anywhere. There is no Asheville entry, note, or commit recording it. If you want it in the record, it would have to be authored now, from memory, and marked as such.

What already changed today

Noting this so I do not re-propose it, and because it is the first evidence the loop works: not_taken was added to the outcome enum in commit 33b212a (2026-08-08, 21:00), which was §6.6 of the DC analysis. Ten DC alternates were re-marked from skipped to not_taken — and d6-blagden was correctly left as skipped, because its note reads "Sadly ran out of time." That is the distinction doing exactly the work it was proposed to do.

Consequence worth flagging: the DC analysis's headline totals are now stale. It reported "17 skipped"; the corpus now holds 6 real skipped + 1 alternate skipped + 10 not_taken. A framework change silently invalidates the numbers in every prior analysis that quoted the old shape. That is an argument for the ledger recording which analyses its changes invalidate — worth adding to the post-mortem loop spec.

What the record could not tell me

Everything in §2, §3, §4, and most of §1 — but the causes are worth separating, because they need different fixes:

  1. Not instrumented at the time. No outcomes, no provenance. Unrecoverable; only affects future trips.
  2. Authored after the trip. Entries first committed 24 July for a trip that ended 18 July, so even a perfect outcome log would be measured against a reconstruction. This is the DC day-four problem at whole-guide scale, and it is why backfilling Asheville outcomes now would manufacture false evidence rather than recover real evidence.
  3. Not asked. No brief, no roster, no per-traveler account. This one is still open — four short notes would close it, and it is the only part of this post-mortem that can still be completed.