Done-condition: internal/ai/skills implements suggest_side_quests v1 per CTXD PROMPTS.MD section 3
with an embedded prompt template; requests 2x the needed count; returns {name, cuisine, method,
est_minutes, difficulty, reason, cited_regulars, search_query}; validators drop invented citations,
over-long or non-citing reasons, and duplicates of Regulars / Quest log / pending / declined names
(harness dedupe); golden tests with llm.Fake cover a clean batch, an invented Regular citation, a
near-duplicate of a declined dish, malformed JSON repaired once and the rendered prompt; Go quality
floor passes.
What changed
skills.SuggestSideQuests and the suggest_side_quests v1 skill, template prompts/suggest_side_quests.v1.tmpl (checksum recorded).
A malformed reply (bad JSON, missing/null/unknown field, bad enum, empty text, non-positive
minutes, empty batch, or more items than asked) gets the harness's one repair turn. A well-formed
Side quest that breaks a section 3 rule is dropped and listed in Dropped with the rule broken.
Duplicates are found with harness.Deduper against Regulars, Quest log, pending and every
declined name, plus near-identical items in the same batch. Cited names must match a Regular
after harness.Normalize. The reason must be <= 180 characters and name a cited Regular.
Golden tests use llm.Fake and make no network calls. One ARCHITECTURE.md bullet added.
Grounding, the deck and the HTTP API are left to task b4f2558c.
Checks
gofmt -l . (empty), go vet ./..., go test -race -count=1 ./..., CGO_ENABLED=0 go build ./...,
make sqlc-check, web typecheck/test/build - all pass.
Maestro task `85a898e1-f1f5-4414-92f3-3277d86afe90` - "suggest_side_quests skill" (Feature 13: Discover: Side Quest Suggestions).
Done-condition: internal/ai/skills implements suggest_side_quests v1 per CTXD PROMPTS.MD section 3
with an embedded prompt template; requests 2x the needed count; returns {name, cuisine, method,
est_minutes, difficulty, reason, cited_regulars, search_query}; validators drop invented citations,
over-long or non-citing reasons, and duplicates of Regulars / Quest log / pending / declined names
(harness dedupe); golden tests with llm.Fake cover a clean batch, an invented Regular citation, a
near-duplicate of a declined dish, malformed JSON repaired once and the rendered prompt; Go quality
floor passes.
## What changed
- `skills.SuggestSideQuests` and the `suggest_side_quests` v1 skill, template
`prompts/suggest_side_quests.v1.tmpl` (checksum recorded).
- A malformed reply (bad JSON, missing/null/unknown field, bad enum, empty text, non-positive
minutes, empty batch, or more items than asked) gets the harness's one repair turn. A well-formed
Side quest that breaks a section 3 rule is dropped and listed in `Dropped` with the rule broken.
- Duplicates are found with `harness.Deduper` against Regulars, Quest log, pending and every
declined name, plus near-identical items in the same batch. Cited names must match a Regular
after `harness.Normalize`. The reason must be <= 180 characters and name a cited Regular.
- Golden tests use `llm.Fake` and make no network calls. One ARCHITECTURE.md bullet added.
- Grounding, the deck and the HTTP API are left to task b4f2558c.
## Checks
gofmt -l . (empty), go vet ./..., go test -race -count=1 ./..., CGO_ENABLED=0 go build ./...,
make sqlc-check, web typecheck/test/build - all pass.
The skill asks for twice the Side quests needed, using the household
context plus the pending Side quests, through an embedded, checksummed
prompt template. A malformed reply gets the harness's one repair turn.
A well-formed Side quest is dropped (and listed in Dropped) when it
repeats a Regular, Quest log dinner, pending or passed name or an
earlier Side quest in the batch, cites no Regular or one that is not a
Regular, or has a reason over 180 characters or naming none of its
cited Regulars. Golden tests use llm.Fake.
Maestro task 85a898e1-f1f5-4414-92f3-3277d86afe90.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A cited Regular now resolves by exact name (ignoring case and spacing)
first, then by normalized name only when that names a single Regular;
an ambiguous citation drops the Side quest instead of rewriting it to
whichever Regular shared the key (MQ-100-1).
A Side quest name with no words left after normalizing is malformed and
goes through the repair turn, so it can no longer evade the dedupe or
the dinner-name rule (MQ-100-2).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reason check compared normalized names, so a reason naming only
"Beef Chili" passed for a citation of "Easy Beef Chili". Find the
Regulars the reason names with the same find the citations use, taking
the longest run of words at each point, and require a cited Regular
among them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reason check split on white space and trimmed punctuation before
looking a phrase up, so a stored name ending in punctuation could be
trimmed into a different Regular (MQ-100-4) and a name joined to the
next word by punctuation was never seen (MQ-100-5).
A mention of a Regular is now where the reason spells its name, ignoring
case and spacing, with the name's own outer punctuation optional and no
letter or digit just outside it. A mention names its Regular unless a
different Regular's mention covers the same text or more, which keeps a
mention of "Easy Beef Chili" from naming "Beef Chili" (MQ-100-3).
One table-driven test covers the whole matrix.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mention took in the name's trailing or leading punctuation without
checking the border beyond it, so with Regulars "Beef Chili" and "Beef
Chili!" the text "Beef Chili!X" named "Beef Chili!" alone, though the
shared bare mention is ambiguous (MQ-100-6). Punctuation is now taken in
only where the border still holds after it; otherwise the mention stays
the bare name, and stays shared.
Only punctuation and the spacing beside it may be left off a name's ends,
and a combining mark counts as part of its letter, so a stored "Chicken
Cafe" with a decomposed accent is no longer mentioned by "Chicken Cafe",
nor plain "Chicken Cafe" by the accented spelling (MQ-100-7). Symbols are
no longer trimmed either.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mention took in a stored name's leading or trailing punctuation only
where the text repeated the stored spacing exactly, although the rule
says spacing is ignored. With Regulars "Beef Chili !" and "Chili!", the
reason "Like your Beef Chili!" left the first mention at "Beef Chili",
so a citation of "Chili!" passed. Match the punctuation with any spacing
beside it, then apply the same border check to the extended mention.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mention extended over a stored name's optional outer punctuation only
when the reason spelled all of it, so "Like your Beef Chili!" left the
mention of "Beef Chili!!" at "Beef Chili" while "Chili!" extended through
its "!", and neither covered the other. Extend through the longest portion
of the punctuation the reason spells after which the border still holds,
at either end of the name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Maestro task
85a898e1-f1f5-4414-92f3-3277d86afe90- "suggest_side_quests skill" (Feature 13: Discover: Side Quest Suggestions).Done-condition: internal/ai/skills implements suggest_side_quests v1 per CTXD PROMPTS.MD section 3
with an embedded prompt template; requests 2x the needed count; returns {name, cuisine, method,
est_minutes, difficulty, reason, cited_regulars, search_query}; validators drop invented citations,
over-long or non-citing reasons, and duplicates of Regulars / Quest log / pending / declined names
(harness dedupe); golden tests with llm.Fake cover a clean batch, an invented Regular citation, a
near-duplicate of a declined dish, malformed JSON repaired once and the rendered prompt; Go quality
floor passes.
What changed
skills.SuggestSideQuestsand thesuggest_side_questsv1 skill, templateprompts/suggest_side_quests.v1.tmpl(checksum recorded).minutes, empty batch, or more items than asked) gets the harness's one repair turn. A well-formed
Side quest that breaks a section 3 rule is dropped and listed in
Droppedwith the rule broken.harness.Deduperagainst Regulars, Quest log, pending and everydeclined name, plus near-identical items in the same batch. Cited names must match a Regular
after
harness.Normalize. The reason must be <= 180 characters and name a cited Regular.llm.Fakeand make no network calls. One ARCHITECTURE.md bullet added.Checks
gofmt -l . (empty), go vet ./..., go test -race -count=1 ./..., CGO_ENABLED=0 go build ./...,
make sqlc-check, web typecheck/test/build - all pass.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: APPROVED for this exact commit.