Skip to content

Run update pull request for v3.1.0 - #22

Merged
brhkim merged 182 commits into
mainfrom
daaf_dev
Nov 3, 2026
Merged

brhkim merged 182 commits into
mainfrom
daaf_dev

Conversation

@brhkim

@brhkim brhkim commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

Brings in full daaf_dev current branch to update main for v3.1.0 release

DAAF Container and others added 30 commits August 20, 2026 14:17
Move the exact Sol profile to 60/75/90 percent while retaining its 300k/400k/500k absolute gates, synchronize documentation, and strengthen boundary coverage.

Co-Authored-By: Claude <noreply@anthropic.com>
…is hardening, observed-provider re-pins

Editorial (README step 8b, all prose user-ratified in-session):
- viewer_template.html: hero bottom line, T1/T2/T3/T5 rewritten for the new
  field (frontier six models/five creators incl. GLM 5.3; open-weights top
  tier; Qwen 27B fully-local viability); fillTakeaways span/setter contract
  updated in lockstep (27 -> 36 spans, verified both directions)
- generate_results_viewer_v2.py: dev-guide span inventory 27 -> 36
- CHANGELOG.md: 2026-08-21 Models + Pricing entries

Process fixes (README):
- step 8: changelog entry required BEFORE regeneration
- step 8b: standing tier/frontier-membership recalculation check
- model matrix 39 -> 41 (9 anthropic / 29 openrouter / 3 chatgpt)

Cost-basis hardening (scoping verified NO contamination today):
- reconcile_openrouter_costs.py: timed-out runs structurally barred from
  attribution candidacy (verified numeric no-op: 0 field diffs / 25 models)
- README: documented the positively-identified clean-set covered-run basis

Re-pins to observed serving providers (user-approved):
- qwen-38-27b: venice/fp8 -> alibaba (84.9% of billed cost); rates
  0.45/3.20 -> 0.575/3.45 + cached_input 0.115; battery $29.19 -> $36.46
- qwen-38-24t-a95b: modal/nvfp4 -> siliconflow/fp8 (57.3% cost, 86% tokens);
  identical rates, no cost change
- test_chatgpt_route.py: new keys registered; counts 39/27 -> 41/29 (27/27 OK)

Scratch (kept as reusable patterns / acceptance evidence): rep-count
verification, cost-attribution scoping probes, reconciler-guard no-op diff,
re-pin surface verification.
Frontier/T1 membership verified unchanged post-re-pin (daafbench_2026-08-21e).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LFPvTV3rBJjFqMxhzS7tG
…k subscription cap, docs, DAAFBench

Shim (v1.3.19): add openai/gpt-6-astra to the model listing; model-aware
clamp rewriting reasoning effort "none" -> "low" for the Astra family
(Astra rejects "none"; OpenAI primary docs 2026-09-05). All other models
unchanged. Offline tests (8) drive the real shim; start_shim.bats gains an
auth.json preflight regression guard for the Codex CLI 0.144.1 -> 0.153.2
upgrade.

Context accounting: register gpt-6-astra / gpt-6-astra[1m] (bare or
provider-prefixed) at the 1,050,000-token flagship window with Sol-parity
quality thresholds (60/75/90% + 300k/400k/500k) in context-bar.sh; replace
the stale ChatGPT-subscription-lane cap 370,000 with 919,000, measured
2026-09-05 on Codex CLI 0.153.2 / shim v1.3.19 (gpt-6-astra accept 919,053 /
reject 922,552; gpt-5.6-sol accept 910,827 / reject 921,973). route_detection
recognizes Astra and enforces the 919k lane ceiling. probe_context_ceiling
gains a calibration-ratio guard against bogus backend token counts and new
default brackets.

Docs and config: orchestrator mode references, deploy-smoke criteria (T0.4
CLAUDE_CODE_MAX_CONTEXT_TOKENS=919000), integration checklist, env settings
example (both subscription and API routes), README, CONTRIBUTING,
understanding guide, CHANGELOG Unreleased entry. DAAFBench: Astra rows for
the OpenRouter and ChatGPT-subscription routes; Sol/Terra/Luna subscription
ceilings corrected to 919k; openrouter-astra deploy-smoke profile.

Companion commit (owned by the concurrent Claude Code 2.1.261 session):
Dockerfile CODEX_VERSION=0.153.2, the protected context-reporter.sh hook,
subagent-bar.sh, CLAUDE.md / CONTEXT_THRESHOLDS_REFERENCE.md / BOUNDARIES.md
threshold tables, user_reference 01 + 07, and the shared bats suites, which
also carry that session's Opus 5 / Fable 5.1 changes. daaf_lib.bats expects
CODEX_VERSION=0.153.2 accordingly.

Upgrade note: ChatGPT-subscription-lane users should set
CLAUDE_CODE_MAX_CONTEXT_TOKENS=919000 (was 370000) and recreate the container.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016oFpcPRmDPfbjosktSsYhK
…tings hardening, hook coverage

Companion to the GPT-6 Astra commit; completes it by landing the shared surfaces
(context-reporter.sh, CONTEXT_THRESHOLDS_REFERENCE.md, Dockerfile).

- Dockerfile: ARG CLAUDE_CODE_VERSION 2.1.202 -> 2.1.261 (Fable 5.1 added 2.1.257,
  [1m]->200K window bug fixed 2.1.260); provenance cites the 2.1.203-212 and
  2.1.213-261 delta reviews; rollback target 2.1.202. Carries CODEX_VERSION 0.153.2.
