# RP-0001: Pre-Implementation Validation for ADR-0007 (MSVL)

**Date:** 2026-04-06
**Status:** Proposed
**Author:** Rafael Ruiz (CTO)
**Executed by:** AI Team (Pablo)
**Related ADR:** ADR-0007 (Mandatory Syntactic Validation Layer)
**Input data:** 6 evaluation runs from 2026-04-06 (`evaluation_*.json`)

---

## Purpose

ADR-0007 defines four implementation decisions: parser gRPC integration, dynamic few-shot injection, N=5 Docker protocol, and syntactic confusion matrix. Before assigning engineering work to any of these, two questions must be answered empirically with data the team already has:

1. **Is the syntactic failure rate structurally predictable?** If failures concentrate in specific question categories or construct types, the few-shot pool and documentation effort can be targeted. If failures are random, the problem is model capability and few-shot injection may not be sufficient.

2. **Does few-shot injection reduce foreign syntax injection before we build the parser gate?** The few-shot change is cheap to test manually. If it eliminates the majority of violations, the urgency profile of the remaining ADR-0007 decisions changes.

These two experiments must be completed and their results reviewed before any ADR-0007 implementation work begins.

---

## Experiment 1 — Syntactic Failure Taxonomy

### Hypothesis

Syntactic violations are not uniformly distributed across question categories. `CODE_GENERATION` questions will show significantly higher violation rates than `RETRIEVAL` or `CONVERSATIONAL` questions, because code generation requires the model to produce executable AVAP syntax rather than describe it. Within `CODE_GENERATION`, violations will concentrate in construct combinations not covered by the current few-shot pool (loops with JSON building, ORM with error handling, multi-function scripts).

### What we already know from the 2026-04-06 runs

The forensic analysis in ADR-0007 identified the following confirmed violations across 6 runs (300 entries total):

| Failure type | Confirmed cases | Dominant model |
|---|---|---|
| Foreign language injection (Go, Python, JS) | 20 | bge-m3, qwen3 |
| Hallucinated AVAP commands | 12 | qwen3, harrier |
| Structural foreign syntax (while, let, var, for) | 8 | bge-m3, qwen3 |

**Critical limitation:** `answer_preview` fields are truncated at ~300 characters. The full response bodies are not available in the JSON files. The counts above are lower bounds.

### Method

**Step 1 — Full response body access.** Re-run `EvaluateRAG` for the two best-performing configurations (harrier/avap-docs-test-v4 and qwen3/avap-docs-test-v4) with a modified `evaluate.py` that logs the complete `answer` field, not just `answer_preview`. This is a one-line change. Run once, not N=5 — this is exploratory, not a benchmarking run.

**Step 2 — Manual taxonomy on CODE_GENERATION entries.** For all 20 `GD-C-*` entries per run, classify each response into one of four categories:

| Category | Definition |
|---|---|
| `VALID_AVAP` | All constructs present are valid AVAP. May be incomplete but syntactically correct. |
| `FOREIGN_SYNTAX` | Contains identifiable syntax from Go, Python, or JavaScript. |
| `INVENTED_COMMAND` | Uses a command name that does not exist in the LRM. |
| `STRUCTURAL_ERROR` | Grammatically wrong AVAP (wrong argument count, missing `end()`, wrong block nesting). |

One reviewer, consistent criteria. The goal is not perfect precision — it is identifying whether `CODE_GENERATION` failures are concentrated in specific construct types.

**Step 3 — Construct-level breakdown.** For every `FOREIGN_SYNTAX` or `INVENTED_COMMAND` entry in `CODE_GENERATION`, record which AVAP construct the question required and which the model failed on. Use the question text to infer the target construct:

| Question | Target construct |
|---|---|
| GD-C-003 (loop + JSON) | `startLoop` + `AddVariableToJSON` |
| GD-C-005 (GET + error handling) | `RequestGet` + `try/exception` |
| GD-C-011 (ORM table check) | `ormCheckTable` + `ormCreateTable` |
| GD-C-014 (list length) | `getListLen` + `itemFromList` |
| ... | ... |

**Step 4 — Cross-model comparison.** Compare the taxonomy distributions between harrier and qwen3 on the same index. If one model shows a qualitatively different failure profile (e.g., harrier fails on ORM, qwen3 fails on loops), the few-shot pool composition matters more than the pool size.

### Success criteria

The experiment is conclusive if it produces one of these two findings:

**Finding A (concentrated failures):** ≥ 70% of `CODE_GENERATION` violations occur in ≤ 5 distinct construct combinations. This means the few-shot pool can be targeted and the ADR-0007 few-shot injection decision is high-leverage.

**Finding B (distributed failures):** Violations are spread across ≥ 10 distinct construct combinations with no clear concentration. This means the model lacks general AVAP grammar coverage and few-shot injection alone will be insufficient — the parser gate becomes the primary defence, not a secondary one.

### Output

A one-page table: construct × model × failure type × count. This table becomes the first version of the syntactic confusion matrix specified in ADR-0007 Section 7, produced without any infrastructure changes.

### Estimated effort

2–3 hours. One `evaluate.py` modification (log full answer), two evaluation runs (no N=5, no seeds required — exploratory), one manual taxonomy pass on ~40 entries.

