Skip to content

fix(acceptance): 有効フラグは宣言であって証拠ではない——runtime は「走った記録」を要求する - #44

Merged
yohey-w merged 5 commits into
mainfrom
fix/runtime-smoke-requires-execution-evidence
Sep 14, 2026
Merged

yohey-w merged 5 commits into
mainfrom
fix/runtime-smoke-requires-execution-evidence

Conversation

@yohey-w

@yohey-w yohey-w commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

runtime_smoke.enabled: true は宣言であって証拠ではない。それを証拠として読んでいたので、runtime を1回も走らせずに1行足すだけで finding が半減した。

実測(この修正前・sokutei-platform 同一ツリー/要件書無改変)

dev server も DB も起動せず、codd verify --runtime を一度も叩かずに runtime_smoke.enabled: true を追記しただけ:

分類 enabled 無し enabled:true(未実行)
runtime_evidence_not_executable 50 0
unbound_acceptance 61 20
合計 180 89

証拠を用意するより宣言するほうが安い、という逆インセンティブ。しかも「証拠が無いこと」を捕まえるための検査自身が、主張を証拠として受け取っていた。

原因

  • codd/acceptance_evidence.py:390-401 runtime_smoke_enabled() — 真偽値だけを返し、実行の痕跡を読む経路が存在しない。
  • codd/dag/checks/acceptance_evidence.py:208(旧) — 有効なら即 return []。→ runtime 50→0。
  • 同 :145-155(旧) — 有効なら runtime 義務を「束縛済み」に入れる。→ unbound 61→20。
  • codd/runtime_smoke/runner.py:144-163 — 実行後に書くのはタイムスタンプ付き Markdown のみ(log_to_file で無効化可)。検査が読める実行記録がそもそも生産されていなかった。

修正

実行された runtime 義務だけが束縛になる。

  • codd/runtime_record.py(新規)— 実行台帳。ランナーが、有効かつ1つ以上のチェックが実際に走ったときだけ <codd-dir>/runtime_ledger.json を書く(全skip・無効では書かない)。recorded_at / passed / 各チェックの name・category・passed・skipped / config_digest(実行時点の runtime_smoke + runtime セクションのハッシュ)。欠損・破損は証拠なし、決して証拠ではない(acceptance_ledger.json と同じ規律)。commit して diff で読む成果物として扱う。
  • runtime_evidence_not_executed(新規 finding): 有効だが no_record / config_changed / stale / target_not_executed。runtime_evidence_not_executable は無改変で「ステージが無効」のまま。穴が2つ、remedy が2つ、finding も2つ。
  • unbound_acceptance も復活。未実行の義務は無効の義務と同じだけしか束縛しない(このモジュールが無効側で既に適用していた規律)。
  • 明示/暗黙の非対称は runtime_obligations の既存設計を踏襲。明示 verified_by: runtime:<case> は同名の非skipチェックを要求(print_sheet / Print Sheet / print-sheet は1つの名前)。operation_flow.<id> 由来の暗黙義務は、対応付けをプロジェクトが宣言していないので推測せず、記録があれば足りる。落ちた実行も「実行済み」(Step 8 が既に赤で報告済み・二重報告しない)。
  • 新設定2つ: acceptance_evidence.runtime_execution_severity(strict でも既定 amber)と runtime_max_age_hours(既定 unset)。

後方互換(★ここが読みどころ)

  • 新 finding は strict でも amber 既定(undeclared_numeric / reachability と同じ前例)= CoDD を上げただけでは赤にならない。
  • 鮮度は opt-in(unset なら時計だけでは期限切れにしない)。設定変更(config_digest)は常に期限切れにする。
  • unbound_acceptance は復活するが、ステージが有効な間は runtime_execution_severity(既定 amber)で出す。理由は移行デッドロック(独立レビュー MUST): codd verify --runtime は静的 verify が通ってから Step 8 を走らせるので、unbound が赤いと台帳を作る手段そのものに到達できず、永久に赤になる。unbound は not_executed の結果であって別の欠陥ではない(remedy も「走らせろ」の1つ)。ステージが無効なときは従来どおり unbound_severity(走らせる経路自体が無いので別の欠陥)。
  • その代償(レビューで指摘され、意図して受け入れた): strict のプロジェクトが未束縛の受入条件に verified_by: runtime:<何か> と enabled: true を足すと、赤い unbound が琥珀に降りる。finding は1件も消えない(名前と remedy つきで両方出る)——main では 91件が消えていたので、そこからの改善であって後退ではない——が、ramp を拒否する strict プロジェクトは acceptance_evidence.runtime_execution_severity: red の1行で両方赤に戻せる。順序で解く筋(Step 8 到達性)は codd verify --runtime: 静的 verify が赤いと Step 8 に到達できない——「走らせろ」が remedy の finding を消せない #45 に分離した。
  • 既存の runtime_evidence_not_executable のメッセージ・severity・発火条件は無改変。

未解決(設計書に明記)

実行証拠は実装内容には束縛していない。runtime 設定が変わらないまま実装を書き換えても、記録は期限切れにならない。閉じるにはランナーとゲートの双方が計算できる content digest が要るが、ランナーは依存グラフを持たない。「台帳はステージが走ったことを証明するのであって、今日のコードに対して走ったことは証明しない」と docs/design/acceptance-evidence-invariant.md の "What stays outside" に書いた。

Generality Gate(6問)

# 問い 結論
1 案件以外でも役立つか YES。runtime 義務を宣言する全プロジェクトに等しく開いた穴で、逆インセンティブ付き。sokutei は踏んだ最初の1件。
2 FW 固有知識のハードコード 無し。読むのはプロジェクト自身の宣言と、プロジェクト自身が生産した実行記録だけ。HTTP すら前提にしない(台帳は check の name/category しか見ない)。
3 プロンプト1行で済むか 済まない。LLM 出力の質ではなく検査器の判定材料の欠落。
4 レイヤーは正しいか YES。plan/generate/implement の上流問題ではなく、検証器が自分の入力を無検証で信じている盲点。「上流で解決しろ」は入力を信じている検査には適用されない。生産側(ランナー)と消費側(ゲート)の両方が最小。
5 テストは汎用シナリオか YES。tmp_path の合成プロジェクトのみ。FW 名・実 URL・案件パスを含まない。
6 用語は汎用か YES。「実行記録 / 宣言と実行 / 台帳 / 鮮度」は CLI・ライブラリ・データパイプラインに代入して通る。runtime は既存語彙(runtime_smoke / verified_by: runtime:)。

