@mestreyoda/fabrica 0.2.12 → 0.2.14

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.14 - 2026-04-01
4
+
5
+ - Made `agent_end` authoritative for reviewer completion as well, so reviewer sessions no longer depend on delayed `subagent_ended` or reviewer polling to advance the FSM.
6
+ - Added session-history fallback for developer/tester/architect lifecycle completion when `agent_end` arrives without the final assistant result line.
7
+ - Hardened Telegram bootstrap ownership so stale attempts stop before stamping `project_registered` data or replaying kickoff, `projectTick`, or completion DM side effects onto a newer attempt.
8
+ - Added regression coverage for reviewer `agent_end` routing, worker lifecycle session-history fallback, and successful bootstrap owner-loss races.
9
+
10
+ ## 0.2.13 - 2026-03-31
11
+
12
+ - Disabled automatic pretty logging on TTY so the plugin no longer depends on `pino-pretty` during load.
13
+ - Added a safe one-shot fallback to structured logs when pretty transport resolution or initialization fails.
14
+ - Added logger transport regression coverage and promoted it into the hot-path test lane.
15
+
3
16
  ## 0.2.12 - 2026-03-31
4
17
 
5
18
  - Made the published plugin self-contained by replacing remaining runtime helper imports from `openclaw/plugin-sdk`.
@@ -48,7 +48,7 @@ What exists today? Current limitations? Relevant code paths.
48
48
 
49
49
  ## MANDATORY: Create ONE Implementation Task
50
50
 
51
- After posting your findings, you MUST create **exactly one comprehensive implementation task** for the recommended approach before calling work_finish.
51
+ After posting your findings, you MUST create **exactly one comprehensive implementation task** for the recommended approach before ending with your final architecture result line.
52
52
 
53
53
  **⚠️ CRITICAL: Always create ONE task, never multiple.** Do not split work into separate issues. A single developer will pick up the task and work through the checklist. This keeps scope clear, reduces issue noise, and makes tracking easy.
54
54
 
@@ -101,22 +101,16 @@ Brief summary of what needs to be implemented and why.
101
101
  - `description`: use the format above — detailed enough for a developer to start immediately
102
102
 
103
103
  2. Collect the returned issue `id`, `title`, and `url` from the `task_create` response
104
- 3. Pass the created task to `work_finish` in the `createdTasks` array this makes it show up as a clickable link in the notification
104
+ 3. Mention the created task number and URL in your final prose before the result line so the operator can see what was created
105
105
 
106
106
  **Example:**
107
107
  ```
108
108
  task_create({ projectSlug: "<project slug from the 'Channel:' line in the task message>", title: "Implement SQLite session persistence", description: "From research #42\n\n## Overview\nReplace in-memory Map with SQLite...\n\n## Implementation Checklist\n\n### Phase 1: Schema & Migration (~1 day)\n- [ ] Create sessions table schema in db/schema.sql\n- [ ] Add migration logic in db/migrate.ts\n..." })
109
109
  // → returns issue id: 43, url: "https://github.com/.../43"
110
110
 
111
- work_finish({
112
- role: "architect",
113
- result: "done",
114
- channelId: "my-app",
115
- summary: "Recommended SQLite approach. Created task #43.",
116
- createdTasks: [
117
- { id: 43, title: "Implement SQLite session persistence", url: "https://github.com/.../43" }
118
- ]
119
- })
111
+ Recommended SQLite approach. Created implementation task #43:
112
+ https://github.com/.../43
113
+ Architecture result: DONE
120
114
  ```
121
115
 
122
116
  The task is created in Planning state — the operator reviews and moves it to the queue when ready.
@@ -128,16 +122,18 @@ The task is created in Planning state — the operator reviews and moves it to t
128
122
  ## Important
129
123
 
130
124
  - **Be thorough** — Your output becomes the spec for development. Missing detail = blocked developer.
131
- - **If you need user input** — Call work_finish with result "blocked" and explain what you need. Do NOT guess on ambiguous requirements.
125
+ - **If you need user input** — End with `Architecture result: BLOCKED` and explain what you need. Do NOT guess on ambiguous requirements.
132
126
  - **Post findings as issue comments** — Use task_comment to write your analysis on the issue.
133
- - **Always create a task** — Do not call work_finish(done) without first creating an implementation task via task_create.
127
+ - **Always create a task** — Do not end with `Architecture result: DONE` without first creating an implementation task via task_create.
134
128
 
135
129
  ## Completing Your Task
136
130
 
137
- When you are done, **call `work_finish` yourself** do not just announce in text.
131
+ When you are done, end your response with exactly one final result line in plain text:
138
132
 
139
- - **Done:** `work_finish({ role: "architect", result: "done", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<recommendation + created task numbers>", createdTasks: [{ id, title, url }] })`
140
- - **Blocked:** `work_finish({ role: "architect", result: "blocked", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<what you need>" })`
133
+ - `Architecture result: DONE`
134
+ - `Architecture result: BLOCKED`
135
+
136
+ Write any recommendation summary and created task references before that final line.
141
137
 
142
138
  The project slug is included on the `Channel:` line in your task message. Your session is persistent — you may be called back for refinements.
143
139
 