---

## Experiment 2 — Few-Shot Injection A/B

### Hypothesis

Injecting 5 semantically similar AVAP examples from the 190-example pool into the generation prompt will reduce foreign syntax injection in `CODE_GENERATION` entries by ≥ 60% compared to the current baseline (no few-shot context). The reduction will be measurable manually without a parser gate, because the most severe violations (complete Go programs, Python `for` loops) are visually identifiable.

### Dependency

Experiment 2 should be run **after** Experiment 1. The construct-level breakdown from Experiment 1 informs which few-shot examples to select: if GD-C-003 (loop + JSON) fails consistently, the few-shot examples injected for that query should include `bucle_1_10.avap` and `construccion_dinamica_de_objeto.avap` from the LRM pool, not generic examples.

### Method

**Step 1 — Build the few-shot retrieval function.** Using `src/utils/emb_factory.py` (already exists), embed the 190 examples from `docs/LRM/*.avap`. For each query in the golden dataset, retrieve the top-5 most similar examples by cosine similarity. Log which examples are selected per query.

**Step 2 — Modify the generation prompt.** Add a few-shot block before the user query in `prompts.py`. Format:

```
The following are valid AVAP code examples. Use them as syntactic reference.

--- Example 1 ---
{few_shot_example_1}

--- Example 2 ---
{few_shot_example_2}

[...up to 5]

Now answer the following question using only valid AVAP syntax:
{query}
```

**Step 3 — Run one evaluation pass** on the same two configurations as Experiment 1 (harrier/avap-docs-test-v4 and qwen3/avap-docs-test-v4). Log full response bodies. This is still exploratory — no N=5, no seeds.

**Step 4 — Manual comparison.** Apply the same taxonomy from Experiment 1 to the new responses. Count `FOREIGN_SYNTAX` and `INVENTED_COMMAND` entries before and after few-shot injection.

**Step 5 — RAGAS delta.** Compare global scores between baseline and few-shot runs. A few-shot injection that reduces syntactic violations but also reduces RAGAS scores significantly would indicate that the few-shot context is consuming context window at the expense of retrieval quality — this informs the K parameter decision in ADR-0007.

### Success criteria

| Result | Interpretation | Implication for ADR-0007 |
|---|---|---|
| Foreign syntax violations drop ≥ 60% | Few-shot injection is high-leverage | Prioritise few-shot implementation before parser gate |
| Foreign syntax violations drop 20–60% | Few-shot helps but is insufficient alone | Implement both in parallel |
| Foreign syntax violations drop < 20% | Model lacks AVAP grammar at a fundamental level | Parser gate is the primary defence; few-shot pool needs expansion or the base model needs replacement |
| RAGAS global score drops > 0.05 | Context window competition is real | Reduce K or implement dynamic context window management |

### Output

A 2×2 table: model × condition (baseline / few-shot) × violation count × RAGAS global score. Plus the few-shot retrieval log showing which examples were selected for which queries — this is the raw input for pool quality analysis.

### Estimated effort

4–6 hours. Embedding the 190 examples + retrieval function (~2h), prompt modification (~30min), two evaluation runs (~2h), manual taxonomy pass (~1h).

---

## Decision gate

Both experiments feed a **go/no-go decision** for ADR-0007 implementation:

| Scenario | Decision |
|---|---|
| Exp 1: concentrated failures + Exp 2: ≥ 60% reduction | Implement few-shot first, parser gate second. The few-shot pool composition (informed by the confusion matrix) is the highest-leverage action. |
| Exp 1: concentrated failures + Exp 2: < 60% reduction | Implement parser gate and few-shot in parallel. The concentrated failure profile informs pool expansion. |
| Exp 1: distributed failures + Exp 2: any result | Parser gate is the primary defence. Few-shot injection is a secondary measure. The base model may need re-evaluation. |
| Both experiments inconclusive | Run Experiment 1 with full response bodies and a second annotator before proceeding. |

This decision gate replaces the need for an architectural meeting to assign priorities — the data makes the priority order self-evident.

---

## What this protocol does not answer

- Whether the AVAP Parser gRPC service can handle the throughput of N=5 evaluation runs (50 queries × 5 runs = 250 parser calls). That requires a load test on the parser service, not an evaluation run.
- Whether 190 examples are sufficient to cover the confusion matrix tail. That requires the confusion matrix from Experiment 1 to exist first.
- The minimum `syntactic_validity` threshold for production readiness. That requires at least one MSVL-validated run with known-good and known-bad models to calibrate.

These three questions are explicitly deferred to the post-implementation phase of ADR-0007.

---

## Timeline

| Step | Owner | Estimated duration |
|---|---|---|
| Experiment 1: `evaluate.py` modification + 2 runs | Pablo (AI Team) | 1 day |
| Experiment 1: manual taxonomy + confusion matrix draft | Pablo (AI Team) | 1 day |
| Experiment 2: few-shot retrieval function + prompt modification | Pablo (AI Team) | 1 day |
| Experiment 2: 2 runs + manual comparison | Pablo (AI Team) | 1 day |
| Results review and go/no-go decision | Rafael Ruiz (CTO) + Pablo | 1 meeting |

**Total: 4 working days before any infrastructure change from ADR-0007 is scheduled.**
