2026-05-19 に work/kouchou-ai/ の current code を対象に、apps/api/src/routers/report.py と packages/analysis-core の生成経路、および手元での再現スクリプトを照合した観測メモ。source-codeより
Observations
- current
apps/api/src/routers/report.pyのGET /reports/{slug}はsettings.REPORT_DIR/<slug>/hierarchical_result.jsonをjson.load()して、その dict にvisibilityと任意のvisualizationConfigを足して返すだけで、config必須チェックをしていない。source-codeより - current
packages/analysis-core/src/analysis_core/steps/hierarchical_aggregation.pyはhierarchical_result.jsonを生成する際にresults["config"] = configを必ず入れている - current
packages/analysis-core/tests/e2e/test_pipeline_e2e.pyとtests/e2e/schemas/hierarchical_result.pyでも、出力hierarchical_result.jsonにconfigが存在する前提で検証している - repo 内のサンプル成果物
utils/dummy-server/app/reports/example/hierarchical_result.jsonとapps/api/broadlistening/pipeline/outputs/example-hierarchical-polis/hierarchical_result.jsonはいずれもconfig.questionを持っていた - 一方で、
configを欠いたhierarchical_result.jsonを一時ディレクトリに作り、report.pyrouter を isolate してGET /reports/missing-config-reportを叩くと200で{"overview":"x","clusters":[],"arguments":[],"visibility":"public"}が返った。つまり router は壊れた report payload をそのまま public API に流す - 同じ壊れた
hierarchical_result.jsonに対してapps/api/src/repositories/config_repository.pyの backward-compat path はConfigJSONParseError: Embedded config is missing or invalidを返し、管理系コードでは欠損を異常として扱っている
Interpretation
- 「通常生成された current report が
configを欠く」再現は見つかっていない - ただし
/reports/{slug}は 保存済み成果物が壊れていた場合にconfig欠損をそのまま返しうる ので、viewer crash の再現条件としては十分ありうる - したがって根本原因は
Overview単体ではなく、API router で result payload を無検証で返している点にあると整理できる
Open Questions
- 壊れた
hierarchical_result.jsonは実運用でどの経路から入りうるのか。旧成果物、手修正、storage 同期不整合、別世代 pipeline の残骸などの切り分けは未確認 /reports/{slug}でconfig欠損を見つけた場合の正しい挙動は 500 / 404 / repair fallback のどれか
Updates
- 2026-05-19: 初版作成