Skip to content

HUB-047 stage 2: question set, nugget reference and annotation prompts - #17

Merged
funsaized merged 1 commit into
mainfrom
hub-047-nugget-artifacts
Aug 14, 2026
Merged

HUB-047 stage 2: question set, nugget reference and annotation prompts#17
funsaized merged 1 commit into
mainfrom
hub-047-nugget-artifacts

Conversation

@funsaized

Copy link
Copy Markdown
Owner

The artefacts you asked to have committed, so an LLM can score from them.

What's in

File What
tests/fixtures/answer_eval_questions.json 15 questions — 8 job-scoped, 7 over bounded topic/tag filters
tests/fixtures/answer_eval_nuggets.json q-nginx-buffering annotated: 15 nuggets, 7 vital, each with its source span
tests/prompts/nugget_extraction.md the annotation prompt — remaining 14 questions are a mechanical run
tests/prompts/nugget_assignment.md the scoring prompt + how the numbers combine
tests/validate_answer_eval_nuggets.py verifies every span verbatim against the corpus

All 15 spans verify. Annotated by a different model family than the qwen3.5:9b under test, mined from documents resolved by scope, zero metered judge calls.

Three things the design didn't anticipate

  1. Unfiltered corpus questions can't be annotated at all. The scope is 679 documents / 44 MB — too large to read exhaustively, and any sampling reintroduces exactly the relevance judgement the document-scope rule exists to exclude. Corpus coverage is measured over bounded topic/tag filters instead, which exercise the same corpus-wide path from HUB-043. Recorded in the fixture as excluded_scopes, not dropped silently.
  2. Span verification needs Unicode folding to be usable. Curly quotes, em dashes and non-breaking spaces defeat literal comparison on text that is genuinely present. Folding them doesn't weaken the rule — the span must still appear word for word — but without it the guard rejects correct nuggets and gets switched off.
  3. The first annotated scope is 39% noise. Job aa216228 retained four dictionary/thesaurus entries for the word "consequence", an API-gateway boilerplate stub and a 404 page: 7 of 18 documents carry nothing on Nginx. That's a screening finding worth its own look — how did "consequence" enter the query plan? It also makes this question a genuine test of finding signal in a noisy scope.

Honesty guards, asserted by test

  • The nugget set is machine-annotated and not yet spot-checked; the fixture says so and a test keeps that disclosure present.
  • validate_answer_eval_nuggets.py imports nothing from app/ — asserted by AST inspection, so nuggets can never be built from what retrieval surfaced. That self-reference is what mechanically produced perfect recall for one published configuration (arXiv:2608.03860).

Verification

422 tests + 622 subtests green in-container (17 new). Span validation run read-only against the live corpus: 15 verified, 0 failures. No deployed container recreated.

🤖 Generated with Claude Code

…mpts

Stage 2 of HUB-047: the artefacts an annotator and a scorer both consume.

- tests/fixtures/answer_eval_questions.json -- 15 questions, 8 job-scoped and
  7 over bounded topic/tag filters.
- tests/fixtures/answer_eval_nuggets.json -- q-nginx-buffering annotated, 15
  nuggets (7 vital), each carrying the document span it came from.
- tests/prompts/{nugget_extraction,nugget_assignment}.md -- the two prompts,
  so the remaining 14 questions are a mechanical run.
- tests/validate_answer_eval_nuggets.py -- verifies every span verbatim
  against the corpus. All 15 verify.

Annotation used a model from a different family than the qwen3.5:9b under
test, mined from documents resolved by scope, at zero metered judge cost.

Three findings the design had not anticipated. Unfiltered corpus questions
cannot be annotated at all: the scope is 679 documents and any sampling of it
reintroduces the relevance judgement the document-scope rule exists to
exclude, so corpus coverage is measured over bounded filters and the exclusion
is recorded in the fixture rather than dropped silently. Span verification
needs Unicode folding to be usable -- curly quotes and em dashes defeat literal
comparison on text that is genuinely present -- without weakening the rule that
the span must appear word for word. And the first annotated scope is 39%
noise: four "consequence" dictionary entries, a boilerplate stub and a 404
page among 18 retained documents, which is a screening finding worth its own
look.

The nugget set is machine-annotated and not yet spot-checked; the fixture says
so, and a test asserts that disclosure stays present. A second test asserts
the validator imports nothing from app/, so nuggets can never be built from
what retrieval surfaced.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@funsaized
funsaized merged commit ee8c5c7 into main Aug 14, 2026
4 checks passed
@funsaized
funsaized deleted the hub-047-nugget-artifacts branch August 14, 2026 16:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant