Parent: #130
Source audit: #135 / commit 81ab347dc082954bf35d1cfe9d549ebf404e5533
Goal
Ship AIHOT as the first real, license-aware hot-data reference source through the existing Source -> WorkflowRun -> Record -> MCP evidence chain. This is one vertical slice; do not add a parallel hot-news API or per-provider MCP facade.
Execution contract
- Worktree:
D:\projects\opencli-aihot-source-20260914
- Branch:
codex/aihot-source-20260914
- Baseline:
6b7c69e0d7f1767d7101336cfeb68e869c772fdf
- Owned paths:
_bmad-output/implementation-artifacts/spec-gh-141-aihot-source.md
backend/channels/aihot_channel.py
backend/channels/registry.py
backend/schemas/source.py
backend/workflow/capability_projection.py
frontend/lib/workflow/node-contracts.ts
frontend/lib/workflow/studio-templates.ts
tests/unit/channels/test_aihot_channel.py
tests/unit/test_workflow_http_source_executor.py
tests/integration/test_records_api.py
tests/unit/test_mcp_server.py
- Do not change shared models/migrations, generic MCP tool names, research service, or package files. Unexpected need expands upward first.
Required behavior
- Anonymous read-only AIHOT REST v1 on
aihot.news only; never old /api/public/*.
- Channel is incremental + paginated with explicit no-auth readiness and stable identity.
- Preserve opaque page/snapshot/change cursors, ETag/304 semantics, 409
snapshot_required rebootstrap, Problem JSON, Retry-After, and forward-compatible unknown fields.
- Preserve attribution, source/original links, publishedAt/discoveredAt/latestAt distinctions, raw/normalized/lineage/hash/identity; do not infer missing timestamps or heat.
- Publish one versioned
intelligence.source.aihot capability with allowed_domains fixed to aihot.news and a Studio template.
- Usage/commercial authorization must be surfaced as a readiness/manifest condition: internal/non-commercial allowed; external commercial redistribution requires written authorization.
- Existing workflow/MCP tools execute/read the source; no duplicate AIHOT MCP tool.
Acceptance
Unit tests for 200/304, pagination, invalid/cross-query cursor, 400, 409 rebootstrap, 429/503 Retry-After, identity, schema addition, attribution and timestamps. Integration verifies update-by-identity without duplicate records and no credential leakage. Live canary: items first request + conditional request, then hot-topics provenance/freshness. Report fixture vs live evidence and keep worktree clean.
Parent: #130
Source audit: #135 / commit 81ab347dc082954bf35d1cfe9d549ebf404e5533
Goal
Ship AIHOT as the first real, license-aware hot-data reference source through the existing Source -> WorkflowRun -> Record -> MCP evidence chain. This is one vertical slice; do not add a parallel hot-news API or per-provider MCP facade.
Execution contract
D:\projects\opencli-aihot-source-20260914codex/aihot-source-202609146b7c69e0d7f1767d7101336cfeb68e869c772fdf_bmad-output/implementation-artifacts/spec-gh-141-aihot-source.mdbackend/channels/aihot_channel.pybackend/channels/registry.pybackend/schemas/source.pybackend/workflow/capability_projection.pyfrontend/lib/workflow/node-contracts.tsfrontend/lib/workflow/studio-templates.tstests/unit/channels/test_aihot_channel.pytests/unit/test_workflow_http_source_executor.pytests/integration/test_records_api.pytests/unit/test_mcp_server.pyRequired behavior
aihot.newsonly; never old/api/public/*.snapshot_requiredrebootstrap, Problem JSON, Retry-After, and forward-compatible unknown fields.intelligence.source.aihotcapability with allowed_domains fixed toaihot.newsand a Studio template.Acceptance
Unit tests for 200/304, pagination, invalid/cross-query cursor, 400, 409 rebootstrap, 429/503 Retry-After, identity, schema addition, attribution and timestamps. Integration verifies update-by-identity without duplicate records and no credential leakage. Live canary: items first request + conditional request, then hot-topics provenance/freshness. Report fixture vs live evidence and keep worktree clean.