Determinism Tier 3: capture LLM reasoning and evidence trail in attestations, logs, and reports
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
Start with the attestation predicate at packages/darnit-baseline/src/darnit_baseline/attestation/predicate.py:82-102 and trace how CheckResult data reaches it through the harness-to-attestation path. Then inspect LLMConsultationResponse and the markdown/SARIF formatters named in the issue; identify their existing tests before changing behavior. Done means the specified pass and LLM evidence can be recorded and surfaced, with INFO logging and the remediation review checkpoint behaving as scoped.
索引モデルが issue の本文から書いたものです。
説明
Summary
When a control's verdict is decided by an LLM consultation
(llm_eval handler resolving via the harness driver), the LLM's
reasoning is captured in the intermediate CheckResult but is
not serialized into attestations, is not logged, and is
not surfaced in markdown / SARIF report output (JSON contains it
if the caller opts into the full evidence dump).
An attestation without an evidence trail is a bare claim.
Reproducing an LLM verdict later requires re-running the LLM against
the same prompt, which the current system doesn't preserve.
This is Determinism Tier 3: nondeterministic results (LLM outputs
have unavoidable model-side variance) are legitimate, but the
reasoning that produced them must be recoverable.
Concrete gaps
Attestation predicate
packages/darnit-baseline/src/darnit_baseline/attestation/predicate.py:82-102
-- per-control attestation records:id,level,category,
status,message,evidence,source, and (post feature 025)
authority. It does NOT record:- Which sieve pass fired (
file_must_exist,exec,pattern,
llm_eval,manual). - For
exec: the command, stdout, exit code. - For
llm_eval: the prompt sent, the model's reasoning, the
model version, token usage. pass_history-- the cascade of attempts across phases.
- Which sieve pass fired (
LLM consultation response shape
packages/darnit/src/darnit/sieve/models.py:81-88--
LLMConsultationResponsecarriesstatus,confidence, a single
reasoning: str, andevidence_cited: list[str]. No structured
evidence trace, no model version, no request-id for correlation.
Report formatters
- Markdown / SARIF do NOT surface LLM reasoning. Full JSON does
(via the evidence dict) but the summary JSON strips it. - Markdown surfaces
resolving_pass_handlerandpass_history(per
tools/audit.py:918-931) so operators can see WHICH pass resolved
the control, but not the LLM's reasoning for the resolution.
Logging
packages/darnit/src/darnit/sieve/orchestrator.py-- no per-pass
disposition logging (PASS/FAIL/INCONCLUSIVE transitions across the
cascade are not emitted).packages/darnit/src/darnit/sieve/builtin_handlers.py-- no
logging of exec command invocation or LLM reasoning at INFO.
LLM-based remediation
packages/darnit-baseline/src/darnit_baseline/remediation/enhancer.py:56-133
-- LLM enhancement is invoked via anllm_fn()callback with no
capture of the request/response, no operator sign-off checkpoint
before applying LLM-suggested changes. This is a Principle IV
concern in addition to a determinism concern.
Scope
- Extend the attestation predicate per-control fields to include:
resolving_pass_handlerandresolving_pass_index.pass_history(already in CheckResult; propagate through).- For
llm_evalresolutions:llm_reasoning,llm_model, and
llm_confidence. Prompt inclusion is opt-in per attestation
profile (large; may be redacted for privacy). error_classwhen present (from #419).
- Extend
LLMConsultationResponseto carrymodeland (optionally)
request_id. - Extend markdown and SARIF formatters to surface LLM reasoning
when present. - Add INFO-level logs at: LLM request dispatch, LLM response receipt,
per-control final disposition. - For LLM-based remediation: log request/response at INFO; add an
operator-review checkpoint in the remediation orchestrator before
applying LLM-suggested changes (interactive prompt when TTY;
fail-loud when non-interactive without explicit
--accept-llm-suggestions).
Non-goals for v0
- Persisting the full LLM prompt in every attestation by default
(size concerns; opt-in per profile). - Storing LLM raw token streams / chain-of-thought (privacy and
size; final reasoning string is sufficient for audit trail). - Alternative LLM providers or a model-selection UI.
Constitution alignment
- II. Conservative-by-Default: an LLM PASS without recorded
reasoning is not a defensible audit result. - IV. Never Guess User Values: the LLM-remediation review
checkpoint is a hard implementation of this principle -- LLM
output alone MUST NOT apply changes. - V. Sieve Pipeline Integrity: the sieve records which pass
resolved a control; the attestation should record the same.
Related
- #418 (Determinism Tier 1) and #419 / #420 (Tier 2) -- companions.
- Feature 025 / RFC-0001 Stage 1 -- introduced
authority;
attestation already carries it. This issue extends the same file
with additional per-control fields. - Feature 026 / harness driver -- LLM dispatch lives there; the
reasoning-capture wiring goes on the harness->attestation path.
- 主要言語
- Python
- スター
- 22
- フォーク
- 27
- 平均マージ
- 1日 20時間
- マージ済み PR(30日)
- 39
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
darnitdevorg/darnit のほかの issue
-
`darnit validate` crashes on openssf-baseline.toml summarising levels対応中かも @i-am-paradox が 1 日前に担当しました。 オープンneeds triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
darnitdevorg/darnit#589 ·
メンテナーはふだん 1 日以内に返信
-
needs triage
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
darnitdevorg/darnit#587 ·
メンテナーはふだん 1 日以内に返信
-
needs triage
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
darnitdevorg/darnit#585 ·
メンテナーはふだん 1 日以内に返信
-
quality
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
darnitdevorg/darnit#523 ·
メンテナーはふだん 1 日以内に返信
-
documentation good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
darnitdevorg/darnit#516 ·
メンテナーはふだん 1 日以内に返信
darnitdevorg/darnit の issue をすべて見る
似ている issue
-
fix formatting of the sample database page of the docs対応中かも @Aaqibhafeezkhan が今日担当しました。 オープンdocumentation good first issue help wanted
難易度 1/5 1時間未満 初心者へのやさしさ 72/100
chaoss/CollectOSS#544 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
area/plugin good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
kestra-io/plugin-soda#137 ·
-
難易度 2/5 半日 初心者へのやさしさ 62/100
ibm-granite/granite.build#504 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信