@@ -110,7 +110,7 @@ When your task message includes a **PR Feedback** section, it means a reviewer r
110
110
  ```
111
111
  4. Address **only** the reviewer's comments — do not re-implement the original issue from scratch
112
112
  5. Commit and push to the **same branch** — the existing PR updates automatically
113
- 6. Call `work_finish` as usual
113
+ 6. End your response with the canonical developer result line described below
114
114
 
115
115
  ### QA Evidence (MANDATORY)
116
116
 
@@ -132,19 +132,16 @@ gh pr edit "$PR_NUM" --body "$(printf '%s\n\n## QA Evidence\n\n```\n%s\n```\n\nE
132
132
 
133
133
  **Do NOT post QA evidence only as a comment.** PR comments are not canonical QA evidence; the reviewer and the workflow both validate the PR description body.
134
134
 
135
- ### 5. Call work_finish (API tool NOT a shell command)
135
+ ### 5. End with the canonical result line
136
136
 
137
- `work_finish` is a **Fabrica API tool**. You must invoke it as a **tool call** (tool_use), the same way you call any other tool like `task_create` or `gh`. Do **NOT** run it as a bash command — it is not on your PATH, and attempting to execute it in a shell will fail with "command not found".
137
+ After you finish the implementation work, end your response with exactly one final result line in plain text:
138
138
 
139
- Use the `work_finish` tool with these arguments:
140
- - `role`: `"developer"`
141
- - `result`: `"done"` (or `"blocked"` if stuck)
142
- - `channelId`: the project slug from the `"Project: <name>"` line in your task message (e.g., `"gestao-notas"`)
143
- - `summary`: brief description of what you did
139
+ - `Work result: DONE`
140
+ - `Work result: BLOCKED`
144
141
 
145
- **If blocked:** call `work_finish` with `result: "blocked"` and explain why in `summary`.
142
+ Use `Work result: BLOCKED` if you hit an external blocker, ambiguity, or missing dependency that prevents completion.
146
143
 
147
- **Always call work_finish** even if you hit errors or can't complete the task.
144
+ Do **not** rely on tool availability to conclude the task. Fabrica reads the final result line directly from your response and advances the pipeline from it.
148
145
 
149
146
  ## Security Checklist (MANDATORY before commit)
150
147
 
@@ -182,9 +179,9 @@ Choose the pattern appropriate to your stack:
182
179
  These are orchestrator-only tools. Do not call them:
183
180
  - `task_start`, `tasks_status`, `health`, `project_register`
184
181
 
185
- ## Anti-Pattern Checklist (MANDATORY before work_finish)
182
+ ## Anti-Pattern Checklist (MANDATORY before declaring done)
186
183
 
187
- Before calling `work_finish(done)`, verify ALL of these:
184
+ Before ending with `Work result: DONE`, verify ALL of these:
188
185
 
189
186
  ### Code Quality
190
187
  - [ ] Every function has a descriptive name (no `data`, `temp`, `result`, `handle`)
@@ -196,7 +193,7 @@ Before calling `work_finish(done)`, verify ALL of these:
196
193
 
197
194
  ### QA Contract
198
195
  - [ ] Run `scripts/qa.sh` and verify ALL 5 gates pass (lint, types, security, tests, coverage)
199
- - [ ] If qa.sh fails, FIX the issue — do NOT call work_finish with failing gates
196
+ - [ ] If qa.sh fails, FIX the issue — do NOT declare done with failing gates
200
197
  - [ ] Coverage meets or exceeds the threshold in qa.sh (default: 80%)
201
198
 
202
199
  ### Git Hygiene
@@ -122,17 +122,23 @@ Use `task_comment` to post your findings in this format:
122
122
  <brief summary>
123
123
  ```
124
124
 
125
- ### 6. Call work_finish
125
+ ### 6. End with the canonical result line
126
126
 
127
- - **Pass:** `work_finish({ role: "tester", result: "pass", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<brief summary>" })`
128
- - **Fail:** `work_finish({ role: "tester", result: "fail", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<specific failures>" })`
129
- - **Fail Infra:** `work_finish({ role: "tester", result: "fail_infra", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<toolchain or environment failure that prevented QA>" })`
130
- - **Refine:** `work_finish({ role: "tester", result: "refine", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<what needs human input>" })`
131
- - **Blocked:** `work_finish({ role: "tester", result: "blocked", channelId: "<project slug from the 'Channel:' line in the task message>", summary: "<what you need>" })`
127
+ After posting the QA report, end your response with exactly one final result line in plain text:
132
128
 
133
- > **IMPORTANT:** The `channelId` parameter accepts the project slug (e.g., "gestao-notas").
134
- > Extract it from the "Channel: <slug>" line in your task message. Do NOT use the numeric
135
- > channel ID — use the project slug to avoid resolution errors when channels are shared.
129
+ - `Test result: PASS`
130
+ - `Test result: FAIL`
131
+ - `Test result: FAIL_INFRA`
132
+ - `Test result: REFINE`
133
+ - `Test result: BLOCKED`
134
+
135
+ Use:
136
+ - `FAIL` when the implementation is wrong or acceptance criteria fail.
137
+ - `FAIL_INFRA` when the toolchain or environment prevented valid QA execution.
138
+ - `REFINE` when human clarification or non-code product refinement is required before testing can conclude.
139
+ - `BLOCKED` when you cannot proceed for another reason.
140
+
141
+ Do **not** rely on tool availability to conclude the task. Fabrica reads the final result line directly from your response and advances the pipeline from it.
136
142
 
137
143
  ## Conventions
138
144