Metadata-Version: 2.4
Name: tevprober
Version: 0.1.0rc1
Summary: Product-independent causal validation planner and evidence binder for TEV repositories
Requires-Python: >=3.11
Description-Content-Type: text/markdown

# TEVProber

TEVProber es el motor genérico de probing del ecosistema TEV. Su responsabilidad es observar un conjunto de cambios declarado, aplicar una política propiedad del repositorio consumidor y producir un plan de validación determinista y sellado. No demuestra teoremas, no concede autoridad de ejecución y no promociona código.

Estado de esta extracción:

```text
VERSION=0.1.0rc1
AUTONOMOUS_PACKAGE=IMPLEMENTED_CANDIDATE
RUNTIME_DEPENDENCIES=0
FORMAL_PROOF_AUTHORITY=NO
EXECUTION_POLICY_AUTHORITY=NO
RELEASE_AUTHORITY=NO
PROMOTION_AUTHORITY=NO
MERGE_AUTHORITY=NO
STANDALONE_REPOSITORY_RELEASE=NOT_YET
CERTIFICATION_COMPLETE=NO
```

## Separación de responsabilidades

```text
TEVProber
    qué debe comprobarse

TEVProver
    si una prueba formal es válida

TEV-LNU-Runtime
    cómo se ejecuta físicamente un plan bajo límites

TEVScript
    semántica de las transformaciones TEV

repositorio consumidor
    qué paths, tests y campañas forman su frontera causal
```

TEVProber no importa ninguna de esas implementaciones.

## Política propiedad del consumidor

El motor consume `TEVPROBER_REPOSITORY_POLICY_V1`. Los paths, nodeids, fronteras y campañas exactas no se hardcodean en el paquete.

Ejemplo mínimo:

```json
{
  "schema": "TEVPROBER_REPOSITORY_POLICY_V1",
  "policy_id": "example",
  "version": "1",
  "max_changed_paths": 64,
  "default_test_ids": ["tests/test_smoke.py::test_smoke"],
  "authority_patterns": ["tests/**", "tools/**"],
  "rules": [
    {
      "rule_id": "source",
      "include": ["src/**"],
      "exclude": [],
      "test_ids": ["tests/test_source.py::test_source"],
      "reasons": ["source_frontier"]
    }
  ],
  "exact_campaigns": [],
  "metadata": {},
  "authority": {
    "formal_proof": false,
    "execution_policy": false,
    "release": false,
    "promotion": false,
    "merge": false,
    "consumer_refactor": false
  }
}
```

`metadata` es opaca para el motor: sólo admite pares string→string, se canonicaliza y queda ligada al `policy_hash`. Permite que el consumidor conserve datos como un `base_sha` histórico sin convertirlos en semántica del engine.

## Modos

- `CAUSAL`: selección de tests por reglas declaradas.
- `FOCUSED`: campaña exacta con conjunto exacto de paths y nodeids.
- `FULL`: el delta toca autoridad, supera el límite o no puede justificarse causalmente; el runner externo debe decidir la suite completa.
- `HOLD`: la petición no satisface un contrato exacto y no se ejecuta.

No existe degradación silenciosa de `FULL` a una selección parcial.

## CLI

```text
tevprober plan --policy .tevprober/repository.json --changed-path src/a.py
tevprober run --plan probe-plan.json --root .
```

El runner local es opcional y acotado. Antes de ejecutar verifica el `plan_hash`, utiliza exactamente los nodeids sellados, elimina opciones ambientales de pytest que puedan alterar la selección, limita timeout/salida y emite `TEVPROBER_RUN_REPORT_V1`.

## Evidencia y autoridad

Todo `ProbePlan` y `RunReport` mantiene falsas estas autoridades:

```text
formal_proof_authority
execution_policy_authority
release_authority
promotion_authority
merge_authority
consumer_refactor_authority
```

Un PASS de TEVProber significa únicamente que la ejecución observada corresponde al plan sellado y terminó con el resultado esperado por el runner. No convierte la suite en prueba formal ni autoriza merge/release.

## Extracción desde TEVProver-CUOFC

Durante esta fase el paquete vive bajo `packages/tevprober/` para conservar trazabilidad del motor histórico. Todo el código distribuible está confinado a:

```text
README.md
pyproject.toml
src/tevprober/**
```

El código de producción no depende del repositorio anfitrión. La campaña histórica SOLID-LNU V2 vive como policy en `.tevprober/solid-lnu-v2.json`; `tools/tevprober_solid_lnu_v2.py` es sólo una fachada de compatibilidad del host.

La release de TEVProber requiere todavía mover estos bytes a un repositorio autónomo `TEVProber`, construir dos wheels reproducibles desde el árbol exacto, instalar una wheel fuera del checkout y emitir `TEVPROBER_EXTRACTION_RECEIPT_V1`. El manifiesto fuente no contiene `source_commit`, `source_tree` o `wheel_sha256`; esos valores pertenecen al receipt externo para evitar autoreferencia.