- settings.json: env CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH=1 (upstream default is
  depth 3 since 2.1.219); skillListingBudgetFraction 0.1 (guardrail — truncation
  only warns past 10% of window); remove 8 inert Write(...) deny rules — on
  >=2.1.261 only Edit(path) rules are evaluated and cover all file-editing tools
  (live-verified: Write to /tmp denied via Edit(//tmp/**)).
- context-reporter.sh + subagent-bar.sh: register Opus 5 (bare and [1m]) in the 1M
  physical-window glob per observed /model+/context matrix; quality profile stays
  conservative-default. Hook also carries the Astra 919k subscription-lane cap.
- Docs: CONTEXT_THRESHOLDS_REFERENCE (Opus 5 physical/profile note + Astra cap),
  CLAUDE.md/BOUNDARIES (Edit-only deny semantics), skill-authoring + data-source
  template (skillListingMaxDescChars / skillListingBudgetFraction — the community
  name maxSkillDescriptionChars does not exist), user_reference 01/07 currency.
- Tests: enforce_model_ceiling.bats +3 frontmatter-parse cases (mutation-verified);
  subagent_bar.bats +5, context_reporter.bats +5 (Opus 5 / Fable 5.1 windows);
  settings_permissions.bats asserts Edit coverage + Write absence.

Post-rebuild verification on 2.1.261: safety-hook battery 145/145, full bats green,
deploy-smoke Tiers 0/1/2/D PASS, /doctor skill listing green.
Session: research/2026-09-05_FrameworkDev_ClaudeCode_Upgrade_2.1.261/

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018dh9Tij7CMpkbNryoFrGwj
…xplore-model

Both hooks serialized their deny decision through `jq -n`, so a missing jq
silently allowed. Pre-check jq and fall back to stderr + exit 2 (block-webfetch:
unconditional; enforce-explore-model: builtin match on subagent_type "Explore").
ERR traps no longer route through jq. Header docs updated; explore-model
description corrected (denies on Explore alone). Tests: block_webfetch 6->10,
enforce_explore_model 9->16, jq-absence simulation asserted real. agent-authoring
hook convention generalized.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018dh9Tij7CMpkbNryoFrGwj
…ents dir overridable

Repairs the two "CI - Scripts" job failures on 1361b56.

- Provider Shim Unit Tests: three tests still pinned SHIM_VERSION 1.3.18
  (health["version"] in test_historical_regressions and
  test_reasoning_formatting; the "shim v1.3.18 starting" startup record in
  test_stream_hardening). The GPT-6 Astra commit bumped the shim to 1.3.19
  without updating them. Literals updated to 1.3.19 (kept literal by design).

- BATS Tests: enforce_model_ceiling.bats reached its agent fixture by
  `..`-traversing out of the hardcoded /daaf/.claude/agents. The kernel
  resolves the missing /daaf prefix before applying `..`, so `[ -f ]` failed
  on CI runners (no /daaf), the hook saw no agent file, and the two over-tier
  DENY tests allowed instead. The hook now honors
  DAAF_ENFORCE_MODEL_CEILING_AGENTS_DIR (default unchanged; follows the
  DAAF_<SCRIPT>_<PURPOSE> convention of context-reporter.sh), and the tests
  point it at TEST_DIR on the run line.

Verified: full bats tests/bash/ 1294/1294 green; the three shim modules
(117 tests) green under the CI discover invocation; shellcheck clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JmxAYejYFd37dXuRv3R8hw
…ssion cache exists

context-reporter.sh and subagent-bar.sh derived the context window from the
/tmp cache written by the main statusline. When that cache was absent (first
prompt, headless dispatch, statusline not yet rendered) both fell back to the
most recent cache from ANY session, then to 200k, and applied the model-keyed
static window map only to subagents on a DIFFERENT model than the session.
An uncached GPT-6 Astra or Opus 5 main session, and every same-model child of
one, was therefore measured against 200k: a 400k Astra reading reported
100%/CRITICAL and subagents falsely throttled. Most visible on the GPT
subscription route, where the true window is furthest from 200k.

New precedence, identical in both scripts:
  1. different-model subagent -> static map for ITS model (unchanged)
  2. else this session's cache when present (authoritative)
  3. else static map for the MEASURED model; unknown/empty -> 200k
The any-session cache inheritance is removed. CLAUDE_CODE_MAX_CONTEXT_TOKENS,
the 919k ChatGPT-lane cap, and every quality-tier threshold are untouched.
The static map is factored into static_window_for_model() in each script
(same arms as before) and shared by both branches.

Tests: context_reporter.bats +5 (uncached main Astra/Opus 5, unrelated cache
ignored, uncached same-model child, cache stays authoritative); 4 fail against
the pre-fix hook. subagent_bar.bats +5 on the DAAF_SUBAGENT_BAR_CACHE_DIR seam
so live /tmp caches cannot mask the "no cache" condition, plus a tightened
fallback test; 5 fail against the pre-fix script. Full bats tests/bash/ green
(1304), shellcheck clean on both scripts. Hook installed by the user via the
hooks-are-user-only workflow; live file verified byte-identical to the draft.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JmxAYejYFd37dXuRv3R8hw
Prefer the child's latest valid input usage over stale output-only task progress for Astra and registered GPT-5.6 models, including Terra and Luna. Show context pending until measured usage is available while preserving existing windows, thresholds, and unrelated routes.

Add regression coverage for model variants, input partitions, malformed records, startup identity, and child isolation. All 83 renderer tests pass; Astra and Sol running-agent bars were visually confirmed by the user.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Extend transcript-first child input accounting to both supported shim backend modes while preserving the subscription-only 919k cap, model windows, quality profiles, and unrelated routes.

Cover both-mode renderer behavior and late streaming usage through the real shim with loopback fixtures. All 84 renderer tests and 8 prompt-cache tests pass; the previous commit reproduces the API display regression.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Repairs the disclosure gaps reproduced on 2026-09-05 (review synthesis S01):
numeric means, missingness rates, and sparse-numeric blocks could reveal
counts below the support threshold that categorical suppression already hid,
while every embedded validation check still passed.

Policy (user-clarified): minimum support counts usable contributing
observations (default 5), not distinct values. Supported constants,
large-sample missingness rates, and large-sample binary means remain
reportable. Version 2.0 reports distinguish withheld / constant / reduced /
full numeric summaries and make relationship support explicit.

- Python and R profiler templates: support gates on every emitted summary;
  validation inspects the serialized candidate report; reject optimized
  Python (-O/-OO) so assertions cannot be disabled; refuse >=2^53 magnitudes;
  reserved __OTHER__ collision handling; R factor-level fixes.
- Skill, disclosure-tier, generation-pattern, profiling-spec, and
  validation-check references aligned to the 2.0 contract; synthetic
  onboarding workflow reference updated.
- Adds scripts/check_profile_templates.py, a runtime regression CLI for the
  standalone T1-T3 profilers (fabricated data only).

Verification (2026-09-11): 122/122 full regression, 41/41 reviewer edge
cases, 50/50 report-only intake checks; three independent review angles
closed with no material finding. Evidence retained in
research/2026-09-10_FrameworkDev_PrivacySupport/ (git-excluded).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017prMNKewbJgXVwjZoBxLfL
run_with_capture.sh reported SUCCESS and "Execution log appended" whenever
the script exited 0, even when the tee capture failed (truncated archived
stdout) or the append failed (no execution log at all). Reproduced on
2026-09-05 (review synthesis S02) against the same source bytes.

The wrapper now tracks three outcomes separately:
- computation: the script's exit code
- capture: tee status into a project-local buffer (.<script>.capture.XXXXXX
  next to the script, never /tmp); recorded as "# Capture: COMPLETE" or
  "INCOMPLETE (tee exit N)" in the log
- persistence: the append is checked, then verified on disk (exactly one
  marker, closing banner last, exit-code line present)

SUCCESS prints only when all three hold. Otherwise an EVIDENCE INCOMPLETE
banner names the failed outcome, the buffer is retained as evidence, and the
wrapper exits 74. SIGINT/SIGTERM append no log, retain the buffer, exit
130/143 (the banner says if an unverified log was already appended).
Concurrent duplicate runs are detected post-append by marker count, not
locked. Captured output reading exactly "EXECUTION LOG" is archived as
"#  EXECUTION LOG" so script output can never forge a marker (this also
broke the re-run guard under the old wrapper). Empty output is archived as
"# (no output)"; NUL bytes are disclosed in the Capture line. A missing
argument prints usage instead of an unbound-variable error; errors go to
stderr.

Contract docs updated: SCRIPT_EXECUTION_REFERENCE.md (new "Evidence
Persistence Verification"), ERROR_RECOVERY.md (new "Execution Wrapper
Evidence Outcomes"), BOUNDARIES.md, CLAUDE.md, VALIDATION_CHECKPOINTS.md,
research-executor and data-ingest agent protocols, and the Reproducibility
Verification ASSESS step. CHANGELOG Unreleased entry added.

Tests: tests/bash/run_with_capture.bats 12 -> 27 cases (tee/append/
duplicate-marker/unwritable-dir/SIGTERM/SIGINT/forged-marker/NUL fault
injection). Verified: 27/27; consumer suites (create_script_revision,
compare_execution_logs, audit_reproduction_paths, RV python/R) 88/88;
shellcheck clean; three-angle review plus bounded recheck closed all
findings. Evidence in research/2026-09-11_FrameworkDev_CaptureIntegrity/
(git-excluded).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017prMNKewbJgXVwjZoBxLfL
Repairs the S03 finding from the 2026-09-05 review synthesis: the copyable
validation and QA templates (VALIDATION_CHECKPOINTS.md CP1-CP4, Join,
Substantiveness, CPP1-CPP4, CPP-SKILL; QA_CHECKPOINTS.md QA1-QA4b,
QAP1-QAP4; Python and R) could report PASS when the evidence for the
claim was absent. Every check now emits one of [PASS] (with its numbers),
[WARNING], [FAIL]/[BLOCKER], [NOT VERIFIED], [SKIPPED] (declared not
applicable, with a reason), or [INFO]; a count line precedes a derived
verdict; a checkpoint with unverified checks cannot read PASSED. CP4 is
re-scoped to Stage 8 (CP4.1-CP4.4) with the former report/plan items
re-homed as Pre-Output Verification (Stage 12). Cross-file surfaces
(agents, workflow references, STATE/Plan templates, notebook skills,
user references) are aligned to the new vocabulary.

Also folds in the two S02 carry-overs: SCRIPT_EXECUTION_REFERENCE.md
template placeholder stubs replaced with prose (they matched the
wrapper's re-run guard), and the deploy-smoke T2.2 evaluator now
anchors on the wrapper's banner frame and requires Capture: COMPLETE.

Regression: tests/python/test_checkpoint_templates.py extracts and
executes the templates from the live reference files (147 tests across
tests/python, all OK). The tests/python CI job's discover pattern is
widened to test_*.py so the suite runs in CI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rUsUuVX1qhUmvPD8wnCet
…k calls

Publishes the Typesafe AI (Jev) typed-judgment skill, previously kept
local-only, updated from the arXiv classifier project (2026-09):

- probabilities are rounded to 2 dp; prob-sum asserts use a
  0.02 / 0.005*n_options tolerance instead of 1e-6 (4 call sites)
- choice != argmax on 0.04-0.16% of rows; argmax assert downgraded to
  a report, persist both fields
- x-typesafe-request-id absent on an observed 503; all reads guarded
- 429s are token-rate not request-rate driven; size concurrency by
  tokens/sec and persist a per-row retry flag
- alias resolution (jev-latest -> jev-1.13.0) and the GET /v1/models
  envelope confirmed against live responses

Adds api-reference.md s14 (observed behaviour, with sample sizes) and
design-patterns.md s10 (prompt invariance, batching trade-offs,
selective-prediction and metric limitations).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…undle _c

bash-safety.sh: the harmonized hook. It shares one body with the Claude Code
Starter Kit, and every site-specific value lives in one SITE CONFIG block.
- Stage-0 classifier for quoted spans and heredocs, with opt-in excision
  that applies only when the receiver is a data consumer.
- One shared pipe-receiver vocabulary.
- Guards for the $(curl ...) download-and-execute family.
- The root, home and working-directory variables are recognised in quoted
  and braced forms.
- Wrapper flags that take an argument no longer hide the command.
- Stdin must be exactly one JSON object.
- Documented residuals, including a non-string tool_name.
- Suites: battery 749, bats 664. Timing fixtures move to
  tests/fixtures/bash_safety/.

enforce-single-command.sh: comment-aware and heredoc-safe. Shell-carrier
bodies (bash -c, sh -c, eval, source) are scanned. A lone background & is a
separator. It gains the same one-object stdin gate. Residuals R1, R2, R6
and R7 are pinned. Suites: bats 98, battery 122.

Hook-maintenance bundle, revision _c: output-scanner, audit-log,
deny-claude-code-guide, enforce-file-first, block-nested-dispatch and
enforce-explore-model.
- Concatenated-JSON stdin can no longer smuggle a blocked call.
- output-scanner scans object-shaped tool responses (tostring), warns by
  variable NAME when a credential value appears, and guards against an
  inherited xtrace.
- audit-log redacts by pattern and by value, caps every target before the
  regex step, and keeps the record through a fallback path.
- Six suites: 243 cases.

Docs: BOUNDARIES hook rows and new rows for deny-claude-code-guide and
enforce-explore-model. shell-scripting testing.md and bash-standards.md.

All suites were verified against the installed hooks on 2026-09-27.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…v-disclosure deny rules

run_with_capture.sh gains a pre-execution scan for environment-secret
prints. It has the same outcome as the package-install scan: exit 3, no log
appended, and the script stays editable in place. It flags:
- whole-environment dumps: os.environ printed or serialized, or R
  Sys.getenv() with no name;
- os.environ.items()/.values() with an output sink on the same line or as a
  for-loop header (env-scrubbing comprehensions are allowed);
- credential-named lookups inside print/log sinks, matched against the
  shared SECRET-NAME-VOCAB v1 list;
- R bare top-level credential lookups, which auto-print;
- shell-outs that dump the environment.
The refusal names the line number and category, never the line text. Both
scans now read the file as text (grep -a), so a NUL byte cannot disable
them. run_with_capture.bats: 43 cases.

settings.json: five user-approved Bash deny rules for shell commands that
print environment values. They are pinned as exact strings in
settings_permissions.bats.

CLAUDE.md (Credential & Secret Protection): scripts must never print
environment or credential values.

SCRIPT_EXECUTION_REFERENCE gains an "Environment-Secret Print Scan"
section. ERROR_RECOVERY gains a recovery row for the new exit-3 case.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ss args; treat unreadable exit codes as unknown

Windows `docker cp` extraction aborts at the first named pipe or device node in
the tar stream (moby/go-archive's Windows FIFO handler is a no-op, then chtimes
fails on the missing path and Unpack returns), silently dropping every later
file while the CLI still prints "Successfully copied". Stale provider-shim
output.fifo files triggered this in the field.

Backup (backup_daaf.sh / .ps1):
- Staging now also deletes FIFOs, sockets, and device nodes (byte-identical,
  quote-free program in both twins); the scan reports a 5th-line count and a
  one-line Note.
- .ps1 caches the copy process Handle and treats an unreadable ExitCode as
  UNKNOWN (never success); a nonzero copy exit with a full file count now
  latches the WITH WARNINGS banner in both twins.

Host PowerShell (daaf.ps1, daaf_lib.ps1, backup_daaf.ps1, test_migration.ps1):
- New ConvertTo-DaafNativeArg (canonical in daaf_lib.ps1, byte-identical
  inline copies) replaces every array-form Start-Process -ArgumentList, which
  split install/backup paths containing spaces (Control Panel child hand-offs
  and backups broke under e.g. "C:\Users\John Smith").
- Control Panel delegates cache .Handle and report an unreadable child exit
  status distinctly instead of as a clean return.

Skill + tests:
- shell-scripting gotchas/standards: Start-Process array joining, null
  ExitCode (WinPS 5.1 and pwsh 6.0-7.4.0 on Windows), Windows docker cp
  FIFO abort; corrected the $LASTEXITCODE "GOOD" example.
- New tests/powershell/native_arg_quoting.Tests.ps1 (helper round-trip, inline
  parity, AST guards pinning the Start-Process inventory); extended backup and
  daaf Pester/bats suites. Pester 773/773, bats 1..189 ok. Windows runtime
  behavior is inferred from upstream sources; not yet run on a Windows host.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ol/Luna and flagship -pro; re-price GPT models

Context monitoring: normalize provider-dotted Claude IDs (anthropic/claude-opus-5.5) for classification in context-reporter.sh (user-applied patch) and subagent-bar.sh; register gpt-6-sol, gpt-6-luna and flagship -pro slugs by 2026-09-29 user policy decision (not validation); context-bar.sh strips a '#<effort>' suffix from .model.id before caching/classification, which also keeps the hook's unchanged-transcript cache path on the right profile. CLAUDE.md tier table, CONTEXT_THRESHOLDS_REFERENCE.md, BOUNDARIES.md and mode references updated.

Deploy smoke: route_detection.py maps GPT-6 Sol/Luna and flagship -pro via a grammar byte-identical to the Bash consumers, so T0.4 enforces the 919k ChatGPT-lane cap for them; messages distinguish measured vs policy-applied caps.

DAAFBench: count the opus-55 registry entry (44/10); re-price GPT-5.6 OpenRouter entries from the 2026-09-29 catalogue and ChatGPT-lane Sol from OpenAI's promotional list price; compute_accounting() now prices each ChatGPT-lane model at its own api_equivalent_pricing and fails safe (unavailable_api_equivalent_pricing) instead of using Luna rates for every model. Viewer headline costs were never affected.

Docs: install-guide price table re-priced; GPT recommendation is now Sol (strong) + Luna (fast) with gpt-6-sol/gpt-6-luna examples, Astra premium, Terra no longer recommended; -pro retest findings. CHANGELOG and benchmarks/CHANGELOG entries.

Tests: context_reporter 96->117, subagent_bar 94->115, context_bar 91->102, test_deploy_smoke 146->147, deploy_smoke.bats inner tables 40/22, test_subscription_accounting +11 methods.

Session record: research/2026-09-29_FrameworkDev_OpenRouterDottedModelNames/SESSION_NOTES.md

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…5.1 long paths)

Windows PowerShell 5.1 Get-ChildItem -Recurse silently skips directories past
the 248-char limit, so a complete backup was under-counted (73,021 files on
disk vs 72,834 reported) and the 1% tolerance hid the gap.

- Backup twins: staging prints the frozen snapshot's counts; the finished
  backup is counted container-side (bind mount, sentinel + *_COUNT_ERRORS
  markers) and verified at zero tolerance; PowerShell/host fallback reports a
  lower bound (N+) and latches WITH WARNINGS; 0 countable files exits 1
  ("could not be verified"); prints the source volume name; long-path notice.
- Restore twins: same count program; macOS/Linux refuses before erasing when
  the backup folder, a subfolder or a file is unreadable; post-restore count
  markers parsed on any exit; restore now ends "Restore completed WITH
  WARNINGS" after any success-path warning. Exit codes unchanged for callers.
- Shared helpers pinned byte-identical by backup_twin_parity.bats.
- Tests: bats and Pester coverage for every new path (174 bats in the three
  suites; Pester 136 backup + 72 restore).
- Docs: shell-scripting gotchas/powershell-standards (item 18)/testing (TMPDIR),
  quickstart, technical FAQ, CHANGELOG (Unreleased).

Not yet run on Windows PS 5.1 / Docker Desktop / macOS; next real backup is
the field test.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…safe staging; workspace Invariant 3

Field failure (Windows, Docker 29.1.3): docker cp aborted extraction at a
file named name<LF>nl and dropped every later entry (72,386 of 73,785);
the zero-tolerance check caught it and failed the run.

- Staging program (byte-identical twins) gains a DAAF_STAGE_NAMES step:
  win (backup_daaf.ps1 only) removes names Windows cannot create (control
  chars, < > : " | ? * \, trailing dot/space, reserved device names incl.
  extensions and COM/LPT superscripts) and all but the first (C byte order)
  of each file-involving case clash; folder pairs are listed; casewarn
  (backup_daaf.sh on macOS) lists case clashes only; Linux unchanged.
  Inserted before the symlink manifest; offender lines and
  STAGED_STRIPPED_* print before the final markers (no spoofing).
- WARNING + WITH WARNINGS latch, exit 0; reports print before fatal exits;
  the Snapshot line credits left-out files instead of live drift; warning
  when the name list cannot be read; progress counts like the snapshot.
- busybox find never flushes a batched -exec ... {} + inside \( \):
  case listing uses top-level -o groups; parity guard scans every
  scripts/host busybox program.
- check_workspace_invariants.sh Invariant 3 flags these names and sibling
  case clashes outside .git; --names-only mode for other folders (the
  backup hints use it for the Claude Code state volume).
- Docs: shell-scripting gotchas (incl. busybox pitfall), bash-standards and
  testing hygiene for hostile-name fixtures, CLAUDE.md self-cleaning
  probes, FAQ, quickstart, CHANGELOG, smoke T0.10 wording.
- Tests: backup bats 78->100, parity 30->32, invariants 12->31, backup
  Pester 136->158; mutation-checked.

Field-validated on the Windows host: busybox probe output identical to
expected; backup with the fixture finished WITH WARNINGS naming exactly the
2 left-out names (73,847 + 2 = 73,849 scanned); without it, plain
"Backup complete!" with an exact count.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…acing data (copy-then-swap)

Restore no longer erases the live Docker volume before the backup is
copied. Both twins now copy the backup into a labelled temporary volume,
run the strip/chown/permission/symlink steps there, verify it exactly
against the backup count, and only then ask for RESTORE. The live volume
is replaced in one interrupt-proof busybox container (--sig-proxy=false,
trap : INT TERM HUP, marker guard `|| exit 3`), verified by a metadata
comparison and an exact post-swap count; the temporary copy is removed
only after success and kept (with recovery steps) on any swap failure.

- per-run identity label checked after create, before the marker write
  and before each swap (docker volume create reuses, docker run -v
  re-creates volumes by name); exact-name leftover detection with a
  plain-language y/n prompt; in-Docker free-space check
- Claude Code state volume gets the same pattern; preparation failures
  stop before any change ("Your DAAF data has not been changed.")
- only swap exit 3 means "nothing replaced"; Docker 125 takes the
  after-swap path; docker values read from stdout only
- .ps1 exits 130 after Ctrl+C inside its try when run from the Control
  Panel (DAAF_NESTED); startup docker ps failure refuses in both twins
- tests: restore bats 66->143, parity 32->57, Pester It 72->179; the
  in-container fallback assert_failure now checks the expected status
- docs: FAQ, quickstart, CHANGELOG, four shell-scripting gotchas

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…untu snapshot, digest pins)

Top-level `==` pins did not make rebuilds reproducible: uv re-resolved the
~107 transitive Python dependencies against live PyPI on every build (13 of 164
packages, incl. numba/llvmlite, drifted within 7 days), and every apt package
and the base image floated as well. R was already frozen via the P3M snapshot.

Dockerfile:
- Base image pinned by multi-arch index digest via ARG UBUNTU_BASE_IMAGE
  (= ubuntu:noble-20260911); uv COPY pinned by digest.
- UV_EXCLUDE_NEWER=2026-09-24T13:20:00Z (ARG + ENV) freezes the full Python
  set, including isolated build deps (fiona sdist on arm64).
- New snapshot layer rewrites apt sources to direct snapshot URIs
  (https://snapshot.ubuntu.com/ubuntu/20260924T132000Z/), bootstraps
  ca-certificates with peer verification disabled for that host on two
  commands only (integrity rests on the GPG-signed InRelease), and writes
  /etc/daaf/ubuntu-snapshot. Empty UBUNTU_SNAPSHOT = documented escape hatch.
- New daaf-apt-update helper (BuildKit heredoc) replaces every bare
  `apt-get update`: --error-on=any plus an `apt-get indextargets` origin guard
  that fails the build on any non-snapshot or shadowed index.
- ENVIRONMENT DATE banner documents inputs, bump rule (base dated tag on or
  before the snapshot), retention, exceptions, and arm64 status.

Docs: new "How DAAF Freezes the Environment" section with a bump procedure
(04_extending_daaf.md); README, quickstart, and FAQ corrected; Reproducibility
Verification mode and its report template now record the environment-date
inputs and treat a frozen original's full Python set as established (with
yank/deletion and architecture caveats). Framework Development mode's Ask First
Dockerfile bullet names date bumps. New bats regression test; migration-test
comments updated.

Verified: sandboxed apt (amd64 + arm64 index resolution, guard negative
cases), shellcheck, bats daaf_lib 33/33, and a real amd64 rebuild whose
Python set (164/164), R set (289/289), and spot-checked system packages are
identical to the pre-change image. Full arm64 image build still pending.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…og bundle _d redaction gaps

Track B — bash-safety.sh (installed revision _d, comment-only over _c):
- New §10 ENV_DISCLOSURE_GUARD, accidental-dump posture mirroring the
  run_with_capture.sh scan: whole-environment dumps reaching a terminal or
  file (a pipe is not a sink); echo/printf/declare -p/typeset -p/printenv of
  an uppercase credential-named variable (last `_` segment KEY APIKEY TOKEN
  SECRET PASSWORD PASSWD PASSPHRASE CREDENTIAL CREDS DSN PAT); /proc/<pid>/
  environ reads; interpreter one-liners printing a whole-env object. Every
  refusal names the category and a safe alternative, never the matched text.
- Additive stage-0 accumulator keeps credential expansions visible inside
  excised data spans; §1-§9 classification unchanged (0 BLOCK→ALLOW over
  789 battery + 704 bats rows and three replay corpora: 707 doc code-block
  lines, 1,692 red-team rows, 5,732 recorded session commands; 4 accepted
  data-token false positives documented in the header).
- Suites: FC241-FC280 mirrored 1:1 (battery 749→789, bats 664→704); shared
  helper tests/bash/helpers/fake_shapes.bash gains fake_env10_name /
  fake_env10_cmd (run-time builders, no credential literals).
- Installers apply_bash_safety_c.sh / _d.sh (sha-drift refusal, dry-run,
  rollback, content-addressed backups).

Track A — audit-log.sh (bundle _d, installed 2026-10-02):
- Closes the inline-literal redaction gaps: hyphenated API-key headers,
  segment-bounded PASS/PASSPHRASE keys, credential long flags, URL userinfo
  passwords, curl --user/-u (incl. line continuation); numeric values on
  token-named keys kept as counters (F4). audit_log.bats 68→91.

Docs: BOUNDARIES.md (bash-safety and deny-rules rows), ERROR_RECOVERY.md
(§10 recovery row), SCRIPT_EXECUTION_REFERENCE.md cross-ref, shell-scripting
testing.md (counts, starter-kit baseline 789/777/12, helper paragraph),
CLAUDE.md § Credential & Secret Protection (one sentence, user-approved).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…onment_settings.txt without a rebuild)

docker-compose.yml injects environment_settings.txt through a service-level
env_file, which Compose applies only when it CREATES the container, so an edit
needs `docker compose down` + relaunch -- a step non-technical users avoid and
that, on a multi-instance install without .env, targets the wrong project.

Control Panel (daaf.sh / daaf.ps1, behavior-identical):
- New option 11 "Restart Container", directly after Rebuild; Stop Web Services
  moves from 11 to 12. Implemented inline (no new host script): it must refresh
  the panel's own settings and port display afterwards.
- Flow: confirm (y/yes any case, default No) -> read the edited file and refuse
  a project-name change made in it -> snapshot panel settings -> `docker compose
  down` (never -v) -> reload settings -> re-check the project name (file edited
  or deleted during down leaves the container stopped, no `up`) -> refresh the
  port display -> `up -d` -> 30x2s readiness poll -> verify /daaf/CLAUDE.md.
- Any failure prints guidance, restores the pre-restart settings and returns to
  the menu, so a retry targets the same install. "rebuild required" settings
  (DAAF_DEV, first-time provider shim) and Dockerfile/package/compose changes
  are pointed to Rebuild Container.
- daaf.sh keeps its display ports in PANEL_PORT_* (set_panel_ports), mirroring
  daaf.ps1's Initialize-DaafPortDisplay, so a defaulted port never masks a file
  value on reload. Both panels print a friendly error for an unreadable settings
  file at startup (daaf.ps1 pauses before closing when not nested).

Settings reload (daaf_lib.sh / daaf_lib.ps1):
- The loaders record which whitelisted DAAF_* keys they adopted FROM THE FILE;
  new reload_daaf_settings / Sync-DaafSettingsFile drop exactly those and
  reload, so edits take effect while user-exported values keep winning -- the
  loader whitelist stays the single key list.
- load_daaf_settings now returns non-zero on an existing but unreadable file
  (it returned 0 when called in a condition). It tests the open silently with
  `true` (not `:`, which exits the shell in POSIX mode), so other loader errors
  stay visible. Import-DaafSettingsFile reads with -ErrorAction Stop.
- view_quarto.sh, view_notebooks.sh, view_logs.sh and run_vscode.sh test the
  loader's result and print the same friendly message.

Docs: the install guide, technical FAQ, environment_settings_example.txt,
README.txt, the Data Onboarding mode's API-key guidance and run_daaf's
"settings modified" note offer Restart Container first, manual commands as the
alternative. Corrects the GPT Fast step (CLAUDE_CODE_DISABLE_FAST_MODE needs a
recreate, not a rebuild), the "read on every start" claims (applied at
container creation), and a daaf_lib.sh comment on DAAF_DATA_VOLUME_NAME.
CHANGELOG Unreleased entry added.

Tests: daaf.bats 72->104, daaf_lib.bats 33->45, daaf.Tests.ps1 69->112,
daaf_lib.Tests.ps1 4->6, plus one unreadable-settings case in each of the four
viewer suites. Covers cancel/EOF, down-before-up and never -v, the project
guard, unreadable/deleted/edited-during-down files with restore and retry,
keys added during down, host-port URLs, timeout/verify failures, POSIX mode,
and dry runs that write nothing. Mutation checks: 57 of 59 caught across
review rounds; both survivors now have covering tests. Not exercised here:
real Docker, Windows PowerShell 5.1, macOS Bash 3.2.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… smoke steps

Both daaf.sh Control Panel smoke steps (macOS /bin/bash 3.2 in smoke-tests;
the bash:3.2 container in bats-bash32) previously fed only `q`, so the new
option 11 never ran under Bash 3.2 -- the bats suites run on ubuntu's Bash 5.

They now feed `11 / " No " / 11 / " YES " / q` under DAAF_DRY_RUN=1: a declined
restart (exercises the answer trim and lowercasing) and a confirmed one (a full
dry-run restart: settings snapshot/restore arrays, reload, set_panel_ports,
readiness poll). Each step asserts "Restart cancelled",
"[DRY-RUN] docker compose down", "Container restarted" and "Goodbye!", and
fails on "compose down -v" or the panel's ERR-trap "unexpected failure".
Asserted strings were taken from a local dry-run rehearsal (Bash 5); the YAML
was parse-checked.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ep Docker's error text on PS 5.1

Windows field test of the copy-then-swap restore (2026-10-05) found three defects; data safety held
throughout (live volumes provably untouched).

- D1: a never-started (Created) container holding a temp volume no longer blocks its removal.
  Holders are listed with `docker ps -a --filter volume=<temp>`; stopped or never-started ones are
  removed with a plain `docker rm`; a running/unknown holder or a failed list refuses with nothing
  removed (all leftovers are checked before any removal).
- D2: Windows PowerShell 5.1 keeps Docker's stderr (Continue brackets instead of SilentlyContinue);
  failures show a "Docker said:" line (docker cp prefers the "denied" / "Can't add file" line).
- D3: Ctrl+C during the Claude Code swap names the Claude Code state, not the DAAF data.
- Leftover swap containers are removed without -f; a vanished one counts as removed.
- Docs: FAQ "in use" item and Control Panel Ctrl+C note, CHANGELOG, 4 shell-scripting gotchas.
- Tests: restore bats 143->159, parity 57->67, Pester It 179->207.

Field-tested on Windows 11 / Windows PowerShell 5.1 / Docker 29.1.3 (2026-10-05; re-check of all
fixes 2026-10-06 passed).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ai project-free

Add data-scientist/references/text-annotation-measurement.md, a vendor-neutral
methodology reference for turning open-ended text into analysis variables with
LLMs, typed-judgment APIs, or trained classifiers: annotation as measurement,
human-coded validation sets, agreement metrics (alpha vs. kappa), LLM-specific
checks, misclassification-bias direction, DSL/PPI corrections, calibration,
reproducibility with hosted models, data governance (FERPA/HIPAA/IRB; confirm
before any third-party API call), and a GUIDE-LLM-aligned reporting checklist.
72 references, each verified or labelled as preprint/working paper/web guidance,
then adversarially reviewed for citation fidelity; no vendor or study
performance figures.

Wire it in: data-scientist SKILL.md routing branch for coding free text (trained
classifier or typesafe-ai as options, with the governance gate), a pointer under
"Text data", a Reference File Structure row and Topic Index rows. supervised-ml.md
gains a no-training-annotator paragraph. exploratory-unsupervised.md scopes the
"always attenuation" claim to the Lanza et al. setting (citing TeBlunthuis et al.
2024; van Smeden et al. 2020) and adds a classify-analyze bridge for
model-produced labels. Language Routing table unchanged.

typesafe-ai: remove project-specific findings from the skill and references;
add "Things to verify on your own calls" (api-reference) and "Evaluating fit for
your task" (design-patterns); describe it as an optional skill; add pointers to
the new methodology reference, a data-disclosure boundary (vendor retention and
training terms are undocumented: archive them, confirm with the user, never send
sensitive text), and an R note (httr2 + jsonlite available).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…cks for backup and restore

A compatibility audit of the backup/restore twins found that the unpinned `busybox` image now resolves
to 1.38.0 (marked unstable, pushed 2026-09-23), so fresh installs would run the restore's swap on an
untested busybox; and that Docker 29 cannot talk to an Engine older than 25.0.

- Pin busybox:1.37.0@sha256:bdf57e52... in backup, restore and migrate (.sh/.ps1) and in
  docker-compose.yml daaf-init: one constant per script; a parity test checks all 7 copies
- Backup and restore: startup Docker version check (refuse <25.0 / unreadable, Podman not supported;
  NOTE when the major version is not the tested 29); an old-Engine hint on the "not running" path
- Backup and restore: check for the helper image and pull it before anything changes; refuse cleanly
  if the pull fails
- .ps1: $PSNativeCommandUseErrorActionPreference = $false; refuse under PowerShell 7 on macOS/Linux
  (point to the bash twin); backup reads staging container IDs and wait status from stdout only
- CI: new real-Docker job restore-failure-paths (never-started/running holders, leftover swap
  container, helper-image download, version check, pin consistency) on ubuntu x86 + arm64
- Docs: FAQ "Which Docker version do backup and restore need?", quickstart, CHANGELOG, 4 gotchas
- Tests: bats restore 159->170, backup 100->107, parity 67->76; Pester restore 207->223,
  backup 158->176, migrate 84->87

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…update GUIDE-LLM citation

Rewrite the Lanza, Tan & Bray (2013) passage in exploratory-unsupervised.md to
what the paper supports: per-class bias in the outcome mean/proportion given
class, larger with stronger effects, substantially reduced by better
measurement, not reduced by larger samples; one Table 3 cell quoted exactly;
unsupported range, illustration and proportionality claim removed. Soften three
phrasings implying classification error always attenuates. Add the verified
Glorfeld (1995) reference that was cited but missing.

Update GUIDE-LLM to its published citation (Feuerriegel et al. 2026, Nature
Human Behaviour 10(7):1182-1186, doi 10.1038/s41562-026-02492-7) in
AI_DISCLOSURE_REFERENCE and STATE_TEMPLATE, restore the exact checklist item
wording, and label API-cost disclosure as a DAAF addition.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
DAAF Container and others added 29 commits November 2, 2026 13:54
…ds the probe detail

_apply_live_warning: when a recovered transient API error or a --max-turns stop downgrades a PASS, the detail opens with 'Live-run warning: …' ahead of the probe's own PASS reason, so the report's Problems-table Observed cell (the detail's first 200 characters) shows why the probe is a WARN. A probe whose own verdict is WARN, FAIL, SKIP or INFO keeps its reason first and gets the warning appended. Covers T1.1, Tier 2, TA.1, T3.1 and T3.2 (11 call sites); interpreting-results.md documents it, including the T2.7 guard-FAIL exception. Self-tests: Ran 406 OK.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lit_corpus 1.5.0-daaf: adjudications glance-sheet with both a
deliverable and --keys lists the deliverable's references, then each
named paper it does not cite, on one sheet, so one reply from the
researcher covers every reference the final will cite. The sheet says
which numbers were added by name, and the MANIFEST row records
keys_from_deliverable and keys_added. Either flag alone lists what it
did before, except that a paper named twice is listed once and a
--keys that names no key is refused (exit 11).

A final check whose card re-check differs from its record
(CARD_RECHECK_DIFFERS, e.g. a stored source file missing or changed)
is a FAIL with exit 11, not exit 10 (lit-verify-report). The mode
file, ERROR_RECOVERY and lit_verify's fix text give its recovery
outside the synthesizer revision loop: put the original file back
unchanged, or ingest the paper again and write a new card version.

Page comparisons at the round and gap check-ins are grouped by paper,
under its short reference and PDF path (mode templates, STATE
template).

The reference-check wording says each reference is looked up in a
database and checked by the researcher against its record, and calls
the glance sheet "the list to check" ("the reference list" is the
.bib): the mode file and its confirmation template in the orchestrator
SKILL.md (identical), literature-review SKILL.md,
AI_DISCLOSURE_REFERENCE, LIT_REVIEW_OUTPUT_CONTRACT,
literature-synthesizer and user_reference/02.

Other audit-08 fixes in the mode file: the rationale rule for each
reference decision, user_pdfs/ created at setup, full paths for
references into other skills, the window and image-cap rule, the
plain-language glossary rows, and no dated or future-tense notes.
literature-searcher gives the exit codes for a wrong hash (8, 10,
11). lit-corpus.md and CONTRIBUTING.md carry the new version and
counts.

Other sessions' uncommitted edits in these files stay uncommitted. In
lit-corpus.md and CONTRIBUTING.md, the version and count tokens are
taken from lines another session is also rewriting; that session's
text stays out. Nothing is deferred.

Tests (run on the exact committed tree): test_lit_corpus 70,
test_lit_verify 246, test_scholar_records 33, test_scholar_search 296,
test_scholar_openalex_gate 56, test_pdf_ingest 59,
test_web_fetch_scrub 7, test_scholar_retry_log 18,
test_deploy_smoke_probes_v2 89; selftests 90/90 and 30/30;
run_with_capture.bats 83, adjudicator_read_scope.bats 38,
settings_permissions.bats 15; the confirmation template is one
identical line in the mode file and the orchestrator SKILL.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lit_corpus 1.6.0-daaf: the reference-check sheet shows the database
record for a reference that does not match ("Does not match:") or whose
title was not compared ("Not compared:"), with a note per label. The
sheet itself stores nothing; keeping a non-matching reference still
goes through the researcher's recorded decision.

scholar_search 1.10.0-daaf and the scholarly-search skill state the
citation second check as it stands: built, no model has passed its
evaluation, so the researcher's reference check confirms references.
Header comments no longer cite the maintainer workspace.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Per-Agent Hooks names adjudicator-read-scope.sh (citation-adjudicator's
read boundary) beside enforce-file-first.sh, and lists the agents whose
frontmatter registers enforce-file-first.sh (literature-searcher,
paper-reader and literature-synthesizer included). The five Bash
holders that do not register it yet are named as gaps that checklist
item A13 flags. agents/README.md line 13 places the four Literature
Review agents.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Untrack scripts/mirror_maintenance/ (94 files: 89 logged maintainer scripts, its README and four JSON snapshots). They rebuild the Education Data Portal mirror, which only the maintainers do, and no DAAF install runs them. The files stay on the maintainer's disk, ignored through .git/info/exclude.
- education-data-explorer: the 14 variable dictionaries, variable-codes.md and maintenance-live-api.md no longer cite those scripts. maintenance-live-api.md now says the generators are maintainer-side, lists the checks a regenerated dictionary must pass, and shows how to check one claim with shipped tools.
- docs-triage allowlist: drop the 52 rows that exempted logged scripts in that folder, and add the rows the documentation sweep's tiers 1-5 needed.
- Note for maintainers: 54_generate-variable-dictionaries_e.py writes its own path into the dictionaries; reword its two header strings at the next regeneration.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Documentation sweep, tiers 3-5: CLAUDE.md, agent_reference templates and workflow phases, the orchestrator skill and its mode files, the agent definitions, and the authoring, shell-scripting, synthetic-data-workflow and web-retrieval skills, checked against agent_reference/DOCUMENTATION_STANDARDS.md. Text states how DAAF works in this release: no research/ workspace citations or change history in shipped files, dates only on facts that change outside DAAF, plain status words and no stage codes in user-read templates and restart prompts.
- Accuracy: CLAUDE.md's one-command rule names background & and line breaks, its regression-suite list includes the chaining battery, and its in-script install scan claim matches what run_with_capture.sh catches. The Explore block's stated reason no longer claims Explore runs on Haiku (it inherits the session model since Claude Code 2.1.198).
- Templates: STATE, REPORT and AI-disclosure templates gain the provider route and a readable QA table; ERROR_RECOVERY, BOUNDARIES and the phase files are aligned with the code they describe.
- Carries uncommitted work from closed sessions that these files already held, whole: the Scope Check (tiers, Read First, scratchpad staging; ModeConfirmationScope), write-capable search-agent and source-researcher records and the enforce-file-first hook on every agent with Bash (SubagentReportBlock), integration-checker wiring at Stages 9, 11 and 12, TmpdirAdjustment's maintainer-only labels and scratch-graduation pointers (incl. synthetic-data-workflow validation-checks.md), the citation sweep's template citations (marimo, R, Quarto, tidyverse), and Manuscript Preparation's web-retrieval 'Blocked Hosts and Fallbacks' section.
- Left out on purpose: CoreDocCondense's later edits (CLAUDE.md, SCRIPT_EXECUTION_REFERENCE, BOUNDARIES, MODE_TEMPLATE, the integration checklist, the orchestrator SKILL.md and seven mode files are committed at that session's pre-edit snapshot), the 3.1.0 version strings (ReleasePrep), and the Literature Review mode file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- DOCUMENTATION_STANDARDS.md: who each kind of file is written for, the seven standards, when a date belongs in a doc, author and reviewer checklists, and the S3 exception that lets the Literature Review mode file keep its own glossary.
- docs-triage.sh family D also flags 'Phase Status Update', the Literature Review stage and checkpoint codes (LR-0..LR-8, CP-1, CP-K ...) and template placeholders such as 'Stage [N]'; family C knows more external names (Compose, PowerShell, Quarto, TinyTeX ...).
- docs_triage.bats covers the new patterns and checks that the Full Pipeline and Data Onboarding restart prompts carry no stage codes.
- New advisory workflow .github/workflows/ci-docs.yml prints the lint's review queue when docs change; it never blocks a merge (maintainer-installed from the sweep's draft).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- All 18 hooks: header comments and the messages users and agents see describe current behavior, and every refusal names a next step that works (documentation sweep tier 5). bash-safety.site.sh's SITE_REBUILD_HINT is now a whole sentence, so a site override written for the old sentence-tail form reads oddly.
- output-scanner: its warning now reaches the model (PostToolUse additionalContext JSON; plain stdout went only to the debug log). A key-shape match that is plainly a placeholder or test fixture by its own text may continue; a live environment value never does.
- CLAUDE_CODE_SESSION_ID joins the secret-name allowlist in output-scanner.sh, audit-log.sh and run_with_capture.sh (one shared block): its value is the session UUID inside Claude Code's own paths, which the scanner had started reporting as a leak.
- enforce-model-ceiling ranks Mythos with Fable (a Mythos session was denying every dispatch); archive-session renders Claude Code 2.1.281's Agent dispatches (and the older Task) as dispatches instead of truncated JSON; the Explore and claude-code-guide denials state DAAF's own reasons.
- run_with_capture.sh: a refused re-run suggests the next unused revision name (02_src_a.py -> 02_src_b.py) instead of always _a; refusals open with one plain form.
- context-reporter.sh, context-bar.sh and subagent-bar.sh: comment and provenance cleanup only; the active SubagentContextMonitoring work (Sonnet 5/Haiku 5.5 window, attachment model lookup, line-wise scans) is not included.
- Tests move with the hooks because CI runs bats against the committed hooks: 11 suites, the safety battery (which now documents what it counts) and the chaining battery (which now takes a draft hook path as $1).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- create_script_revision.sh refuses a destination folder that does not exist, naming the mkdir -p fix, instead of failing inside mktemp.
- collect_session_logs.sh creates logs/ and writes its collection request before the "no sessions found" exit, so a project worked on only in the current session is still collected when the session ends; new tests/bash/collect_session_logs.bats.
- generate_log_viewer.py treats both Agent and Task tool calls as subagent dispatches, so Log Explorer links subagents for Claude Code 2.1.281 sessions; its hints give the full collect command.
- Launchers no longer suggest --port for a browser-facing server (Compose publishes only the default ports); check_workspace_invariants.sh drops the obsolete GLPK symlink entry and its test; the launch, log-viewer and CLI wrapper scripts get current-state comments and messages (sweep tier 5).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Host scripts and their Bash/PowerShell twins (installer, control panel, backup and restore, migrate, rebuild, update, launchers and viewers): plain messages that say what happened and what to do next, printed commands that reach the right install, current-state comments (documentation sweep tier 2).
- Updater: 'Conflicts resolved!' appears only when no merge, rebase or cherry-pick is still in progress; otherwise it prints the commands that finish the operation, and a failed check fails closed. The conflict recipe stages resolved tracked files only (git add -u), so untracked research projects are never swept in.
- Dockerfile and docker-compose.yml: comment rewording only for the image layers and the user additions block; issue templates ask for the provider route and exact model ID.
- bats and Pester suites for the host scripts move with them; carries TmpdirAdjustment's comment relabels in install.bats and restore_from_backup.bats.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- README and user guides 01-07 (documentation sweep tier 1 and the release-prep currency memo): accuracy checked against the scripts they describe, per-route privacy, provider routes and setup, current install, update and rebuild steps, Scope Check wording, and the Claude Code versions behind claude.ai skill sync.
- CONTRIBUTING: 'Guardrails Your Custom Components Must Follow' replaces the v3.0.0 upgrade section; points to the documentation standard and its triage lint; asks bug reports for the provider route, exact model ID and DAAF version.
- CODE_OF_CONDUCT gains the support address; the DAAFBench viewer footer drops the Discord link.
- Left out: the 3.1.0 version strings (ReleasePrep) and CONTRIBUTING's three Literature Review CLI rows (that session's 1.7.0 tool is not committed yet; the dated test counts in those rows stay until it is).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- geopandas and sf-terra: the spatial LM-test decision rule follows Anselin (2005): when both robust tests are significant, take the larger statistic with caution (it said 'Spatial Durbin'); when neither is, look for another misspecification first.
- CCD historical-changes: the Python and R race-collapse recipes keep 9 (Unknown) and 99 (Total) instead of folding them into missing; the race/ethnicity transition is dated 2008-09 to 2010-11, and the series warning now fires for any series touching file years 2008-2010.
- CCD SKILL.md (7) and CRDC SKILL.md (15): broken cross-file anchors now match the real headings.
- data-scientist: esda G_Local needs star=True for Gi*; scikit-learn LogisticRegression is L2-penalized by default (use statsmodels for inference); data-documentation's Python recipes are flat sequential code like their R twins.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Not documentation-sweep work: committed whole from two closed sessions so it is not left behind. TmpdirAdjustment labelled research/ citations in shipped comments as maintainer-only, or replaced them with the upstream URL, in great-tables, vintage-drift and five test files.
- PSEO variable-definitions (closed citation sweep, probed 2026-10-27/28): opeid is a string in the 2001-2018 mirror shards and Int64 in 2019-2021, with the zero-pad needed before joining; cipcode is a bare 2-digit family code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Claude Code's Edit and Write results carry the whole edited file, and DAAF's test suites hold credential-shaped fixtures on purpose, so once the scanner's warning reached the model every edit of such a test file told the agent to stop.
- For an Edit, Write or MultiEdit whose file_path is under a tests/ folder, the key-shape families are skipped. The value-based check still runs, so a live credential value written into a test file still warns.
- output_scanner.bats: three cases (tests/ edit silent, the same shape elsewhere warns, a live value in a tests/ edit warns).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…cript parsing

