feat(runtime): implement single-article consolidation runtime and modularize codebase

This commit is contained in:
2026-08-24 00:14:07 -03:00
parent e1e0be1353
commit 23de7d8fe7
176 changed files with 266754 additions and 10179 deletions
@@ -0,0 +1,121 @@
"""Contract tests for manifest-output.schema.json."""
from __future__ import annotations
import jsonschema
from src.runtime.core.config import create_schema_registry, load_schema
from src.runtime.storage.file_store import create_manifest_dict
def test_manifest_output_schema_completed_text_valid():
schema = load_schema("manifest-output.schema.json")
registry = create_schema_registry()
validator = jsonschema.Draft202012Validator(schema, registry=registry)
valid_manifest = create_manifest_dict(
fingerprint="a" * 64,
source_url="https://example.com/article/1",
selected_extractor="trafilatura",
final_status="completed_text",
generate_markdown=True,
markdown_path="out/articles/" + "a" * 64 + ".md",
markdown_hash="b" * 64,
config_version="1.0.0",
trace_id="trace_001",
ecp_classification={
"category": "DIRECT_INHERENT",
"confidence": 0.95,
"rationale": "High direct entity relevance.",
"evidences": ["Direct entity mentioned."],
},
enrichment={
"sentiment": "positive",
"tags": ["river plate", "futebol", "argentina"],
},
provider_versions={
"hygiene": {
"provider": "groq",
"model": "llama-3.1-8b-instant",
"role_config_version": "1.0.0",
},
"enrichment": {
"provider": "deepseek",
"model": "deepseek-chat",
"role_config_version": "1.0.0",
},
},
model_versions={
"runtime_primary": {
"provider": "groq",
"model": "llama-3.1-8b-instant",
"role_config_version": "1.0.0",
},
"runtime_fallback": {
"provider": "deepseek",
"model": "deepseek-chat",
"role_config_version": "1.0.0",
},
},
prompt_versions={
"article_content_hygiene": {"version": "1.0.0", "hash": "c" * 64},
"article_sentiment_tags": {"version": "1.0.0", "hash": "d" * 64},
},
error_codes=[],
)
errors = list(validator.iter_errors(valid_manifest))
assert len(errors) == 0, f"Schema errors: {[e.message for e in errors]}"
def test_manifest_output_schema_rejected_ecp_valid():
schema = load_schema("manifest-output.schema.json")
registry = create_schema_registry()
validator = jsonschema.Draft202012Validator(schema, registry=registry)
rejected_manifest = create_manifest_dict(
fingerprint="a" * 64,
source_url="https://example.com/article/2",
selected_extractor="newspaper4k",
final_status="rejected_ecp",
generate_markdown=False,
markdown_path=None,
markdown_hash=None,
config_version="1.0.0",
trace_id="trace_002",
ecp_classification={
"category": "TANGENTIAL",
"confidence": 0.88,
"rationale": "Only brief tangential reference.",
"evidences": ["Brief reference."],
},
enrichment=None,
provider_versions={
"hygiene": {
"provider": "groq",
"model": "llama-3.1-8b-instant",
"role_config_version": "1.0.0",
},
"enrichment": None,
},
model_versions={
"runtime_primary": {
"provider": "groq",
"model": "llama-3.1-8b-instant",
"role_config_version": "1.0.0",
},
"runtime_fallback": {
"provider": "deepseek",
"model": "deepseek-chat",
"role_config_version": "1.0.0",
},
},
prompt_versions={
"article_content_hygiene": {"version": "1.0.0", "hash": "c" * 64},
"article_sentiment_tags": {"version": "1.0.0", "hash": "d" * 64},
},
error_codes=["ECP_REJECTED"],
)
errors = list(validator.iter_errors(rejected_manifest))
assert len(errors) == 0, f"Schema errors: {[e.message for e in errors]}"