Skip to content

AI usage log (curated)

Public audit trail of AI assistance in this TFG, as required by the ESII TFG regulation (Feb 2026, §6). One entry per work session: date, tool, type of use, affected areas. Raw auto-generated session records live in sessions/.

Maintained by the author. The thesis declaration is generated from this log plus git history (Co-Authored-By: Claude trailers) by the ai-declaration skill.

Date Tool Type of use Affected areas
2026-06-11 Claude Code (Fable 5) Research & analysis: read TFG regulations and proposal; summarized AI-usage compliance constraints. Design assistance: drafted the development-environment plan (stack, process, compliance tooling) iteratively refined and approved by the author. docs/development-plan.md, ADR-0001
2026-06-11 Claude Code (Fable 5) Code/config generation under author direction: repo scaffold, toolchain config, CI workflows, hooks, skills, agents, docs site, thesis template adaptation (Carlito font). All reviewed by the author. repo scaffold (pyproject.toml, .claude/, .github/, Makefile, mkdocs.yml, thesis/TFG.tex, CLAUDE.md)
2026-06-11 Claude Code (Fable 5) Code generation under author direction: resolved+merged Dependabot PR #1; implemented FR-02 slice (domain model, SQLite layer, FastAPI factory, DefectDojo-style JSON ingestion, tests, demo) on PR #23, pending author validation. src/revalid/, tests/, scripts/demo/, docs/roadmap.md
2026-07-01 Claude Code (Fable 5) Tooling & governance under author direction: Kanban board automation (#24/#29); CI-gated auto-merge governance (ADR-0003, #33); starlette CVE + dependency fixes (#31, Dependabot); roadmap refresh (#32); added the feature-request skill. FR-06 allowlist/SSRF guard (#34). All reviewed by the author. .github/workflows/, docs/adr/0003-*, .claude/skills/feature-request/, src/revalid/allowlist.py
2026-07-13 Claude Code (Fable 5) Code generation under author direction: FR-07 probe executor + FR-09 evidence-backed verdicts completing the M1 walking skeleton (#12/#14) — SQLi login-bypass probe over the FR-06 allowlist, Juice Shop lab, demo, unit/integration/system tests. Process, decided by the author: ADR-0004 right-sizing the solo-dev workflow (kept board, disabled the forced codebase-memory gate, lighter chore PRs); housekeeping (settings fix, tracked skill + AI session logs). All reviewed by the author. src/revalid/{retest,domain,db,app}.py, lab/, scripts/demo/, tests/, docs/adr/0004-*, docs/architecture/c4.md, docs/roadmap.md
2026-07-13 Claude Code (Fable 5) Code generation under author direction: FR-01 PDF report ingestion opening M2 (#6) — pdf.py deterministic pdfplumber extraction (text + best-effort finding candidates), fail-closed on non-PDF/corrupt/no-text, unit + integration tests, demo, synthetic PDF fixture generator. Automated security-auditor review found + reproduced a decompression-bomb DoS; hardened read_pdf with size/page/text/wall-clock bounds that fail closed. Automated doc-curator review flagged the missing mkdocstrings entry, fixed. Design drafted for author ratification: ADR-0007 (proposed) selecting pdfplumber over PyMuPDF (AGPL) and fixing the FR-01→FR-03 text seam. All reviewed by the author; ADR acceptance pending. src/revalid/pdf.py, tests/{unit,integration}/, tests/data/juice_shop_report_synthetic.pdf, scripts/, docs/adr/0007-*, docs/roadmap.md, pyproject.toml
2026-07-13 Claude Code (Fable 5) Process/scope decision by the author: adopt a single trusted-user threat model (ADR-0008). Removed the security-auditor agent and the PDF decompression-bomb hardening (reverted read_pdf to its simpler form; kept the corrupt/non-PDF fail-closed handling required by FR-01). Closed follow-up #43. Decided and reviewed by the author. .claude/agents/security-auditor.md (deleted), src/revalid/pdf.py, tests/{unit,integration}/, docs/adr/0008-*, docs/adr/0007-*, docs/development-plan.md
2026-07-13 Claude Code (Fable 5) Code generation under author direction: FR-03 LLM finding extraction (#8) — extract.py per-candidate Pydantic AI agent with a list[ExtractedFinding] schema-validation gate (invalid output retried then flagged, never persisted), lineage in raw (NFR-02); extended domain Finding/FindingRecord with impact/attack_vector; TestModel/FunctionModel unit tests + full-pipeline integration test; make demo-extract. Design drafted for author ratification: ADR-0009 (proposed, per-candidate architecture). All reviewed by the author; ADR acceptance pending. src/revalid/{extract,domain,db}.py, tests/{unit,integration}/, scripts/demo/extract_pdf.py, docs/adr/0009-*, docs/roadmap.md, pyproject.toml
2026-07-13 Claude Code (Fable 5) Code generation under author direction: FR-13 model-agnostic LLM config closing M2's feature scope (#18) — llm.py (REVALID_LLM_MODEL env var, Claude default, Ollama via Pydantic AI's native provider + openai extra); extraction agent/demo pick up the configured backend with no code change; unit + integration tests for the env-only switch and a live-Ollama system test (skips without a server). Verified live against local Ollama qwen3.5:9b (3/4 fixture findings, 1 gate-flagged). Design drafted for author ratification: ADR-0010 (proposed). All reviewed by the author; ADR acceptance pending. src/revalid/{llm,extract}.py, tests/{unit,integration,system}/, scripts/demo/extract_pdf.py, docs/adr/0010-*, docs/reference/api.md, docs/roadmap.md, pyproject.toml
2026-07-13 Claude Code (Fable 5) Evaluation-data sourcing & validation under author direction: adopted a real external OWASP Juice Shop pentest report (Nozipho Mthimunye's public write-up) as the M2/FR-15 evaluation input; author confirmed the source. On the author's licensing question, advised against re-hosting a no-license work — credited + linked the author and kept the PDF local/git-ignored instead (tests/data/README.md). Validated the pipeline on it: FR-01 → 8 clean candidates; a full FR-01→FR-03 run on local ollama:qwen3.5:9b gave 8/8 well-formed findings (100%). All reviewed by the author. tests/data/README.md, .gitignore, docs/roadmap.md
2026-07-13 Claude Code (Fable 5) Code generation under author direction: FR-04 retest-plan generation opening M3 (#9) — plan.py (ADR-0011): a Pydantic AI agent proposes typed PlannedActions from a finding's reproduction steps, then a deterministic gate binds each target to the allowlisted base URL, drops anything the FR-06 guard rejects or any destructive method, and maps survivors to domain Probes in a new RetestPlan (reuses Probe; inherits the FR-13 model switch). Unit + integration tests (typed-only, allowlist-drop, method-drop, schema gate); make demo-plan; verified live on ollama:qwen3.5:9b. Design drafted for author ratification: ADR-0011 (proposed). All reviewed by the author; ADR acceptance pending. src/revalid/{plan,domain}.py, tests/{unit,integration}/, scripts/demo/plan_retest.py, Makefile, docs/adr/0011-*, docs/reference/api.md, docs/roadmap.md

Reconstructed entries — later addition (2026-07-20)

Later addition. The curated log above was maintained in real time only through 2026-07-13. The entries in this section were reconstructed retrospectively on 2026-07-20 from the git audit trail (commit history, pull requests, and ADRs 0012–0035) plus this session's own work, to close the gap between the log and the actual development of milestones M3–M6 and the thesis. The auto-recorded files in sessions/ remain the primary raw record. The specific Claude model family for the 2026-07-14…19 development sessions is not captured by the git trail; it is left as "Claude Code" rather than guessed.

Date Tool Type of use Affected areas
2026-07-14 Claude Code (reconstructed) Code generation under author direction: FR-04 plan generation finalised (#49); FR-05 server-side plan approval gate + versioning (ADR-0012, #51); FR-11 React SPA operable end-to-end and redesigned as a "forensic verdict instrument" (ADR-0013, #54/#55); FR-08 execution sanity checker (ADR-0014, #59); FR-10 audit trail + verdict re-derivation (ADR-0015, #60). Design decided/ratified by the author: ADRs 0007/0009/0010/0011/0012/0013 accepted (#52/#56); protect-private-data hook removed (ADR-0006, #50). Releases v0.2.0 and v0.3.0. All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, docs/roadmap.md, tests/
2026-07-15 Claude Code (reconstructed) Code generation under author direction: FR-12 versioned run export + published JSON schema (ADR-0016, #61); FR-15 evaluation-harness scaffold + ground-truth generator (ADR-0017, #65/#66); FR-14 Playwright browser probes (ADR-0018, #67); FR-13 user-configurable model/provider setting (ADR-0021, #71); retest-technique registry (ADR-0019, #69); manual report entry (ADR-0020, #70). Documentation: C4 + sequence diagrams (#62). Design ratified by the author: ADRs 0014/0015/0016; release v0.4.0 (#63/#64). All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, docs/architecture/c4.md, tests/
2026-07-16 Claude Code (reconstructed) Code generation under author direction: async plan generation (ADR-0022, #72); plan iteration — regenerate/revise + clickable pipeline stages (ADR-0023, #77/#79); FR-16 finding stage wizard + versioned edits & notes (ADR-0024, #82/#84); FR-17 Slice 0 agentic retest console — sandbox + gated exec + verdict (ADR-0025, #89), chat-centric console (#91), Slice 2 operator manual commands (ADR-0026, #93), Slice 3 gated guiding plan (ADR-0027, #95). Tooling decided by the author: issue-first Kanban board-reminder hook + CLAUDE.md rule (#76). All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, .claude/hooks/, CLAUDE.md, tests/
2026-07-17 Claude Code (reconstructed) Code generation under author direction: FR-17 Slice 4 chat steering & Q&A — queued operator messages + respond tool (ADR-0028, #97); Slice 5 free-launch mode + budgets (ADR-0029, #101); runnable-console fixes — WebSocket library + responsive default model (#99). All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, tests/
2026-07-18 Claude Code (reconstructed) Code generation under author direction: FR-17 Slice 6a agentic verdict integration + human adjudication (ADR-0030, #103); Slice 6b-i flexible command-output evidence for agentic verdicts (ADR-0031, #106). All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, tests/
2026-07-19 Claude Code (reconstructed) Code generation & refactoring under author direction: FR-17 Slice 6b-ii user-owned goal replacing agent-proposed plans (ADR-0032, #108/#109); Slice 6b-iii retiring the batch execution path end-to-end (ADR-0033, #111/#112/#114); Slice 7 full-width agentic cockpit + terminal (#116); Slice 8 pause-and-ask lifecycle (ADR-0034, #118); Slices 9/10 configurable then removed step budget + cockpit redesign (ADR-0035, #122/#124); launch-time scope + conversational agent replies. All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, docs/roadmap.md, docs/requirements/srs.md, tests/
2026-07-19 – 2026-07-20 Claude Code (Opus 4.8) (reconstructed) Thesis writing assistance under author direction: drafted the State of the Art (Ch. 2), Introduction (Ch. 1) and Methodology (Ch. 3) chapters; built the bibliography with 56 references, each independently verified against Crossref / the arXiv API / OpenLibrary or a live official source (no fabricated citations); produced six original TikZ figures; wired the chapters into the ESII template; and generated this §6 AI-usage declaration and reconstructed the entries above from the git audit trail. All reviewed by the author. thesis/chapters/ch1.tex, ch2.tex, ch3.tex, thesis/bib/ref.bib, thesis/TFG.tex, thesis/include/configuracion.tex, docs/ai-usage/AI_USAGE_LOG.md
2026-07-20 Claude Code (Opus 4.8) Code generation under author direction: console batch — runtime model discovery in Settings, report archive/delete, re-upload de-duplication by content hash, editable report metadata, verdict presentation and layout polish (#141). Scope and every UX call decided by the author. All reviewed by the author. src/revalid/, frontend/src/, tests/, docs/roadmap.md
2026-07-20 Claude Code (Opus 4.8, 1M context) Code generation under author direction: FR-13 multi-provider model discovery — probing Ollama, Claude and OpenAI for the models each backend actually offers, so the operator selects from a live list instead of a hardcoded one (#143). The author decided to replace the hardcoded list. All reviewed by the author. src/revalid/settings.py, src/revalid/llm.py, frontend/src/routes/Settings.tsx, tests/
2026-07-20 Claude Code (Opus 4.8, 1M context) Code generation under author direction: FR-18 reports chat assistant — a read-only Pydantic AI agent over the persisted corpus with four typed DB query tools (corpus overview, report list, finding search, finding detail) plus persisted chat threads and a new Chat tab (#136, PR #146, ADR-0036). The author requested the feature and chose read-only query tools over context-stuffing, and persisted threads over ephemeral ones. All reviewed by the author. src/revalid/reports_chat.py, src/revalid/app.py, src/revalid/db.py, frontend/src/routes/Chat.tsx, docs/adr/0036-*, tests/
2026-07-20 – 2026-07-21 Claude Code (Opus 4.8, 1M context) Code generation under author direction: FR-19 CVSS + MITRE ATT&CK enrichment of ingested findings, inferring with inferred provenance when the report is silent (ADR-0037, #144/#145); FR-18 reports-chat streaming — async Server-Sent-Events endpoint replacing the blocking turn (ADR-0038); overview findings risk-profile severity bar; Settings panel reorganisation + a wide-by-default content-width root fix. Thesis edits under author direction: company-tutor name, clickable/box-free bibliography links, honest reframing of the "revalidation untouched by automation" claim, removal of the gap figure + several self-justifying passages. Documentation synced: ADR-0038, SRS FR-18 AC5, C4 container diagram, roadmap. Design decided by the author (the streaming request, the settings/overview layout, the CVSS/MITRE scope, every thesis rewording). All reviewed by the author. src/revalid/, frontend/src/, docs/adr/, docs/requirements/srs.md, docs/architecture/c4.md, docs/roadmap.md, thesis/, tests/
2026-07-21 Claude Code (Opus 4.8, 1M context) Documentation maintenance under author direction, on the author's instruction that the published site was outdated and that code is the source of truth. Audited every page of the MkDocs site against the codebase and corrected the drift: published the previously uncommitted "How it works" workflow page (fixing two factual errors in it), rewrote the landing page and the stale pre-repository development plan, added the missing reports_chat API page, reconciled all 38 ADR status lines with the decision log, and corrected SRS/roadmap claims describing the deleted batch execution path, a stale export schema version and superseded ADRs (#147/PR #148, #149/PR #151). Diagnosed and fixed two long-standing MkDocs/mermaid rendering defects that had made every published diagram illegible, verifying the result by headless-browser screenshot; added twelve architecture diagrams (C4 component level, deployment topology, ER data model, subsystem flows). Also performed repository branch hygiene (45 merged local branches and 5 stale remote branches removed). Author directed the work and retains review; ADR ratifications flagged for his confirmation. docs/ (site-wide), mkdocs.yml, docs/stylesheets/extra.css
2026-07-22 Claude Code (Opus 4.8, 1M context) Repository landing + backlog burn-down under author direction. Split a large uncommitted working tree into nine per-issue pull requests, each verified locally before pushing (#164, #167, #169–#178): the per-layer UML pipeline hardening, the retest-console lifecycle/wake/405 root-fix, FR-18 SSE chat streaming, the per-report severity meter and archived-report exclusion, the thesis chapters, and the rebuilt README with a generated wordmark and real captures of the running SPA. Then fixed the standing backlog: diagnosed the #156 flaky test as a genuine production race (sync agent tools sharing one non-thread-safe SQLAlchemy Session across Pydantic AI worker threads; reproduced at 21/40 runs) and serialised it behind one seam; reshaped the note taxonomy to the goal flow with an idempotent backfill so existing notes are not orphaned (#113); surfaced CVSS + ATT&CK in the SPA with explicit inferred provenance (#144); replaced the minimal sandbox image with a Kali toolbox, re-verifying the egress lock against it (#105); and replaced the console's static spinner with the model's live reasoning after measuring what a real backend actually streams (#140). Board hygiene: audited every open issue against the code, closed the delivered M6 epic, rescoped #144. The author chose the PR split, the landing order and the auto-merge gate; the FR-15 ground truth (#20) was deliberately left to the author, since authoring the answer key and scoring against it would make the Results chapter self-referential. All reviewed by the author. src/revalid/, frontend/src/, tests/, lab/sandbox/, docs/adr/, docs/roadmap.md, README.md, thesis/
2026-07-22 Claude Code (Opus 4.8, 1M context) Dependency-PR burn-down and FR-15 close-out under author direction. Cleared the six open Dependabot PRs: merged the react-dom/react-query/font bumps, diagnosed the dev-dependencies group's ERESOLVE failure as a real upstream cap (typescript-eslint@8.65.0 still pins typescript <6.1.0) and added a version-scoped 7.x ignore in .github/dependabot.yml (#195/PR #196), and recreated the conflicting setup-uv action bump. FR-15 (#20): on the author's explicit instruction this session — overriding the earlier "leave it to the author" stance — assisted with the ground-truth answer key (tests/data/eval/ground_truth.json), with each expected verdict grounded in the unpatched-lab property (independent of the retest tool's output, to avoid a circular eval) and the scoreboard finding encoded as the NFR-01 ambiguous hard-constraint case. Recorded the accepted FR-15 result (the author's one Claude-API run, ≈87.5% correct) in the roadmap with its honest limitation (single run, export not preserved, not an on-demand make eval figure). The author directed authoring the ground truth and validates it; the expected verdicts remain the author's to confirm. All reviewed by the author. .github/dependabot.yml, tests/data/eval/ground_truth.json, docs/roadmap.md, docs/ai-usage/AI_USAGE_LOG.md
2026-07-24 Claude Code (Opus 5, 1M context) Documentation/thesis currency audit and UML authoring under author direction. Audited the whole codebase against every authored document and corrected the drift found: guided-mode code comments citing ADR-0039 where the rebase had renumbered the decision to ADR-0040; the retired needs_guidance state still named in two API docstrings, the landing page, the README and the SRS; scope.py and deltas.py missing from the C4 component view, the module map and the API/UML reference; the report lifecycle missing its cancelled state and the note-stage enum predating the real goal stage; FR-18 SSE streaming documented as "not yet on main" in three places when it had shipped; the retired !command prefix; and FR-06/NFR-03 not reflecting ADR-0041's scope-driven egress. Added FR-17 acceptance criteria AC24–AC29 for ADRs 0035/0039/0040/0041/0042, which the SRS had stopped recording at AC23. Authored two new documentation pages — a curated class model (domain core, persistence seam, agentic session collaboration, export document) and a use-case model traced to requirements with the decisive scenario expanded — plus a responsibility-partitioned activity diagram, all as Mermaid wired into the existing figure generator so the memoir renders from the same sources. Thesis: reviewed every chapter against the implementation, corrected the ADR count (38→42), the CI/PR statistics, the milestone status, a caption naming three states that no longer exist, the containment claims, and the installation command's missing sandbox extra; added the class-model section and the new figures. Then, on the author's pointer that an evaluation existed elsewhere, located an unmerged local branch (feat/retest-console-controls) carrying a complete 310-line Evaluation chapter with measured results (12 findings on the pinned lab, local 27B backend: 8 correct / 4 inconclusive / 0 confidently wrong, plus a manual-vs-guided-vs-autonomous timing study) alongside Design-chapter improvements main never received. The author chose to port both and to keep the chapter's own honest NFR-01 framing (safety constraint met, accuracy 67% against a 70% bar); ported them, reconciling the branch's future-work restructure with this session's observability item, deliberately excluding the branch's older ch3 and its superseded tooling copies, and updating every downstream claim — the ch4 requirements table, the ch2 gap section and the abstract — that had described the evaluation as future work. Fixed one inconsistency the import exposed: the chapter referred to a retest "effort budget" that ADR-0035 had removed. The author directs scope and validates; the ratification of ADR-0038/0041 was flagged for his decision rather than changed. All reviewed by the author. src/revalid/, docs/architecture/, docs/requirements/, docs/reference/, docs/index.md, README.md, scripts/gen_thesis_figs.py, mkdocs.yml, thesis/
2026-07-25 Claude Code (Opus 5, 1M context) Code generation & refactoring under author direction on the FR-17 console's interaction surface. One agent, one voice, five states (ADR-0042, #217/#218 → PR #219): deleted the parallel read-only Q&A stand-in so a single agent answers every message; collapsed eight lifecycle states to five (idle/working/awaiting_command/awaiting_operator/stopped), folding the retired needs_guidance into awaiting_operator; made a message at the approval gate withdraw the pending command and steer; and retuned the instructions so a question the agent cannot answer triggers a lookup rather than a shrug. The author chose this scope explicitly — adopting the interaction-surface pieces of a competing local redesign while keeping main's guided mode and egress work, and rejecting the wholesale merge. Reopen a concluded session (ADR-0043, #214 → PR #216): withdraw a premature verdict from the queryable projection while keeping it in the append-only transcript as a verdict_cancelled event. The rebase of #216 onto #219 forced an ADR renumber (0042 → 0043) and exposed two defects the assistant then fixed: a test asserting the removed STARTING state, and a Reopen control shipped with no frontend test. All reviewed by the author. src/revalid/retest_session.py, src/revalid/retest_agent.py, src/revalid/domain.py, frontend/src/routes/RetestSession.tsx, docs/adr/0042-*, docs/adr/0043-*, tests/
2026-07-25 Claude Code (Opus 5, 1M context) Deployment engineering and release close-out under author direction. Containerised deployment (ADR-0044, #220 → PR #221): a two-stage app image (Node builds the SPA, Python installs locked deps) plus a compose stack that includes the pinned lab rather than restating its version. The load-bearing decision was the author's: reach the Docker daemon by mounting the host socket and provisioning sibling containers — Docker-in-Docker and a socket proxy both rejected — with the root-equivalent consequence stated plainly in the ADR, the compose file and the README, accepted only under the single-operator threat model (ADR-0008). Containment was re-verified inside the deployed stack rather than assumed. v1.0.0 close-out (#223, #225): on the author's rule that nothing ships as v1 with an issue or PR open — milestones M5/M6 closed, every ADR from 0001 to 0044 brought to accepted/superseded, an SRS honesty pass ticking met criteria with their evidence while marking FR-19 AC4 only half met (the evaluation ground-truth tagging is deliberately the author's), and a thesis pass removing a future-work section the shipped evaluation had made false. One test was found to hang rather than fail (it awaited a deleted event kind), which would have stalled CI silently; fixed to key off the real state change. All reviewed by the author. Dockerfile, docker-compose.yml, Makefile, README.md, docs/adr/0044-*, docs/roadmap.md, docs/requirements/srs.md, thesis/, tests/
2026-07-25 Claude Code (Opus 5, 1M context) Debugging, security fix and documentation under author direction, all originating in the author's live testing of an online-scope retest. Two defects (#226 → PR #227): the ADR-0041 egress proxy never started (a repr-escaped config passed through printf '%s', and a shell handed to command where the image declares an ENTRYPOINT) — both hidden behind a # pragma: no cover, which is why they shipped with every gate green; and editing a finding silently wiped its CVSS/ATT&CK. Regression tests now pin both. Egress rebuilt at L3 (ADR-0045 supersedes ADR-0041, #228 → PR #229): the author's call, after the assistant's diagnosis showed the deeper problem was architectural — an L7 HTTP proxy gives nmap and every raw-socket tool no route out. Egress control moved to a per-session gateway container holding an iptables allowlist and NET_ADMIN, with the sandbox sharing its network namespace and keeping only NET_RAW, so no command inside can widen its own scope. Verified live (target reachable, off-scope refused, iptables -F denied, clean teardown). CodeQL py/stack-trace-exposure (#231 → PR #232): the FR-18 SSE stream framed raw exception text to the client; replaced with a fixed detail plus a real log — deliberately doing more than the suggested one-line autofix, which would have introduced a silent failure. Documentation (#230 → PR #234, #235): a new network-topology page (containment had no diagram anywhere despite being the project's central claim), a post-ADR-0045 currency sweep, and the previous session's AI-usage row. All reviewed by the author. src/revalid/sandbox.py, src/revalid/reports_chat.py, src/revalid/findings.py, frontend/src/, docs/adr/0045-*, docs/architecture/topology.md, docs/ai-usage/AI_USAGE_LOG.md, tests/
2026-07-25 Claude Code (Opus 5, 1M context) Code repair, thesis preparation and review under author direction, continuing the same day. Audit findings fixed (#247-#251): the retest agent's instructions asserted that its sandbox could reach only the lab target, which ADR-0045 had made false for every online scope — the model was told its target was unreachable while the sandbox could in fact reach it; the reachability line is now derived per session from the scope the sandbox was provisioned against, with two regression tests verified to fail without the fix. Also removed a write-only session flag whose two docstrings claimed it gated the free-launch loop, de-duplicated a prompt builder whose copies had diverged so that the goal generator saw a finding's severity and attack vector while the retest agent did not, and retired walking-skeleton leftovers published in the generated API reference. A console refactor (#253) was deliberately deferred on the author's decision — the risk of moving 900 lines is immediate and the benefit only accrues if the code is edited again — with a lint ceiling added instead so it cannot grow further. Bibliography (#255): the author had asked on 2026-07-23 for ~30 references; the reduction was done then but lived on a stash and never reached main. The 31 kept keys were recovered verbatim from that stash and the prose surgery redone against current main, folding each claim onto the citation that survived rather than leaving 36 sentences unsupported. Thesis figures (#259, #262): measuring the built PDF showed most figures printing at 39-58% of body-text size, one at a third of the text column, and three carrying overlapping or clipped labels; the two containment topologies were added, the diagram sources reshaped, and a float-placement bug fixed that had been printing a table twenty-four pages from its own discussion. Review (#261): a full rubric and Reglamento pass was run; its mechanical findings were applied — including a genuine regulation breach, a memoir that directed the tribunal to a repository without ever giving its URL — while every finding depending on the author's own data (a results table that does not sum, an impossible percentage, the unattributed evaluation reports) was recorded for him and deliberately left unguessed. One paragraph the assistant had written earlier the same day was cut on the reviewer's judgement that it was the weakest page in the document. All reviewed by the author. src/revalid/retest_agent.py, src/revalid/retest_session.py, src/revalid/plan.py, src/revalid/app.py, frontend/src/, thesis/bib/ref.bib, thesis/chapters/, thesis/figs/, docs/architecture/, docs/ai-usage/AI_USAGE_LOG.md, tests/
2026-07-25 Claude Code (Opus 5, 1M context) Interaction-design change and a thesis-readiness documentation sweep, under author direction. A handed-back console waits (ADR-0046, #243 → PR #244): the author rejected the awaiting_operator prompt banner — "when handed to me it will just wait for me to be done" — so the banner was deleted, the status label reworded from the imperative "Your move" to the factual "Waiting for you", Conclude promoted from a banner button to a permanent control in every live state, and the agent's hand-back copy rebalanced so it proposes concluding only where it has actually reached a determination. Removing the banner exposed a latent ADR-0043 defect (a reopened session still reported the verdict its operator had withdrawn), fixed in the same PR. Verified live in the browser by the author. Documentation sweep (#245): on the author's instruction that the version is done and thesis-ready, three audits were run over the repository (documentation currency, thesis-versus-code drift, and the pre-release codebase audit) and their confirmed findings applied — this log, which had fallen fifteen PRs behind and is the source the declaration above is compiled from; the roadmap, whose first entry still advertised a "next action" completed at v1.0.0; retired lifecycle states and a removed hand-back prompt still described as current in the C4 sequence diagrams, workflow.md, six rendered docstrings, the use-case model and the SRS; two state-machine diagrams that drew Conclude as gated by state, contradicting the decision they illustrate; missing acceptance criteria AC30–AC31 for ADRs 0043/0046; and a thesis component figure left stale by an earlier commit that edited its source without regenerating it. The §6 declaration itself was corrected: it named only the Opus~4 family where the log records three model identities, and listed five categories of use where the evidence supports seven. The author directs scope and validates; nothing recorded here was inferred without checking it against the code. frontend/src/, src/revalid/, docs/adr/0046-*, docs/architecture/, docs/requirements/, docs/roadmap.md, docs/ai-usage/AI_USAGE_LOG.md, README.md, thesis/chapters/, thesis/figs/, tests/
2026-07-25 Claude Code (Opus 5, 1M context) Code generation and debugging under author direction on the FR-19 ingest doors. Enrichment reached only the PDF door, because it rides inside the extraction call that the FR-02 JSON and manual doors never make — so findings from those doors landed with an empty taxonomy and no way to derive one. Opt-in enrichment (#233 → PR #236): a stated CVSS/ATT&CK is copied verbatim, and derivation is available behind an explicit enrich=true — the author chose opt-in over automatic, keeping the "never guess silently" line. Typed taxonomy on manual entry (#237 → PR #238): CVSS vector, base score and ATT&CK techniques on the creation form and the JSON door, with mitre_techniques documented as a revalid-specific key and a stated cwe never silently renamed into a technique id. Silent no-op fixed (#241 → PR #242): found while validating the above live on a local 9B model — the same import twice, once enriched and once empty, because the model occasionally returned {} and the schema permitted it; a model that answers nothing now retries instead of reporting success. Documentation (#239 → PR #240): the claim that every finding is enriched whichever door it came through survived in three pages the earlier PRs had not touched, alongside a factual error about which module does the work. All reviewed by the author. src/revalid/findings.py, src/revalid/extract.py, src/revalid/app.py, frontend/src/, docs/architecture/workflow.md, docs/index.md, README.md, tests/
2026-07-25 Claude Code (Opus 5, 1M context) Thesis submission-readiness pass under author direction (#266, closing the open half of #261). The author asked for every remaining defect fixed and to be told what only he could supply. Rubric and regulation gaps closed: a new §2.1 stating the literature-search strategy and admission criteria (a graded learning outcome that appeared nowhere); a §6.2.1 competencies covered naming the proposal's own IS5 and IS6 against the evidence for each, plus the degree's instrumental, systemic, personal and UCLM transversal competencies; both evaluation reports attributed for the first time — the twelve-finding retest input traced from the PDF's own metadata to Hack & Fix, a consultancy sample deliverable for a fictitious client, and the extraction/hosted-backend input to Nozipho Mthimunye's public write-up, both added to ref.bib and cited (the Authorship Statement's claim that all non-original material is attributed was until now contradicted); and all eight table captions moved above the tabular per the ESII seminar. Correctness: the 87.5% claim reworded to its real basis (7 of 8 exploitable findings, no confident verdict on the deliberately ambiguous ninth); a new §5.2 reporting O1, which ch5 promised and never measured (8/8 well-formed findings, 100%, 78 s on local qwen3.5:9b against FR-03's ≥90%), including the honest split that the model half clears the bar while the deterministic segmenter recovered 8 of 9 findings on one report and nothing on the other; the headline table's Cmds total corrected from 48 to the 58 its own rows sum to (flagged to the author as the one number to confirm); NFR-02 marked partial in Table 4.1; CI/PR statistics refreshed and dated (336 CI / 342 security runs over 143 merged PRs, median 43 s, p95 94 s, four cancelled long runs) and the §6 declaration's inverted claim about which sessions lack a model identity corrected against the log. New honesty items the author had not asked for but the evidence demanded: a determinism threat to validity (an agentic retest is not reproducible run to run, which is why the nine-finding rows are separate runs and not re-slices), a statement of exactly which artefacts of the twelve-finding run survive (input and outcomes, no FR-12 export, no committed key), and a paragraph in §1.3 recording that the proposal's "de forma autónoma" became a per-command human gate, with the evidence that the gate costs no time. Presentation: the use-case figure split in two and re-laid out, and per-figure type overrides added at the Mermaid sources, lifting the smallest printed labels from 33–47% of body-text size to 54–69%; the containment mechanism de-duplicated from three statements to one plus cross-references; filler verso pages made genuinely blank; prose em-dashes cut from 354 to 101 (~1.1/page). Build verified clean: 34 bibliography entries, 34 cited, zero orphans either way, zero undefined references, zero overfull boxes, no float-too-large, every float within four pages of its first mention. The author directs scope and validates; the page span (90 pages ch1→bibliography against the 80-page recommendation) and the code↔competency mapping were reported to him for decision rather than resolved unilaterally. thesis/ (all chapters, bib/ref.bib, TFG.tex, figures), docs/requirements/use-cases.md, docs/architecture/c4.md, docs/architecture/data-model.md
2026-07-26 Claude Code (Opus 4.8) Ingestion redesign, thesis/documentation sync and a licensing decision, under author direction. Whole-document extraction (ADR-0047, #293 → PR #294): on the author's directive that FR-01/FR-03 must not depend on regex — "feed the whole PDF to the model and ask for it back" — the regex heading segmenter (segment_findings/FindingCandidate) was deleted and pdf.py now renders the entire report to Markdown with PyMuPDF4LLM (deterministic legacy mode: no ML layout model, no OCR), replacing pdfplumber; extract.py sends the whole document to the extraction agent in one call returning list[ExtractedFinding], the schema gate unchanged, Pydantic AI kept as the framework (the author's call not to adopt Instructor, which would duplicate what Pydantic AI already provides), lineage simplified, cancellation reduced to interrupt-only, and an explicit max_tokens set so a multi-finding response is not truncated. The redesign trades format-robustness for a context-window boundary: measured on the local qwen3.5:9b backend the extractor produces schema-valid findings end to end for reports that fit — 4/4 on the synthetic fixture and 1/1 on a new deterministic single-finding fixture (scripts/gen_one_finding_pdf.py), authored to prove local extraction on a small report — while the nine- and twelve-finding real reports overflow a small local model and need a hosted large-context backend; Ollama's /v1 endpoint was verified to ignore num_ctx, so a larger local context is the operator's server setting, not something the app can request. Evaluation refocus (#295 → PR #296): a repetition pass over ch5 — the §5.7 discussion tightened from a near-verbatim recap into a synthesis, the §5.3 competing TryHackMe/Claude digression cut to a forward pointer, and the §5.5 27B passes reconciled with a precision fix so "every model cleared a live finding autonomously" is scoped to the models actually run without the gate. Relicensing to AGPL-3.0-or-later (#299 → PR #300): the author's decision once it was clear the new PyMuPDF4LLM (and its PyMuPDF core) dependency is AGPL-3.0 and that Beerware cannot grant unrestricted rights over embedded copyleft code — LICENSE replaced with the verbatim GNU AGPL v3 text, pyproject.toml/README updated, ADR-0047 made explicit and ratified accepted, ADR-0001's Beerware choice annotated as superseded, and the thesis ch3 and roadmap brought into line; the same PR removed the now-obsolete regex-segmenter history from Evaluation §5.2 so it describes only the current design. Documentation synced across the redesign: SRS FR-01/FR-03, the C4 / workflow / subsystem-flow diagrams, the index and API reference, and thesis ch3/ch4/ch5/annex; each PR auto-merged on green CI with the thesis rebuilt clean (127 pages, 0 undefined references, 0 overfull boxes). The author directed every design and scope call — the regex removal, the library choice, keeping Pydantic AI, and the licence — and validates; all reviewed by the author. src/revalid/pdf.py, src/revalid/extract.py, src/revalid/llm.py, src/revalid/app.py, tests/, scripts/, LICENSE, pyproject.toml, README.md, docs/adr/0047-*, docs/adr/0001-*, docs/requirements/srs.md, docs/architecture/, docs/index.md, docs/reference/api.md, docs/roadmap.md, thesis/