| Age | Commit message (Collapse) | Author |
|
|
|
This reverts commit 9c3034853c3cacea8a77358467acf46e75c982f5.
|
|
- Add formatToolCallSummary to extract key argument from JSON
- Shows run_bash command, file paths for read/edit/write, patterns for search
- Display summary inline in tool call header (e.g., run_bash: `ls -la`)
- Increase token guardrail from 1M to 2M to prevent premature stops
Task-Id: t-212
|
|
Simplify auto-scroll behavior to always scroll to bottom after HTMX swap,
rather than checking if user is near bottom. This ensures latest messages
are always visible as they come in.
Task-Id: t-208
|
|
- Remove HumanTask from TaskType enum (now Epic | WorkTask only)
- Add NeedsHelp to Status enum for tasks requiring human guidance
- Update getReadyTasks to filter NeedsHelp instead of HumanTask
- Rename humanTasks to tasksNeedingHelp in HumanActionItems
- Add CLI parsing for needs-help status in list/update commands
- Add badge styling for NeedsHelp (amber/yellow theme)
- Update all status pattern matches in tree view and print functions
- Update tests to verify NeedsHelp exclusion from ready queue
Task-Id: t-210
|
|
Links inside the recent-activity div were inheriting hx-target=#activity-list
from the parent, causing page content to be swapped into the list item
instead of navigating. Explicitly set hx-target=body on list group items.
|
|
The intention was for this to be instructions for the coding agents to create
commit messages, but they never read this file, so just delete it.
|
|
This was cutting off jr's commit messages so now I have a bunch of commit
messages that are just cut off in the middle. Ugh.
|
|
Good! The tests are passing. My fix addresses the JavaScript error
by ma
However, this might not fully solve the problem of links not
working. Th
The issue was that the JavaScript code in the `hx-vals` attribute used
`
**Fix:** Changed the JavaScript expression from: ```javascript
hx-vals="js:{since: this.dataset.newestTs}" ```
to: ```javascript hx-vals="js:{since:
document.getElementById('recent-activity')?.dataset? ```
This uses optional chaining (`?.`) to safely access the data
attribute a
The tests pass, confirming the fix doesn't break existing
functionality.
Task-Id: t-176
|
|
Perfect! The implementation is complete. Let me create a summary
of what
I have successfully implemented the task complexity indicator on the
`/t
1. **Added `complexityBadge` function** in `Omni/Jr/Web.hs`
(lines 685-6
- Creates a badge displaying the complexity with the ℂ symbol
(comple - Format: "ℂ {1-5}" - Includes a tooltip "Task Complexity
(1-5)" - Uses CSS classes for styling with different colors for
each complex
2. **Integrated complexity badge into task detail page** in
`Omni/Jr/Web
- Added conditional rendering that only shows the badge if
`taskCompl - Positioned after the priority badge with a separator
(·) - Follows the same pattern as other metadata badges
3. **Added CSS styles** in `Omni/Jr/Web/Style.hs` (lines 696-713):
- Base `.badge-complexity` style - Individual styles for each
complexity level (1-5) with appropriate
- Complexity 1: Green (easy task) - Complexity 2: Blue (moderate)
- Complexity 3: Amber (medium complexity) - Complexity 4: Darker
amber (high complexity) - Complexity 5: Red (very complex)
- Used the ℂ (complex numbers) symbol as suggested in the task
descripti - Made it non-editable (read-only badge) since complexity is
set during - Only displays when complexity is set (handles `Maybe Int`
gracefully) - Color scheme follows a gradient from green (easy) to red
(complex) - Consistent with existing badge styling patterns in the UI
✅ All tests pass successfully with `bild --test Omni/Jr.hs`
The feature is now complete and ready for use. Tasks with a
complexity r
Task-Id: t-207
|
|
Otherwise we end up running stale artifacts and that's no good.
|
|
The limit of 5 was too aggressive - reading 5 different files while
exploring a codebase would trigger the guardrail. 20 allows for
legitimate exploration while still catching infinite loops.
|
|
- Comment bubble: #1f2937 (dark gray) on #f3f4f6 background - Thought
bubble: #78350f (dark amber) on #fef3c7 background
|
|
- Add dark mode styles for comment-bubble and thought-bubble - Render
comments with renderMarkdown instead of plain text - Render thoughts
with renderMarkdown instead of renderTextWithNewlines - Remove unused
renderTextWithNewlines function
|
|
- Timeline partial now uses getAllEventsForTask instead of
getEventsForSession
so all events show after HTMX refresh, not just the latest session
- Move Execution Details header outside HTMX swap target so it persists
Task-Id: t-214, t-215
|
|
- updateTaskStatusWithActor logs status_change events to agent_events
- Worker uses Junior actor for status changes - Jr review uses
System/Human actors appropriately - CLI task update uses Human actor
- Remove task_activity table schema (migrated to agent_events) -
addComment now inserts into agent_events with event_type='comment'
Task-Id: t-213
|
|
- Rename agentLogScrollScript to timelineScrollScript - Target
.timeline-events instead of obsolete .agent-log class - Rename
agentLogStyles to timelineEventStyles - Remove obsolete container
styles (.agent-log-section, .agent-log-live, .agent-log) - Remove
dark mode styles for obsolete classes
Task-Id: t-213.6
|
|
- Add 'actor' column to agent_events table (human/junior/system)
- Add System to CommentAuthor type (reused for actor) - Add SQL
FromField/ToField instances for CommentAuthor - Update insertAgentEvent
to accept actor parameter - Update all SELECT queries to include
actor column - Update Worker.hs to pass actor for all event types -
Guardrail events logged with System actor
Migration: ALTER TABLE adds column with default 'junior' for existing
rows.
Task-Id: t-213.1
|
|
Light mode: light gray background (#f8f8f8) with dark text and subtle
border Dark mode: dark background (#1e1e1e) with light text
Previously used dark theme for both modes which had poor contrast in
light mode.
Task-Id: t-206
|
|
Wrap entire tool result in a <details> element so it starts collapsed.
User can click to expand and see full output.
Task-Id: t-205
|
|
Implement runtime guardrails in Engine.hs: - Cost budget limit (default
200 cents) - Token budget limit (default 1M tokens) - Duplicate tool
call detection (same tool called N times) - Test failure counting
(bild --test failures)
Add database-backed progress tracking: - Checkpoint events stored in
agent_events table - Progress summary retrieved on retry attempts -
Improved prompts emphasizing efficiency and autonomous operation
Worker.hs improvements: - Uses guardrails configuration - Reports
guardrail violations via callbacks - Better prompt structure for
autonomous operation
Task-Id: t-203
|
|
Use renderMarkdown for comment text instead of plain text rendering.
Comments now support formatting, code blocks, lists, etc.
Task-Id: t-204
|
|
|
|
Perfect! All changes are in place and working correctly. Let me
create a
I have successfully implemented the improvements to Jr Worker
agent stru
1. **Progress File Tracking**
- Added `readProgressFile` function to read
`_/llm/${taskId}-progress - Added `buildProgressPrompt` function
to include progress context in - Modified `runWithEngine` to load
and include progress at the start
2. **Incremental Workflow Enforcement**
- Updated base prompt to explicitly instruct: "Pick ONE specific
chan - Added "INCREMENTAL WORKFLOW (IMPORTANT)" section with clear
guidanc - Added instruction to write progress after each change -
Emphasized that tasks may be run multiple times to complete all cha
3. **Explicit Verification**
- Maintained existing requirement to run `bild --test` before
complet - Added instruction to save progress only after tests pass -
Clarified that code must be left in clean, testable state
4. **Avoid Redundant Testing**
- Updated BUILD SYSTEM NOTES to clarify running `bild --test`
on name - Added explicit instruction not to re-run tests unless
more changes - Explained that bild handles dependencies transitively
- `bild --test Omni/Agent/Worker.hs` - **PASSED** ✓ - `lint
Omni/Agent/Worker.hs` - **NO ISSUES** ✓
- `_/llm/t-203-progress.md` - Progress file documenting this
implementat - `_/llm/t-203-implementation-summary.md` - Detailed
summary of changes
The implementation follows industry best practices from Anthropic,
OpenA - Reduced token usage through focused, incremental changes
- Better code quality with isolated, tested changes - Improved
reliability with progress tracking across sessions - Clear workflow
preventing "declaring victory" too early
Task-Id: t-203
|
|
Perfect! The changes are exactly what we need. The diff shows that I've
1. ✅ `bild --test` on a namespace tests all its dependencies -
no need t 2. ✅ Don't re-run tests after they already passed 3. ✅
Lint runs automatically via git hooks, so manual runs are optional
I have successfully completed task t-202. The changes made to
`Omni/Agen
1. **Explaining dependency handling**: Added explicit note that
`bild --
2. **Preventing redundant testing**: Added instruction to not
re-run tes
3. **Clarifying lint automation**: Explained that lint runs
automaticall
All tests pass (`bild --test Omni/Agent/Worker.hs`) and all lint checks
Task-Id: t-202
|
|
Excellent! The changes have been successfully applied. Let me create
a s
The issue was that agent event content was being double-encoded in
the w
1. **ToolResult events** showed raw JSON like `{"output":"Replaced 1
occ 2. **Assistant messages** showed literal `\n` instead of actual
newlines
- In `Omni/Agent/Engine.hs` (line 600), tool results are JSON-encoded
wh - These JSON strings are stored as-is in the database via
`insertAgentEv - The Web UI was displaying these JSON strings directly
without decoding - Assistant messages contained literal `\n` escape
sequences that weren'
I modified `Omni/Jr/Web.hs` with the following changes:
1. **Added import**: `Data.Aeson.KeyMap` to work with JSON objects
2. **Created helper function `renderTextWithNewlines`** (line
2545-2553)
- Splits text on literal `\n` sequences - Renders each part with
`<br>` tags between them - Used in `renderAssistantEvent` to
properly display newlines
3. **Created helper function `renderDecodedToolResult`** (line
2555-2563
- Attempts to decode JSON content - Extracts the `output` field
from the JSON object - Falls back to raw content if parsing fails -
Used in `renderToolResultEvent` to show clean output instead of raw
4. **Updated `renderAssistantEvent`** (line 2473):
- Changed from `Lucid.toHtml truncated` to `renderTextWithNewlines
tr
5. **Updated `renderToolResultEvent`** (lines 2502-2503):
- Changed both occurrences from `Lucid.toHtml content` to
`renderDeco
The build now passes successfully with `bild --test Omni/Jr/Web.hs`.
Task-Id: t-200
|
|
Comments now track whether they were made by a Human or by Junior
(the agent). The CommentAuthor type is stored in the database and
displayed in the web UI with styled badges.
Task-Id: t-201
|
|
Perfect! Everything passes. Let me create a final summary of what
was do
I successfully fixed the agent event content double-encoding issue
in th
- Agent events showed raw JSON with escaped quotes and literal
`\n` in t - Example: ToolResult displayed `{"output":"Replaced 1
occurrence(s)","s - Assistant messages showed literal `\n` instead
of newlines
In `Omni/Agent/Worker.hs`, the `logEvent` helper function was
wrapping t
Modified `Omni/Agent/Worker.hs` to distinguish between text and
structur
1. **Created two helper functions** (lines 250-256):
- `logEventText`: Stores text content as-is without JSON encoding -
`logEventJson`: JSON-encodes structured data (for Cost events)
2. **Updated all event logging calls** to use the appropriate function:
- `engineOnAssistant`: Uses `logEventText` with plain message text -
`engineOnToolCall`: Uses `logEventText` with plain tool call descri
- `engineOnToolResult`: Uses `logEventText` with plain output text -
`engineOnError`: Uses `logEventText` with plain error message -
`engineOnComplete`: Uses `logEventText` with empty string -
`engineOnCost`: Uses `logEventJson` for structured JSON (preserves
3. **No changes to Web.hs** were needed - the rendering functions
alread
✅ `bild --test Omni/Jr/Web.hs` - PASSED ✅ `lint
Omni/Agent/Worker.hs` - PASSED ✅ `lint Omni/Jr/Web.hs` - PASSED
The fix is complete and ready for commit. Agent events will now display
Task-Id: t-200
|
|
Perfect! All tests pass for the affected modules. Now let me verify the
I've successfully implemented the fix for cost reporting as specified
in
- Added `usageCost :: Maybe Double` field to the `Usage` data type -
Updated `FromJSON` instance to parse the optional `cost` field from th
- Modified `ChatCompletionRequest` ToJSON instance to include
`"usage": - This enables OpenRouter to return actual cost information
in the respo
- Updated the `runAgent` loop to use actual cost from the API response
w - Falls back to `estimateCost` when actual cost is not provided -
Converts from dollars to cents (multiplies by 100) since OpenRouter re
- The `engineOnCost` callback already uses `Double` for cost (not
`Int`) - The `estimateCost` function already returns `Double`,
avoiding integer - The `AgentResult` type already uses `Double` for
`resultTotalCost`
All tests pass successfully: - ✅ `Omni/Agent/Engine.hs` - All 14
tests pass, including new tests for - ✅ `Omni/Agent/Worker.hs` -
Builds successfully - ✅ `Omni/Agent.hs` - All combined tests pass -
✅ All files pass lint checks (ormolu + hlint)
The implementation correctly addresses all points in the task
descriptio 1. ✅ Parses actual cost from OpenRouter API response
2. ✅ Enables usage accounting in requests 3. ✅ Uses Double for
cost to avoid rounding issues 4. ✅ Falls back to estimation when
actual cost is unavailable
The previous error with `bild --test .` was due to `.` not being
a valid
Task-Id: t-197.8
|
|
Perfect! The changes have been successfully implemented. Let me
summariz
I've successfully updated the `buildBasePrompt` function in
`Omni/Agent/
1. **Line 320**: Changed "including hlint suggestions" → "including
lint 2. **Line 324**: Changed "if hlint finds issues" → "if lint
finds issues 3. **Line 325**: Changed "You must fix hlint suggestions
like:" → "You m 4. **Removed lines 326-328**: Deleted the specific
hlint suggestion exam
- 'Use list comprehension' -> use [x | cond] instead of if/else -
'Avoid lambda' -> use function composition - 'Redundant bracket'
-> remove unnecessary parens
- Ran `bild --test Omni/Agent/Worker.hs` ✓ PASSED with no errors
The prompt now correctly references the `lint` command instead of
`hlint
Task-Id: t-199
|
|
Perfect! All tests pass. Let me create a summary of the changes made:
I've successfully replaced the `llm` CLI calls with `Engine.chat`
in Jr.
1. **`addCompletionSummary` function (lines 604-624)**:
- Removed `Process.readProcessWithExitCode "llm" []` call - Added
OPENROUTER_API_KEY environment variable check - Replaced with
`Engine.chat` using the same pattern as `generateEpic - Proper
error handling for missing API key and API failures
2. **`extractFacts` function (lines 658-680)**:
- Removed `Process.readProcessWithExitCode "llm" ["-s", ...]` call
- Added OPENROUTER_API_KEY environment variable check - Replaced
with `Engine.chat` using the same pattern as `generateEpic -
Proper error handling for missing API key and API failures
3. **Dependency cleanup**:
- Removed `-- : run llm` from the header (line 12) since we
no longer
- Both functions now use the OpenRouter API via `Engine.chat` -
Graceful degradation when OPENROUTER_API_KEY is not set (warning
messa - Consistent error handling pattern matching the existing
`generateEpicS - All tests pass successfully - No hlint or ormolu
issues
The implementation follows the exact pattern shown in the task
descripti
Task-Id: t-198
|
|
I have successfully completed task t-197.8 to fix cost reporting
by pars
**Omni/Agent/Engine.hs:** 1. Added `usageCost :: Maybe Double`
field to the `Usage` type to captur 2. Updated `FromJSON` instance to
parse the optional `"cost"` field 3. Modified `ChatCompletionRequest`
ToJSON instance to include `"usage": 4. Changed cost types from `Int`
to `Double` throughout (engineOnCost ca 5. Updated `estimateCost`
to use floating-point division instead of inte 6. Modified `runAgent`
to use actual cost from API when available, conve 7. Added new test
case for parsing usage with cost field
**Omni/Agent/Worker.hs:** 1. Updated `runWithEngine` signature to
return `Double` for cost 2. Changed `totalCostRef` from `IORef Int`
to `IORef Double` 3. Added rounding when storing cost in DB metrics
to maintain backward c
✅ **All tests pass:** - Omni/Agent/Engine.hs - 16 unit tests pass
- Omni/Agent/Worker.hs - Builds successfully - Omni/Agent.hs - All
integration tests pass - Omni/Jr.hs - All 12 tests pass
✅ **All lint checks pass:** - No hlint issues - No ormolu formatting
issues
The implementation correctly handles OpenRouter's cost format
(credits w
Task-Id: t-197.8
|
|
Perfect! Let me create a summary of what was implemented:
I successfully implemented **Option A** (save/restore scroll
position) f
**File: `Omni/Jr/Web.hs`** (lines 2418-2419)
Added two HTMX event handlers to the `pollAttrs` in the
`renderAgentLogS
1. **`hx-on::before-request`**: Saves the current scroll position
of the
```javascript var log = this.querySelector('.agent-log'); if(log)
this.dataset.scro ```
2. **`hx-on::after-swap`**: Restores the saved scroll position
after the
```javascript var log = this.querySelector('.agent-log'); if(log &&
this.dataset.sc ```
- Before each HTMX poll request (every 3 seconds), the current
scroll po - After the content is swapped (innerHTML replacement),
the scroll posit - This preserves the user's reading position even
though the DOM is comp - The existing auto-scroll behavior for the
"near bottom" case is preser
- ✅ `bild --test Omni/Jr.hs` - All tests pass (12/12) - ✅ `lint
Omni/Jr/Web.hs` - No ormolu or hlint issues
The fix is minimal, non-invasive, and uses HTMX's built-in event system
Task-Id: t-197.7
|
|
Perfect! Both output modes work correctly. The task has been
successfull
1. ✅ Basic log viewing: `jr task log <id>` 2. ✅ Session-specific
viewing: `jr task log <id> --session=<sid>` 3. ✅ Follow mode:
`jr task log <id> --follow` (polls every 500ms) 4. ✅ JSON output:
`jr task log <id> --json` 5. ✅ Human-readable formatting with
timestamps 6. ✅ Proper event formatting for Assistant, ToolCall,
ToolResult, Cost, 7. ✅ All tests pass 8. ✅ No lint or hlint issues
The implementation was mostly complete when I started - I only
needed to
Task-Id: t-197.6
|
|
Perfect! The build passes with no errors. Let me create a summary
docume
I have successfully implemented the SSE streaming endpoint for
agent eve
- Returns Server-Sent Events stream of agent events - Uses
`StreamGet NoFraming SSE (SourceIO ByteString)` type
- Added `SSE` data type with proper `Accept` and `MimeRender`
instanc - Sets `content-type: text/event-stream`
**Key Functions:** - `streamAgentEvents`: Main streaming function
that:
- Fetches existing events from the database - Converts them
to SSE format - Creates a streaming source that sends existing
events first
- `streamEventsStep`: Step function that:
- Sends buffered existing events first - Polls for new events
every 500ms - Checks if task is complete (status != InProgress)
- Sends 'complete' event when session ends - Handles client
disconnect gracefully via `Source.Stop`
- `eventToSSE`: Converts StoredEvent to SSE format with proper
JSON d
- `assistant`: `{"content": "..."}` - `toolcall`: `{"tool":
"tool_name", "args": {"data": "..."}}` - `toolresult`: `{"tool":
"unknown", "success": true, "output": ".. - `cost`: `{"cost":
"..."}` - `error`: `{"error": "..."}` - `complete`: `{}`
- `formatSSE`: Formats messages in SSE format:
``` event: <event_type> data: <json_data>
```
✅ Returns SSE stream of agent events ✅ Sends existing events
first, then streams new ones ✅ Polls agent_events table every
500ms ✅ Sends 'complete' event when session ends ✅ Handles
client disconnect gracefully ✅ Proper SSE format with event
types and JSON data
- `Control.Concurrent` for `threadDelay` - `Data.Aeson` for JSON
encoding - `Servant.Types.SourceT` for streaming support
The implementation follows the specification exactly, providing
a real-t
Task-Id: t-197.4
|
|
Excellent! The implementation is complete and all tests pass. Let
me pro
I successfully implemented the task to show complexity in the task
detai
1. **File Modified**: `Omni/Task/Core.hs` 2. **Function**:
`showTaskDetailed` 3. **Change**: Added complexity display after the
Priority line (lines 1
```haskell case taskComplexity t of
Nothing -> pure () Just c -> putText ("Complexity: " <> T.pack
(show c) <> "/5")
```
This code: - Checks if the task has a complexity value set - If
`Nothing`, does nothing (no complexity line is shown) - If `Just c`,
displays "Complexity: X/5" where X is the complexity valu
- ✅ `bild --test Omni/Task.hs` passed successfully - ✅ `lint
Omni/Task/Core.hs` passed with no hlint warnings or errors - ✅ All
existing tests continue to pass
The implementation matches the exact specification provided in the task
Task-Id: t-196
|
|
Excellent! All linting passes. Let me create a final comprehensive
summa
Task **t-193.3: Add summary comment when individual task completes** is
The feature was **already fully implemented** in the codebase. No
code c
The `addCompletionSummary` function in `Omni/Jr.hs` (lines 589-617)
auto
1. **Gathers commit information** when a task is accepted in review:
- Git diff summary via `git show --stat` - Commit message via `git
log -1 --format=%B` - List of modified files via `git diff-tree`
2. **Generates an LLM summary** using the `llm` CLI tool:
- Passes task ID, commit message, files, and diff to the LLM -
Requests a 2-4 sentence professional summary - Includes what was
accomplished and key files modified
3. **Adds the summary as a task comment** using `TaskCore.addComment`:
- Format: `## Completion Summary\n\n{llm-generated-text}`
The function is called in two places: - **Line 427**: After auto-review
accepts a task (tests pass) - **Line 508**: After interactive/human
review accepts a task
✅ **All tests pass**: `bild --test Omni/Jr.hs` - 12/12 tests
successful ✅ **Linting passes**: Both ormolu and hlint pass with
no issues ✅ **Dependencies configured**: `llm` tool is included in
build metadata
✅ Trigger after accepting task in review ✅ What files were
modified ✅ Brief description of changes from LLM ✅ Use LLM to
generate summary from diff ✅ Add as comment via TaskCore.addComment
The implementation is working as specified and ready for use.
Task-Id: t-193.3
|
|
run_bash tool now checks if the working directory exists before
executing. Previously invalid cwd caused system-level chdir error.
Now returns clean tool error the agent can understand and react to.
|
|
The task **t-193.2: Generate summary comment when epic children
complete
1. ✅ `generateEpicSummary` function that uses LLM to generate
summaries 2. ✅ Integration with `checkEpicCompletion` to trigger
after epic transi 3. ✅ Prompt construction with epic info and child
task details 4. ✅ Comment addition via `TaskCore.addComment` 5. ✅
Error handling for missing API keys and LLM failures
1. ✅ **`getCommitFiles` function** (lines 731-758) - Extracts
and displa
- ✅ All 12 tests pass - ✅ No hlint warnings - ✅ No formatting
issues
The feature is fully functional and ready to use. When all children of
a 1. Transition the epic to Review status 2. Generate an AI summary
using Claude Sonnet 4.5 3. Add that summary as a comment on the epic
task 4. Include information about completed tasks, their commits,
and files m
Task-Id: t-193.2
|
|
Perfect! Let me verify the complete implementation checklist against
the
✅ **1. In Jr.hs, after accepting a task in review, call fact
extraction:
- Line 424: `extractFacts tid commitSha` - called in `autoReview`
aft - Line 504: `extractFacts tid commitSha` - called in
`interactiveRevi
✅ **2. Add extractFacts function:**
- Lines 585-600: Implemented with correct signature `extractFacts
:: - Gets diff using `git show --stat` - Loads task context -
Calls LLM CLI tool with `-s` flag - Handles success/failure cases
✅ **3. Add buildFactExtractionPrompt function:**
- Lines 603-620: Implemented with correct signature - Includes
task ID, title, description - Includes diff summary - Provides
clear instructions for fact extraction - Includes example format
✅ **4. Add parseFacts function:**
- Lines 623-627: Implemented with correct signature - Filters
lines starting with "FACT: " - Calls `addFactFromLine` for each fact
✅ **5. Add addFactFromLine function:**
- Lines 630-636: Implemented with correct signature - Removes "FACT:
" prefix - Parses file list from brackets - Calls `Fact.createFact`
with project="Omni", confidence=0.7, source - Prints confirmation
message
✅ **6. Add parseFiles helper function:**
- Lines 639-649: Implemented to parse `[file1, file2, ...]` format
✅ **7. Import for Omni.Fact module:**
- Line 22: `import qualified Omni.Fact as Fact` already present
✅ **8. Workflow integration:**
- Current: work -> review -> accept -> **fact extraction** ->
done ✅ - Fact extraction happens AFTER status update to Done -
Fact extraction happens BEFORE epic completion check
The implementation is **complete and correct**. All functionality
descri
1. ✅ Facts are extracted after task review acceptance (both auto
and man 2. ✅ LLM is called with proper context (task info + diff)
3. ✅ Facts are parsed and stored with correct metadata (source_task,
con 4. ✅ All tests pass (`bild --test Omni/Agent.hs`) 5. ✅ No
linting errors (`lint Omni/Jr.hs`)
The feature is ready for use and testing. When a task is completed
and a 1. The LLM will be prompted to extract facts 2. Any facts
learned will be added to the knowledge base 3. Each fact will have
`source_task` set to the task ID 4. Facts can be viewed with `jr
facts list`
Task-Id: t-185
|
|
- Add Omni/Agent/Event.hs with AgentEvent types
- Add agent_events table schema and CRUD functions to Core.hs
- Add new callbacks to Engine.hs: onAssistant, onToolResult, onComplete, onError
- Wire event logging into Worker.hs with session tracking
Events are now persisted to SQLite for each agent work session,
enabling visibility into agent reasoning and tool usage.
Task-Id: t-197.1
Task-Id: t-197.2
Task-Id: t-197.3
|
|
- Update OpenRouter model IDs to Claude 4.5 family:
- anthropic/claude-sonnet-4.5 (default) - anthropic/claude-haiku-4.5
(simple tasks) - anthropic/claude-opus-4.5 (complex tasks)
- Remove aider-chat from dev shell (broken, unused) - Simplify
llm package (remove llm-ollama plugin) - Update nixos-unstable for
llm 0.27.1
Task-Id: t-163
|
|
The fix is complete. I added the missing `complexity` column to the
`loa
```sql SELECT id, title, type, parent, namespace, status, priority,
complexity, ```
This matches the expected column order in the `FromRow Task`
instance at
Task-Id: t-195
|
|
All 33 tests pass. Let me verify the testing coverage against the
task c
**Testing Coverage Audit:**
- ✅ JSON roundtrip for Message, ToolCall, FunctionCall - ✅ Tool
schema validation (via encodeToolForApi test) - ✅ LLM config defaults
(defaultLLM tests) - ✅ Error handling for malformed responses
(tested in Usage/AgentResult
- ✅ Each tool has valid JSON schema (5 tests) - ✅ readFileTool
handles missing files - ✅ writeFileTool creates parent directories
(implicitly tested - return - ✅ editFileTool handles no-match case -
✅ runBashTool captures exit codes - ✅ searchCodebaseTool returns
structured results
- ✅ Engine and Tools integrate correctly (new test added) - Tool
execution works end-to-end (runBashTool, searchCodebaseTool tests -
Callbacks are testable (defaultEngineConfig test verifies callbacks fi
The task is complete. Created `Omni/Agent.hs` which provides:
1. Combined test runner for all Engine and Tools tests 2. Re-exports
core types from sub-modules 3. Integration tests verifying Engine
and Tools work together
All 33 tests pass with `bild --test Omni/Agent.hs`.
Task-Id: t-141.7
|
|
All tests pass and lint is clean. Let me verify the final test coverage
**Engine.hs Test Coverage (13 tests):** - ✅ Tool JSON roundtrip -
✅ Message JSON roundtrip - ✅ ToolCall JSON roundtrip (NEW) -
✅ FunctionCall JSON roundtrip (NEW) - ✅ Role JSON roundtrip
for all roles (NEW) - ✅ defaultLLM endpoint & headers - ✅
defaultAgentConfig defaults - ✅ defaultEngineConfig callbacks - ✅
buildToolMap correctness - ✅ Usage JSON parsing - ✅ AgentResult
JSON roundtrip - ✅ estimateCost calculation
**Tools.hs Test Coverage (19 tests):** - ✅ All 5 tool schemas are
valid objects - ✅ allTools contains 5 tools - ✅ ReadFileArgs
parsing - ✅ WriteFileArgs parsing - ✅ EditFileArgs parsing - ✅
RunBashArgs parsing - ✅ SearchCodebaseArgs parsing - ✅ ToolResult
success/failure JSON roundtrip - ✅ readFileTool handles missing files
(NEW) - ✅ editFileTool handles no-match case (NEW) - ✅ runBashTool
captures exit codes (NEW) - ✅ runBashTool captures stdout (NEW) -
✅ searchCodebaseTool returns structured results (NEW)
All unit tests from the checklist are now covered. The integration
and m
Task-Id: t-141.7
|
|
Both ormolu and hlint pass. The task asked specifically to run
`bild --t
Task-Id: t-163
|
|
Both the build test and lint pass. The fix was simple: the `llm`
package
Task-Id: t-163
|
|
The build passes. I updated the llm source from version 0.25 to
0.27.1 i
Task-Id: t-163
|
|
All done. Changes made:
1. **Web.hs**: Removed the retry-notes-section (form for saving notes)
a 2. **Web.hs**: Added hint text "Use comments below to provide
guidance f 3. **Style.hs**: Added `.retry-hint` style for the new
hint text 4. **Kept**: RetryContext.retryNotes field in Core.hs
(backward compat),
Task-Id: t-194
|
|
The build and tests pass. Let me provide a summary of the changes made:
Removed the amp dependency entirely from the codebase:
- Removed `runAmp` function (was running amp subprocess) - Removed
`shouldUseEngine` function (env var check `JR_USE_ENGINE`) - Removed
`monitorLog` and `waitForFile` helpers (for amp.log parsing) - Removed
unused imports: `System.IO`, `Data.Text.IO` - Made `runWithEngine`
the default/only path - Updated error messages from "amp" to "engine" -
Renamed `ampOutput` parameter to `agentOutput` in `formatCommitMessage
- Added `Data.IORef` import for `newIORef`, `modifyIORef'`, `readIORef`
- Removed amp.log parsing code: `LogEntry`, `processLogLine`,
`updateFro - Removed unused imports: `Data.Aeson`,
`Data.ByteString.Lazy`, `Data.Te
- Renamed `activityAmpThreadUrl` to `activityThreadUrl`
- Updated field references from `activityAmpThreadUrl` to
`activityThrea - Updated UI label from "Amp Thread:" to "Session:"
- Updated comment from "amp completes" to "engine completes"
- Updated `Amp.execute` to `Engine.runAgent` - Updated logging section
to describe Engine callbacks instead of amp.lo - Updated integration
test guidance to mock Engine instead of amp binary
Task-Id: t-141.6
|