context-reporter.sh and subagent-bar.sh measured claude-sonnet-5 subagents against a 200k window. Claude Code runs Sonnet 5.x and Haiku 5.5 with a native 1M window (Claude Code model-configuration docs, Extended context), so Sonnet specialists read HIGH/CRITICAL at 12-25% of their real context and returned early. The window arm now includes *sonnet-5* and *haiku-5-5*; the threshold profile stays conservative (on 1M: ELEVATED 150k, HIGH 200k, CRITICAL 250k).

The hook's model scan slurped the transcript (jq -s), so one partly written last line blanked the subagent model and the first report used the session's window. The hook and subagent-bar.sh now share one line-wise model-scan program (skips malformed lines and isApiErrorMessage records, §§ MODEL_SCAN_JQ markers, lockstep test), fall back to the subagent transcript's model attachment, and redirect stderr before reading. The hook's usage scan, context-bar.sh's two transcript scans and archive-session.sh's subagent metrics are line-wise too.

Tests: context_reporter.bats (128-141), subagent_bar.bats (127-134), context_bar.bats (106-108), archive_session.bats (24). Docs: CONTEXT_THRESHOLDS_REFERENCE.md and BOUNDARIES.md describe the Claude window mapping and the model lookup. These two doc files also carry remaining wording from the parallel documentation sweep (CONTEXT_THRESHOLDS_REFERENCE.md lines 19-35 and 45; one BOUNDARIES.md sentence at the Defense-in-Depth table intro).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…chestrator and data-scientist skills

