Conversation
AB metrics: - Replace ':days::integer' with 'CAST(:days AS integer)' in the textual SQL query — asyncpg misparses ':param::type' as a malformed named parameter and raises PostgresSyntaxError on every page load. - Regression test: test_ab_metrics_sql_uses_cast_not_double_colon. Poller: - Add dedicated OSError handler in polling_loop() — covers socket.gaierror (DNS, [Errno -2] Name or service not known), ConnectionRefusedError, and other network-level failures. - Backs off exponentially (30 s → 60 s → 120 s, cap 300 s) instead of retrying at the normal poll interval and flooding logs. - Regression tests: test_polling_loop_oserror_triggers_backoff, test_polling_loop_oserror_backoff_doubles_on_repeat. Co-authored-by: AgentCeption Bot <agent@agentception.io>
…#1058) The warning text was crammed inside the .od-header flex row alongside all the other buttons, stretching the row and breaking the layout. - Pull loneWorkerWarning out of od-header__launch-group entirely. - Add a dedicated .od-warn-strip element rendered just below the header (still inside the OD panel flex column) with amber colouring. - Launch button stays in the header row unobstructed. - Strip strips the leading emoji from the JS string to avoid duplication with the icon span. - New SCSS: .od-warn-strip with icon/text sub-elements. Co-authored-by: AgentCeption Bot <agent@agentception.io>
Updates all 40 files that referenced port 10003 — Docker images, compose files, CI workflow, app entrypoint, scripts, all docs, tests, and derived .agentception role prompts — to use port 1337. Verified zero remaining 10003 references, clean mypy, no template drift, and health check passes on the new port. Co-authored-by: AgentCeption Bot <agent@agentception.io>
Adds a "Specific Issue" scope option to the root node editor panel so a lone worker can be pinned to a single GitHub issue number without needing a coordinator above it. - OrgNode.scope extended to 'full_initiative' | 'phase' | 'issue' - New scopeIssueNumber field on OrgNode / OrgNodePayload - isRootSelected computed getter — scope picker only shown for root - loneWorkerWarning suppressed when scope === 'issue' - launch() passes scope_issue_number to already-supported backend field - Edit panel gains a Scope radio (Full Initiative / Specific Issue) with a number input that appears when Specific Issue is selected - SCSS: od-scope-radio / od-scope-opt / od-editor__input styles Co-authored-by: AgentCeption Bot <agent@agentception.io>
When a node is scoped to a specific issue, the node card now displays a clickable issue number badge (e.g. "# 1048") that links directly to the GitHub issue in a new tab. The badge uses the same emerald tint as the worker node border, is visible both before and after launch, and clicking it does not trigger node selection (stopPropagation). - nodeCardHtml gains a scopeBadge() helper covering both phase and issue scopes - renderD3 / nodeCardHtml accept repo string to build the GitHub URL - _render() passes this.repo through - New od-node__issue-link SCSS pill style (emerald, hover state) Co-authored-by: AgentCeption Bot <agent@agentception.io>
The widget was showing a single 'control' bucket with no treatment group, making the A/B framing meaningless. Repurposed to a clear health dashboard: - Drop the 'Variant' column (always 'control', adds no signal) - Add 'Developer Run Health' heading with lookback window subtitle - Add Passed / Failed columns alongside pass rate percentage - Color-code pass rate: green >= 50%, amber > 0%, red = 0% - Format avg_input_tokens as e.g. '1.52M' instead of raw integer - Update loading placeholder and HTML comment in build.html - Update route module docstring - SCSS: dev-health-panel heading, dev-health__good/warn/bad color classes Co-authored-by: AgentCeption Bot <agent@agentception.io>
Redesigns the bottom panel from a bare table into a full health dashboard matching the Mission Control visual language. SQL / data: - Adds avg_output_tokens, avg_cache_read/write_tokens to aggregates - Adds avg_duration_secs (completed_at - spawned_at) per run - Adds retry_count (attempt_number > 0) - Adds per-grade counts (A/B/C/D/F) via a reviewer-run join on issue_number — the old query read developer done-events which never carry grades, so pass_rate was always 0%; it now correctly surfaces the reviewer verdict - Computes estimated_cost_per_run in Python using Anthropic token pricing - Computes retry_rate = retry_count / runs Visual (drh BEM block, _foundation.scss tokens throughout): - 7-tile KPI grid: Runs / Pass Rate / Avg Duration / Est. Cost / Avg Iters / Retry Rate / Avg Tokens — each tile uses bg-elevated + border-subtle - Semantic modifiers (--good/--warn/--bad) apply gradient tints + color - Grade distribution: A–F progress bars with letter, count, and % columns — A/B green, C amber, D orange, F danger-red - Panel header: ⚡ icon, title badge, run count pushed to right - Replaced legacy --surface-2/--muted with --bg-elevated/--text-muted Co-authored-by: AgentCeption Bot <agent@agentception.io>
FASTEMBED_CACHE_DIR was documented in a config comment but never implemented as a Settings field, so the env var was a no-op and FastEmbed always defaulted to /tmp/fastembed_cache — wiped on every container rebuild. - Add fastembed_cache_dir setting (default /home/agentception/.cache/fastembed) - Pass cache_dir to TextEmbedding, SparseTextEmbedding, TextCrossEncoder so all three ONNX models (~900 MB total) land in the named volume - Add agentception-fastembed-cache named volume in docker-compose.yml mounted at /home/agentception/.cache/fastembed - entrypoint.sh: mkdir + chown the fastembed cache before dropping privs
fix: persist FastEmbed ONNX model cache across container rebuilds
Extends the scope picker from 2 options to a 3-level cascade. Each level is a radio option; selecting Phase or Ticket shows a dropdown populated from the initiative's context data. Blocked phases and tickets (those where all issues carry the blocked/deps label) are shown grayed out and disabled so users can't dispatch against work that's stuck. Backend: - Add blocked: bool to PhaseSummary and IssueSummary TypedDicts - get_label_context() now tracks per-phase blocked counts and per-issue blocked flag from the blocked/deps label - PhaseSummaryItem and IssueSummaryItem Pydantic models expose blocked so the field is serialised to the frontend Frontend: - Add IssueItem interface with blocked field; extend PhaseItem - Store issues list in component state (was discarded by _loadPhases) - _loadPhases() now stores both phases and issues from context API - loneWorkerWarning suppressed for scope === 'phase' in addition to 'issue' - 3-option scope radio: Label / Phase / Ticket - Phase scope: select dropdown, blocked options disabled + (blocked) suffix - Ticket scope: select dropdown, blocked options disabled + (blocked) suffix - New .od-scope-select SCSS with dark-theme styling and blocked option muting
feat: scope cascade filter Label → Phase → Ticket in org designer
OrgNodeSpec.scope was Literal["full_initiative", "phase"] — it did not include "issue", so dispatching with scope=issue sent by the new Ticket scope picker caused Pydantic to reject the request with a 422. The frontend then displayed "[object Object]" because FastAPI's 422 detail is an array of validation error objects, not a string. - Add "issue" to OrgNodeSpec.scope literal - Add scope_issue_number: int | None = None to OrgNodeSpec - Add FastApiValidationError interface to org_designer.ts - DispatchError.detail typed as string | FastApiValidationError[] - launch() error handler formats validation arrays as "msg1; msg2" instead of stringifying the raw object
fix: OrgNodeSpec missing 'issue' scope + readable 422 error messages
The dispatch pipeline runs git commands with cwd=/app (settings.repo_dir) inside the container. The narrow bind-mount strategy excluded .git, so every git call — _resolve_dev_sha(), ensure_worktree(), list_git_worktrees() — failed with "fatal: not a git repository". Add .git as a writable bind mount so worktree dispatch works end-to-end. Also fix 6 tests in test_ensure_helpers.py that patched asyncio.create_task with return_value=asyncio.Future(). The AsyncMock coroutines passed to the mock were never closed, emitting RuntimeWarning "coroutine never awaited" at teardown. Replace with a side_effect helper that closes the incoming coroutine before returning the future. Co-authored-by: AgentCeption Bot <agent@agentception.io>
…t suite KeyError fix: test_label_context_returns_phases_and_issues was patching get_label_context with mock data missing the 'blocked' field, which the route now reads. Added blocked: False to both phases and issues in the mock and asserted on the field in the response. Coroutine warning fix: add make_create_task_side_effect() to conftest.py and use it wherever asyncio.create_task is mocked with a plain MagicMock. When AsyncMock-patched functions (run_agent_loop, auto_dispatch_reviewer, teardown_agent_worktree, auto_redispatch_after_rejection) are called and their resulting coroutine is passed to a mocked create_task, that coroutine is never closed, producing RuntimeWarning at GC time. The helper closes the coroutine immediately and returns a resolved Future. Files updated: conftest.py, test_label_context_and_dispatch.py, test_dispatch_variant.py, test_ensure_helpers.py, test_build_commands.py, test_build_commands_rebase.py. Verified: 82 passed, 0 warnings with -W error::RuntimeWarning. Co-authored-by: AgentCeption Bot <agent@agentception.io>
…#1079) Implements the three state-transition tools that were already exercised by test_mcp_build_commands_pr3.py but had no corresponding production code: - build_block_run: implementing → blocked (reversible via build_resume_run) - build_resume_run: blocked/stopped → implementing (idempotent restart-safe) - build_stop_run: any active → stopped (non-terminal, resumable) Also restores persist.py to committed state — the local dirty version had removed the stall guard, cross-repo collision fix, and JsonValue types. Fixes all 13 failures and 2 RuntimeWarning leaks in test_mcp_build_commands_pr3.py. Co-authored-by: AgentCeption Bot <agent@agentception.io>
…#1080) - test_build_commands_rebase.py: add side_effect=make_create_task_side_effect() to the bare patch("...asyncio.create_task") in test_rebase_succeeds_with_empty_worktree_path_dict; the plain MagicMock left auto_dispatch_reviewer coroutines unclosed, triggering RuntimeWarning during GC in later tests. - agent_loop.py:2297: replace datetime.datetime.utcnow() with datetime.datetime.now(datetime.UTC) to silence the DeprecationWarning that surfaced in 7 test_agent_loop.py tests. Co-authored-by: AgentCeption Bot <agent@agentception.io>
…1081) test_rebase_conflict_returns_error_and_aborts and test_no_worktree_path_skips_rebase_and_dispatches_reviewer both patched asyncio.create_task as a plain MagicMock; the auto_dispatch_reviewer AsyncMock coroutine passed to create_task was never closed, triggering a RuntimeWarning during GC in later tests (test_build_initiative_tabs). Added side_effect=make_create_task_side_effect() to both patches. Full suite: 2074 passed, 0 warnings. Co-authored-by: AgentCeption Bot <agent@agentception.io>
) The .git bind-mount is owned by the macOS host user; the container process runs as agentception (UID 1001) which has a different UID. Git 2.35.2+ treats this as dubious ownership and refuses to run, causing the "git rev-parse origin/dev failed: fatal: detected dubious ownership" error on every agent dispatch. Add /app and /worktrees to the system git config (written to /etc/gitconfig) during the privileged entrypoint phase so both root (build steps) and the unprivileged agentception user (after gosu drop) can run git against the mounted repository. Co-authored-by: AgentCeption Bot <agent@agentception.io>
…tor as Cursor-like terminal log (#1084) JS bug: D3 hierarchy<LiveOrgNode> makes d.data a LiveOrgNode, not a RunTreeNodeRow; accessing d.data.id/.role threw TypeError everywhere in the live org tree callbacks. Fixed by accessing (d.data as LiveOrgNode).data at all five call sites (link key, card key, classed×2, html). Inspector redesign — Cursor-like terminal log: - height: calc(100vh-80px) replaces max-height so __content flex children actually scroll instead of compressing - min-height: 0 through __content → __activity so overflow-y triggers - #activity-feed: dark terminal bg (#09090f), monospace, styled scrollbar - Activity rows: 3-column grid (icon | summary | ts), 22px compact lines, color-coded 2px left borders (purple=LLM, green=file, orange=tool, etc.) - Event cards restyled for dark context; step_start → subtle section divider (border-top + uppercase label) instead of a heavy ► card - Stop button and stream-status bar get matching dark bg + red-tinted stop Co-authored-by: AgentCeption Bot <agent@agentception.io>
The _AB_QUERY SQL returns retry_count, avg_output_tokens, avg_cache_read_tokens, avg_cache_write_tokens, avg_duration_secs, and grade_a through grade_f — but the test mocks only supplied a subset of columns, causing KeyError: 'retry_count' in CI. Also updates the HTMX assertion from the old <table class="ab-metrics"> to the current <div class="drh"> template structure. Co-authored-by: AgentCeption Bot <agent@agentception.io>
#1087) The typing audit flags `**_: object` as a param_object violation. Replace with explicit `name: str | None` keyword arg matching asyncio.create_task's actual signature. Co-authored-by: AgentCeption Bot <agent@agentception.io>
- Add FOUC-prevention inline script in <head> that reads localStorage or prefers-color-scheme before first paint - Add [data-theme="light"] token overrides in _foundation.scss for backgrounds, borders, text, accents, semantic colors, and shadows - Add themeToggle() Alpine.js component (theme_toggle.ts) that toggles data-theme on <html> and persists preference to localStorage - Add toggle button in the nav bar (sun/moon icons) Co-authored-by: AgentCeption Bot <agent@agentception.io>
Replace hardcoded dark-mode colors with CSS custom property tokens across _org-chart.scss, _inspector-layout.scss (org designer section), and _plan.scss (phase 1a/1b). Remove $od-* SCSS variables in favour of theme-aware tokens. Add --bg-hover / --bg-hover-strong tokens to both dark and light theme definitions. Fix stale fallback values in _plan.scss that referenced non-existent custom properties (--border, --bg-secondary). Co-authored-by: AgentCeption Bot <agent@agentception.io>
Buttons with solid accent/gradient backgrounds (launch, apply, save- confirm, mode toggle active, plan step bubbles, options badge) need white text regardless of theme. Reverts these specific cases from var(--text-primary) back to #fff — the token is correct for text on theme-aware backgrounds but wrong for text on opaque colored fills. Co-authored-by: AgentCeption Bot <agent@agentception.io>
fix: merge main into dev to resolve conflict for release PR #1093
2 tasks
The auto-merge of main into dev interleaved old hardcoded color blocks alongside the new tokenized versions, creating duplicate declarations, stale $od-* variable references, and a missing closing brace that broke sass compilation. Co-authored-by: AgentCeption Bot <agent@agentception.io>
5 tasks
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.
Summary
Release merge bringing
devintomain. Key changes since last release:Dark / Light Mode
Org Designer
issueLiveOrgNodedata access inrenderLiveD3OrgNodeSpecmissingissuescope + readable 422 errorsMCP & Infrastructure
build_block_run,build_resume_run,build_stop_runMCP toolsgit safe.directoryfor/appand/worktreesin entrypoint.gitinto container for dispatch git commandsDeveloper Run Health
Test & Type Hygiene
RuntimeWarningandDeprecationWarningsourcescreate_taskcoroutine leaks in rebase testsAsyncMockcoroutine warnings across test suiteobjectparam type in conftestTest plan