Skip to content

feat: Require the API key on every /api/v1/ endpoint - #8

Merged
tslateman merged 2 commits into
mainfrom
worktree-gate-api-reads
Sep 9, 2026
Merged

tslateman merged 2 commits into
mainfrom
worktree-gate-api-reads

Conversation

@tslateman

Copy link
Copy Markdown
Owner

Summary

The hosted instance served coverage, drift, impact, and the task queue to anyone, and the api_v1 writes (claim, complete, conflict detect/resolve) never checked a key at all. require_api_key now guards all 20 /api/v1/ views; /api/docs/, /api/openapi.json, and the landing page stay open. With SPECTRACE_API_KEY unset, dev mode still bypasses with a warning, so local workflows and the test suite run unchanged.

  • 14 api_v1 views and 6 api.py reads gated (the 3 api.py writes already were).
  • The six api.py reads declare requires_auth=True, so the OpenAPI spec now shows the lock on 9 operations.
  • docs/integration.md states the new rule.
  • 13 new tests: 401 without/with wrong key, 200 via X-API-Key and Bearer, dev-mode bypass, and the public surface staying open.

Verified

  • pytest: 1287 passed.
  • Generated OpenAPI spec lists security on all 9 documented operations.

After merge

Fly already holds SPECTRACE_API_KEY, so a fly deploy puts the gate live; agents and CI holding the key are unaffected.

🤖 Generated with Claude Code

https://claude.ai/code/session_01S5JK8c9t5YJWcgD7Jsoo6t

The hosted instance served coverage, drift, impact, and the task queue
to anyone, and the api_v1 writes (claim, complete, conflict actions)
never checked a key at all. require_api_key now guards all of them;
/api/docs/, /api/openapi.json, and the landing page stay open. The six
api.py reads declare requires_auth so the spec shows the lock.
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

Code Impact Analysis

Comparing: ae35ee953a04bc3d05a68998ef049e542f46136b .. 66b14df3da548e9dd6ad6d51c60746f908e34794
Risk: CRITICAL (0.85)

Changed Files (5)
  • [spectrace] CHANGELOG.md
  • [spectrace] docs/integration.md
  • [spectrace] spectrace/requirements/api.py
  • [spectrace] spectrace/requirements/api_v1.py
  • [spectrace] spectrace/requirements/tests/test_api_auth.py

Affected Requirements (18)

  • [spectrace] REQ-CORE-005
  • [spectrace] REQ-RSLT-000
  • [spectrace] REQ-RSLT-001
  • [spectrace] REQ-RSLT-002
  • [spectrace] REQ-RSLT-003
  • [spectrace] REQ-RSLT-004
  • [spectrace] REQ-RSLT-005
  • [spectrace] REQ-RSLT-006
  • [spectrace] REQ-SPEC-000
  • [spectrace] REQ-SPEC-001
  • [spectrace] REQ-SPEC-002
  • [spectrace] REQ-SPEC-003
  • [spectrace] REQ-SPEC-004
  • [spectrace] REQ-SPEC-005
  • [spectrace] REQ-TASK-000
  • [spectrace] REQ-TASK-001
  • [spectrace] REQ-TASK-002
  • [spectrace] REQ-TASK-003

Affected Modules (17)

  • [spectrace] docs/spec-impact-graph.md
  • [spectrace] spectrace/requirements/management/commands/code_impact_analysis.py
  • [spectrace] spectrace/requirements/management/commands/detect_conflicts.py
  • [spectrace] spectrace/requirements/management/commands/detect_drift.py
  • [spectrace] spectrace/requirements/management/commands/impact_analysis.py
  • [spectrace] spectrace/requirements/management/commands/spec_coverage.py
  • [spectrace] spectrace/requirements/services/agent_tasks.py
  • [spectrace] spectrace/requirements/services/conflict_detector.py
  • [spectrace] spectrace/requirements/services/dependency_validator.py
  • [spectrace] spectrace/requirements/services/impact_analyzer.py
  • [spectrace] spectrace/requirements/services/impact_graph.py
  • [spectrace] spectrace/requirements/tests/test_api_v1_results.py
  • [spectrace] spectrace/requirements/tests/test_api_v1_specs.py
  • [spectrace] spectrace/requirements/tests/test_api_v1_tasks.py
  • [spectrace] spectrace/requirements/urls.py
  • [spectrace] spectrace/requirements/validation_runs.py
  • [spectrace] spectrace/requirements/validator.py

Affected Projects (1)

  • spectrace

Evidence

Edges carrying this change — annotated: 47 | contract: 0 | inferred: 4 | dependency: 0

Affected Tests (77)

pytest spectrace/requirements/tests/test_api_v1_results.py::test_detect_conflicts__excludes_structured_when_false
pytest spectrace/requirements/tests/test_api_v1_results.py::test_detect_conflicts__handles_empty_body
pytest spectrace/requirements/tests/test_api_v1_results.py::test_detect_conflicts__passes_custom_params
pytest spectrace/requirements/tests/test_api_v1_results.py::test_detect_conflicts__rejects_invalid_json
pytest spectrace/requirements/tests/test_api_v1_results.py::test_detect_conflicts__returns_results
pytest spectrace/requirements/tests/test_api_v1_results.py::test_get_conflict__returns_404_for_unknown
pytest spectrace/requirements/tests/test_api_v1_results.py::test_get_conflict__returns_detail
pytest spectrace/requirements/tests/test_api_v1_results.py::test_latest_run__filters_by_source
pytest spectrace/requirements/tests/test_api_v1_results.py::test_latest_run__returns_404_when_empty
pytest spectrace/requirements/tests/test_api_v1_results.py::test_latest_run__returns_latest
pytest spectrace/requirements/tests/test_api_v1_results.py::test_list_conflicts__filters_by_confidence
pytest spectrace/requirements/tests/test_api_v1_results.py::test_list_conflicts__filters_by_pattern
pytest spectrace/requirements/tests/test_api_v1_results.py::test_list_conflicts__filters_by_requirement_id
pytest spectrace/requirements/tests/test_api_v1_results.py::test_list_conflicts__filters_by_resolved
pytest spectrace/requirements/tests/test_api_v1_results.py::test_list_conflicts__rejects_invalid_limit

…and 62 more.


Informed-consent gate: this comment warns, it does not block the merge.

@tslateman
tslateman merged commit 7d9f33e into main Sep 9, 2026
6 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