Cut only passages whose every instruction is already loaded for the reader when needed. CLAUDE.md: merged repeated context-health statements, dropped restated script and tmp rules, trimmed the Reference Files table to files every agent may need. Orchestrator skill: removed the loading decision tree and Scope Check tiers table (mode files carry both), and paragraphs restating CLAUDE.md or BOUNDARIES.md. data-scientist skill: removed workflows, checklists, notebook sections and quick trees duplicated in the same file or its references; folded their few unique checks into the Principles. Fixes: R routing for LIML, GMM-IV, SUR, 3SLS, VAR and panel IV; IAT comment labels and Parquet examples in references; change narration in BOUNDARIES.md; registration knock-ons in FRAMEWORK_INTEGRATION_CHECKLIST.md, MODE_TEMPLATE.md, CONTRIBUTING.md and four agent routing tables. Benchmark goldens embedding these files need a refresh before cross-change comparisons.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
CHANGELOG: replace the ad hoc Unreleased draft with the v3.1.0 entry in house style (summary, Important Notes for Existing Users, Detailed Notes, General Framework Improvements, For Contributors), built from a verified inventory of v3.0.2..HEAD and reviewed. Fix the table-of-contents anchors for the ' -- ' headings (v3.1.0, v3.0.2), which GitHub slugs with four hyphens. Tag-time items stay marked in HTML comments.

