3.2 KiB
Claude ownership claim — 2026-08-14
Working from Feature-List-AI-Duoc-thu-V1.md (new file, owner-added this
session): a live 17-query audit against production found 5/26 features fully
passing, plus one reproducible bug (incomplete_answer on any two-section
question, e.g. "Chỉ định và chống chỉ định của Aspirin"). Full audit + plan
were reviewed and approved by the owner before starting
(C:\Users\vuxba\.claude\plans\snug-sparking-goose.md, not in-repo).
Checked WORK_SPLIT_2026-08-10.md (Codex owns rag/**) against the more
recent per-session claims: CLAUDE_CLAIM_2026-08-11.md and
CLAUDE_CLAIM_2026-08-12.md both show Claude editing rag/answer.py /
rag/agent.py directly after that split, each time with an explicit claim
and an explicit "not touching" list rather than treating the 08-10 split as
still absolute. Following that same practice here.
git log confirms production is on current HEAD (4f867aa, "Deploy to
production" succeeded 2026-08-14T04:59:27Z) — three same-day/previous-day
commits (3c6262e, 623fd62, f662835) already fixed adjacent bugs; none
of them touch the scope below.
Work split across 3 branches/PRs this session
- PR1 (this claim, branch
agent/fix-clarify-and-safety-messaging): theincomplete_answerbug fix + 3 small response-text/UI fixes. - PR2 (next): two new read-only endpoints — list sections per drug, verbatim section text.
- PR3 (last): query-history persistence (new Postgres column via additive migration, new endpoint, frontend wiring).
Each will get its own claim update / follow-up entry here as it starts.
PR1 — files claimed now
apps/ai-service/rag/sections.py— add a multi-match helper only;SectionResolver.resolve()'s existing single-match behavior is unchanged (other callers depend on "or nothing at all").apps/ai-service/rag/understanding.py— detect when a turn names ≥2 distinct sections, route to the existingmissing_attributeclarify instead of silently collapsing to one and generating a wrong-scope answer.apps/ai-service/rag/agent.py— vary theout_of_scopemessage (price/vendor/brand vs. genuinely off-topic) instead of one shared string.apps/ai-service/rag/answer.py— fixed, non-generated notice block onlist_mode(condition→drug) answers, same "module constant" pattern as the existingDISCLAIMER.apps/ai-service/tests/test_understanding.py,apps/ai-service/tests/test_section_routing.py,apps/ai-service/tests/test_agent.py,apps/ai-service/tests/test_grounded_generation.py— new/updated tests for the above.packages/ui/src/ChatBubble.tsx— render the existingmessage.disclaimerfield per-message (data already flows end-to-end, just never rendered).
Not touching: rag/service.py, rag/routing.py, retrieval adapters,
ingestion/, or anything under the pre-existing dirty docs/ deletion
block already in the working tree (unrelated restructuring, left alone).
Local-only, no deploy
Per standing instruction: build + test locally only. No push, no PR open/merge,
no deploy without the owner's explicit go for each PR. Postgres backup +
rollback.yml awareness apply to PR3 (the only one with a schema change),
noted in the plan file.