@neonwatty/limner 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -29
- package/dist/commands/compare-image-reference.d.ts +1 -0
- package/dist/commands/compare-image-reference.js +4 -0
- package/dist/commands/compare-image-reference.js.map +1 -1
- package/dist/commands/compare-output.js +2 -1
- package/dist/commands/compare-output.js.map +1 -1
- package/dist/commands/compare.d.ts +1 -0
- package/dist/commands/compare.js +4 -12
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/ledger.d.ts +3 -1
- package/dist/commands/loop-actions.d.ts +22 -0
- package/dist/commands/loop-actions.js +54 -0
- package/dist/commands/loop-actions.js.map +1 -0
- package/dist/commands/loop-cli.js +121 -2
- package/dist/commands/loop-cli.js.map +1 -1
- package/dist/commands/loop-comparison-adapters.d.ts +1 -0
- package/dist/commands/loop-comparison-adapters.js +7 -2
- package/dist/commands/loop-comparison-adapters.js.map +1 -1
- package/dist/commands/loop-response.d.ts +31 -0
- package/dist/commands/loop-response.js +84 -0
- package/dist/commands/loop-response.js.map +1 -0
- package/dist/commands/loop-task.d.ts +17 -0
- package/dist/commands/loop-task.js +98 -0
- package/dist/commands/loop-task.js.map +1 -0
- package/dist/commands/loop.d.ts +4 -1
- package/dist/commands/loop.js +26 -21
- package/dist/commands/loop.js.map +1 -1
- package/dist/core/agent-comparison-pack.d.ts +17 -0
- package/dist/core/agent-comparison-pack.js +25 -102
- package/dist/core/agent-comparison-pack.js.map +1 -1
- package/dist/core/agent-comparison-prompts.d.ts +1 -1
- package/dist/core/agent-comparison-prompts.js +4 -4
- package/dist/core/agent-comparison-prompts.js.map +1 -1
- package/dist/core/agent-comparison-report.js +2 -2
- package/dist/core/agent-comparison-report.js.map +1 -1
- package/dist/core/agent-comparison-response.d.ts +1 -0
- package/dist/core/agent-comparison-response.js +2 -0
- package/dist/core/agent-comparison-response.js.map +1 -0
- package/dist/core/agent-comparison-submit.d.ts +35 -0
- package/dist/core/agent-comparison-submit.js +113 -0
- package/dist/core/agent-comparison-submit.js.map +1 -0
- package/dist/core/agent-task-brief.d.ts +30 -0
- package/dist/core/agent-task-brief.js +158 -0
- package/dist/core/agent-task-brief.js.map +1 -0
- package/dist/core/comparison-artifacts.js +16 -7
- package/dist/core/comparison-artifacts.js.map +1 -1
- package/dist/core/current-artifacts.d.ts +14 -0
- package/dist/core/current-artifacts.js +16 -0
- package/dist/core/current-artifacts.js.map +1 -0
- package/dist/core/ledger-agent-responses.d.ts +22 -0
- package/dist/core/ledger-agent-responses.js +13 -0
- package/dist/core/ledger-agent-responses.js.map +1 -0
- package/dist/core/ledger-db.js +20 -0
- package/dist/core/ledger-db.js.map +1 -1
- package/dist/core/ledger-events.js +21 -1
- package/dist/core/ledger-events.js.map +1 -1
- package/dist/core/ledger-markdown.d.ts +21 -6
- package/dist/core/ledger-markdown.js +89 -6
- package/dist/core/ledger-markdown.js.map +1 -1
- package/dist/core/ledger-queries.d.ts +4 -1
- package/dist/core/ledger-queries.js +12 -3
- package/dist/core/ledger-queries.js.map +1 -1
- package/dist/core/ledger-store.d.ts +8 -1
- package/dist/core/ledger-store.js +4 -0
- package/dist/core/ledger-store.js.map +1 -1
- package/dist/core/loop-rerun-command.d.ts +4 -0
- package/dist/core/loop-rerun-command.js +36 -0
- package/dist/core/loop-rerun-command.js.map +1 -0
- package/dist/core/report-writer.js +1 -1
- package/dist/schemas/ledger.d.ts +23 -0
- package/dist/schemas/ledger.js +4 -0
- package/dist/schemas/ledger.js.map +1 -1
- package/docs/agent-workflow.md +39 -11
- package/docs/archive/visual-spec-workflow.md +23 -0
- package/docs/goals/db-native-agent-responses/goal.md +91 -0
- package/docs/goals/db-native-agent-responses/state.yaml +240 -0
- package/docs/superpowers/plans/2026-06-13-agent-response-sqlite.md +70 -0
- package/docs/superpowers/plans/2026-06-13-loop-action-ledger.md +257 -0
- package/package.json +1 -1
- package/skills/limner/SKILL.md +22 -21
- package/templates/target/AGENT_GUIDE.md +4 -4
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# DB-Native Agent Responses
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
|
|
5
|
+
Make Limner treat SQLite as the canonical store and submission path for agent comparison responses, so agents no longer rely on a magic `agent-response.json` file as package state.
|
|
6
|
+
|
|
7
|
+
## Original Request
|
|
8
|
+
|
|
9
|
+
Plan this out using GoalBuddy prep and do the work so Limner stores agent comparison responses in SQLite instead of using `agent-response.json`.
|
|
10
|
+
|
|
11
|
+
## Intake Summary
|
|
12
|
+
|
|
13
|
+
- Input shape: `existing_plan`
|
|
14
|
+
- Audience: Limner users and agents dogfooding visual comparison loops across multiple projects
|
|
15
|
+
- Authority: `approved`
|
|
16
|
+
- Proof type: `test`
|
|
17
|
+
- Completion proof: `npm run check` passes, docs/skills describe the DB-native workflow, and a fresh Seatify loop can submit/read an agent response through SQLite without depending on target-scoped `agent-response.json`.
|
|
18
|
+
- Goal oracle: A local Limner workflow where `loop compare` produces a response submission path, `loop response submit` stores the full JSON in SQLite, ledger/export surfaces that row, and no docs/skills instruct agents to write canonical `agent-response.json`.
|
|
19
|
+
- Likely misfire: Only copying response JSON into SQLite after reading the old file, while leaving the file as the real source of truth.
|
|
20
|
+
- Blind spots considered: migration from existing local ledgers, direct compare command compatibility, stale response detection without file mtimes, generated artifact naming, agent discoverability, and preserving model-agnostic CLI behavior.
|
|
21
|
+
- Existing plan facts: Keep responses local only; SQLite should store the full raw JSON; `agent_responses` belongs beside ledger events rather than inside the ledger event log; agent-readable skills/docs must explain the CLI commands; previous `agent-response.json` freshness semantics showed cached reuse and should become explicit DB submission state instead.
|
|
22
|
+
|
|
23
|
+
## Goal Oracle
|
|
24
|
+
|
|
25
|
+
The oracle for this goal is:
|
|
26
|
+
|
|
27
|
+
`npm run check` passes and a fresh loop can validate a DB-submitted agent comparison response without treating captures/**/agent-response.json as canonical state.`
|
|
28
|
+
|
|
29
|
+
The PM must keep comparing task receipts to this oracle. Planning, discovery, a passing tiny slice, or a clean-looking board is not enough. The goal finishes only when a final Judge/PM audit maps receipts and verification back to this oracle and records `full_outcome_complete: true`.
|
|
30
|
+
|
|
31
|
+
## Goal Kind
|
|
32
|
+
|
|
33
|
+
`existing_plan`
|
|
34
|
+
|
|
35
|
+
## Current Tranche
|
|
36
|
+
|
|
37
|
+
Complete the DB-native response submission and storage tranche: validate the current code path, implement the CLI/storage/prompt/doc changes, verify with tests and `npm run check`, then prepare the branch for PR/release follow-up if green.
|
|
38
|
+
|
|
39
|
+
## Non-Negotiable Constraints
|
|
40
|
+
|
|
41
|
+
- Keep Limner model-agnostic: accept JSON via CLI file or stdin rather than integrating a provider.
|
|
42
|
+
- Keep logs and ledgers local; do not add remote telemetry.
|
|
43
|
+
- Do not commit generated `.limner/`, `dist/`, `node_modules/`, or smoke artifacts.
|
|
44
|
+
- Preserve supported comparison modes: `image-mockup`, `mockup-implementation`, and `image-implementation`.
|
|
45
|
+
- Store the full agent response JSON in SQLite.
|
|
46
|
+
- Do not leave `agent-response.json` as the canonical handoff/state file in docs, skills, or loop behavior.
|
|
47
|
+
- Run `npm run check` before claiming implementation completion or opening a PR.
|
|
48
|
+
|
|
49
|
+
## Stop Rule
|
|
50
|
+
|
|
51
|
+
Stop only when a final audit proves the full original outcome is complete.
|
|
52
|
+
|
|
53
|
+
Do not stop after planning, discovery, or Judge selection if a safe Worker task can be activated.
|
|
54
|
+
|
|
55
|
+
Do not stop after a single verified Worker package when the broader owner outcome still has safe local follow-up work. Advance the board to the next highest-leverage safe Worker package and continue unless a phase, risk, rejected-verification, ambiguity, or final-completion review is due.
|
|
56
|
+
|
|
57
|
+
## Slice Sizing
|
|
58
|
+
|
|
59
|
+
Safe means bounded, explicit, verified, and reversible. It does not mean tiny.
|
|
60
|
+
|
|
61
|
+
A good task is the largest safe useful slice.
|
|
62
|
+
|
|
63
|
+
The Worker should complete the full coherent DB-native response submission slice, including tests and documentation, unless code inspection finds that the slice must be split.
|
|
64
|
+
|
|
65
|
+
## Canonical Board
|
|
66
|
+
|
|
67
|
+
Machine truth lives at:
|
|
68
|
+
|
|
69
|
+
`docs/goals/db-native-agent-responses/state.yaml`
|
|
70
|
+
|
|
71
|
+
If this charter and `state.yaml` disagree, `state.yaml` wins for task status, active task, receipts, verification freshness, and completion truth.
|
|
72
|
+
|
|
73
|
+
## Run Command
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
/goal Follow docs/goals/db-native-agent-responses/goal.md.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## PM Loop
|
|
80
|
+
|
|
81
|
+
On every `/goal` continuation:
|
|
82
|
+
|
|
83
|
+
1. Read this charter.
|
|
84
|
+
2. Read `state.yaml`.
|
|
85
|
+
3. Run the bundled GoalBuddy update checker when available and mention a newer version without blocking.
|
|
86
|
+
4. Re-check the likely misfire: do not preserve `agent-response.json` as the canonical response channel.
|
|
87
|
+
5. Work only on the active board task.
|
|
88
|
+
6. Assign Scout, Judge, Worker, or PM according to the task.
|
|
89
|
+
7. Write a compact task receipt.
|
|
90
|
+
8. Update the board.
|
|
91
|
+
9. Continue to the next safe local work package unless final audit proves the goal complete.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
goal:
|
|
4
|
+
title: "DB-Native Agent Responses"
|
|
5
|
+
slug: "db-native-agent-responses"
|
|
6
|
+
kind: existing_plan
|
|
7
|
+
tranche: "Implement SQLite-native agent response submission/storage and remove agent-response.json as canonical loop state."
|
|
8
|
+
status: done
|
|
9
|
+
oracle:
|
|
10
|
+
signal: "A fresh Limner loop can submit and validate an agent comparison response through SQLite, docs/skills describe that workflow, and npm run check passes."
|
|
11
|
+
cadence: "after Worker implementation and at final audit"
|
|
12
|
+
final_proof: "Receipt-backed npm run check result plus evidence that docs/skills and CLI behavior no longer make agent-response.json the canonical response state."
|
|
13
|
+
intake:
|
|
14
|
+
original_request: "Plan this out using GoalBuddy prep and make Limner stop using agent-response.json as canonical state."
|
|
15
|
+
interpreted_outcome: "Limner should make SQLite the source of truth and CLI submission channel for agent comparison responses."
|
|
16
|
+
input_shape: existing_plan
|
|
17
|
+
audience: "Limner users and agents running visual polish loops across multiple projects"
|
|
18
|
+
authority: approved
|
|
19
|
+
proof_type: test
|
|
20
|
+
completion_proof: "npm run check passes and a fresh loop validates a DB-submitted agent response without relying on target-scoped agent-response.json."
|
|
21
|
+
likely_misfire: "SQLite stores a copy of the file, but the file remains the true handoff/state mechanism."
|
|
22
|
+
blind_spots_considered:
|
|
23
|
+
- "Existing ledger migration from 0.1.7 rows that used response_path."
|
|
24
|
+
- "Direct compare commands may still need prompt/schema artifacts without a loop trajectory."
|
|
25
|
+
- "Freshness must become DB submission state rather than file existence timing."
|
|
26
|
+
- "Agents need docs/skills that reveal the submission CLI without reading code."
|
|
27
|
+
- "Seatify smoke artifacts should not be committed."
|
|
28
|
+
existing_plan_facts:
|
|
29
|
+
- "SQLite already has an agent_responses table with response_json."
|
|
30
|
+
- "Current 0.1.7 still reads captures/**/agent-response.json before storing rows."
|
|
31
|
+
- "The new workflow should accept response JSON through CLI file or stdin."
|
|
32
|
+
- "The full raw JSON must remain stored locally in SQLite."
|
|
33
|
+
- "Loop ledger exports should keep surfacing response evidence and action history."
|
|
34
|
+
|
|
35
|
+
rules:
|
|
36
|
+
pm_owns_state: true
|
|
37
|
+
one_active_task: true
|
|
38
|
+
max_write_workers: 1
|
|
39
|
+
no_implementation_without_worker_or_pm_task: true
|
|
40
|
+
no_completion_without_judge_or_pm_audit: true
|
|
41
|
+
planning_is_not_completion: true
|
|
42
|
+
queued_required_worker_blocks_completion: true
|
|
43
|
+
continuous_until_full_outcome: true
|
|
44
|
+
missing_input_or_credentials_do_not_stop_goal: true
|
|
45
|
+
preserve_and_validate_existing_plan: true
|
|
46
|
+
intake_misfire_must_be_audited: true
|
|
47
|
+
goal_pressure_requires_oracle: true
|
|
48
|
+
no_completion_on_weak_proof: true
|
|
49
|
+
slice_policy:
|
|
50
|
+
max_consecutive_tiny_tasks: 2
|
|
51
|
+
prefer_vertical_slices: true
|
|
52
|
+
judge_picks_largest_safe_slice: true
|
|
53
|
+
worker_completes_whole_slice: true
|
|
54
|
+
|
|
55
|
+
agents:
|
|
56
|
+
scout: installed
|
|
57
|
+
worker: installed
|
|
58
|
+
judge: installed
|
|
59
|
+
|
|
60
|
+
visual_board:
|
|
61
|
+
selected: local
|
|
62
|
+
local:
|
|
63
|
+
status: starting
|
|
64
|
+
url: "http://goalbuddy.localhost:41737/db-native-agent-responses/"
|
|
65
|
+
command: "npx goalbuddy board docs/goals/db-native-agent-responses"
|
|
66
|
+
|
|
67
|
+
active_task: null
|
|
68
|
+
|
|
69
|
+
tasks:
|
|
70
|
+
- id: T001
|
|
71
|
+
type: judge
|
|
72
|
+
assignee: Judge
|
|
73
|
+
status: done
|
|
74
|
+
reasoning_hint: high
|
|
75
|
+
objective: "Validate the DB-native response plan against the current Limner code and choose the largest safe Worker implementation slice."
|
|
76
|
+
inputs:
|
|
77
|
+
- "docs/goals/db-native-agent-responses/goal.md"
|
|
78
|
+
- "Current Limner source, tests, README, docs, and skills"
|
|
79
|
+
- "Existing plan facts in goal.intake.existing_plan_facts"
|
|
80
|
+
constraints:
|
|
81
|
+
- "Read-only."
|
|
82
|
+
- "Do not implement."
|
|
83
|
+
- "Preserve the user's correction that agent-response.json must not remain canonical."
|
|
84
|
+
expected_output:
|
|
85
|
+
- "Decision"
|
|
86
|
+
- "Exact Worker objective"
|
|
87
|
+
- "allowed_files"
|
|
88
|
+
- "verify"
|
|
89
|
+
- "stop_if"
|
|
90
|
+
- "Any split tasks if the first slice is too large or risky"
|
|
91
|
+
receipt:
|
|
92
|
+
result: done
|
|
93
|
+
decision: approved
|
|
94
|
+
full_outcome_complete: false
|
|
95
|
+
summary: "Current code stores response_json in SQLite but still reads captures/**/agent-response.json as canonical input. Approve one vertical Worker slice: DB pending context on loop compare, loop response submit for file/stdin, validation from stored context, summary artifacts, ledger export, docs/skills updates."
|
|
96
|
+
evidence:
|
|
97
|
+
- "src/core/agent-comparison-pack.ts reads responsePath and readAgentResponse()."
|
|
98
|
+
- "src/commands/loop.ts records responseJson after compare, not as the submission channel."
|
|
99
|
+
- "src/core/agent-comparison-prompts.ts tells agents to write JSON to responsePath."
|
|
100
|
+
- "README.md and docs/agent-workflow.md instruct agent-response.json handoff."
|
|
101
|
+
worker:
|
|
102
|
+
objective: "Implement SQLite-native agent response submission and remove agent-response.json as canonical loop state."
|
|
103
|
+
allowed_files:
|
|
104
|
+
- "src/core/agent-comparison*.ts"
|
|
105
|
+
- "src/core/comparison-artifacts.ts"
|
|
106
|
+
- "src/core/current-artifacts*.ts"
|
|
107
|
+
- "src/core/ledger*.ts"
|
|
108
|
+
- "src/core/report-writer.ts"
|
|
109
|
+
- "src/commands/compare*.ts"
|
|
110
|
+
- "src/commands/loop*.ts"
|
|
111
|
+
- "src/commands/ledger*.ts"
|
|
112
|
+
- "src/schemas/*.ts"
|
|
113
|
+
- "src/index.ts"
|
|
114
|
+
- "README.md"
|
|
115
|
+
- "docs/agent-workflow.md"
|
|
116
|
+
- "skills/limner/SKILL.md"
|
|
117
|
+
- "templates/target/AGENT_GUIDE.md"
|
|
118
|
+
verify:
|
|
119
|
+
- "npm test -- agent-comparison-pack loop-agent-responses loop-task ledger"
|
|
120
|
+
- "npm run check"
|
|
121
|
+
stop_if:
|
|
122
|
+
- "The migration requires destructive changes to existing ledgers."
|
|
123
|
+
- "Direct compare commands cannot remain useful without an explicit user decision."
|
|
124
|
+
- "The implementation would require remote telemetry or model-provider coupling."
|
|
125
|
+
- id: T002
|
|
126
|
+
type: worker
|
|
127
|
+
assignee: Worker
|
|
128
|
+
status: done
|
|
129
|
+
reasoning_hint: high
|
|
130
|
+
objective: "Implement the DB-native agent response submission/storage workflow selected by T001."
|
|
131
|
+
allowed_files:
|
|
132
|
+
- "src/core/agent-comparison*.ts"
|
|
133
|
+
- "src/core/comparison-artifacts.ts"
|
|
134
|
+
- "src/core/current-artifacts*.ts"
|
|
135
|
+
- "src/core/ledger*.ts"
|
|
136
|
+
- "src/core/report-writer.ts"
|
|
137
|
+
- "src/commands/compare*.ts"
|
|
138
|
+
- "src/commands/loop*.ts"
|
|
139
|
+
- "src/commands/ledger*.ts"
|
|
140
|
+
- "src/schemas/*.ts"
|
|
141
|
+
- "src/index.ts"
|
|
142
|
+
- "README.md"
|
|
143
|
+
- "docs/agent-workflow.md"
|
|
144
|
+
- "skills/limner/SKILL.md"
|
|
145
|
+
- "templates/target/AGENT_GUIDE.md"
|
|
146
|
+
verify:
|
|
147
|
+
- "npm test -- agent-comparison-pack loop-agent-responses loop-task ledger"
|
|
148
|
+
- "npm run check"
|
|
149
|
+
stop_if:
|
|
150
|
+
- "Need files outside allowed_files."
|
|
151
|
+
- "Current code shape contradicts the selected implementation approach."
|
|
152
|
+
- "A migration risk appears that requires an explicit Judge decision."
|
|
153
|
+
- "Verification fails twice with different root causes."
|
|
154
|
+
receipt:
|
|
155
|
+
result: done
|
|
156
|
+
changed_files:
|
|
157
|
+
- "src/core/agent-comparison*.ts"
|
|
158
|
+
- "src/core/ledger*.ts"
|
|
159
|
+
- "src/commands/loop*.ts"
|
|
160
|
+
- "src/commands/compare*.ts"
|
|
161
|
+
- "README.md"
|
|
162
|
+
- "docs/agent-workflow.md"
|
|
163
|
+
- "skills/limner/SKILL.md"
|
|
164
|
+
- "templates/target/AGENT_GUIDE.md"
|
|
165
|
+
commands:
|
|
166
|
+
- cmd: "npm test -- loop-agent-responses"
|
|
167
|
+
status: pass
|
|
168
|
+
- cmd: "npm test -- agent-comparison-pack comparison-artifacts loop-agent-responses loop-task ledger current-artifacts ledger-store"
|
|
169
|
+
status: pass
|
|
170
|
+
- cmd: "npm run typecheck"
|
|
171
|
+
status: pass
|
|
172
|
+
- cmd: "npm test"
|
|
173
|
+
status: pass
|
|
174
|
+
- cmd: "npm run check"
|
|
175
|
+
status: pass
|
|
176
|
+
summary: "Loop comparison prompts now submit responses through SQLite via loop response submit; stored comparison context validates submissions and writes summary artifacts without canonical agent-response.json."
|
|
177
|
+
- id: T003
|
|
178
|
+
type: worker
|
|
179
|
+
assignee: Worker
|
|
180
|
+
status: done
|
|
181
|
+
reasoning_hint: medium
|
|
182
|
+
objective: "Run a fresh local smoke workflow, preferably Seatify if available, and record evidence without committing generated artifacts."
|
|
183
|
+
allowed_files:
|
|
184
|
+
- "No repo file writes; smoke may write only external workspace/ledger artifacts."
|
|
185
|
+
- "/Users/neonwatty/Desktop/seatify-ux-limner-artifacts/2026-06-04/limner-workspaces/A-public-homepage/targets/homepage-desktop/captures/image-reference"
|
|
186
|
+
verify:
|
|
187
|
+
- "Run a fresh loop compare and loop response submit using the source CLI."
|
|
188
|
+
- "Confirm ledger export includes a fresh validated agent response row."
|
|
189
|
+
stop_if:
|
|
190
|
+
- "Seatify workspace is unavailable."
|
|
191
|
+
- "Smoke workflow needs credentials or external publishing."
|
|
192
|
+
- "Generated artifacts would need to be committed."
|
|
193
|
+
receipt:
|
|
194
|
+
result: done
|
|
195
|
+
changed_files:
|
|
196
|
+
- "/Users/neonwatty/Desktop/seatify-ux-limner-artifacts/2026-06-04/limner-workspaces/A-public-homepage/targets/homepage-desktop/captures/image-reference"
|
|
197
|
+
commands:
|
|
198
|
+
- cmd: "LIMNER_LEDGER_HOME=/tmp/limner-db-native-smoke.kZldTK npm run dev -- --workspace /Users/neonwatty/Desktop/seatify-ux-limner-artifacts/2026-06-04/limner-workspaces/A-public-homepage loop start --mode image-mockup --target homepage-desktop --name db-native-seatify-smoke --max-iterations 2"
|
|
199
|
+
status: pass
|
|
200
|
+
- cmd: "LIMNER_LEDGER_HOME=/tmp/limner-db-native-smoke.kZldTK npm run dev -- --workspace /Users/neonwatty/Desktop/seatify-ux-limner-artifacts/2026-06-04/limner-workspaces/A-public-homepage loop compare --trajectory traj_2da3a56dc1909a61"
|
|
201
|
+
status: pass
|
|
202
|
+
- cmd: "test ! -e targets/homepage-desktop/captures/image-reference/agent-comparison/agent-response.json"
|
|
203
|
+
status: pass
|
|
204
|
+
- cmd: "LIMNER_LEDGER_HOME=/tmp/limner-db-native-smoke.kZldTK npm run dev -- --workspace /Users/neonwatty/Desktop/seatify-ux-limner-artifacts/2026-06-04/limner-workspaces/A-public-homepage loop response submit --trajectory traj_2da3a56dc1909a61 --from-run 2026-06-14T125413357Z-db02fl --file targets/homepage-desktop/captures/image-reference/agent-comparison/agent-response.example.json"
|
|
205
|
+
status: pass
|
|
206
|
+
- cmd: "LIMNER_LEDGER_HOME=/tmp/limner-db-native-smoke.kZldTK npm run dev -- --workspace /Users/neonwatty/Desktop/seatify-ux-limner-artifacts/2026-06-04/limner-workspaces/A-public-homepage loop task --trajectory traj_2da3a56dc1909a61 --executor subagent"
|
|
207
|
+
status: pass
|
|
208
|
+
summary: "Fresh Seatify homepage loop validated DB-native response submission: pending missing row, fresh validated row, comparison summary, task brief, and skipped no-op action were all recorded."
|
|
209
|
+
- id: T999
|
|
210
|
+
type: judge
|
|
211
|
+
assignee: Judge
|
|
212
|
+
status: done
|
|
213
|
+
reasoning_hint: high
|
|
214
|
+
objective: "Audit whether DB-native agent responses satisfy the original user outcome for this tranche."
|
|
215
|
+
inputs:
|
|
216
|
+
- "All done task receipts"
|
|
217
|
+
- "Last verification"
|
|
218
|
+
- "Current dirty diff"
|
|
219
|
+
constraints:
|
|
220
|
+
- "Do not implement."
|
|
221
|
+
- "Reject completion if agent-response.json remains canonical in loop behavior, docs, or skills."
|
|
222
|
+
- "Reject completion if npm run check has not passed after implementation."
|
|
223
|
+
- "Reject completion if required Worker work is still queued or active."
|
|
224
|
+
expected_output:
|
|
225
|
+
- "complete | not_complete"
|
|
226
|
+
- "full_outcome_complete: true | false"
|
|
227
|
+
- "missing evidence"
|
|
228
|
+
- "next task if not complete"
|
|
229
|
+
receipt:
|
|
230
|
+
result: done
|
|
231
|
+
decision: complete
|
|
232
|
+
full_outcome_complete: true
|
|
233
|
+
summary: "Oracle satisfied: npm run check passed; Seatify smoke validated loop response submit; docs/skill/target guide teach SQLite submission; current loop comparison code no longer uses agent-response.json as canonical state."
|
|
234
|
+
|
|
235
|
+
checks:
|
|
236
|
+
dirty_fingerprint: "main...origin/main clean before GoalBuddy control files"
|
|
237
|
+
last_verification:
|
|
238
|
+
result: unknown
|
|
239
|
+
task: null
|
|
240
|
+
commands: []
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Agent Response SQLite Evidence Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
+
|
|
5
|
+
**Goal:** Store every loop comparison's full `agent-response.json` evidence in SQLite so freshness, validation, and recommendations are centralized.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Add an `agent_responses` table beside `ledger_events`, not inside the event log. `writeAgentComparisonPack` reports response JSON/hash/freshness; `loop compare` records that evidence with trajectory, iteration, and run IDs. Ledger exports summarize DB rows and mark cached reuse plainly.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** TypeScript, better-sqlite3, Zod comparison schema, Vitest, GitHub Actions, npm release workflow.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Files
|
|
14
|
+
|
|
15
|
+
- Modify `src/core/ledger-db.ts`: create `agent_responses`.
|
|
16
|
+
- Modify `src/core/agent-comparison-pack.ts`: expose response JSON, hash, and freshness.
|
|
17
|
+
- Modify `src/core/ledger-store.ts`: add `recordAgentResponse`.
|
|
18
|
+
- Modify `src/core/ledger-queries.ts`: export agent response rows.
|
|
19
|
+
- Modify `src/core/ledger-markdown.ts`: render `## Agent Responses`.
|
|
20
|
+
- Modify `src/commands/loop.ts`: record response evidence after compare.
|
|
21
|
+
- Tests: `src/core/ledger-db.test.ts`, `src/core/agent-comparison-pack.test.ts`, `src/core/ledger-store.test.ts`, `src/commands/loop.test.ts`, `src/commands/ledger.test.ts`.
|
|
22
|
+
- Docs: update `README.md`, `docs/agent-workflow.md`, and `skills/limner/SKILL.md` only if CLI/user behavior changes.
|
|
23
|
+
|
|
24
|
+
## Data Contract
|
|
25
|
+
|
|
26
|
+
Create table:
|
|
27
|
+
|
|
28
|
+
```sql
|
|
29
|
+
agent_responses (
|
|
30
|
+
response_id text primary key,
|
|
31
|
+
trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
|
|
32
|
+
iteration_id text,
|
|
33
|
+
run_id text,
|
|
34
|
+
mode text not null,
|
|
35
|
+
profile text,
|
|
36
|
+
response_path text not null,
|
|
37
|
+
response_hash text,
|
|
38
|
+
freshness text not null,
|
|
39
|
+
validation_status text not null,
|
|
40
|
+
input_fingerprint_json text,
|
|
41
|
+
response_json text,
|
|
42
|
+
score_json text,
|
|
43
|
+
top_fix text,
|
|
44
|
+
created_at text not null
|
|
45
|
+
)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Freshness values: `missing`, `cached`, `stale`, `invalid`. `fresh` is reserved for future run-scoped response creation.
|
|
49
|
+
|
|
50
|
+
## Tasks
|
|
51
|
+
|
|
52
|
+
- [ ] **Task 1: DB schema and store API**
|
|
53
|
+
|
|
54
|
+
Add `agent_responses` to `ledger-db.ts` and assert it exists in `ledger-db.test.ts`. Add `recordAgentResponse` to `ledger-store.ts`; it inserts one row with `response_id = createLedgerId('resp')`. Add a store test that starts a trajectory, records a validated cached response with `response_json`, then exports the row.
|
|
55
|
+
|
|
56
|
+
- [ ] **Task 2: Pack response evidence**
|
|
57
|
+
|
|
58
|
+
In `agent-comparison-pack.ts`, compute whether `agent-response.json` existed before the pack was written, read the raw response text when present, hash it, and expose fields on `AgentComparisonPackResult`: `responseJson`, `responseHash`, `freshness`, `profile`, `inputFingerprint`, `topFix`, `score`. Map missing to `missing`, invalid JSON/schema to `invalid`, active comparison mismatch to `stale`, and validated pre-existing response to `cached`.
|
|
59
|
+
|
|
60
|
+
- [ ] **Task 3: Record from loop compare**
|
|
61
|
+
|
|
62
|
+
In `compareLoop`, after a compare returns and before/after the event append, call `store.recordAgentResponse` when `result.agentComparison` exists. Include trajectory ID, active iteration ID, run ID, trajectory mode, pack profile, response path/hash/json, freshness, validation status, input fingerprint, score, and top fix. Add loop tests for validated cached and missing/awaiting rows.
|
|
63
|
+
|
|
64
|
+
- [ ] **Task 4: Export and docs**
|
|
65
|
+
|
|
66
|
+
Export `agentResponses` from `ledger-queries.ts` and render `## Agent Responses` in `ledger-markdown.ts`, including run, status, freshness, response hash, score, top fix, and path. Add ledger markdown tests showing `freshness: cached`. Update docs/skill if needed to say full agent responses are stored in local SQLite.
|
|
67
|
+
|
|
68
|
+
- [ ] **Task 5: Verify and release path**
|
|
69
|
+
|
|
70
|
+
Run `npm run check`, smoke Seatify with a fresh trajectory, confirm the DB row says `freshness: cached` for the reused response, then make a commit, push, open PR, monitor CI, merge when green, trigger npm release workflow, reinstall, and rerun Seatify expecting the installed CLI to expose the same evidence.
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Loop Action Ledger Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
+
|
|
5
|
+
**Goal:** Add first-class action logging so each Limner comparison can be followed by an explicit subagent handoff, polish action, skip, or completion record.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Reuse `ledger_events` for v1. Action events store `actionId`, source comparison `runId`, executor, status, summary, files, and commit in `inputs_summary`; edited files are also artifact refs. `loop task` becomes the bridge from validated comparison evidence to an agent or subagent action.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** TypeScript, Commander, Zod, better-sqlite3, Vitest, Markdown docs, bundled Codex skill instructions.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## File Structure
|
|
14
|
+
|
|
15
|
+
- Modify `src/schemas/ledger.ts`: action kind/status/executor schemas and 255-character summary validation.
|
|
16
|
+
- Modify `src/core/ledger-events.ts`: validate action event summaries.
|
|
17
|
+
- Modify `src/commands/loop.ts`: `recordLoopAction`, enriched `getLoopTask`, action event context.
|
|
18
|
+
- Modify `src/commands/loop-cli.ts`: `loop action start|complete|skip`, plus `loop task --executor`.
|
|
19
|
+
- Modify `src/core/agent-task-brief.ts`: source run ID, desired executor, action logging commands.
|
|
20
|
+
- Modify `src/core/ledger-markdown.ts`: action history section.
|
|
21
|
+
- Tests: `src/commands/loop.test.ts`, `src/core/agent-task-brief.test.ts`, `src/core/ledger-store.test.ts`, `src/commands/ledger.test.ts`.
|
|
22
|
+
- Docs: `README.md`, `docs/agent-workflow.md`, `skills/limner/SKILL.md`.
|
|
23
|
+
|
|
24
|
+
## Event Contract
|
|
25
|
+
|
|
26
|
+
Event types: `loop.action.started`, `loop.action.completed`, `loop.action.skipped`, `loop.action.failed`. `inputs_summary` shape:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"actionId": "act_0123456789abcdef",
|
|
31
|
+
"kind": "polish",
|
|
32
|
+
"executor": "subagent",
|
|
33
|
+
"fromRunId": "2026-06-13T020201866Z-rkm2tn",
|
|
34
|
+
"summary": "Resize and reposition dashboard preview",
|
|
35
|
+
"files": ["targets/homepage-desktop/reference/styles.css"],
|
|
36
|
+
"commit": "abc1234"
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Task 1: Add Ledger Action Types
|
|
41
|
+
|
|
42
|
+
**Files:** `src/schemas/ledger.ts`, `src/core/ledger-events.ts`, `src/core/ledger-store.test.ts`
|
|
43
|
+
|
|
44
|
+
- [ ] **Step 1: Write the failing validation test**
|
|
45
|
+
|
|
46
|
+
Add to `src/core/ledger-store.test.ts`:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
it('rejects overlong action summaries', () => {
|
|
50
|
+
const store = createLedgerStore(db);
|
|
51
|
+
const trajectory = store.startTrajectory(createInput());
|
|
52
|
+
expect(() => store.appendEvent({
|
|
53
|
+
trajectoryId: trajectory.trajectoryId,
|
|
54
|
+
iterationId: trajectory.activeIterationId ?? undefined,
|
|
55
|
+
eventType: 'loop.action.started',
|
|
56
|
+
actor: 'agent',
|
|
57
|
+
inputsSummary: JSON.stringify({ summary: 'x'.repeat(256) }),
|
|
58
|
+
})).toThrow(/255/);
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- [ ] **Step 2: Run the failing test**
|
|
63
|
+
|
|
64
|
+
Run: `npm test -- src/core/ledger-store.test.ts`
|
|
65
|
+
|
|
66
|
+
Expected: FAIL because action summaries are not validated yet.
|
|
67
|
+
|
|
68
|
+
- [ ] **Step 3: Add schemas, validation, and verify**
|
|
69
|
+
|
|
70
|
+
Add to `src/schemas/ledger.ts`:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
export const ledgerActionKindSchema = z.enum(['polish', 'handoff', 'manual-edit', 'verification', 'no-op']);
|
|
74
|
+
export const ledgerActionStatusSchema = z.enum(['started', 'completed', 'skipped', 'failed']);
|
|
75
|
+
export const ledgerActionExecutorSchema = z.enum(['subagent', 'agent', 'user', 'cli']);
|
|
76
|
+
export const ledgerActionSummarySchema = z.string().min(1).max(255);
|
|
77
|
+
export type LedgerActionKind = z.infer<typeof ledgerActionKindSchema>;
|
|
78
|
+
export type LedgerActionStatus = z.infer<typeof ledgerActionStatusSchema>;
|
|
79
|
+
export type LedgerActionExecutor = z.infer<typeof ledgerActionExecutorSchema>;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
In `src/core/ledger-events.ts`, if `eventType` starts with `loop.action.`, parse `inputsSummary`, require a string `summary`, and validate it with `ledgerActionSummarySchema`.
|
|
83
|
+
|
|
84
|
+
Run: `npm test -- src/core/ledger-store.test.ts`
|
|
85
|
+
|
|
86
|
+
Expected: PASS.
|
|
87
|
+
|
|
88
|
+
## Task 2: Add Core Action Recording
|
|
89
|
+
|
|
90
|
+
**Files:** `src/commands/loop.ts`, `src/commands/loop.test.ts`
|
|
91
|
+
|
|
92
|
+
- [ ] **Step 1: Write failing tests**
|
|
93
|
+
|
|
94
|
+
Import `recordLoopAction` and add cases for `started`, `completed`, and `skipped`:
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
const action = recordLoopAction({
|
|
98
|
+
ledgerEnv,
|
|
99
|
+
trajectoryId: started.trajectoryId,
|
|
100
|
+
status: 'started',
|
|
101
|
+
kind: 'polish',
|
|
102
|
+
executor: 'subagent',
|
|
103
|
+
fromRunId: 'run_123',
|
|
104
|
+
summary: 'Resize dashboard preview',
|
|
105
|
+
});
|
|
106
|
+
expect(action.actionId).toMatch(/^act_/);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Assert exported events contain `loop.action.started`, `loop.action.completed`, and `loop.action.skipped`, and that parsed `inputsSummary` includes `actionId`, `fromRunId`, `executor`, `summary`, `files`, and `commit` when supplied.
|
|
110
|
+
|
|
111
|
+
- [ ] **Step 2: Run the failing test**
|
|
112
|
+
|
|
113
|
+
Run: `npm test -- src/commands/loop.test.ts`
|
|
114
|
+
|
|
115
|
+
Expected: FAIL because `recordLoopAction` does not exist.
|
|
116
|
+
|
|
117
|
+
- [ ] **Step 3: Implement `recordLoopAction` and verify**
|
|
118
|
+
|
|
119
|
+
In `src/commands/loop.ts`, add `LoopActionInput` with `status`, `kind`, `executor`, `summary`, optional `actionId`, `fromRunId`, `files`, `commit`, and the existing trajectory selector fields. Use `createLedgerId('act')` when no action ID is supplied. Append event type `loop.action.${status}`, actor `agent` for `subagent` or `agent`, actor `user` for `user`, and actor `cli` for `cli`. Return `{ actionId }`.
|
|
120
|
+
|
|
121
|
+
Run: `npm test -- src/commands/loop.test.ts`
|
|
122
|
+
|
|
123
|
+
Expected: PASS.
|
|
124
|
+
|
|
125
|
+
## Task 3: Add CLI Commands
|
|
126
|
+
|
|
127
|
+
**Files:** `src/commands/loop-cli.ts`, `src/commands/loop.test.ts`
|
|
128
|
+
|
|
129
|
+
- [ ] **Step 1: Add command normalization coverage**
|
|
130
|
+
|
|
131
|
+
Add a test that passes files as `['src/app/page.tsx', 'src/app/globals.css']` to `recordLoopAction` and asserts the exported action event stores both files and creates `edited-file` artifact refs.
|
|
132
|
+
|
|
133
|
+
- [ ] **Step 2: Implement `loop action`**
|
|
134
|
+
|
|
135
|
+
Add Commander subcommands:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
limner loop action start --trajectory <id> --from-run <run-id> --kind polish --executor subagent --summary "Resize dashboard preview"
|
|
139
|
+
limner loop action complete --trajectory <id> --action <action-id> --summary "Adjusted preview sizing" --files "src/app/page.tsx,src/app/globals.css" --commit abc1234
|
|
140
|
+
limner loop action skip --trajectory <id> --from-run <run-id> --summary "Smoke test only; no polish intended"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Each command prints `Action: <action-id>`.
|
|
144
|
+
|
|
145
|
+
- [ ] **Step 3: Verify CLI and tests**
|
|
146
|
+
|
|
147
|
+
Run: `npm run dev -- loop action start --help`
|
|
148
|
+
|
|
149
|
+
Expected: help lists `--trajectory`, `--from-run`, `--kind`, `--executor`, and `--summary`.
|
|
150
|
+
|
|
151
|
+
Run: `npm test -- src/commands/loop.test.ts`
|
|
152
|
+
|
|
153
|
+
Expected: PASS.
|
|
154
|
+
|
|
155
|
+
## Task 4: Make Task Briefs Subagent-Ready
|
|
156
|
+
|
|
157
|
+
**Files:**
|
|
158
|
+
- Modify: `src/core/agent-task-brief.ts`
|
|
159
|
+
- Modify: `src/commands/loop.ts`
|
|
160
|
+
- Modify: `src/commands/loop-cli.ts`
|
|
161
|
+
- Test: `src/core/agent-task-brief.test.ts`
|
|
162
|
+
- Test: `src/commands/loop.test.ts`
|
|
163
|
+
|
|
164
|
+
- [ ] **Step 1: Write failing assertions**
|
|
165
|
+
|
|
166
|
+
Update tests to expect JSON fields `sourceRunId`, `desiredExecutor`, `actionStartCommand`, and `actionCompleteCommandExample`. Expect Markdown to include `## Action Logging`, `limner loop action start`, `limner loop action complete`, and `limner loop action skip`.
|
|
167
|
+
|
|
168
|
+
- [ ] **Step 2: Enrich task lookup and command**
|
|
169
|
+
|
|
170
|
+
Change `latestValidatedComparison` to return `{ summaryPath, inputsSummary, runId }`. Add `--executor <executor>` to `loop task`, default `subagent`. When appending `loop.task.viewed`, include `inputsSummary: JSON.stringify({ sourceRunId, desiredExecutor })`.
|
|
171
|
+
|
|
172
|
+
- [ ] **Step 3: Update task output and verify**
|
|
173
|
+
|
|
174
|
+
Add action commands to `buildAgentTaskBrief` JSON and Markdown. The start command must include `--trajectory`, `--from-run`, `--kind polish`, `--executor`, and `--summary`. The complete command example must include `--trajectory`, `--action <action-id>`, `--summary`, and `--files`.
|
|
175
|
+
|
|
176
|
+
Run: `npm test -- src/core/agent-task-brief.test.ts src/commands/loop.test.ts`
|
|
177
|
+
|
|
178
|
+
Expected: PASS.
|
|
179
|
+
|
|
180
|
+
## Task 5: Show Actions in Ledger Exports
|
|
181
|
+
|
|
182
|
+
**Files:**
|
|
183
|
+
- Modify: `src/core/ledger-markdown.ts`
|
|
184
|
+
- Test: `src/commands/ledger.test.ts`
|
|
185
|
+
|
|
186
|
+
- [ ] **Step 1: Write failing Markdown export test**
|
|
187
|
+
|
|
188
|
+
Create a fixture with one `loop.action.completed` event. Assert the markdown export contains:
|
|
189
|
+
|
|
190
|
+
```md
|
|
191
|
+
## Action History
|
|
192
|
+
- act_
|
|
193
|
+
- status: completed
|
|
194
|
+
- executor: subagent
|
|
195
|
+
- from run: run_123
|
|
196
|
+
- summary: Resize dashboard preview
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- [ ] **Step 2: Implement action formatting and verify**
|
|
200
|
+
|
|
201
|
+
Parse `loop.action.*` events from `exported.events`, read `inputsSummary`, and render `## Action History` before artifact sections. If no actions exist, render `- None recorded`.
|
|
202
|
+
|
|
203
|
+
Run: `npm test -- src/commands/ledger.test.ts`
|
|
204
|
+
|
|
205
|
+
Expected: PASS.
|
|
206
|
+
|
|
207
|
+
## Task 6: Document the Agent Workflow
|
|
208
|
+
|
|
209
|
+
**Files:**
|
|
210
|
+
- Modify: `README.md`
|
|
211
|
+
- Modify: `docs/agent-workflow.md`
|
|
212
|
+
- Modify: `skills/limner/SKILL.md`
|
|
213
|
+
|
|
214
|
+
- [ ] **Step 1: Document the loop**
|
|
215
|
+
|
|
216
|
+
Document:
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
loop compare -> loop task --executor subagent -> loop action start -> edit -> loop action complete -> loop compare
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Also document `loop action skip` for comparison-only smoke runs.
|
|
223
|
+
|
|
224
|
+
- [ ] **Step 2: Update skill instructions and verify**
|
|
225
|
+
|
|
226
|
+
In `skills/limner/SKILL.md`, instruct agents to prefer `limner loop task --executor subagent`, record `loop action start` before edits, record `loop action complete` after edits, record `loop action skip` when no edit is intended, and keep `--summary` under 255 characters.
|
|
227
|
+
|
|
228
|
+
Run: `rg "loop action|--executor subagent|Action Logging" README.md docs/agent-workflow.md skills/limner/SKILL.md`
|
|
229
|
+
|
|
230
|
+
Expected: each file has at least one matching workflow reference.
|
|
231
|
+
|
|
232
|
+
## Task 7: Final Verification
|
|
233
|
+
|
|
234
|
+
**Files:**
|
|
235
|
+
- All files above
|
|
236
|
+
|
|
237
|
+
- [ ] **Step 1: Run the aggregate gate**
|
|
238
|
+
|
|
239
|
+
Run: `npm run check`
|
|
240
|
+
|
|
241
|
+
Expected: lint, typecheck, Vitest, build, Knip, and file-size guard all pass.
|
|
242
|
+
|
|
243
|
+
- [ ] **Step 2: Run a local smoke flow**
|
|
244
|
+
|
|
245
|
+
Run:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npm run dev -- loop action start --trajectory <existing-test-trajectory> --from-run <validated-run-id> --kind polish --executor subagent --summary "Smoke action start"
|
|
249
|
+
npm run dev -- loop action skip --trajectory <existing-test-trajectory> --from-run <validated-run-id> --summary "Smoke test only"
|
|
250
|
+
npm run dev -- ledger export <existing-test-trajectory> --format markdown
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Expected: export contains `## Action History` with both action records.
|
|
254
|
+
|
|
255
|
+
- [ ] **Step 3: PR handoff notes**
|
|
256
|
+
|
|
257
|
+
Include the top risks: wrong trajectory, executor intent recorded but external orchestrator did not use a subagent, and action completed without follow-up comparison. Include commands run, smoke trajectory ID, generated ledger excerpt, and the residual risk that Limner records action claims but cannot independently prove who edited files.
|
package/package.json
CHANGED