Version sweep to 3.1.0: CITATION.cff (version, date-released 2026-11-02), README (draft comment, badge, APA, BibTeX), and the DAAF citation in AI_DISCLOSURE_REFERENCE, CITATION_REFERENCE, REPORT_TEMPLATE and STATE_TEMPLATE.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lit_corpus 1.7.0-daaf carries the researcher's decisions on the
reference check sheet:

- The sheet names the references it will leave out of the reference
  list, and its request names them by number with the way to keep
  one: ask for it to be checked, or checked again.
- One rule decides which references a reply can decide: the corpus
  verdict and the verify row's own verdict are both CONFIDENT, WEAK
  or MISMATCH. The decision command refuses every other row, and the
  sheet marks as left out every listed reference that no reply can
  decide and no decision made citable or rejected.
- attach verify refuses a verify row with no verdict that verify
  gives (a check that did not finish).
- "Authors as cited" shows the name the check looked for.
- Asking for references to be checked again has its own route: a
  check-only search pass runs verify again and attaches the new rows,
  a new version of the list is shown at the same checkpoint, and the
  reply is recorded as its own decision kind (check_again).
- Held references are sorted as the list sorts its rows.

Rule version glance-words-v2; output contract 0.4.0 unchanged.
test_lit_corpus has 85 tests; the lit_corpus selftest checks 32
expectations. The mode file, lit-corpus.md, the literature-searcher
and data-verifier agents, the STATE template, ERROR_RECOVERY,
CONTRIBUTING and the user guide follow.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The scholarly-search skill and its references, and the comments in
the lit, scholar, pdf and web tools, no longer point to the
maintainer's working notes. The evidence they relied on is stated in
place (how it was measured, when, and the result), and internal
decision and session codes give way to dated decisions.

