- Added the first-pass Python package under
src/oidc_hunter. - Added a managed-Dockerfile-compatible
src/main.pyentrypoint. - Added environment-driven configuration for state paths, catalog URL, OpenAI-compatible LLM base URL, model name, API key, optional Cloudflare configuration, and bounded runtime controls.
- Moved the default durable state layout to
data/with SQLite,candidates.yaml, reports, lessons, and per-run artifacts. - Expanded SQLite initialization to include snapshots, tactic metadata, investigation batches, probe summaries, issuer clusters, decisions, and lessons learned.
- Added catalog and
candidates.yamlimporters that tolerate the key variants called out inDESIGN.md. - Added Cloudflare Radar top-domain ingestion and persisted seed-batch artifacts.
- Added deterministic OIDC probing for candidate domains using
https://<domain>/.well-known/openid-configuration. - Added issuer clustering, known-set matching, candidate promotion, alternative-domain handling, and deterministic candidate export.
- Added a
SequentialAgentroot workflow with bounded investigation and reviewLoopAgents. - Added the bounded investigator Python execution tool with subprocess isolation and fallback tactic generation.
- Added durable per-run markdown reports, lessons learned, and tactic score updates under
data/. - Added importer and end-to-end deterministic workflow tests.
- Tightened the live ADK path by reducing loop model turns, adding stage-scoped timeouts, durable-state-aware fallback, and explicit progress logging.
- Added mocked ADK/LiteLLM stage-path coverage rather than only deterministic workflow coverage.
- Verified local compile and unit tests with Python 3.14.
- Verified local no-LLM smoke run creates state, candidates, lessons, and a report.
- Verified
container build -t oidc-hunter:dev .succeeds with the macOScontainercommand. - Added
run.shto selectcontainer, thendocker, thenpodman, while mountingdata/as persistent state. - Verified real live-model runs after the ADK refactor, including a packaged
run.shexecution against mounteddata/and a host-side run that exposed and fixed ADKStatemutation issues.
- None in the current implementation checklist.
- Expand review heuristics for suspicious issuer-domain relationships and candidate staleness handling.
- Add richer retained probe artifacts for ambiguous-but-interesting findings.
- Investigate why the current local endpoint still times out some ADK stages even with the larger default budget, and decide whether further prompt simplification or endpoint-side tuning is warranted.
- Local unit tests:
.venv/bin/python -m unittest discover - Local no-LLM smoke:
OIDC_HUNTER_SKIP_DOTENV=1 OIDC_HUNTER_STATE_DIR=/tmp/oidc-hunter-local-verify-2 .venv/bin/python -m oidc_hunter - Container build:
container build -t oidc-hunter:dev . - Packaged run wrapper:
./run.sh - Live packaged verification: on 2026-04-26,
./run.shfetched the live catalog and Cloudflare seeds into mounteddata/, persisted SQLite state plus artifacts, and completed with stage-scoped ADK fallback instead of rerunning the whole workflow. - Live host-side verification: on 2026-04-26, a direct
.venv/bin/python -m oidc_hunterrun against the configured local model surfaced an ADKtool_context.statemutation bug, which was fixed by replacing.pop()calls with key-safe deletion.
pyproject.toml is listed in .managedfiles. It was updated in this first pass to add required application dependencies. The upstream gitrepoforge template or external configuration should be updated so these dependency changes are preserved the next time gitrepoforge runs.