Repository navigation
Import Podcast Assistant into assistants/podcast #7
Description
Import Podcast Assistant into assistants/podcast
Status: done — import accepted; standalone Telegram credential smoke superseded/cancelled, not passed
Tags: migration, assistant, podcast, testing, P0
Depends on: None — #12 is complete
Blocks: None — #9 and #44 are complete; the implementation source required by #30/#31 was delivered
Final disposition
The Podcast Assistant source import is complete and accepted. The canonical in-repository module is assistants/podcast/; the transitional root copy is absent; the external source remained read-only; package metadata, documentation, ignore rules, import log, prompts/templates, fixtures, utilities, and tests were reconciled.
The previously open real-credential smoke for the imported assistant's standalone Telegram bot is cancelled as superseded, not passed. Telegram rollout is now owned by the shared conversational-agent work (#121 and #128). Closing this import issue does not assert that the old standalone bot was smoke-tested, that shared production Telegram rollout has passed, or that a shared Podcast execution capability exists. #128 explicitly keeps Podcast creation outside its MVP; any later Podcast execution must be separately implemented and accepted through its owning issue.
Completion evidence
-
assistants/podcast/is the canonical imported module and there are not two active maintained copies. - The source boundary and import provenance are documented; the external source was not modified and is not a runtime dependency.
- Sensitive/local outputs are ignored and the transitional local-storage boundary is documented.
- Package resolution, knowledge-base utilities, Telegram text/status behavior, Heru progress behavior, and retry/resume behavior have automated coverage.
- Tester re-review passed after retry/resume and root-command fixes: evidence.
- Assistant-boundary re-review passed after automatic commit/push behavior was removed: evidence.
- PM accepted the completed import: evidence.
- CANCELLED / SUPERSEDED — NOT PASSED: standalone real Telegram credential smoke. Shared Telegram ingress and rollout belong to Consolidate private Telegram identity, text, voice, and photo input #121/Roll out and cut over the Telegram conversational MVP #128.
Historical acceptance scope
The completed import preserved the source assistant's code and tests sufficiently to make it available as a DataOps module. It did not make transitional local inbox/document/run storage into production artifact storage, and it did not establish production Podcast execution, production Telegram readiness, or permission for external writes.
Out of scope after closure
- Shared Telegram identity/text/voice/photo ingress and rollout: Consolidate private Telegram identity, text, voice, and photo input #121/Roll out and cut over the Telegram conversational MVP #128.
- Production conversational approvals and plugin execution: Epic: Deliver a Telegram-first conversational agent MVP #122 and its child issues.
- Production Podcast execution integration: remains separate from this import and is not claimed by closure.
- Operational-knowledge private-repository migration: Move Podcast Assistant operational knowledge behind the private boundary #144.
- Changes to the external source repository.
Activity
alexeygrigorev commentedon Jun 27, 2026
Software Engineer handoff for #7
Summary:
assistants/podcast/.podcast-assistant/copy instead of keeping a shim, so there is one maintained in-repo assistant location.../podcast-assistantinto the canonical path, including assistant code, tests, process docs, templates, knowledge-base data/docs, actual-question tooling,.env.example, and example.docxfixtures.../../../herurelative toassistants/podcast/._docs/import-log.mdwith final destination, source state, exclusions, and validation results.Changed paths:
podcast-assistant/**moved toassistants/podcast/**.assistants/podcast/.gitignoreassistants/podcast/README.mdassistants/podcast/pyproject.tomlassistants/podcast/uv.lockassistants/podcast/process/podcast.mdassistants/podcast/scripts/search_podcast_kb.pyassistants/podcast/tests/test_search_podcast_kb.pyassistants/podcast/:.env.example, actual podcast data files,knowledge_base/actual_questions_analysis.md,knowledge_base/question_playbook.md,scripts/import_actual_podcast_questions.py,tests/test_import_actual_podcast_questions.py, andpodcast_examples/Podcast/**fixtures._docs/import-log.mdTests and checks run:
uv lock --project assistants/podcast: passed.cd assistants/podcast && uv run pytest: passed, 24 passed / 0 failed.uv run --project /home/alexey/git/dataops/assistants/podcast --directory /home/alexey/git/dataops/assistants/podcast pytest: passed, 24 passed / 0 failed.cd assistants/podcast && uv run python scripts/search_podcast_kb.py "AI agents evaluation": passed.test -d ../podcast-assistant && test ! -d ../podcast-assistant/.git && test ! -e podcast-assistant: passed.git diff --check: passed.Requested command caveat:
uv run --project assistants/podcast pytestfrom the repo root failed before running the assistant suite because pytest used the DataOps root config and collected unrelated root tests. Result: 4 collection errors from missing root-test dependenciesfrontmatterandplaywright. The assistant suite itself passes from the assistant project root as shown above.Skipped / human checks:
[HUMAN]Telegram smoke test was not run. It requires realTELEGRAM_BOT_API_KEY,TELEGRAM_CHAT_ID, and external Telegram delivery.Source-boundary confirmation:
../podcast-assistantwas read only for this work.../podcast-assistantexists and is not Git-backed:../podcast-assistant/.gitis absent.assistants/podcast/; the imported package does not rely on runtime reads from../podcast-assistant.podcast-assistant/no longer exists in the DataOps checkout after the move.Acceptance criteria status:
assistants/podcast/exists and is canonical: done.podcast-assistant/removed/reduced so there are not two active copies: done; removed, no shim kept.../podcast-assistant: done._docs/import-log.mdupdated with final destination, source path/state, copied paths, exclusions, and validations: done.assistants/podcast/.gitignorefor.env,.env.*except.env.example,.venv, caches,.tmp,heru_runs/, raw/used inbox contents, and generated documents.assistants/podcast/.assistants/podcast/: done.inbox/,documents/, and logs: done in README and import log.assistants/podcast/process/andassistants/podcast/templates/.[HUMAN]real Telegram bot smoke test: not run; remains human-gated.Readiness:
uv run --project assistants/podcast pytestcollection behavior; usecd assistants/podcast && uv run pytestor the absolute--project+--directoryform to validate the assistant suite.alexeygrigorev commentedon Jun 27, 2026
ASSISTANT REVIEW FINDINGS for #7
Reviewed from the assistant-boundary perspective. I did not modify files or commit.
Finding
/process.assistants/podcast/process/podcast.md:51instructs the Heru agent to commit results whenever the directory is a git repo, andassistants/podcast/main.py:497-498then runsgit pushautomatically when a commit hash is detected after/process. This means an allowed Telegram chat can trigger a real Heru run, local file changes, a commit, and a remote push from the assistant runtime. That conflicts with the issue/process boundary that real external writes should be human/integration-gated and that normal repo commits/pushes go through the DataOps review pipeline. Recommendation: remove auto-push for the imported DataOps module, or gate it behind an explicit opt-in env var/dry-run mode with tests and docs that make the default local-only.Passed boundary checks
assistants/podcast/; rootpodcast-assistant/is absent in the worktree.../podcast-assistantremains outside runtime references in the imported assistant; boundary command passed:test -d ../podcast-assistant && test ! -d ../podcast-assistant/.git && test ! -e podcast-assistant.../../../heruinassistants/podcast/pyproject.tomlanduv.lock;../heruexists relative to the DataOps repo root.TELEGRAM_BOT_API_KEY,TELEGRAM_CHAT_ID,GROQ_API_KEY,HERU_ENGINE, canonical path, and local run commands fromassistants/podcast/.assistants/podcast/README.md:56-60and ignored byassistants/podcast/.gitignorefor.env*,.tmp/,.venv/, caches,heru_runs/,inbox/raw/*,inbox/used/*, anddocuments/*except.gitkeepplaceholders.assistants/podcast/process/podcast.mdandassistants/podcast/templates/podcast_guest_intake.md.PODCAST_ASSISTANT_INTEGRATION_ENGINESand skipped when unset.Verification run
24 passed / 0 failedfromassistants/podcast/.assistants/podcast/with bytecode/cache writes disabled:PYTHONDONTWRITEBYTECODE=1 uv run pytest -p no:cacheprovider tests/test_main.py tests/test_heru_runner.py tests/test_session_retrier.py tests/test_search_podcast_kb.py tests/test_build_podcast_knowledge_base.py tests/test_import_actual_podcast_questions.py -q24 passed in 0.25s.PYTHONDONTWRITEBYTECODE=1 uv run pytest -p no:cacheprovider tests_integration -q2 skipped in 0.08s.alexeygrigorev commentedon Jun 27, 2026
CHANGES REQUESTED
Tester verification for #7 on 2026-06-27.
Blocking findings:
Retry/resume behavior is not actually covered by the imported unit tests.
assistants/podcast/tests/test_session_retrier.pycovers session-id lookup, non-Git commit lookup, and the first-run success path. It does not cover the key retry/resume behavior required by the acceptance criteria: first Heru run fails, a saved session id is used,HeruRunneris invoked again withsession_idand the continuation prompt, Telegram gets the resume message, and no-session / max-retry failure paths behave correctly.The issue-listed command
uv run --project assistants/podcast pyteststill fails from the DataOps repo root before reaching a clean assistant-suite result. It uses the DataOps root pytest config, collects unrelated root tests, and errors on missing root dependenciesfrontmatterandplaywright. The implementation handoff records this caveat, and the package-path forms below do pass. If the root--projectform is intentionally unsupported, the issue/docs/import-log should not leave it looking like a normal validation command for the assistant suite.Passing evidence:
cd assistants/podcast && uv run pytest: PASS, 24 passed in 0.25s.uv run --project /home/alexey/git/dataops/assistants/podcast --directory /home/alexey/git/dataops/assistants/podcast pytest: PASS, 24 passed in 0.23s.cd assistants/podcast && uv run python scripts/search_podcast_kb.py "AI agents evaluation": PASS, returned episode, prep-question, and actual-transcript-question matches.test -d ../podcast-assistant && test ! -d ../podcast-assistant/.git && test ! -e podcast-assistant: PASS.git diff --check: PASS.Static/source-boundary checks:
assistants/podcast/exists and is the canonical in-repo package location.podcast-assistant/is absent in the working tree.rgfound no runtime references from assistant code to../podcast-assistant; those references are confined to README/import-log style documentation.assistants/podcast/pyproject.tomlresolves Heru from../../../heru, anduv.lockmatches that editable path.assistants/podcast/.gitignoreexcludes.env,.env.*except.env.example,.venv,.pytest_cache,__pycache__,.tmp,heru_runs/, raw/used inbox contents, and generated documents; currentinbox/anddocuments/tracked candidates are only.gitkeepplaceholders.TELEGRAM_BOT_API_KEY,TELEGRAM_CHAT_ID,GROQ_API_KEY, andHERU_ENGINE, plus local commands fromassistants/podcast/and the transitional storage boundary._docs/import-log.mdrecords source path/state, final destination, copied path groups, exclusions, and validation results. It does not falsely claim the human Telegram smoke was run.Not run / still open:
[HUMAN]Telegram smoke remains open. I did not run real Telegram delivery or processing because it requires real bot credentials and external delivery.alexeygrigorev commentedon Jun 27, 2026
Software Engineer updated handoff for #7 after changes requested
Summary of follow-up fixes:
assistants/podcast/tests/test_session_retrier.py:session_idand continuation prompt, Telegram gets the resume message, then success returns cleanly;MAX_RETRIESand return the final retry error.uv run --project assistants/podcast pytestpass from the DataOps repo root without changing root pytest config or weakening root tests. The assistant project now has a minimal build backend and package-localpytestentrypoint that routes no-arg assistant pytest runs toassistants/podcast/testswith the assistant config./processauto-push path fromassistants/podcast/main.py. It no longer imports or callssubprocess.run(["git", "push"], ...).assistants/podcast/process/podcast.mdso Heru is instructed not to commit or push. Generated documents and moved inbox files stay as local working-tree changes for the DataOps review pipeline.assistants/podcast/tests/test_main.pycoverage proving/processreports a local commit hash without callingsubprocess.run/ push behavior by default.assistants/podcast/README.mdand_docs/import-log.mdwith the no-push/local-review boundary and current validation results.Changed paths since the prior handoff include:
assistants/podcast/assistant_pytest.pyassistants/podcast/main.pyassistants/podcast/process/podcast.mdassistants/podcast/pyproject.tomlassistants/podcast/uv.lockassistants/podcast/tests/test_session_retrier.pyassistants/podcast/tests/test_main.pyassistants/podcast/README.md_docs/import-log.mdThe original #7 canonicalization changes are still present:
podcast-assistant/**moved toassistants/podcast/**.../podcast-assistantreconciled intoassistants/podcast/, including assistant code, tests, prompts/process docs, templates, knowledge-base data/docs, actual-question tooling,.env.example, and example.docxfixtures.Tests and checks run after the fixes:
uv lock --project assistants/podcast: passed.uv run --project assistants/podcast pytest: passed, 28 passed / 0 failed.cd assistants/podcast && uv run pytest: passed, 28 passed / 0 failed.cd assistants/podcast && uv run pytest tests/test_session_retrier.py tests/test_main.py: passed, 12 passed / 0 failed.cd assistants/podcast && uv run python scripts/search_podcast_kb.py "AI agents evaluation": passed, returned episode, prep-question, and actual-transcript-question matches.test -d ../podcast-assistant && test ! -d ../podcast-assistant/.git && test ! -e podcast-assistant: passed.git diff --check: passed.rg -n "git push|subprocess\.run|commit the result|commit.*push|No push was performed|Do not commit or push" assistants/podcast/main.py assistants/podcast/process/podcast.md assistants/podcast/tests assistants/podcast/README.mdconfirms the old push/commit instruction is gone and only the new no-push/default-local behavior remains.Skipped / human checks:
[HUMAN]Telegram smoke test was not run. It still requires realTELEGRAM_BOT_API_KEY,TELEGRAM_CHAT_ID, and external Telegram delivery.Source-boundary confirmation:
../podcast-assistantwas not modified.../podcast-assistantexists and is not Git-backed:../podcast-assistant/.gitis absent.podcast-assistant/is absent in the DataOps checkout.assistants/podcast/; the imported package does not read from../podcast-assistantat runtime.Per-acceptance-criterion status:
assistants/podcast/exists and is canonical: done.podcast-assistant/removed/reduced so there are not two active copies: done; removed, no shim kept.../podcast-assistant: done._docs/import-log.mdrecords final destination, source path/state, copied paths, exclusions, and validation: done and updated after follow-up fixes.assistants/podcast/.gitignorefor.env,.env.*except.env.example,.venv, caches,.tmp,heru_runs/, raw/used inbox contents, and generated documents.uv run --project assistants/podcast pytestnow passes from repo root./processno-push behavior, Heru progress formatting, retry/resume success/no-session/max-retry paths, and knowledge-base build/search utilities.assistants/podcast/: done./processdoes not commit or push by default and generated files stay local for review.[HUMAN]real Telegram bot smoke test: not run; remains human-gated.Readiness:
uv run --project assistants/podcast pytestpasses.alexeygrigorev commentedon Jun 27, 2026
TEST PASS
Tester re-review for #7 after the Software Engineer follow-up fixes.
Previous blockers are resolved:
assistants/podcast/tests/test_session_retrier.pycovers first-run success, failed first run resuming with a saved session id, Telegram resume notification, no saved session id failure, and max-retry exhaustion.uv run --project assistants/podcast pytestcollected 28 assistant tests and passed.Verification rerun:
uv run --project assistants/podcast pytest: PASS, 28 passed in 0.26s.cd assistants/podcast && uv run pytest: PASS, 28 passed in 0.27s.cd assistants/podcast && uv run pytest tests/test_session_retrier.py tests/test_main.py: PASS, 12 passed in 0.26s.uv run --project /home/alexey/git/dataops/assistants/podcast --directory /home/alexey/git/dataops/assistants/podcast pytest: PASS, 28 passed in 0.27s.cd assistants/podcast && uv run python scripts/search_podcast_kb.py "AI agents evaluation": PASS, returned episode, prep-question, and actual-transcript-question matches.test -d ../podcast-assistant && test ! -d ../podcast-assistant/.git && test ! -e podcast-assistant: PASS.git diff --check: PASS.Additional checks:
assistants/podcast/remains the canonical package location; rootpodcast-assistant/is absent in the working tree.../podcast-assistantremain confined to docs/import-log evidence, not assistant code.../../../herueditable path in package metadata/lockfile.main.pyno longer contains agit pushpath,process/podcast.mdsays not to commit or push, andtests/test_main.pyverifies/processreports a local commit without callingsubprocess.runfor push behavior..gitignorestill excludes local-only state; currentinbox/anddocuments/tracked candidates are only.gitkeepplaceholders.Not run / still open:
[HUMAN]Telegram smoke remains open. I did not run real Telegram delivery or processing because it requires real bot credentials and external delivery.alexeygrigorev commentedon Jun 27, 2026
ASSISTANT REVIEW PASS for #7
Re-reviewed after the Software Engineer follow-up, focused on the prior assistant-boundary blocker. I did not edit files or commit.
Pass criteria checked:
/processno longer auto-pushes.assistants/podcast/main.pyno longer importssubprocessor runsgit push; when a commit hash is detected it reportsLocal commit detected ... No push was performed.assistants/podcast/process/podcast.mdnow says:Do not commit or push changes. Leave generated documents and moved inbox files as local working tree changes for the DataOps review pipeline./processruns do not commit or push by default, and generated files stay local for normal DataOps review.assistants/podcast/tests/test_main.py, and retry/resume coverage is now present inassistants/podcast/tests/test_session_retrier.py.git push,git commit, old commit instruction, or subprocess push/commit call in the assistant runtime/test/doc surfaces reviewed. Remaining hits are the explicit no-push prompt, no-push status message, and test assertion.Verification run:
PYTHONDONTWRITEBYTECODE=1 PYTEST_ADDOPTS='-p no:cacheprovider' uv run --project assistants/podcast pytest: passed, 28 passed.PYTHONDONTWRITEBYTECODE=1 PYTEST_ADDOPTS='-p no:cacheprovider' uv run pytest tests/test_main.py tests/test_session_retrier.py -qfromassistants/podcast/: passed, 12 passed.PYTHONDONTWRITEBYTECODE=1 PYTEST_ADDOPTS='-p no:cacheprovider' uv run pytest tests_integration -qfromassistants/podcast/: 2 skipped as expected because real engine integration tests are opt-in.test -d ../podcast-assistant && test ! -d ../podcast-assistant/.git && test ! -e podcast-assistant: passed.git diff --check: passed.No remaining assistant-boundary findings from this re-review.
alexeygrigorev commentedon Jun 27, 2026
ACCEPTED
PM acceptance after Tester pass and Assistant Engineer pass.
The V1 canonicalization is acceptable:
assistants/podcast/is the canonical in-repo Podcast Assistant location, the rootpodcast-assistant/active copy is absent,../podcast-assistantremains a read-only source boundary with no runtime dependency, and the import log / README / package metadata / ignore rules document the new path, env vars, validation, local-only storage, and future DataOps job/artifact boundary.Acceptance evidence checked:
uv run --project assistants/podcast pytestcollected the assistant suite and passed, retry/resume coverage is now present, and the previous root-command blocker is resolved./processno longer auto-pushes, the prompt says not to commit or push, and tests cover the default no-push behavior.uv run --project assistants/podcast pytest: PASS, 28 passed;git diff --check: PASS; source/root-copy boundary command: PASS.Keep this issue open with the
humanlabel after commit/push. The only remaining criterion is[HUMAN]Telegram smoke with real credentials: allowed chat accepts a harmless intake item,/statusreports it, and processing/dry-run starts safely. Because that external check is still open, the implementation commit should useRefs #7rather thanCloses #7.Canonicalize Podcast Assistant module
alexeygrigorev commentedon Jun 28, 2026
Human-gate audit update (2026-06-28): no agent-verifiable implementation work remains for #7.\n\nCurrent evidence:\n- Canonical Podcast Assistant module is in assistants/podcast/.\n- Root podcast-assistant/ copy is absent; ../podcast-assistant remains read-only and not Git-backed.\n- Import evidence is recorded in _docs/import-log.md.\n- Re-run verification passed: uv run --project assistants/podcast pytest (31 passed); focused main/session tests passed; knowledge-base search command passed; git diff --check passed.\n\nRemaining HUMAN verification to close #7:\n1. Configure real assistants/podcast/.env values: TELEGRAM_BOT_API_KEY, TELEGRAM_CHAT_ID, GROQ_API_KEY if testing audio/image paths, and HERU_ENGINE=codex or HERU_ENGINE=claude.\n2. Start the bot from this repo: cd assistants/podcast && uv sync && uv run python main.py.\n3. From the allowed Telegram chat: send /start, send one harmless text intake item, confirm it is stored under assistants/podcast/inbox/raw/, send /status, and start /process or a safe controlled dry-run path.\n4. Confirm no unauthorized chat access, no secret exposure, no auto-commit, and no auto-push.\n5. Comment evidence here, then remove human and close #7 if the smoke passes.
alexeygrigorev commentedon Jul 31, 2026
PM closeout: the import itself was completed, independently re-tested, Assistant-reviewed, and PM-accepted. The remaining standalone real-credential Telegram smoke is explicitly CANCELLED AS SUPERSEDED, not passed: shared Telegram ingress/rollout is owned by #121/#128. This closure does not claim a shared Podcast execution capability; #128 keeps Podcast creation outside its MVP. Dependencies are reconciled: #12, #9, and #44 are complete, the implementation source for #30/#31 was delivered, and #7 blocks nothing.
Canonicalize Podcast Assistant module