- The lit_corpus.sh and lit_verify.sh headers describe the tools as
  they are now, without dated "added" lines or session codes.
- Fixture provenance text names the live runs it came from without
  local paths, and test docstrings and comments are rewritten the
  same way.
- CI wording states which packages the bare unit job pins.

No tool version, output, exit code or exit text changes, and no test
assertion changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comments, docstrings and the scholarly-search references no longer
carry session or review codes. Each rule and decision is described
as it stands now, with the date it was made or measured.

- pdf_text_common.py, web_retrieval_common.py, lit_verify.py and the
  Elicit and Scite backends: header and rule-version comments state
  current behavior and dates, without change narration.
- licensing.md, api-notes.md and elicit.md: build-session codes and
  checkpoint names give way to dated entries; licensing.md marks each
  built backend "Built".
- test_scholar_search.py: each verify-rule test class docstring names
  the rules version the class pins.
- literature-synthesizer.md: the held-references note matches how the
  reference check uses the held list.

No code, output or test assertion changes: each changed Python file
parses to the same code as before, docstrings aside.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…R routing sync, stale pointers

Reviewed the downstream effects of f88773a (deduplication of CLAUDE.md and the
orchestrator and data-scientist skills). No rule was lost; these are the
knock-ons it left.

Loading triggers: Ad Hoc reads a Literature Review only through the output
contract's consumer files; Revision and Extension and Literature Review point to
their own ERROR_RECOVERY sections with triggers; Full Pipeline reads each phase
file when its phase begins, and reads only the named VALIDATION_CHECKPOINTS
section a checkpoint result needs.