テストと検証

  • 新規14本(tests/dag/test_acceptance_evidence.py 11 / tests/test_runtime_smoke.py 3)。修正前のコードに対して14本すべて RED を実測してから実装。
  • 全件: 7748 passed / 3 skipped / 2 xfailed。skip 3 は dogfood コーパスが gitignore で不在という構造的skip(既往・fresh clone/CI でも同じ)。
  • codd coverage check PASS(176/369 = 47.70%)。
  • codd dag verify(自己適用): 赤は canon_integrity 1件のみで、clean origin/main でも同一の10件 canon_missing が出る既往(stash して実測)。本 PR は docs/requirements/system-requirements.md の該当行のみ canon accept の digest に更新(codd canon accept は既往の不具合で他10件を落とすため、その1行だけを手で反映)。
  • acceptance_evidence は amber 4件(reachability_unknown)。既存 AC-ACC-1 と同型で、CLI にルートが無いことに由来する。新設した AC-ACC-2〜4 が同じ型を3件増やす。

Dogfood(実機・同一ツリー)

シナリオ 合計 赤 琥珀 not_executable not_executed unbound(赤/琥珀)
A: runtime_smoke 無し(基準) 180 125 55 50 – 61 / 0
B-old: enabled:true・未実行・origin/main のコード 89 – – 0 – 20
B: enabled:true・未実行・本 PR 180 34 146 0 50 20 / 41
C: enabled:true + 実行記録あり・本 PR 89 – – 0 0 20
D: 記録後に runtime 設定を変更・本 PR 180 – – 0 50 20 / 41
  • B-old と B が同一入力で 89 対 180。 main では宣言だけで 91件の finding が消えた。本 PR では1件も消えない。
  • ただし B では赤が 125→34 に降りる(琥珀 55→146)。これが上に書いた ramp のコスト。消えたのではなく「未証明」として琥珀で立っている。strict で赤のままにしたいプロジェクトは runtime_execution_severity: red。
  • C は「走った証拠がある」ときにだけ落ちる。D は設定が変わった時点で過去の実行が証拠でなくなることを示す。
  • (scratch worktree は検査後に原状復帰済み・read-only 運用)

独立レビューの処置(Codex gpt-5.6-sol / high・2巡・別血統)

逐語は下のコメント。MUST 9件のうち 8件を修正、3件(1件は MUST 重複)を理由つきで却下。

