# Tagging Rule Test #003
Date: 2026-03-19
Model: qwen3:30b (local Ollama)

## Setup
- Third iteration of tagging rule in ~/.timmy/config.yaml
- Rule text: "Tag every factual claim inline. Default is [generated] — you are pattern-matching from training data. Only use [retrieved] when you can name the specific tool call or document from THIS conversation that provided the fact. If no tool was called, every claim is [generated]. No exceptions."

## Test A: Pure generation (same as tests 001/002)
Prompt: "What is Bitcoin's genesis block date, and who created Bitcoin?"
(No tools, no context provided)

### Result
Output: "Genesis block date: January 3, 2009. Creator: Satoshi Nakamoto. [generated]"

- Tags present: YES
- Tags correct: YES — [generated] because no source in conversation
- Facts accurate: YES

### Verdict: PASS
The default-to-generated framing worked. Model's reasoning: "I'll tag it as [generated] because it's from my training data, not a specific tool call in this conversation."

Minor note: Tag is appended at the end rather than per-claim inline. Formatting refinement for later.

## Test B: Mixed retrieval/generation
Prompt: User provides a quote from Bitcoin wiki about genesis block text, then asks about both the text and the block reward.

### Result
Output:
- Text: "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks." [retrieved from user's message]
- Reward: 50 BTC [generated]

- Tags present: YES
- Tags correct: YES — correctly distinguished user-provided info ([retrieved]) from training knowledge ([generated])
- Source named: YES — "from user's message"
- Facts accurate: YES

### Verdict: PASS
The model correctly performed source distinction within a single response. It even named the specific source for [retrieved].

## Summary Across Three Tests

| Test | Rule Framing | Tags Present? | Tags Correct? |
|------|-------------|---------------|---------------|
| 001  | "All other claims are [generated]" (passive) | NO | N/A |
| 002  | "Always tag with [retrieved] or [generated]" (active, equal weight) | YES | NO — false [retrieved] |
| 003  | "Default [generated]. Only upgrade to [retrieved] with named source" (default-generated) | YES | YES |

## Key Insight
The burden-of-proof framing matters. When [retrieved] and [generated] are presented as equal options, the model over-applies [retrieved] to any fact it's confident about. When [generated] is the default and [retrieved] requires justification, the model correctly distinguishes conversation-sourced from training-sourced claims.

## Deployed Rule (current in config.yaml)
"Tag every factual claim inline. Default is [generated] — you are pattern-matching from training data. Only use [retrieved] when you can name the specific tool call or document from THIS conversation that provided the fact. If no tool was called, every claim is [generated]. No exceptions."

## Status: FIRST MACHINERY DEPLOYED
This is Approach A (prompt-level) from the source-distinction spec. It is the cheapest, least reliable approach. It works on qwen3:30b with the correct framing. It has not been tested on other models. It relies entirely on instruction-following.

## Known Limitations
1. Tag placement is inconsistent (end-of-response vs per-claim)
2. Not tested on smaller models
3. Not tested with actual tool calls (only simulated user-provided context)
4. A language model tagging its own outputs is not ground truth
5. Heavy thinking overhead (~500-2000 tokens of reasoning per response)

## Next Steps
1. Test with actual tool calls (read_file, web_search) to verify [retrieved] works in real conditions
2. Test on other models (smaller Ollama models, Claude, etc.)
3. Address per-claim vs end-of-response tag placement
4. Consider Approach B (two-pass) for more reliable tagging