R routing: every restatement now matches data-scientist's table. LIML,
non-panel GMM-IV, SUR, 3SLS and VAR escalate in R (no installed package);
IV with FE goes to fixest; dynamic-panel GMM to plm's pgmm(). Synced across the
mode files, data-planner, causal-inference, descriptive-analysis, linearmodels,
statsmodels, plm, r-stats, python-r-, r-python- and stata-r-translation.
Removed two false claims: ivreg has no LIML method; plm has Fama-MacBeth (pmg).

Pointers and wording: CLAUDE.md lines 206 and 340, smoke-test README,
marimo/quarto descriptions of data-scientist, registration count (16 across 7
files), code-documentation's standalone-app framing and many:1 join labels.

Tracking: benchmarks/README.md notes the 13 goldens that need a refresh and
corrects the claim that goldens hold CLAUDE.md text; CHANGELOG v3.1.0 gains a
"Method choices in R" bullet.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lit_corpus 1.8.0-daaf, output contract 0.5.0, prepares the citation
adjudicator for its evaluation:

- adjudications ingest refuses a batch unless the adjudicator's own
  Claude Code transcript, found from the agent ID, records only the
  packed model ID (rule adj-model-check-v1). The transcript is read
  only as a regular file, never through a symlink or a pipe.
- CLAUDE.md's sha256 is recorded at pack and at ingest beside the
  adjudicator identity; a change is a warning and never decides a
  judgment or the evaluation gate.