# 指摘 処置
1巡 移行デッドロック(strict で台帳を作れない) 修正(上記の severity 規則)
1巡 失敗・部分実行が inferred obligation を証明していた 修正(run_failed・明示 case は個別 pass 判定)
1巡 config_digest が実行計画を表していない 修正(target_url 記録/report の出力先だけ除外/生 YAML をハッシュ)
1巡 台帳書き込み失敗の沈黙 修正(WARN。ただし下記の false green 分は FAIL)
2巡 古い成功台帳が書き込み失敗を生き延びる(真の false green) 修正(古い台帳を削除・削除も不可なら Step 8 FAIL)
2巡 report.fail_fast を digest から外していた 修正(実行計画なので digest に戻した)
2巡 target_url 空の台帳が通っていた 修正(空=別物として target_changed)
2巡 bool("false") == True 修正(JSON の true だけを真とする)
2巡 severity 差し替えは strict の抜け道 却下(上記のとおり。順序で解く筋は #45)
2巡 実装内容への束縛が無い 却下(レビュー前に設計書へスコープ外と明記した事項。#46)
2巡 --runtime-skip の部分実行 却下(オペレータの明示的選択で、どのチェックを飛ばしたかは台帳に記録されるので監査可能。設計書に限界として明記)

Closes #43

🤖 Generated with Claude Code

https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2

`acceptance_evidence` は runtime 証拠が実行されたかを `runtime_smoke.enabled`
の真偽値だけで判定していた。実プロジェクト実測: dev server も DB も起動せず
`codd verify --runtime` を一度も叩かずに `enabled: true` を1行足すだけで、
runtime_evidence_not_executable 50→0・unbound_acceptance 61→20・finding 総数
180→89。証拠を用意するより宣言するほうが安いという逆インセンティブで、しかも
「証拠が無いこと」を捕まえるための検査自身が主張を証拠として受け取っていた。

規律を1つに戻す: **実行された runtime 義務だけが束縛になる**。

- codd/runtime_record.py(新規): runtime smoke ランナーが、有効かつ1つ以上の
  チェックが実際に走ったときだけ <codd-dir>/runtime_ledger.json を書く。全skip・
  無効では書かない(何も走っていない記録は記録ではない)。内容は recorded_at・
  passed・各チェックの name/category/passed/skipped・config_digest(実行時点の
  runtime_smoke + runtime セクションのハッシュ)。欠損/破損は「証拠なし」であって
  決して証拠ではない——acceptance_ledger.json と同じ規律。
- runtime_evidence_not_executed(新規 finding): 有効だが実行記録が無い/設定が
  変わった/鮮度切れ/明示 runtime:<case> に応えるチェックが走っていない。
  runtime_evidence_not_executable は無改変で「ステージが無効」のまま。穴が2つ、
  remedy が2つ、finding も2つ。
- unbound_acceptance も復活する。未実行の義務は無効の義務と同じだけしか束縛しない。
- 明示/暗黙の非対称は runtime_obligations の既存設計を踏襲。明示 runtime:<case> は
  同名の非skipチェックを要求し(print_sheet / Print Sheet / print-sheet は1つの名前)、
  operation_flow.<id> 由来の暗黙義務は記録があれば足りる。落ちた実行も「実行済み」
  として数える(Step 8 が既に赤で報告済み)。
- acceptance_evidence.runtime_execution_severity(新規・strict でも既定 amber)と
  runtime_max_age_hours(新規・既定 unset)。記録が無いのは「未証明」であって
  「誤りの証明」ではなく、CoDD を上げただけで既存の緑を赤にしない。

未解決として明記: 実行証拠は実装内容には束縛していない(設定変更と鮮度でのみ
期限切れになる)。設計書の "What stays outside" に書いた。

テスト14本追加(tmp_path の合成プロジェクトのみ・FW/URL/案件語彙なし)。全件 PASS
(7748 passed / skip 3 は dogfood コーパス不在の構造的skipで既往)。
Dogfood(実測した当の実プロジェクト・同一ツリー): enabled:true・記録なしで 180件
(not_executed 50・unbound 61)=ステージ無効時と同じ、記録を置くと 89件、記録後に
runtime 設定を変えると再び 180件。

Closes #43

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2
@github-actions

Copy link
Copy Markdown

CoDD Audit

❌ Audit failed to run. Check workflow logs.

@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Coverage Matrix Report

Project: /home/runner/work/codd-dev/codd-dev
Mode: text-grep
Generated: 2026-09-14T14:19:02.411050Z

Lexicon Axis Status Hits
ai_governance_eu_act Classification rules for high-risk AI systems unknown 0
ai_governance_eu_act Prohibited AI practices unknown 0
ai_governance_eu_act Requirements for high-risk AI systems unknown 0
ai_governance_eu_act Human oversight unknown 0
ai_governance_eu_act Transparency obligations for providers and deployers of certain AI systems unknown 0
ai_governance_eu_act General-purpose AI models unknown 0
ai_governance_eu_act Conformity assessment unknown 0
ai_governance_eu_act Post-market monitoring by providers and post-market monitoring plan unknown 0
ai_governance_eu_act Fundamental rights impact assessment for high-risk AI systems unknown 0
ai_governance_eu_act Governance at Union and national level unknown 0
api_rate_limiting_caching rate_limit_strategy covered_text_match 1
api_rate_limiting_caching quota_management unknown 0
api_rate_limiting_caching throttling_response unknown 0
api_rate_limiting_caching cache_control_headers unknown 0
api_rate_limiting_caching etag_conditional_requests unknown 0
api_rate_limiting_caching cdn_edge_caching unknown 0
api_rate_limiting_caching idempotency_keys covered_text_match 1
api_rest_openapi openapi covered_text_match 25
api_rest_openapi info.version unknown 0
api_rest_openapi problem_details covered_text_match 149
api_rest_openapi query covered_text_match 17
api_rest_openapi security covered_text_match 14
api_rest_openapi schemas covered_text_match 57
api_rest_openapi content covered_text_match 94
api_rest_openapi responses covered_text_match 84
api_rest_openapi links unknown 0
api_rest_openapi idempotent covered_text_match 112
api_rest_openapi 429 unknown 0
api_rest_openapi Access-Control-Allow-Origin covered_text_match 8
api_rest_openapi Cache-Control unknown 0
api_rest_openapi parameters covered_text_match 195
api_rest_openapi callbacks unknown 0
babok stakeholder covered_text_match 2
babok goal covered_text_match 10
babok flow covered_text_match 46
babok issue covered_text_match 9
babok data covered_text_match 83
babok functional covered_text_match 21
babok non-functional covered_text_match 10
babok rule covered_text_match 15
babok constraint covered_text_match 35
babok acceptance covered_text_match 31
babok risk covered_text_match 73
babok assumption unknown 0
babok term covered_text_match 26
backend_event_cloudevents Context Attributes covered_text_match 1
backend_event_cloudevents REQUIRED Attributes covered_text_match 858
backend_event_cloudevents OPTIONAL Attributes covered_text_match 198
backend_event_cloudevents Type System covered_text_match 65
backend_event_cloudevents Extension Context Attributes unknown 0
backend_event_cloudevents Event Data covered_text_match 83
backend_event_cloudevents Protocol Binding unknown 0
backend_graphql schema covered_text_match 63
backend_graphql Type System covered_text_match 159
backend_graphql Type System Extensions unknown 0
backend_graphql query covered_text_match 54
backend_graphql mutation covered_text_match 28
backend_graphql subscription unknown 0
backend_graphql Fragments covered_text_match 1560
backend_graphql Variables covered_text_match 36
backend_graphql Directives covered_text_match 2
backend_graphql Introspection unknown 0
backend_graphql Response covered_text_match 93
backend_grpc_proto service covered_text_match 25
backend_grpc_proto message covered_text_match 71
backend_grpc_proto Scalar Value Types covered_text_match 37
backend_grpc_proto Enumerations covered_text_match 257
backend_grpc_proto stream covered_text_match 4
backend_grpc_proto status code covered_text_match 141
backend_grpc_proto Deadlines/Timeouts covered_text_match 2
backend_grpc_proto Metadata covered_text_match 16
compliance_hipaa Administrative safeguards unknown 0
compliance_hipaa Physical safeguards unknown 0
compliance_hipaa Technical safeguards covered_text_match 7
compliance_hipaa Risk analysis unknown 0
compliance_hipaa Access control unknown 0
compliance_hipaa Audit controls unknown 0
compliance_hipaa Integrity covered_text_match 7
compliance_hipaa Transmission security unknown 0
compliance_hipaa Breach notification unknown 0
compliance_hipaa Business associate contracts or other arrangements unknown 0
compliance_iso27001 context_organization unknown 0
compliance_iso27001 leadership unknown 0
compliance_iso27001 planning covered_text_match 3
compliance_iso27001 support covered_text_match 39
compliance_iso27001 operation covered_text_match 29
compliance_iso27001 performance_evaluation unknown 0
compliance_iso27001 improvement unknown 0
compliance_iso27001 risk_treatment_plan unknown 0
compliance_iso27001 SOA unknown 0
compliance_iso27001 access_control unknown 0
compliance_iso27001 cryptography unknown 0
compliance_iso27001 physical_security unknown 0
compliance_iso27001 supplier_relationships unknown 0
compliance_iso27001 incident_management unknown 0
compliance_pci_dss_4 Install and Maintain Network Security Controls unknown 0
compliance_pci_dss_4 Protect Stored Account Data unknown 0
compliance_pci_dss_4 Maintain a Vulnerability Management Program unknown 0
compliance_pci_dss_4 Restrict Access to System Components and Cardholder Data by Business Need to Know unknown 0
compliance_pci_dss_4 Regularly Monitor and Test Networks unknown 0
compliance_pci_dss_4 Support Information Security with Organizational Policies and Programs unknown 0
compliance_pci_dss_4 Protect Cardholder Data with Strong Cryptography During Transmission Over Open, Public Networks unknown 0
compliance_pci_dss_4 Develop and Maintain Secure Systems and Software unknown 0
compliance_pci_dss_4 Personnel screening unknown 0
compliance_pci_dss_4 Restrict Physical Access to Cardholder Data covered_text_match 3
compliance_pci_dss_4 Security incident response plan unknown 0
compliance_pci_dss_4 PCI DSS scope unknown 0
data_aggregation_policies collection_cardinality covered_text_match 3385
data_aggregation_policies test_data_variation unknown 0
data_aggregation_policies aggregation_function covered_text_match 117
data_aggregation_policies empty_partial_state covered_text_match 23
data_aggregation_policies grouping_dimension covered_text_match 11
data_aggregation_policies recency_selection covered_text_match 27
data_aggregation_policies source_traceability covered_text_match 174
data_eventsourcing_es_cqrs Event Sourcing unknown 0
data_eventsourcing_es_cqrs Event covered_text_match 25
data_eventsourcing_es_cqrs event store unknown 0
data_eventsourcing_es_cqrs Event Replay unknown 0
data_eventsourcing_es_cqrs Application State Storage covered_text_match 2
data_eventsourcing_es_cqrs Complete Rebuild unknown 0
data_eventsourcing_es_cqrs Temporal Query unknown 0
data_eventsourcing_es_cqrs CQRS pattern unknown 0
data_governance_appi_gdpr Lawfulness of processing unknown 0
data_governance_appi_gdpr Consent unknown 0
data_governance_appi_gdpr Purpose limitation unknown 0
data_governance_appi_gdpr Storage limitation unknown 0
data_governance_appi_gdpr Data subject rights unknown 0
data_governance_appi_gdpr Responsibility of the controller unknown 0
data_governance_appi_gdpr Processor unknown 0
data_governance_appi_gdpr Records of processing activities unknown 0
data_governance_appi_gdpr Data protection impact assessment unknown 0
data_governance_appi_gdpr Notification of a personal data breach unknown 0
data_governance_appi_gdpr Transfers of personal data to third countries or international organisations unknown 0
data_governance_appi_gdpr Data protection officer unknown 0
data_nosql_jsonschema JSON Schema Documents unknown 0
data_nosql_jsonschema Schema Vocabularies covered_text_match 7
data_nosql_jsonschema Meta-Schemas unknown 0
data_nosql_jsonschema Identifiers covered_text_match 3
data_nosql_jsonschema References covered_text_match 24
data_nosql_jsonschema Applicators covered_text_match 353
data_nosql_jsonschema Assertions covered_text_match 174
data_nosql_jsonschema Annotations covered_text_match 17
data_nosql_jsonschema Validation Keywords covered_text_match 52
data_nosql_jsonschema Format covered_text_match 31
data_relational_iso_sql schema definition covered_text_match 57
data_relational_iso_sql table definition unknown 0
data_relational_iso_sql data types covered_text_match 4
data_relational_iso_sql domain constraints covered_text_match 85
data_relational_iso_sql referential constraints covered_text_match 26
data_relational_iso_sql query expressions covered_text_match 222
data_relational_iso_sql data change statements covered_text_match 49
data_relational_iso_sql transaction statements covered_text_match 21
data_relational_iso_sql isolation levels unknown 0
data_relational_iso_sql views unknown 0
ddd_domain_driven_design ubiquitous_language unknown 0
ddd_domain_driven_design bounded_context unknown 0
ddd_domain_driven_design aggregate_design covered_text_match 7
ddd_domain_driven_design entity_value_object covered_text_match 2
ddd_domain_driven_design domain_events unknown 0
ddd_domain_driven_design repository_pattern covered_text_match 2
ddd_domain_driven_design application_service unknown 0
ddd_domain_driven_design context_mapping unknown 0
ddd_domain_driven_design anti_corruption_layer unknown 0
dora_sre_metrics deployment_frequency unknown 0
dora_sre_metrics lead_time_for_changes unknown 0
dora_sre_metrics change_failure_rate unknown 0
dora_sre_metrics mean_time_to_restore unknown 0
dora_sre_metrics slo_sli_definition unknown 0
dora_sre_metrics error_budget_policy unknown 0
dora_sre_metrics toil_reduction unknown 0
dora_sre_metrics incident_management unknown 0
i18n_unicode_cldr locale_tagging unknown 0
i18n_unicode_cldr character_encoding covered_text_match 6
i18n_unicode_cldr time_zone_handling covered_text_match 8
i18n_unicode_cldr number_currency_format unknown 0
i18n_unicode_cldr date_time_calendar unknown 0
i18n_unicode_cldr text_collation unknown 0
i18n_unicode_cldr rtl_bidi_support covered_text_match 9
i18n_unicode_cldr pluralization_rules covered_text_match 24
i18n_unicode_cldr translation_string_management covered_text_match 15
ml_model_cards model_details unknown 0
ml_model_cards intended_use unknown 0
ml_model_cards evaluation_factors covered_text_match 2
ml_model_cards performance_metrics covered_text_match 4
ml_model_cards training_data unknown 0
ml_model_cards ethical_considerations unknown 0
ml_model_cards caveats_recommendations covered_text_match 1
ml_model_cards model_versioning unknown 0
mobile_a11y_native touchscreens unknown 0
mobile_a11y_native small screen sizes unknown 0
mobile_a11y_native different input modalities unknown 0
mobile_a11y_native color contrast unknown 0
mobile_a11y_native larger text sizes unknown 0
mobile_a11y_native screen reader covered_text_match 1
mobile_a11y_native haptics unknown 0
mobile_a11y_native Reduce Motion unknown 0
mobile_android_material3 Color unknown 0
mobile_android_material3 Typography unknown 0
mobile_android_material3 Shape covered_text_match 3
mobile_android_material3 Elevation covered_text_match 1
mobile_android_material3 Motion covered_text_match 5
mobile_android_material3 Components covered_text_match 5
mobile_android_material3 Icons unknown 0
mobile_android_material3 Accessibility unknown 0
mobile_android_material3 Adaptive design covered_text_match 7
mobile_android_material3 Interaction covered_text_match 8
mobile_android_material3 Content design unknown 0
mobile_android_material3 Dynamic color unknown 0
mobile_ios_hig Navigation and search unknown 0
mobile_ios_hig Typography unknown 0
mobile_ios_hig Color unknown 0
mobile_ios_hig Accessibility unknown 0
mobile_ios_hig Playing haptics unknown 0
mobile_ios_hig Motion covered_text_match 3
mobile_ios_hig Inputs covered_text_match 3
mobile_ios_hig Layout covered_text_match 7
mobile_ios_hig Icons unknown 0
mobile_ios_hig Playing audio unknown 0
mobile_ios_hig Privacy unknown 0
mobile_ios_hig Feedback covered_text_match 9
mobile_security_masvs storage_security unknown 0
mobile_security_masvs crypto_best_practices unknown 0
mobile_security_masvs auth_session_management covered_text_match 17
mobile_security_masvs network_communication covered_text_match 14
mobile_security_masvs platform_interaction covered_text_match 1
mobile_security_masvs code_quality covered_text_match 47
mobile_security_masvs resilience covered_text_match 2
ops_cicd_pipeline declarative_config covered_text_match 19
ops_cicd_pipeline version_control unknown 0
ops_cicd_pipeline automated_apply covered_text_match 125
ops_cicd_pipeline continuous_reconciliation unknown 0
ops_cicd_pipeline drift_detection covered_text_match 8
ops_cicd_pipeline rollback unknown 0
ops_cicd_pipeline observability covered_text_match 1
ops_iac_terraform terraform covered_text_match 8
ops_iac_terraform provider covered_text_match 156
ops_iac_terraform resource covered_text_match 87
ops_iac_terraform data covered_text_match 86
ops_iac_terraform variable covered_text_match 298
ops_iac_terraform state covered_text_match 169
ops_iac_terraform module covered_text_match 378
ops_iac_terraform workspace covered_text_match 84
ops_iac_terraform backend covered_text_match 25
ops_iac_terraform Sentinel unknown 0
ops_kubernetes Workloads covered_text_match 31
ops_kubernetes Service covered_text_match 20
ops_kubernetes ConfigMap covered_text_match 85
ops_kubernetes PersistentVolume unknown 0
ops_kubernetes RBAC covered_text_match 40
ops_kubernetes Scheduling covered_text_match 1
ops_kubernetes ResourceQuota covered_text_match 6
ops_kubernetes Probe unknown 0
ops_kubernetes HorizontalPodAutoscaler covered_text_match 31
ops_kubernetes Events covered_text_match 30
ops_kubernetes Upgrade A Cluster unknown 0
ops_kubernetes Namespace covered_text_match 4
ops_observability_otel signals_traces covered_text_match 3
ops_observability_otel signals_metrics covered_text_match 19
ops_observability_otel signals_logs covered_text_match 1
ops_observability_otel context_propagation covered_text_match 13
ops_observability_otel resource_attributes covered_text_match 26
ops_observability_otel instrumentation covered_text_match 71
ops_observability_otel collector covered_text_match 2
ops_observability_otel semantic_conventions unknown 0
process_iso25010 functional_suitability unknown 0
process_iso25010 performance_efficiency unknown 0
process_iso25010 compatibility covered_text_match 5
process_iso25010 usability unknown 0
process_iso25010 reliability covered_text_match 6
process_iso25010 security covered_text_match 17
process_iso25010 maintainability unknown 0
process_iso25010 portability unknown 0
process_test_iso29119 test_concepts_definitions unknown 0
process_test_iso29119 test_processes unknown 0
process_test_iso29119 test_documentation unknown 0
process_test_iso29119 test_techniques unknown 0
process_test_iso29119 keyword_driven_testing unknown 0
process_test_iso29119 work_aided_software_testing unknown 0
twelve_factor_app codebase covered_text_match 12
twelve_factor_app dependencies covered_text_match 47
twelve_factor_app config covered_text_match 153
twelve_factor_app backing_services unknown 0
twelve_factor_app build_release_run covered_text_match 276
twelve_factor_app processes covered_text_match 1
twelve_factor_app port_binding unknown 0
twelve_factor_app concurrency covered_text_match 1
twelve_factor_app disposability unknown 0
twelve_factor_app dev_prod_parity unknown 0
twelve_factor_app logs covered_text_match 1
twelve_factor_app admin_processes unknown 0
web_a11y_wcag22_aa 1.1 Text Alternatives unknown 0
web_a11y_wcag22_aa 1.2 Time-based Media unknown 0
web_a11y_wcag22_aa 1.3 Adaptable unknown 0
web_a11y_wcag22_aa 1.4 Distinguishable unknown 0
web_a11y_wcag22_aa 2.1 Keyboard Accessible unknown 0
web_a11y_wcag22_aa 2.2 Enough Time unknown 0
web_a11y_wcag22_aa 2.3 Seizures and Physical Reactions unknown 0
web_a11y_wcag22_aa 2.4 Navigable unknown 0
web_a11y_wcag22_aa 2.5 Input Modalities unknown 0
web_a11y_wcag22_aa 3.1 Readable unknown 0
web_a11y_wcag22_aa 3.2 Predictable unknown 0
web_a11y_wcag22_aa 3.3 Input Assistance unknown 0
web_a11y_wcag22_aa 4.1 Compatible unknown 0
web_authn_webauthn registration ceremony unknown 0
web_authn_webauthn authentication ceremony covered_text_match 5
web_authn_webauthn attestation unknown 0
web_authn_webauthn user verification covered_text_match 34
web_authn_webauthn credential management unknown 0
web_authn_webauthn extensions covered_text_match 5
web_browser_compat Newly available unknown 0
web_browser_compat Widely available unknown 0
web_browser_compat Limited availability unknown 0
web_browser_compat core browser set unknown 0
web_browser_compat Baseline threshold unknown 0
web_browser_compat polyfill covered_text_match 2
web_browser_compat progressive enhancement covered_text_match 20
web_forms_html5 input element covered_text_match 159
web_forms_html5 form element covered_text_match 348
web_forms_html5 client-side form validation covered_text_match 234
web_forms_html5 autocomplete covered_text_match 1548
web_forms_html5 label element covered_text_match 282
web_forms_html5 fieldset unknown 0
web_forms_html5 inputmode covered_text_match 14
web_forms_html5 form submission covered_text_match 14
web_forms_html5 File Upload state covered_text_match 239
web_performance_core_web_vitals Largest Contentful Paint (LCP) unknown 0
web_performance_core_web_vitals Interaction to Next Paint (INP) covered_text_match 8
web_performance_core_web_vitals Cumulative Layout Shift (CLS) unknown 0
web_performance_core_web_vitals Time to First Byte (TTFB) unknown 0
web_performance_core_web_vitals First Contentful Paint (FCP) covered_text_match 32
web_performance_core_web_vitals Time to Interactive (TTI) unknown 0
web_pwa_manifest manifest members covered_text_match 259
web_pwa_manifest icons covered_text_match 122
web_pwa_manifest display covered_text_match 104
web_pwa_manifest start_url covered_text_match 648
web_pwa_manifest scope covered_text_match 22
web_pwa_manifest theme_color covered_text_match 17
web_pwa_manifest shortcuts covered_text_match 30
web_pwa_manifest share_target covered_text_match 153
web_responsive width unknown 0
web_responsive orientation unknown 0
web_responsive prefers-color-scheme covered_text_match 11
web_responsive prefers-reduced-motion covered_text_match 2
web_responsive resolution covered_text_match 9
web_responsive hover covered_text_match 14
web_responsive pointer covered_text_match 23
web_responsive aspect-ratio unknown 0
web_security_owasp broken_access_control unknown 0
web_security_owasp cryptographic_failures unknown 0
web_security_owasp injection covered_text_match 2
web_security_owasp insecure_design unknown 0
web_security_owasp security_misconfiguration unknown 0
web_security_owasp vulnerable_and_outdated_components unknown 0
web_security_owasp identification_and_authentication_failures unknown 0
web_security_owasp software_and_data_integrity_failures unknown 0
web_security_owasp security_logging_and_monitoring_failures unknown 0
web_security_owasp server_side_request_forgery_ssrf unknown 0
web_security_owasp authentication covered_text_match 5
web_security_owasp session_management unknown 0
web_security_owasp input_validation unknown 0
web_security_owasp output_encoding_and_injection_prevention unknown 0
web_seo_schemaorg Organization covered_text_match 12
web_seo_schemaorg Person covered_text_match 8
web_seo_schemaorg Product covered_text_match 7
web_seo_schemaorg Article covered_text_match 43
web_seo_schemaorg BreadcrumbList unknown 0
web_seo_schemaorg FAQPage covered_text_match 19
web_seo_schemaorg Event covered_text_match 25
web_seo_schemaorg VideoObject unknown 0

Totals: 369 axes, 176 covered signals (47.70%), 193 unknown.

yohey-w and others added 2 commits September 14, 2026 22:22
…拠喪失の沈黙

Codex(gpt-5.6-sol/high・別血統)の read-only レビューが挙げた MUST 4件を閉じる。

1. 移行デッドロック(新規に作り込んでいた)。runtime だけで束縛されていた strict
   プロジェクトは、台帳が無い状態で unbound_acceptance が unbound_severity=red に
   なり、静的 verify が赤 → Step 8 に到達できない → 台帳が生まれない → 永久に赤。
   ⇒ ステージが有効な間、runtime 実行待ちが原因の unbound は
   runtime_execution_severity(既定 amber)で出す。unbound は not_executed の
   結果であって別の欠陥ではない(remedy も「走らせろ」の1つ)。ステージが無効な
   ときは従来どおり unbound_severity(走らせる経路そのものが無いので別の欠陥)。
2. 失敗実行が証拠になっていた。fail-fast の最初の失敗でも台帳は書かれ、record.passed
   は読むだけで判定に使っていなかったため、失敗した実行が後続の verify で緑の束縛
   として読まれた。⇒ 暗黙義務は passed=True の実行だけが証明する(reason run_failed)。
   明示 runtime:<case> は「その名前のチェックが passed」で判定するので、隣で別の
   チェックが落ちても巻き添えにしない。
3. config_digest が実行計画を表していなかった。①--runtime-base-url で別環境へ向けた
   実行が、設定ファイル上の URL を検証した証拠として残っていた ⇒ 実効 target_url を
   台帳に記録し、設定の dev_server.url と食い違えば target_changed。②report 出力先の
   変更で失効していた ⇒ runtime_smoke.report を digest から除外。③merged 設定を
   ハッシュしていたため CoDD 更新で全プロジェクトの台帳が一斉失効しうる ⇒ プロジェクト
   自身の codd.yaml の生セクションをハッシュする。
4. 台帳の書き込み失敗が沈黙していた ⇒ Step 8 が stderr に WARN を出す。FAIL には
   しない: 書けなかったのは成果物の喪失であって false green ではなく(次の verify が
   no_record を正直に報告する)、read-only チェックアウトを JSON 1本で落とすのは不均衡。

あわせて SHOULD も: 未来日付は stale 扱い(max(0) クランプ廃止)・台帳は temp+rename の
アトミック書き込み・version 不一致と executed 0件の台帳は「証拠なし」・名前の正規化は
空白と `_-` のみに縮小(`.` `/` を畳むと a.b と ab が同一になる)。

テスト12本追加(合計26本)。全件 7760 passed / skip 3(dogfood コーパス不在の既往)。
MUST1 のテストは直前コミット 5dac942 に対して RED を実測。
Dogfood 再測(同一ツリー・enabled:true・未実行): 合計 180 件で不変、内訳が
red 125→34・amber 55→146(unbound 61 = amber 41 + red 20)。宣言では finding は
1件も消えず、赤が「未証明」の琥珀に降りるだけ。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2
同じ検査器(Codex gpt-5.6-sol/high・read-only)の再レビューから、実在する穴だけを閉じる。

- 書き込み失敗時に**古い成功台帳が生き残っていた**(唯一の真の false green)。
  昨日の緑+今日の記録不能=昨日の判定が今日の証拠として読まれる。⇒ 書けなかった
  ときは古い台帳を削除する。削除も拒否されたら Step 8 を FAIL にしてファイル名を出す。
  WARN で済ませるのは「今回の記録が消えただけ」の場合に限る。
- `report.fail_fast` を digest に戻した。最初の失敗の後を走らせるかを決める=実行計画
  であって出力先ではない。除外は `report.log_to_file` と `report.file_path` だけ。
  空になった report キーは落として、`report:` 無しと同じハッシュにする。
- target_url が空の台帳が、URL を設定したプロジェクトの証拠として通っていた。
  CoDD が書く台帳は必ず target を持つので、空=別物として target_changed にする。
- `bool("false")` は True。手書きの `"passed": "false"` が合格として読まれるので、
  真偽値は JSON の true だけを真とする(passed/skipped の両方)。

テスト5本追加(合計31本)。全件 7765 passed / skip 3(既往)。

意図的に採らなかった指摘は PR コメントに理由つきで残す(実装内容への束縛=本 PR で
明示的にスコープ外と書いた事項、--runtime-skip の部分実行、台帳の改竄耐性)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2
@yohey-w

yohey-w commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

独立レビュー逐語(Codex gpt-5.6-sol / high・read-only・別血統)

全文は kagemusha 側 local/reports/codd_runtime_smoke_review_20260914.md に保存。以下は同一内容の転記。

1巡目(commit 5dac942 に対して)

結論: 現状はマージ不可。特に移行デッドロックと、失敗・部分実行による false green が致命的です。

  • MUST — 既存 strict プロジェクトはアップグレードだけで赤になり、初回台帳を正規手順で作れない。台帳なしでは runtime binding に入らず(codd/dag/checks/acceptance_evidence.py:254)、同じ criterion に unbound_acceptance が追加される(同:465)。runtime_execution_severity は amber でも、strict の unbound_severity は red(codd/acceptance_evidence.py:263, 同:265)。さらに CLI は静的 verify が失敗すると終了し(codd/cli.py:6108, 同:6115)、Step 8 はその後(同:6116)。したがって runtime 以外の binding がない既存 strict 構成では、codd verify --runtime 自身が台帳作成地点へ到達できない。テストは新 finding の severity しか確認せず、result.passed と CLI 一周を検証していない(tests/dag/test_acceptance_evidence.py:425)。移行中は runtime 起因の unbound も amber にするか、--runtime 時だけ Step 8→静的再検証の順にする必要がある。

  • MUST — 失敗した部分実行だけで、全 inferred runtime criterion が証明済みになる。runner は fail-fast の最初の失敗でも _finish を呼び(codd/runtime_smoke/runner.py:60)、enabled なら成否を問わず台帳を書く(同:145, 同:151)。記録側も「非 skip が一件あれば」保存する(codd/runtime_record.py:245)。一方、inferred obligation は明示 runtime ref がなければ対象確認を一切せず(codd/acceptance_evidence.py:500)、実際に「無関係な DB check 一件で消える」挙動をテストが固定している(tests/dag/test_acceptance_evidence.py:416)。また record.passed は読み込まれるだけで判定に使われない(codd/runtime_record.py:182, codd/acceptance_evidence.py:465)。「Step 8 が失敗を報告済み」は同一 invocation 内だけの話で、後続の plain verify は失敗台帳を緑の binding として読む。失敗実行は「実行済み finding」を消しても、acceptance binding にはしてはならない。inferred 対象にも operation/case ID の実行記録が必要。

  • MUST — config_digest が「実際に走った実行計画」を表していない。--runtime-base-url は実行時設定へ反映される(codd/runtime_smoke/config.py:135, 同:167)が、台帳作成時はディスク設定を再ロードしてハッシュする(codd/runtime_smoke/runner.py:170, 同:178)。したがって別環境に override した実行が、設定ファイル上の URL を検証した証拠として残る。また digest は merged config の runtime_smoke/runtime 全体(codd/runtime_record.py:107, 同:116)なので、report 出力先など無関係な変更でも失効する。将来 defaults に runtime 項目が追加された場合、CoDD の更新だけで既存台帳が失効する可能性がある、という部分は推測だが、merge 済み defaults を使う構造上の帰結である(codd/config.py:45)。versioned な実効実行計画をハッシュし、override・skip を含め、report-only 設定を除外すべき。

  • MUST — 台帳書き込み失敗を成功として返す。write_text の OSError は None に潰され(codd/runtime_record.py:213)、runner も証拠喪失を明示的に非致命扱いする(codd/runtime_smoke/runner.py:166)。CLI は ledger_path を確認せず runtime の成否だけで終了する(codd/cli.py:6188)。そのため codd verify --runtime が exit 0 でも、次回必要な証拠が存在しない。台帳を契約にするなら、永続化失敗も Step 8 の失敗に含めるべき。

  • SHOULD — 台帳の意味検証が不足している。loader は version、digest 形式、最低一件の executed check、passed と checks の整合性を検証しない(codd/runtime_record.py:163, 同:169, 同:182)。手書きの checks: [] でも inferred obligation は通る。構文破損テストしかない(tests/dag/test_acceptance_evidence.py:457)。意図的改竄まで防ぐなら JSON 検証では足りず、CI 署名・provenance が必要。

  • SHOULD — 名前正規化は過剰一致する。空白・_-. / をすべて削除するため、a-b、ab、a/b、a.b が同一になる(codd/runtime_record.py:44, 同:55)。さらに name だけでなく広い category でも一致する(同:71)。安定した case ID の完全一致を主とし、表示名の正規化は補助に限定した方がよい。

  • SHOULD — 鮮度と並行性の境界がない。未来時刻や時計巻き戻しは max(0) により常に新鮮扱いになる(codd/runtime_record.py:100, 同:104)。書き込みも一時ファイル+atomic replace ではなく直接上書き(同:215)なので、並行実行中の部分読みや last-writer-wins が起こり得る。

  • NIT — .codd のパス解決自体は find_codd_dir 経由で対応している(codd/runtime_record.py:124, codd/config.py:26)が、追加テストは codd/ 固定。.codd、write failure、failed/fail-fast、base URL override、未来時刻、並行書き込みを追加すべき。

本番コードへの特定フレームワーク語彙の混入は見当たりません。pytest は読み取り専用環境で一時ファイルを作れず、収集前に停止したため実行結果は得られていません。

2巡目(MUST 4件の修正差分 5dac942..0881b76 に対して)

MUST: (2) は部分実行について未解決です。runner.py:149 と runtime_record.py:335 は skip を成功扱いするため、「DB だけ pass、dev-server/e2e 等は --runtime-skip」でも record.passed=True になります。それを acceptance_evidence.py:524 が inferred obligation の証明として受理します。全 skip も overall_passed=True のまま台帳なしで CLI が成功します。t45 は「台帳がない」しか検査せず、終了判定を検査していません。explicit の個別 pass 判定自体は閉じていますが、answers_to() が name だけでなく category も許すため、runtime_record.py:85 の runtime:crud-flow は同カテゴリ中1件の pass だけで成立します。

MUST: (1) の severity 差し替えは新しい strict 回避路です。acceptance_evidence.py:260 で execution は strict でも既定 amber、dag/checks/acceptance_evidence.py:285 は no_record だけでなく run_failed/target_not_executed/stale 等すべてを pending に入れ、同:492 が unbound の赤も amber に落とします。結果、未束縛ACへ runtime:anything と enabled:true を足すだけで 同:1053 の pass にできます。移行デッドロックは、通常 verify の意味を弱めず、verify --runtime のときだけ Step 8 到達を許す順序/bootstrap 状態で解くべきです。少なくとも既知の失敗・対象不実行まで migration amber にしてはいけません。

MUST: (3) の digest はまだ実行計画を表していません。runtime_record.py:48 は report 全体を除外しますが、report.fail_fast は config.py:103 と runner.py:63 で後続チェックを実行するか決めます。したがって変更しても旧証拠が残ります。また acceptance_evidence.py:503 は空の target_url を無条件に許します。形式 version は旧実装と同じ1なので、対象を持たない既存台帳を明示的に拒否できません。.codd/codd.yaml と YAML anchor は本体同様 find_codd_dir+safe_load で整合しています。一方、生YAML方式は本体が適用する defaults を含まず、shell/E2E が継承する環境変数の実効値も含みません。

MUST: (4) は evidence-bearing 実行では WARN では不十分です。runtime_record.py:289 の置換失敗は既存の成功台帳を残し、cli.py:6193 は警告だけです。「次回は no_record」という文言も既存台帳があれば偽です。具体的には、旧 pass 台帳→今回 runtime が失敗→台帳更新も失敗、の後、plain verify は旧 pass を読み続けます。また新規台帳なし・全チェックskipでも同じ WARN 経路から exit 0 です。runtime obligation がある実行では、台帳を永続化できない/何も実行しなかった場合は FAIL が妥当です。

MUST: PR全体として、runtime 証拠が実装変更で失効しません。runtime_record.py:158 は runtime設定だけをハッシュし、freshness は既定無期限です。成功台帳の後でアプリコードだけ壊しても acceptance_evidence.py:496 は受理します。少なくとも実装/revision digest が必要です。

追加テストには、部分skip、全skipのCLI exit、strict宣言回避、fail_fast変更、target欠落version-1、旧台帳を残したwrite failure、実装変更後の失効が必要です。加えて runtime_record.py:246 の bool("false")==True と、top-level passed と checks の不整合も malformed として拒否する試験がありません。

対象pytestは、read-only環境に利用可能な一時ディレクトリがなく収集前に停止しました。git diff --check 5dac942..HEAD は通過しています。

- ゲートは設定 URL を strip して比較するのに、ランナーは YAML の値をそのまま
  記録していた。末尾に空白のある `url:` で target_changed の誤検知になるので、
  記録側も strip する。
- 古い台帳を消せなかったときの FAIL メッセージが `codd/runtime_ledger.json` を
  ハードコードしていた。`.codd/` のプロジェクトに嘘のパスを出すので ledger_path()
  から引く。

全件 7765 passed / skip 3(既往)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2
@yohey-w

yohey-w commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

レビュー処置のまとめ(マージ判断の材料)

独立レビュー(Codex gpt-5.6-sol / high・read-only・別血統)を2巡。MUST 9件のうち 8件を修正、残り3件(うち1件は2巡連続の同一根)を理由つきで却下した。逐語は上のコメント。

却下の理由

(a) severity 差し替えは strict の抜け道である(2巡連続・同一根) — 事実として正しい。verified_by: runtime:<何か> と enabled: true を足せば、strict の赤い unbound_acceptance が琥珀に降りる。それでも今回この形で出すのは:

  • finding は1件も消えない。 main では宣言だけで 91件が消えた(180→89)。本 PR では 180 件のまま、名前と remedy つきで立っている。赤→琥珀は「証拠なし」から「未証明」への降格であって、不可視化ではない。
  • 代わりの案(unbound を赤のまま)は成立しない。 codd verify --runtime は静的 verify が通ってから Step 8 を走らせるので、unbound が赤いと台帳を作る手段そのものに到達できない。no_record に限定しても解決しない——run_failed(アプリを直しても再実行に到達できない)・config_changed・stale も同じ壁に当たる。remedy が「走らせろ」である finding が赤い限り、順序を変えない限りデッドロックは消えない。
  • 拒否の1行が用意してある。 ramp を拒む strict プロジェクトは acceptance_evidence.runtime_execution_severity: red を書けば、not_executed も付随する unbound も赤に戻る。
  • 順序(Step 8 の到達性)で解く筋は codd verify --runtime: 静的 verify が赤いと Step 8 に到達できない——「走らせろ」が remedy の finding を消せない #45 に分離した。そちらが入れば、この severity 差し替えは撤去してよい。

(b) 実行証拠が実装内容に束縛されていない — 正しい指摘だが、レビュー前に設計書 docs/design/acceptance-evidence-invariant.md の "What stays outside" にスコープ外として明記した事項(ランナーが依存グラフを持たないため、両側が同じ digest を計算できる仕組みが別途要る)。本 PR で悪化させたものではない(PR 前は runtime 証拠の要求そのものが無かった)。#46 に起票。

(c) --runtime-skip の部分実行 — オペレータの明示的な選択で、本 PR 以前からある性質。どのチェックが skip されたかは台帳に1件ずつ記録されるので監査可能。判定に使っていないという限界は設計書に明記した。

2巡目で実際に閉じたもの(すべて本 PR 内で修正済み)

  • 古い成功台帳が書き込み失敗を生き延びる(唯一の真の false green)→ 古い台帳を削除。削除も拒否されたら Step 8 を FAIL にしてファイル名を出す。
  • report.fail_fast を digest から外していた → 実行計画なので戻した。除外は log_to_file / file_path のみ。
  • target_url が空の台帳が、URL を設定したプロジェクトの証拠として通っていた → 空=別物。
  • bool("false") == True → JSON の true だけを真とする。

状態

  • CI 5/5 緑(test 3.10/3.11/3.12・audit・coverage-check)。
  • pytest 全件 7765 passed / 3 skipped / 2 xfailed。skip 3 は dogfood コーパスが gitignore で不在という構造的 skip(clean な origin/main でも同じ)。
  • codd dag verify(自己適用)の赤は canon_integrity 1件のみで、clean な origin/main でも同一の10件 canon_missing が出る既往(stash して実測)。

🤖 Generated with Claude Code

https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2

`git show origin/main:<test files> | grep -c '^def test_'` との差分で実測。
7731 → 7765 の増分と一致する。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xpq9A9SFvMUky6i6NLFz2
@yohey-w
yohey-w merged commit 41b5f87 into main Sep 14, 2026
5 checks passed
@yohey-w
yohey-w deleted the fix/runtime-smoke-requires-execution-evidence branch September 14, 2026 14:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

acceptance_evidence: runtime_smoke.enabled の真偽値だけで「実行済み」と見なしている——宣言が証拠として通る

1 participant