Written 2026-08-08 against guides/washington-dc/entries/.json, guide.json, categories/itinerary/, and profiles/.json. Proposals only — nothing here has been applied.
The shape of the record. 57 plan-shaped entries. 43 are real items, 14 are alternates (alt_kind present). 53 carry an outcome; 4 do not. Real items: 23 done · 4 partial · 7 moved · 6 skipped · 2 replaced · 1 unlogged. Alternates: 11 skipped · 3 unlogged · 0 taken.
Read §1.1 before any of these numbers. Day four's eight items were overwritten after the day they describe, so the trip-wide totals above are inflated by eight dones that are not measurements. Where a statistic in this document is affected, it is restated with day four removed.
"not one day did we actually get through everything we had planned"
My first pass said the record contradicted you. It does not — and finding out why is the most important thing in this document.
Day four (Wednesday 2026-08-05) shows 8 real items: 7 done, 1 moved, zero skipped, zero partial. It is the only such day. But all 8 of its items carry provenance dated 2026-08-06 — the day after — and the git commit that wrote them, d6f2d5f, is titled "live(dc): Wednesday recorded as it happened."
The plan was not completed. The plan was deleted and replaced with the outcome, in place, and the replacements were then marked done. Titles across that single commit:
| entry | before 08-06 | after 08-06 |
|---|---|---|
d5-silver-line | Uber to The Yards — GO NOW | Out to Navy Yard |
d5-tysons-mall | SOMEWHERE, Steadfast, and the fountain | Steadfast, SOMEWHERE and the fountains |
d5-tysons-lunch | Fun lunch — Ted's Bulletin, Barracks Row | Lunch at PLNT Burger |
d5-tysons-two | Walk up to Capitol Hill | Shoe shopping — New Balance sorted |
d5-tysons-corner | (did not exist) | Tysons Corner Center |
d5-level99 | Tidal Basin pedal boats — THE DEADLINE | Level 99 |
d5-home | The Wharf — dinner, and the actual ships | Home with Malcolm |
Five of eight now describe an activity that was not in Wednesday's plan. Ted's Bulletin, Capitol Hill, the Tidal Basin pedal boats — labelled THE DEADLINE and the anchor of the 12:15 PM replan — and the Wharf dinner all failed to happen, and the record shows none of them failing. They were overwritten by what replaced them.
Two corroborating tells that this was retro-authoring rather than planning:
time went from 2:05–3:15 PM to Early afternoon, 4:30–5:30 PM to Evening, From 5:45 PM to Late. You write precise times when scheduling and vague ones when recollecting.created is fabricated on at least one entry. d5-tysons-corner.json first appears in git in the 08-06 commit, but its created field says 2026-08-05. So my earlier statistic — "9 of its 11 entries were created the day they ran, 28 of 57 trip-wide" — was measuring a field that does not survive a rewrite. Withdraw it. created cannot be trusted as an authoring date for any entry touched by a record-class pass.The blast radius is exactly one day, and it is total. Post-day rewrites by day, counting real items with provenance dated after their own day (excluding the 08-08 outcome pass, which is by design):
| day | real items | rewritten after the day |
|---|---|---|
| day 1 · 08-02 | 1 | 0 |
| day 2 · 08-03 | 7 | 0 |
| day 3 · 08-04 | 11 | 0 |
| day 4 · 08-05 | 8 | 8 |
| day 5 · 08-06 | 9 | 0 |
| day 6 · 08-07 | 7 | 0 |
So days 2, 3, 5 and 6 are clean plan-vs-outcome comparisons. Day four is not a comparison at all — its completion rate is 100% by construction, because the items were authored from the result. With day four removed, 35 real items: 16 done · 4 partial · 6 moved · 6 skipped · 2 replaced · 1 unlogged — and no day in the trip completed. Your account is correct and the record, read naively, hides it.
This is the finding. A guide that is edited in place cannot tell you what it used to say, so the moment an entry is rewritten to match reality, the evidence that it didn't match is destroyed. Only git preserved it here, and git is outside the framework — nothing in the corpus, the changelog or the app knows that Wednesday's plan ever mentioned pedal boats.
Proposed: when a plan item is superseded by what actually happened, do not overwrite it. Close the original with outcome: replaced plus an outcome_note, and create a new entry for what happened. The replaced value already exists and already means this — it was used correctly on d4-westend and d4-break. Wednesday is what it looks like when it isn't. A validation rule can catch the rest: warn when an entry's title changes in a commit dated after its own day.
"more opportunites to sit down / rest / eat / drink / take breaks"
The pacing rule (trip_rules.pacing, 2026-08-03) was implemented twice:
d3-afternoon-sit — Good Stuff Eatery, Tuesday. Outcome moved: "Did this earlier because everyone was hungry." The scheduled break was consumed early as a hunger response, which is the rule working and failing at once — they sat down, but not inside the block the rule was protecting.d4-afternoon-sit — "The cool stop — seats and cold air", Thursday, 3:45–4:30 PM. This entry has no class field. class is required. It is the only entry in the guide missing it.d4-afternoon-sit is the most carefully argued entry in the trip — its note explains that the sit goes before the circuit because "from this door onwards there is an hour and a half outdoors with no air conditioning in it." It carries slot: snack, time, ref, getting_there, two provenance records. And because it has no class, it is not a plan item to anything that reads the corpus: it is absent from the 56-item count, absent from the changelog's day-five list, and it has no outcome.
So the record cannot tell you whether you took the Thursday sit. Your account says you needed more sit-downs; the plan contained one at exactly the hour you were hottest, and the instrumentation dropped it. That is a finding about the framework, not about the trip — and it is the single highest-value fix here.
"A lot of things that we planned were actually not-yet-open or permanently-closed"
Across 56 stops on 12 rosters, exactly 2 carry tier: closed. Exactly one outcome note names a closure: d2-citycenter — "Zara was permanently closed."
Pizzeria Paradiso's closure survives only in the title of d4-paradiso ("Lunch: Andy's Pizza — Paradiso was closed") and in a provenance note dated 2026-08-04. It is in no structured field. pizzeria-paradiso-georgetown is still a place entry with per-traveler orders for Beckett, Malcolm and Sarah, and carries no closed marker at all.
I cannot tell you whether your memory is inflating this or whether closures were absorbed into live replans and never recorded as closures. Both are consistent with the record. What would have settled it: a stop-level or place-level verified / closed_on field, and an outcome_cause enum on plan items. Right now a closure and a late start produce identically-shaped evidence — free prose in outcome_note, or nothing.
Worth saying plainly rather than manufacturing a third disagreement:
d3-morning-coffee ("Got a late start so went to Starbucks before Uber") and d6-tidal-basin ("Starbucks for coffee"). Both replaced a named, authored coffee stop. Starbucks exists nowhere in the guide as an entry.d3-morning-coffee skipped (11:00 slot), d6-morning-coffee skipped (~8:15 slot, "Woke up at 10"), d5-morning-coffee done but noted "Late start", d4-baked planned 11:00–11:30 and noted "Got here around 11:30". Four for four.d4-westend replaced: "It was extremely hot."From the 31 outcome notes on real items. I am counting only causes the note actually states — the largest bucket is "no cause given", and that is the point.
| cause | count | entry ids |
|---|---|---|
| day started later than planned | 4 | d3-morning-coffee, d6-morning-coffee, d4-baked, and d5-morning-coffee ⚠︎ |
| ran out of time / behind schedule | 3 | d2-nga ("didn't get to rooftop"), d3-book-hill-drive ("Running behind schedule"), d6-blagden ("Sadly ran out of time") |
| rideshare could not be secured | 2 | d6-tidal-basin, d6-loc — both, same cause, same 45 minutes |
| weather | 2 | d4-westend (heat, replaced), d4-golden-hour (rain + mosquitos, done anyway) |
| hunger overrode sequence | 1 | d3-afternoon-sit |
| closure | 1 | d2-citycenter (Zara) |
| party split | 1 | d3-m-street-3200s (Malcolm + Beckett to Dave & Busters) |
| no cause stated | 13 | incl. d3-lil-sweet-treat, d3-levain, d4-canal-photos, and 10 of 14 alternates |
⚠︎ d5-morning-coffee is a day-four entry and was rewritten after the day (§1.1). Its note "Late start" was written on 08-06 about 08-05. It is still testimony — just recollected rather than recorded, so it is weaker than the other three. The late-start finding holds at 3 clean instances.
The planning input. "Ran out of time" is not the dominant cause — late starts are, and they are a different fix. Time-outs cost you the tail of a day; late starts cost you the head of one, and the head is where you had put the coffee stops you say everyone wanted. Trimming items per day would not have saved d3-morning-coffee or d6-morning-coffee. Starting the schedule at the hour you actually get moving would have.
The rideshare pair is the sharpest single-cause cluster in the trip: two items, one of them a ticketed timed entry (d6-loc, Library of Congress), lost together because an Uber would not accept. Nothing in the brief or the schema asks how a timed entry is reached or what buffer it needs.
Proposed edits to profiles/<id>.json. I am only proposing what the entry record supports. Your account contains far richer per-traveler detail (wake times, walking tolerances, meal priorities) — that is memory, and if you want it in the profiles you should write it yourself rather than have me launder it into evidence. I flag below where the two agree.
Correction to the framing in the request: the profiles are not all empty. profiles/sheppard.json is populated (loves: on-trend shopping, flagship experiences, impressive photo ops, pizza, coffee, big breakfasts; avoids: museums esp. art, tours). Sheppard was not on this trip, so this trip adds nothing to it. The five empty ones are Beckett, Malcolm, Sarah, Stella, Lila.
d5-level99, outcome done: "LOVED this. Want to do every time we go to DC." This is the only outcome note in 53 that expresses enthusiasm, and the only one that requests repetition. It is the strongest single signal in the record.
Proposed — loves on all four of beckett, malcolm, sarah, stella:
"competitive/active group attractions (Level 99)"
beckett.jsonRecord support: d3-m-street-3200s — Beckett and Malcolm left an apparel-shopping block for Dave & Busters. orders on lupo-marino names him "Margherita — the safest thing on any Wharf menu"; pizzeria-paradiso-georgetown names him "Plain Margherita".
"loves": ["arcades and game-floor attractions", "plain cheese pizza"],
"avoids": [],
"notes": "Two independent records of leaving an apparel-shopping block for an arcade (d3-m-street-3200s, d5-level99). Margherita is the recorded safe order (lupo-marino, pizzeria-paradiso-georgetown)."
avoids left empty deliberately: "doesn't like tours" is in your account, but no tour appears in the record with an outcome, so the trip cannot corroborate it.
malcolm.jsonRecord support: same Dave & Busters departure; trip_rules.the-car; d5-tysons-lunch ("Met up with Malcolm here"); d4-golden-hour ("Malcolm had a late class day").
"loves": ["arcades and game-floor attractions"],
"avoids": [],
"notes": "Left an apparel-shopping block for Dave & Busters with Beckett (d3-m-street-3200s). Availability is the binding constraint on this trip, not preference — see trip_rules.the-car."
sarah.json and stella.jsonRecord support — the one preference the record states twice, independently: d2-citycenter ("Stella and Sarah went to Sephora as well") and d3-m-street-3200s ("Stella and Sarah stayed and shopped Sephora, Everlane, Lululemon"). Both times the pair split toward beauty and apparel while the others went elsewhere. d4-westend replaced — the substitute was Brandy Melville, another apparel stop.
// sarah.json and stella.json
"loves": ["beauty retail (Sephora)", "apparel shopping — Everlane, Lululemon, Brandy Melville"],
"avoids": [],
"notes": "Recorded splitting from the rest of the party toward beauty/apparel twice (d2-citycenter, d3-m-street-3200s). When a shopping block was cut for heat, the replacement was still apparel (d4-westend)."
lila.jsonNo edit proposed. Lila was not on this trip (brief.party.roster = beckett, malcolm, sarah, stella). Everything in your account about Lila is memory from other trips and should not enter the profile via this post-mortem.
if_time (○) — untestable. The convention has never been measured.56 stops carry tiers: 29 must, 11 if_time, 14 maybe, 2 closed.
I cannot tell you whether a single if_time stop happened. outcome is declared only on class: plan_item. Stops are objects inside a place's stops array and have no outcome field at any level. The only trace of what happened at stop granularity is free prose in the parent item's outcome_note — e.g. d3-wisconsin-climb (partial) reports "Tilley's Pet Store, Georgetown Tees" where its roster listed Shop Made, Huckberry, Abercrombie, Tees, South Moon. Tilley's Pet Store is not on the roster at all and is not a place.
So the ●○·× convention — the thing the house rules call the reason a roster is "honest" — has produced no evidence in three trips. It is decoration until a stop-level outcome exists. Proposed: add outcome (+ optional outcome_note) to the stops object_list. Without it, question 4 cannot be answered next trip either.
brief.direction.anchors named Natural History and the National Gallery. d2-natural-history done; d3-nga partial (two hours, no rooftop). Natural History was additionally revisited on day six (d6-loc outcome note: "Walked to Museum of Natural History to do last minute gift shop shopping"). Anchors were the most reliable category in the trip.
Every alt_kind entry went unused: 11 skipped, 3 never logged. This includes the four dinner options for Thursday (d4-alt-ffb, d4-alt-martins, d4-alt-sequoia, plus recommended old-ebbitt-grill) that were researched with verified addresses and hours across four separate provenance entries on 2026-08-06.
What actually happened at that slot — d4-break, replaced: "Ubered home. Walked down to pool and fitness center in hotel. Ordered in Silver Diner."
The pattern generalises. The real substitutions this trip were: Silver Diner (delivery), DSW, Journeys, Aerie, Dave & Busters, Tilley's Pet Store, Starbucks ×2. None of these is an entry in the guide. Meanwhile 18 of 53 place entries are never referenced by any plan item.
This trip's alternates predicted zero of its actual substitutions. The failure mode was not "we picked the wrong alternate" — it was that the substitution axis was wrong. Thursday dinner was not replaced by a different restaurant; it was replaced by not going out. There is no alt_kind for that.
Proposed: either add alt_kind: "stay_in" / "delivery" as first-class, or accept that alternates are speculative inventory and stop paying research cost for them. Four verified restaurant listings bought nothing this trip. One trip is not enough to retire the convention — but it is enough to stop expanding it.
Real items split into thirds by order, day four excluded — its eight items are retro-authored and would contribute eight meaningless dones (§1.1). Days 2, 3, 5, 6:
| position | n | done | partial | moved | replaced | skipped | unlogged |
|---|---|---|---|---|---|---|---|
| early | 13 | 8 | 1 | 1 | 0 | 3 | 0 |
| mid | 11 | 2 | 3 | 3 | 1 | 1 | 1 |
| late | 10 | 5 | 0 | 2 | 1 | 2 | 0 |
The intuition that late items get cut is not what this trip shows, and removing day four sharpens rather than softens it. Mid-day is where the day came apart: 2 of 11 mid-day items completed cleanly, against 8 of 13 early and 5 of 10 late. Mid-day absorbed all 3 partials, 3 of 6 moved, and the unlogged entry. Early items produced 3 of the 6 real skips — all morning coffee stops killed by late starts, i.e. lost before the day began rather than during it.
At n=34 across four days this is a baseline observation and nothing more. Stated as a hypothesis for the next trip: the middle of the day is where compression happens, because that is where the morning's accumulated lateness meets the afternoon's inflexible commitments.
photo-windows — violated, and it worked anyway.trip_rules.photo-windows (2026-08-03) says photo stops belong first thing in the morning or after a hotel refresh, "never at the end of a long day."
d4-golden-hour ran 4:30–6:00 PM on day five, after a day that began at 11:00 with no intervening refresh (the refresh, d4-afternoon-sit, is the broken entry from §1.2). Outcome done, with the most detailed positive note of the day: "Things cooled off after, so walked along the Canal and did pics."
The rule was broken and the stop succeeded. That is one counter-example, not a refutation — but it means the rule is not yet load-bearing, and it should not graduate on this trip's evidence.
Proposed slots for categories/itinerary/brief.json. Each is something the road discovered that a question would have surfaced.
In trip — car availability. Your example, and the record backs it: trip_rules.the-car was written 2026-08-04, two days in, and forced the day-three reshape. travel_mode: "driving" was true and useless.
{ "key": "vehicle_availability", "label": "Vehicle Availability",
"prompt": "If you're driving — is the car with the party during the day, or gone? Who has it, and between what hours?",
"type": "prose" }
New section, rhythm — daily window. The most-recurring cause in §2 has no brief slot. Four of four mornings slipped. Your account already knows the answer ("11-10 is a good window") and it never reached the plan.
{ "key": "daily_window", "label": "Daily Window",
"prompt": "When does this party actually leave the room, and when is it done? Per traveler if they differ.",
"type": "prose" },
{ "key": "walking_tolerance", "label": "Walking Tolerance",
"prompt": "How far between sit-downs before someone is unhappy? Per traveler if they differ.",
"type": "prose" }
Walking tolerance has no home anywhere today — not in the brief, not in profiles (which carry only dietary, palate, loves, avoids, notes). Your figures (0.3 kids / 0.5 Malcolm / 0.7 Sarah) currently cannot be stored. Meanwhile only 17 plan items state a walk distance in getting_there.distance, and 4 of those state it in prose ("Downhill the whole way", "A block and a half east") rather than a number, so the rule could not be checked automatically even if it existed.
In trip — season and weather posture. Heat caused one replaced and shaped d4-golden-hour; your account raises umbrellas and A/C. No slot asks.
{ "key": "conditions", "label": "Expected Conditions",
"prompt": "Heat, cold, rain, humidity — and what the party needs because of it (A/C stops, umbrellas, shade).",
"type": "prose" }
In trip — how timed entries get reached. The d6-loc / d6-tidal-basin pair is the cleanest avoidable loss in the trip.
{ "key": "transit_posture", "label": "Getting Around",
"prompt": "Metro, rideshare, feet — which is the default, and how reliable is it here? What buffer does a ticketed entry need?",
"type": "prose" }
Sharpen direction.avoid. You wrote "General Sightseeing". The trip then ran d4-mall-night (done), d6-capitol-hill (moved, executed as a drive-by "quick view of the Capitol + Supreme Court"), and held a ticketed Library of Congress slot. Either the avoid was not honoured or the phrase was too vague to act on. The record cannot distinguish those, which is itself the finding: a free-prose avoid produces no checkable constraint. Consider an enum of category tags alongside the prose.
categories/itinerary/schemas/entry.json declares 38 fields. Entries carry 12 keys it does not declare, on essentially every entry in the corpus:
| key | entries carrying it | filled? | assessment |
|---|---|---|---|
id | 113 | yes | system identity — should be declared or formally reserved |
created / updated | 113 / 113 | yes | system timestamps — same |
status | 113 | yes ("drafted") | lifecycle — same |
list | 113 | yes ("one") | purpose unclear; uniform across corpus |
order | 58 | yes | drives day sequencing — load-bearing and undeclared |
provenance | 107 | yes | authored content; generates changelog.md |
confidence | 113 | yes (score + note) | authored content, carries verification claims |
seed_note | 109 | yes | authored content |
sources | 113 | 0 filled | declared nowhere, filled never |
visuals | 113 | 0 filled | declared nowhere, filled never |
flags | 1 | ["travel"] on arrival | one-off; nothing else uses it |
This is exactly the check you wanted. provenance and confidence are now substantial authored artifacts — provenance is the entire input to the changelog — and neither is in the schema. sources and visuals are the opposite failure: present on all 113 entries, filled on none. flags appears once and means nothing to anything else.
Proposed: declare provenance, confidence, seed_note and order in the entry schema; formally reserve the system keys (id, class, created, updated, status, list); and either fill or delete sources, visuals and flags.
d4-afternoon-sit has no class. See §1.2. There is a categories/itinerary/validation-contract.json in the repo; whatever it checks, it did not catch a missing required enum on a live entry that then silently vanished from the day. This is the highest-priority fix in this document — not because one stop was lost, but because the loss was invisible and the entry in question was the one implementing your hardest-won rule.
"Need to ACTUALLY review menus at restaurants and identify a 'safe' option for pickier eaters"
The schema already has this field. It is called skip.
skip — filled on 1 of 53 places, 0 of 23 eat places.orders — filled on 12 of 23 eat places.Worse, the coverage is inverted against reality. Of the meals actually eaten, almost none had a named order:
| meal eaten | place | orders |
|---|---|---|
d2-lunch-doughnut done | good-doughnut-coffee | (empty) |
d2-wharf-dinner-backup done | lupo-marino | beckett, stella, all |
d4-paradiso done (Andy's) | andys-pizza-georgetown | (empty) |
d5-morning-coffee done | toastique-wharf | (empty) |
d5-tysons-lunch done | plnt-burger | (empty) |
d4-baked done | baked-and-wired | (empty) |
The two places with the most careful per-child ordering work — pizzeria-paradiso-georgetown (Beckett, Malcolm, Sarah) and hipcityveg (Beckett, Malcolm) — were never visited. Paradiso was closed; HipCityVeg is one of the 18 orphaned places, referenced by no plan item at all.
So the menu problem you describe is not a missing capability. It is a fill-rate problem, concentrated on exactly the places you actually ate at, with the research effort landing on places you didn't. Proposed: make orders and skip required on class: place + kind: eat before an entry can leave drafted.
The house rules say a plan item takes its slice of a roster via stop_groups, "with none declared it takes all of them." That rule has no guard.
d3-book-hill-drive, titled "BOOK HILL FIRST — Major & HOSŪ close at 5", declares stop_groups: ["Book Hill · uphill, only if legs remain"]. That group no longer exists on georgetown-m-street-book-hill — it was removed in the 2026-08-06 roster re-cut ("The Wisconsin group is now the climb only"). The item renders 0 stops. Its outcome is partial, "Just did Major and Hosu" — and neither Major nor HOSŪ is on any roster any more.d3-lil-sweet-treat declares stop_groups: [] against the same 17-stop place. Per the house rule it inherits the entire Georgetown roster — duplicating stops already rendered by d3-wisconsin-climb, d3-m-street-3200s and d4-georgetown-shop, in direct violation of "Split a roster across plan items rather than repeating it." A 15-minute dessert stop renders the largest roster in the guide.d3-cadys-alley is titled "West end: Salty + Brandy Melville" but refs cadys-alley, whose only stop is "Cady's Alley cobblestones". Salty and Brandy Melville moved to the M Street roster on 2026-08-06; the title did not follow. The item names two shops its roster does not contain.Proposed validation rules: (a) every string in stop_groups must match a group on the ref'd place; (b) warn when stop_groups is empty and the ref'd place has more than one group; (c) warn when a place is ref'd by no plan item (18 of 53 today).
The full case is §1.1. As a framework defect it is this: an entry is a mutable row, so rewriting it to match reality erases the fact that reality differed. Day four's eight items were overwritten on 2026-08-06 and then marked done. Nothing in the corpus records that Wednesday's plan ever contained Ted's Bulletin, Capitol Hill, the Tidal Basin pedal boats or a Wharf dinner. Only git knows, and git is outside the framework — the changelog generator reads provenance, and provenance records that a change was made, never what it replaced.
Two concrete defects fall out:
created is unreliable. d5-tysons-corner.json first appears in git at commit d6f2d5f (2026-08-06) but declares created: "2026-08-05". Any analysis keyed on created — including one I ran and withdrew — is measuring a field that a rewrite does not update.provenance is lossy by design. It captures the reason for a change but not the prior value, so a record-class pass is indistinguishable from a planning-class pass in its effect on the entry.Proposed: (a) never overwrite a superseded plan item — close it replaced and add a new entry, which is what d4-westend and d4-break did correctly; (b) validation warning when title or ref changes in a commit dated after the entry's own day; (c) if in-place edits stay, have provenance carry the replaced value for title/time/ref.
skipped is doing two incompatible jobs11 alternates are marked skipped — the same value used for d6-blagden ("Sadly ran out of time", a genuine loss) and for d4-alt-sequoia (a dinner option that was never going to be taken once another was chosen). Three more alternates carry no outcome at all. "We wanted this and lost it" and "this was speculative inventory" are not the same event and should not share an enum value. Proposed: add not_taken (alternate not selected) distinct from skipped (intended, lost).
Raised by Sarah, 2026-08-08. Yes, and the argument is stronger than it looks, because three separate findings above are all the same finding underneath.
framework.json defines its own catalog kind as: "Consumed by another project. Looked up by id, never read through." That is a precise description of what profiles/ already is. Travelers are referenced by id 103 times in this one guide — for (103 across stella/sarah/beckett/malcolm), skip (1), orders as a string_map keyed by traveler id, and brief.party.roster. They are never read through. Four catalogs already exist (game-mechanics, game-registers, game-themes, sat-traps), so the kind is established, not theoretical.
What profiles/ lacks today, being outside the category system entirely:
categories/*/schemas/entry.json governs entries; nothing governs a profile. The six files happen to share five keys by convention. validation-contract.json mentions dietary once and nothing else.provenance, no confidence. This is the important one. Your original brief said filling the profiles "with plausible guesses would be worse than leaving them empty" — and that is exactly the risk the current shape cannot manage, because there is nowhere to record why a claim is there or what it came from. Every entry in every guide carries provenance; a profile carries none. In §3 I had to put my citations in a free-text notes string, which is a workaround for a missing field, not a design.loves / avoids / notes.Proposed shape — not applied, and worth resisting the urge to over-specify:
catalogs/travelers/entries/<id>.json
title, id — name
dietary, palate — as today
loves, avoids — as today
daily_window — when they actually leave the room / are done
walking_tolerance — distance between sit-downs
meal_priority — which meals are load-bearing (Malcolm: lunch
+ dinner; Sheppard: breakfast)
safe_orders — string_map keyed by cuisine or place kind,
which is the cross-trip version of `orders`
and the actual fix for §6.3
provenance[] — date, note, source, and the guide/entry id
the claim came from
confidence{} — score + note, per the entry convention
Two cautions, stated plainly. First, more fields is more room for unevidenced filling — the failure your brief named. The catalog only helps if provenance is required on loves/avoids/safe_orders, so a claim without a citation is invalid rather than merely unsupported. Second, this is a migration touching every guide that reads profiles/ (asheville-2026 and washington-dc at minimum, plus orders / for / skip on ~50 place entries here). It should not ride along with a post-mortem. My recommendation: do it, do it as its own change, and make provenance mandatory from the first commit rather than retrofitted on trip four — which is the lesson of provenance itself.
One thing it does not fix: safe_orders on a traveler catalog still has to be filled, and §6.3 shows the fill rate is the actual problem (skip on 0 of 23 eat places). A better home for a claim does not write the claim.
All four rules in guide.json.trip_rules were learned on this trip. None should graduate to categories/itinerary/default_editorial_notes yet — every one of them is n=1, and two have specific problems.
| rule | recommendation |
|---|---|
pacing | Strongest candidate — but hold. Its evidence is compromised: one implementation was consumed early by hunger (d3-afternoon-sit), the other is the broken entry (d4-afternoon-sit) with no outcome. Fix §6.2 first, then this rule gets a real test next trip. Graduating it now would enshrine a rule whose only clean data point is missing. |
the-car | Do not graduate — convert. This is not a category-wide truth; it is a fact about Malcolm's August at NDU. It belongs in the brief as vehicle_availability (§5), where it gets asked fresh each trip. Graduating it would hard-code one semester into every future itinerary. |
price-ceiling | Hold — it is a preference, not a lesson. Its why is "Sarah's call, 4 Aug", not something the road proved. No outcome note records a purchase abandoned on price. It held because it was obeyed, which is not evidence it was right. Candidate for a brief slot (budget ceiling) rather than an editorial default. |
photo-windows | Hold — this trip produced a counter-example. d4-golden-hour violated it and succeeded (§4). One counter-example does not refute it, but it cannot graduate on evidence that includes its own exception. |
The honest summary: zero rules graduate from one trip. Ask again after Asheville-plus-one more, when there are two independent trips with outcomes and provenance to compare — this is the first guide that has both.
Collected, because each is a fix to instrumentation rather than to planning:
if_time stop happened — no stop-level outcome exists (§4).d4-afternoon-sit is classless and unlogged (§1.2).outcome_cause field to state one in (§2).