Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions api/schema_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Schema drift report endpoint."""

from flask import Blueprint

from api._flask_types import FlaskReturn, json_response
from utils.schema_drift import get_schema_report

schema_report_bp = Blueprint("schema_report", __name__)


@schema_report_bp.route("/api/schema-report")
def schema_report() -> FlaskReturn:
"""Return known/new/missing JSONL field paths from recent parse runs."""
return json_response(get_schema_report())
2 changes: 2 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from api.export_api import export_bp
from api.projects import projects_bp
from api.schema_report import schema_report_bp
from api.search import search_bp
from api.sessions import sessions_bp
from utils.exclusion_rules import load_rules, resolve_exclusion_rules_path
Expand Down Expand Up @@ -101,6 +102,7 @@ def create_app(
app.register_blueprint(sessions_bp)
app.register_blueprint(search_bp)
app.register_blueprint(export_bp)
app.register_blueprint(schema_report_bp)

@app.after_request
def set_security_headers(response):
Expand Down
14 changes: 7 additions & 7 deletions benchmarks/baselines.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
"_note": "Gated means from ubuntu-latest CI benchmark-results.json (PR #97, run 28126772276). Excluded from gate (recorded for reference): test_parse_session_small, test_search_full_corpus (sub-ms CI noise). Memory benchmarks use extra_info.peak_bytes (bytes); latency uses stats.mean (seconds).",
"updated": "2026-06-24T20:15:37Z",
"_note": "Gated means from ubuntu-latest CI benchmark-results.json. PR #108 (schema drift): parse/export latency baselines raised for per-entry field-path fingerprinting. Excluded from gate (recorded for reference): test_parse_session_small, test_search_full_corpus (sub-ms CI noise). Memory benchmarks use extra_info.peak_bytes (bytes); latency uses stats.mean (seconds).",
"updated": "2026-07-03T00:00:00Z",
"machine": "Linux",
"groups": {
"parse": {
"test_parse_session_small": 0.00010518068718225604,
"test_parse_session_medium": 0.002991333112179635,
"test_parse_session_large": 0.032311203818181436,
"test_parse_session_medium": 0.004645,
"test_parse_session_large": 0.045401,
"test_parse_large_peak_memory": 2032028.0
},
"export": {
"test_bulk_export_session_count[sessions-10]": 0.0042825538530803925,
"test_bulk_export_session_count[sessions-50]": 0.021406330209302382,
"test_bulk_export_session_count[sessions-100]": 0.04229194749999898,
"test_bulk_export_session_count[sessions-10]": 0.006504,
"test_bulk_export_session_count[sessions-50]": 0.032314,
"test_bulk_export_session_count[sessions-100]": 0.064562,
"test_bulk_export_zip_peak_memory[sessions-10]": 350628.0,
"test_bulk_export_zip_peak_memory[sessions-50]": 506454.0,
"test_bulk_export_zip_peak_memory[sessions-100]": 694088.0
Expand Down
300 changes: 300 additions & 0 deletions schema_baseline.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
{
"version": 1,
"description": "Known Claude Code JSONL field paths as of 2026-07-03. Drift detection compares path presence only (added/removed paths); type changes are not detected. Mark required:true only for paths present on every record (currently: type). Update deliberately when upstream format changes.",
"fields": {
"_futureSchemaVersion": {
"required": false
},
"compactMetadata": {
"required": false
},
"compactMetadata.preTokens": {
"required": false
},
"compactMetadata.trigger": {
"required": false
},
"content": {
"required": false
},
"cwd": {
"required": false
},
"data": {
"required": false
},
"data.output": {
"required": false
},
"data.type": {
"required": false
},
"experimentalFlag": {
"required": false
},
"gitBranch": {
"required": false
},
"isApiErrorMessage": {
"required": false
},
"isSidechain": {
"required": false
},
"message": {
"required": false
},
"message.content": {
"required": false
},
"message.content[]": {
"required": false
},
"message.content[].id": {
"required": false
},
"message.content[].input": {
"required": false
},
"message.content[].input.command": {
"required": false
},
"message.content[].input.description": {
"required": false
},
"message.content[].input.file_path": {
"required": false
},
"message.content[].name": {
"required": false
},
"message.content[].text": {
"required": false
},
"message.content[].thinking": {
"required": false
},
"message.content[].type": {
"required": false
},
"message.model": {
"required": false
},
"message.stop_reason": {
"required": false
},
"message.usage": {
"required": false
},
"message.usage.cache_creation": {
"required": false
},
"message.usage.cache_creation.ephemeral_1h_input_tokens": {
"required": false
},
"message.usage.cache_creation.ephemeral_5m_input_tokens": {
"required": false
},
"message.usage.cache_creation_input_tokens": {
"required": false
},
"message.usage.cache_read_input_tokens": {
"required": false
},
"message.usage.input_tokens": {
"required": false
},
"message.usage.output_tokens": {
"required": false
},
"message.usage.service_tier": {
"required": false
},
"parentToolUseID": {
"required": false
},
"parentUuid": {
"required": false
},
"permissionMode": {
"required": false
},
"sessionId": {
"required": false
},
"slug": {
"required": false
},
"snapshot": {
"required": false
},
"snapshot.timestamp": {
"required": false
},
"subtype": {
"required": false
},
"timestamp": {
"required": false
},
"toolUseID": {
"required": false
},
"toolUseResult": {
"required": false
},
"toolUseResult._unknownToolMeta": {
"required": false
},
"toolUseResult._unknownToolMeta.vendor": {
"required": false
},
"toolUseResult.agentId": {
"required": false
},
"toolUseResult.answers": {
"required": false
},
"toolUseResult.answers.q1": {
"required": false
},
"toolUseResult.code": {
"required": false
},
"toolUseResult.content": {
"required": false
},
"toolUseResult.description": {
"required": false
},
"toolUseResult.durationMs": {
"required": false
},
"toolUseResult.exitCode": {
"required": false
},
"toolUseResult.file": {
"required": false
},
"toolUseResult.file.content": {
"required": false
},
"toolUseResult.file.filePath": {
"required": false
},
"toolUseResult.file.numLines": {
"required": false
},
"toolUseResult.filePath": {
"required": false
},
"toolUseResult.filenames": {
"required": false
},
"toolUseResult.filenames[]": {
"required": false
},
"toolUseResult.isAsync": {
"required": false
},
"toolUseResult.message": {
"required": false
},
"toolUseResult.mode": {
"required": false
},
"toolUseResult.newTodos": {
"required": false
},
"toolUseResult.newTodos[]": {
"required": false
},
"toolUseResult.newTodos[].content": {
"required": false
},
"toolUseResult.newTodos[].id": {
"required": false
},
"toolUseResult.numFiles": {
"required": false
},
"toolUseResult.numLines": {
"required": false
},
"toolUseResult.plan": {
"required": false
},
"toolUseResult.plan[]": {
"required": false
},
"toolUseResult.query": {
"required": false
},
"toolUseResult.questions": {
"required": false
},
"toolUseResult.questions[]": {
"required": false
},
"toolUseResult.questions[].id": {
"required": false
},
"toolUseResult.results": {
"required": false
},
"toolUseResult.results[]": {
"required": false
},
"toolUseResult.results[].url": {
"required": false
},
"toolUseResult.retrieval_status": {
"required": false
},
"toolUseResult.status": {
"required": false
},
"toolUseResult.stderr": {
"required": false
},
"toolUseResult.stdout": {
"required": false
},
"toolUseResult.structuredPatch": {
"required": false
},
"toolUseResult.task": {
"required": false
},
"toolUseResult.task.description": {
"required": false
},
"toolUseResult.task.task_id": {
"required": false
},
"toolUseResult.task_id": {
"required": false
},
"toolUseResult.task_type": {
"required": false
},
"toolUseResult.totalDurationMs": {
"required": false
},
"toolUseResult.truncated": {
"required": false
},
"toolUseResult.url": {
"required": false
},
"type": {
"required": true
},
"uuid": {
"required": false
},
"version": {
"required": false
}
}
}
Loading
Loading