Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[1.0.0] — 2026-04-08
First stable release. All four agents (
ingestion,cric,document-monitor,github-doc-sync) are production-ready. This release focuses on correctnessunder concurrent read/write access, operational observability, and release
tooling.
Fixed
Concurrency — DuckDB torn-read protection
All database write operations that involve multiple SQL statements are now
wrapped in explicit
BEGIN/COMMIT/ROLLBACKtransactions. Before thisfix, a query arriving from AskPanDA (via the Bamboo MCP tool) during a write
cycle could observe a missing table, an empty table, or a partially-inserted
result.
cric_fetcher._load()— the fullDROP TABLE → CREATE TABLE → INSERTsequence for
queuedatais now a single atomic transaction. Concurrentreaders always see either the previous complete snapshot or the new one.
DuckDBStore.write_table(overwrite=True)— same fix applied to thegeneric overwrite path used by the ingestion agent's source history tables.
BigPandaJobsFetcher._fetch_and_persist()— the three-table write(
jobsupsert +selectionsummaryreplace +errors_by_countreplace) foreach queue is now a single transaction. A reader can never observe a state
where some tables have been updated for a cycle and others have not.
Concurrency — ChromaDB staging swap
DocumentMonitorAgent._ingest_file()previously deleted old chunks from thelive ChromaDB collection and then inserted new ones, leaving a window where
the document was invisible to concurrent queries. The update path now uses an
atomic staging swap:
<name>__stagingcollection.finallyblock).If the staging write fails the live collection is never touched. If the swap
step fails the old chunks remain visible.
Added
scripts/bump_version.py— release versioning scriptA new script for bumping the version string across all relevant files in one
command:
Validates both version strings against PEP 440, reports each file updated, and
exits non-zero on any failure — safe to run in CI. After a successful bump the
script prints a reminder to reinstall the package so agents pick up the new
version at runtime:
common/cli.py— shared startup bannerA new
log_startup_banner(logger, prog)helper inbamboo_mcp_services.common.cliemits a consistent startup line on everyagent launch:
The version is resolved at runtime from the installed package metadata
(
importlib.metadata) so it always reflects the version inpyproject.tomlwithout requiring a hardcoded constant.
Previously three of the four CLIs each contained an inline 9-line copy of this
logic, and
bamboo-document-monitorhad no version logging at all. The helperreplaces all four with a single call.
Per-queue progress logging in
BigPandaJobsFetcherThe ingestion agent now logs a progress line before fetching each queue,
showing the current position in the cycle:
This makes it straightforward to monitor long cycles (e.g. 230 queues × 60 s
inter-queue delay ≈ 4 hours) and to identify which queue a failure or slowdown
is associated with.
New test coverage — 16 tests across 3 files
tests/agents/cric_agent/test_cric_agent.pytests/agents/ingestion_agent/test_bigpanda_jobs_fetcher.pytests/test_duckdb_store.py(new)write_tableappend and overwrite modes; ROLLBACK on insert failure preserves previous data; table existence after a failed overwrite;record_snapshotround-tripsChanged
bamboo-document-monitorCLI now useslog_startup_bannerand thereforelogs version and Python information on startup, matching the other three
agents.
DuckDBStore.write_table(overwrite=False)is unchanged — the append pathinvolves no DROP and was already safe.
Notes for operators
AskPanDA / Bamboo MCP read connections — the transaction fixes above protect
against torn reads caused by the write process, but for full safety the MCP
query tool should open DuckDB files with
read_only=True:DuckDB enforces a single-writer policy at the file level. A second connection
opened with
read_only=False(the default) while the agent holds the writeconnection will either block or raise
IOException: Database is already open.read_only=Trueconnections are explicitly allowed to coexist with one writer.