- adjudications release frees a packed batch that will not be
  ingested (never dispatched, a failed pack script, or refused by
  ingest), with a reason; its rows can then be packed in a new batch.
- When no listed reference can be confirmed, the reference check
  sheet says which ones are already decided (glance-words-v3).
- The contract bundle is regenerated at contract 0.5.0 with a
  synthetic adjudicator transcript and CLAUDE.md; the phrase table
  and its test pin follow the new contract version.
- The citation-adjudicator agent file and the citation-adjudication
  reference describe the model check, which changes the adjudicator
  identity; the evaluated list is empty, so no evaluated identity is
  voided. The mode file, lit-corpus.md, the output contract, the
  STATE template, ERROR_RECOVERY, the literature-searcher agent and
  CONTRIBUTING follow.

test_lit_corpus has 99 tests; the lit_corpus selftest checks 35
expectations.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Literature Review works end to end, but it has had limited
real-world testing at launch. The places that introduce it to a user
label it experimental, and explain the label in one sentence that
asks for a closer review of its output and for reports of what goes
wrong:

- README.md: the mode's entry in the modes list, label and sentence.
- user_reference/02: the modes table (label), the mode's own section
  (the sentence first) and the quick-scan tryout (a pointer).
  user_reference/07: the FAQ modes list (label).
- The Literature Review confirmation template, in both copies (the
  orchestrator SKILL.md and literature-review-mode.md, still
  identical), the mode file's user orientation, and the mode's item
  in the SKILL.md expanded orientation.
- A switch from another mode skips the confirmation, so the switch
  offers in user-support-mode.md and data-discovery-mode.md carry
  the sentence, and a rule in SKILL.md (Mode Escalation Paths) and
  in the mode file (Escalation Triggers) adds it to every other
  proposal to switch into Literature Review.
- CHANGELOG v3.1.0: the summary and the mode's entry carry the label
  and a note; For Contributors gains the entry for the previous
  commit (output contract 0.5.0, lit_corpus 1.8.0-daaf), with the
  model check stated as evidence, not proof.

The quickstart's three PDF-reading mentions and the review's own
deliverables stay unlabelled. Other sessions' uncommitted hunks in
these files stay in the working tree.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ng requirement, GPT-6 status, checkpoint terminology

Applies the confirmed items from the website-sync documentation memo (21 issues,
each re-verified against the tree), plus extras the verification found.

Setup text: Python package count is "60+" everywhere (Dockerfile names 67).
01's model-routing subsection is renamed "Model routing for alternative
providers" (anchor #model-routing-for-alternative-providers; inbound link in 07
updated) and opens with the requirement: every route except Anthropic directly
needs the OPUS and SONNET model-tier settings, matching enforce-model-ceiling.sh.
Template section [3] banner drops "(advanced)". GPT-6 Sol and Luna status in the
template, 07 and CHANGELOG matches the 2026-10-28 record (OpenAI accepted both
model names; Sol passed, Luna did not; no full DAAF session; no recorded
API-key test).

Terminology: in user-facing text "checkpoint" now means only a pause where DAAF
waits for the user; CP1-CP4 are "validation checks"; code-reviewer checks are
"quality review". Glossary rows in the orchestrator's Plain-Language Rule table,
02, 03 (three headings renamed, TOC updated), 06, 07, PLAN_TEMPLATE body and
REPRODUCTION_REPORT_TEMPLATE follow it.

Wording: Open Augments Field Guide links; README methods list; "lifecycle-tagged"
explained; "bare" has one meaning; lab director; no "seamless"; time-relative
"currently" removed; provider shim defined (+07 glossary row); synthetic-data top
tier in 04; installs and removals; launcher heading; Esc as the interrupt key
(stamped); Kimi K3 scoped to the July corpus; 919k ceiling stated as numbers;
Fable/Mythos thresholds compared with the extended-horizon profile; 12 R library
skills; 164/173 package figures explained; hidden backup items left in place.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lit_corpus 1.8.1-daaf. adjudications pack refuses a --model-id that
lit_verify's model normalization would change (a trailing [1m], a
dotted Claude ID, surrounding whitespace), with exit 1 and nothing
packed, and names the form to pass. The value is never rewritten:
it is an identity field the evaluated list is matched on as given,
while ingest compares models normalized, so another spelling would
pass the model check and never match a list entry. Two tests and a
selftest case cover it (101 tests, 36 expectations); the exit
tables, lit-corpus.md, CONTRIBUTING and the CHANGELOG entry follow.
Output contract 0.5.0 and every rule version are unchanged.

- README.md and user_reference/02: the experimental notice gains
  the address for reports.
- SKILL.md and literature-review-mode.md: a switch into Literature
  Review copies both sentences of the experimental notice. The mode
  file's pack step says a provider prefix is kept.
- The model check is stated exactly: the transcript must record at
  least one model, and every model it records must be the packed
  one (mode file, lit-corpus.md, the output contract,
  citation-adjudication.md, citation-adjudicator.md; the agent and
  rubric files get new sha256s, the template block is unchanged).
- ERROR_RECOVERY.md: a missing pack log is exit 10; a pack whose
  captured script did not complete is released, and a batch never
  packed holds nothing to release.
- Smaller accuracy fixes: CLAUDE.md "never part of the identity"
  rather than "never compared"; an empty release reason in the
  exit-11 lists; a fuller exit-11 help text; two long lines
  rewrapped; the CLAUDE_CONFIG_DIR and symlinked-folder limits of
  the transcript lookup; which usage errors write a MANIFEST row.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Output contract 0.6.0, lit_corpus 1.9.0-daaf, lit_verify 1.17.0-daaf.
A model DAAF has not tested for a job no longer stops a review: the
review plan warns the researcher, who chooses, in their own words.

- The AI reference checker runs in every review. While its model is
  untested, its verdicts are hints beside each reference on the
  reference check list (the ones it flags first) and the researcher
  decides every reference, unless they accept the checker (lit_corpus
  adjudications untested-checker): its SAME_WORK verdicts then confirm
  references, labelled "confirmed by an untested AI check (your
  choice)". An acceptance counts only when its record is complete,
  and a model already on the tested list cannot be accepted. A model
  mismatch still refuses a tested checker's batch; an untested one's
  is kept as hints with a warning.
- An untested PDF reader reads text only unless the researcher
  records a page-picture choice (lit_verify vision-override): "check"
  lists every number read from a picture for comparison, "accept"
  takes the readings and the review labels them. lit_verify route
  --reader-model prints the VISION line each reader dispatch copies.
- lit_verify report counts these confirmations only when the
  recorded choice re-derives from the project's records, with the
  warnings CITATION_CONFIRMED_BY_UNTESTED_AI_CHECK and
  VISION_READ_BY_UNTESTED_MODEL (84 report statuses).
- adjudications pack skips a reference the checker already judged
  unless a new judgment would count for more; --rejudge with --keys
  asks again (adj-selector-v2).
- The checker returns its answer through SubagentHandback: its
  read-scope hook allows that one call besides reading its bundle,
  and ingest accepts it in the audit log.
- run_with_capture.sh also refuses a script that runs either new
  choice command, and both have permissions.ask rules, so a choice
  is recorded only at a permission prompt.
- The checker's agent and rubric files are corrected to match (new
  file sha256s; the prompt template is unchanged). The contract
  bundle is regenerated; the mode file, skills, agents, references,
  CLAUDE.md, CONTRIBUTING and the CHANGELOG follow.

Tests: test_lit_corpus 116, test_lit_verify 264; selftests 38 and
98; run_with_capture.bats 93, adjudicator_read_scope.bats 44.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@brhkim
brhkim merged commit 99ac264 into main Nov 3, 2026
29 checks passed
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.

1 participant