Commit History
-
[NOTICKET] fix(knowledge_extraction): rule.txt few-shots stop contaminating the gold set (X23)
Rifqi Hafizuddin +1: Claude Opus 5Two of the four worked examples were lifted from the reference corpus, and they contaminated the measurement in opposite directions. Example 2 used "Waterfall Analysis dapat di-review melalui dua metode" and taught that it is NOT a rule. The gold set records that exact sentence as WATERFALL_TWO_METHODS. The prompt was instructing the model to fail one gold rule by construction, so the branch could not score above 14/15. Example 1 was the inverse and had gone unnoticed: its evidence is gold rule PTY_PRODUCTION_SOURCE verbatim (joint survey / truck count). That is a free hit inflating the score, not capping it. Both are now synthetic, which is the reasoning examples 3 and 4 already carried in the prompt itself. The closing note is generalised: all four are synthetic, so neither an answer nor a NON-answer for a real document leaks in. The gold set was deliberately NOT touched, following the X22 precedent -- the prompt is tuned constantly and the gold is the measuring instrument, so th…7e8614f -
[NOTICKET] feat(knowledge_extraction): output schema v2 — entity ids, links, 16 fields cut
Rifqi Hafizuddin +1: Claude Fable 5Harry's review of the output contract asked for four things: an id on every entity, a formula referenced rather than restated, rules related to formulas, and a smaller schema. All four are adopted. Two defects surfaced while adding the ids, and they matter more than the ids do. Neither existing identifier survived a re-run: `cluster_id` was a frequency-rank ordinal (`#c000` over a list sorted by mention count), so one changed count reshuffled every id after it, and `rule_id` was written by the model, so the same rule could return a different slug next run. The product is an expert working a review queue — if Mas Beta approves 40 entries and a prompt is retuned, unstable ids lose which 40. Approval continuity, not linking, is why these exist. New `ids.py` mints term/formula/rule/brief ids as sha256 over content: never positional, never model-supplied. New `link.py` resolves every reference after the branches run — deterministic, no LLM, no spend — and returns dangle counts rather than…49dfe4d -
[NOTICKET] fix(knowledge_extraction): rule.txt excludes bare equations (X20)
Rifqi Hafizuddin +1: Claude Opus 5The rule branch was spending calls re-extracting equations the formula branch already captures, and dropping the operational prose it exists for. 4 of 8 v2 rule statements were bare equations; in the prototype 0 of 7 were. The cause is not the model. Before rendering, formulas reached it as mangled character-spaced LaTeX and did not read as statements. Rendered to clean prose they read exactly like prescriptive rules, and rule.txt never excluded them -- it defined a rule as "a statement that constrains or directs behaviour", which a formula arguably is. Rendering gained +7.3 recall points on the term filter, so the fix belongs in the prompt, not in undoing the rendering. Three edits. A rule is now PROSE, with a paragraph saying an equation belongs to the formula branch and that "calculation policy" means prose stating how, when or on what basis a calculation applies. A new requirement 3 sets statement to null when the only prescriptive content is a formula. And -- the clause that mat…296cdd7
-
[NOTICKET] fix(knowledge_extraction): show the model the section heading
Rifqi Hafizuddin +1: Claude Fable 5The evidence block sent to the model carried only `chunk.text`, so the section heading never reached it. Two consequences, both silent: - Indonesian standards name the term in the heading and open the body with the definition — "2.1.3 Physical of Availability (PA)" / "Adalah ketersediaan fisik…" — and the body often never repeats the term. The model was being asked to define a term its evidence never named. - It broke the invariant that what the model reads is exactly what the span check searches. `validate.evidence_text` already composed heading + text, so a field quoting a section title would have been rejected as unlocatable — and the model could not have quoted one anyway. Found while verifying the claim in the flow illustration: "Physical of Availability" appeared in the prompt only because the prompt file's own worked example contains that string, never from the document being processed. The deterministic `source_wording` fallback masked the effect, which is why th…a7bdeae
-
[NOTICKET] feat(knowledge_extraction): paid extraction stage + validate, diff, queue
Rifqi Hafizuddin +1: Claude Fable 5Completes every stage that does not depend on the seam. The pipeline now runs end to end: artifact -> filters -> cluster -> rank -> LLM -> validate -> diff -> frequency-sorted review queue. extract/ client on the nano __54n quad; structured output is PROBED not assumed (json_schema, falling back to json_object + validate-retry, recording which applied); cached tokens read from the API, never modelled. Four branches, one call per TERM CLUSTER. Prompts stay as files so the fixed prefix is byte-identical and caching keeps engaging. validate/ span check (whitespace-only normalisation, never repairs, unlocatable provenance rejects every guarded field), escalation, conflict detection by token overlap — explainable to the reviewer, and it never picks a winner. diff/ new / duplicate / conflicting against an explicitly supplied active glossary, so the duplicate and conflicting paths are reachable. The …ab5ea78