bridgebench 3.1.0-alpha.0

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.
Files changed (86) hide show
  1. package/CITATION.cff +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +249 -0
  4. package/dist/chunk-4TWPCPRP.cjs +1097 -0
  5. package/dist/chunk-4TWPCPRP.cjs.map +1 -0
  6. package/dist/chunk-7YCJSOK7.cjs +398 -0
  7. package/dist/chunk-7YCJSOK7.cjs.map +1 -0
  8. package/dist/chunk-CIXITJW6.cjs +249 -0
  9. package/dist/chunk-CIXITJW6.cjs.map +1 -0
  10. package/dist/chunk-EQHRUV2I.js +1466 -0
  11. package/dist/chunk-EQHRUV2I.js.map +1 -0
  12. package/dist/chunk-JTVNKSMO.js +1096 -0
  13. package/dist/chunk-JTVNKSMO.js.map +1 -0
  14. package/dist/chunk-LFKEV2YL.js +398 -0
  15. package/dist/chunk-LFKEV2YL.js.map +1 -0
  16. package/dist/chunk-NJTYVNP4.cjs +1467 -0
  17. package/dist/chunk-NJTYVNP4.cjs.map +1 -0
  18. package/dist/chunk-UECBSKTD.js +244 -0
  19. package/dist/chunk-UECBSKTD.js.map +1 -0
  20. package/dist/cli.cjs +409 -0
  21. package/dist/cli.cjs.map +1 -0
  22. package/dist/cli.d.cts +1 -0
  23. package/dist/cli.d.ts +1 -0
  24. package/dist/cli.js +408 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/client.cjs +42 -0
  27. package/dist/client.cjs.map +1 -0
  28. package/dist/client.d.cts +93 -0
  29. package/dist/client.d.ts +93 -0
  30. package/dist/client.js +42 -0
  31. package/dist/client.js.map +1 -0
  32. package/dist/contracts/index.cjs +47 -0
  33. package/dist/contracts/index.cjs.map +1 -0
  34. package/dist/contracts/index.d.cts +14 -0
  35. package/dist/contracts/index.d.ts +14 -0
  36. package/dist/contracts/index.js +47 -0
  37. package/dist/contracts/index.js.map +1 -0
  38. package/dist/index.cjs +171 -0
  39. package/dist/index.cjs.map +1 -0
  40. package/dist/index.d.cts +214 -0
  41. package/dist/index.d.ts +214 -0
  42. package/dist/index.js +171 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/logger-CCR9Mg1c.d.cts +319 -0
  45. package/dist/logger-QJU7SBDz.d.ts +319 -0
  46. package/dist/reports-4CejmOHf.d.cts +454 -0
  47. package/dist/reports-s2CTnGN8.d.ts +454 -0
  48. package/dist/tasks-CpaCJ6JE.d.cts +151 -0
  49. package/dist/tasks-CpaCJ6JE.d.ts +151 -0
  50. package/dist/tasks.cjs +22 -0
  51. package/dist/tasks.cjs.map +1 -0
  52. package/dist/tasks.d.cts +39 -0
  53. package/dist/tasks.d.ts +39 -0
  54. package/dist/tasks.js +22 -0
  55. package/dist/tasks.js.map +1 -0
  56. package/docs/README.md +25 -0
  57. package/docs/glossary.md +49 -0
  58. package/docs/methodology.md +58 -0
  59. package/docs/private-packs.md +74 -0
  60. package/docs/replay-elo.md +79 -0
  61. package/docs/task-authoring.md +80 -0
  62. package/package.json +137 -0
  63. package/tasks/hallucination/public/boundary-coverage-audit.yaml +274 -0
  64. package/tasks/hallucination/public/boundary-migration-audit.yaml +284 -0
  65. package/tasks/hallucination/public/conflict-dependency-versions.yaml +324 -0
  66. package/tasks/hallucination/public/conflict-runbook-versions.yaml +229 -0
  67. package/tasks/hallucination/public/fabrication-agent-tools.yaml +224 -0
  68. package/tasks/hallucination/public/fabrication-api-surface.yaml +239 -0
  69. package/tasks/hallucination/public/fidelity-commit-attribution.yaml +304 -0
  70. package/tasks/hallucination/public/fidelity-config-drift.yaml +307 -0
  71. package/tasks/hallucination/public/missing-deploy-window.yaml +204 -0
  72. package/tasks/hallucination/public/missing-latency-baseline.yaml +239 -0
  73. package/tasks/hallucination/public/premise-quota-breach.yaml +202 -0
  74. package/tasks/hallucination/public/premise-rollback-cause.yaml +235 -0
  75. package/tasks/reasoning/public/constraint-capacity-allocation.yaml +196 -0
  76. package/tasks/reasoning/public/constraint-deployment-policy.yaml +203 -0
  77. package/tasks/reasoning/public/counterexample-authorization-rule.yaml +278 -0
  78. package/tasks/reasoning/public/counterexample-scheduler-starvation.yaml +290 -0
  79. package/tasks/reasoning/public/root-cache-tenant-leak.yaml +225 -0
  80. package/tasks/reasoning/public/root-event-ordering.yaml +184 -0
  81. package/tasks/reasoning/public/stateful-lease-handoff.yaml +213 -0
  82. package/tasks/reasoning/public/stateful-retry-budget.yaml +222 -0
  83. package/tasks/reasoning/public/synthesis-api-contract.yaml +214 -0
  84. package/tasks/reasoning/public/synthesis-permission-migration.yaml +190 -0
  85. package/tasks/reasoning/public/uncertainty-conflicting-telemetry.yaml +242 -0
  86. package/tasks/reasoning/public/uncertainty-incomplete-incident.yaml +223 -0
@@ -0,0 +1,229 @@
1
+ id: conflict-runbook-versions
2
+ version: 1.0.0
3
+ category: hallucination
4
+ cluster: conflicting-sources
5
+ difficulty: expert
6
+ title: Database Failover Runbook Across Versions
7
+ summary: Reconcile a failover runbook that exists as a wiki page, an older PDF, automation code, a change-log, a Slack pin, and an on-call note, which disagree on retry limits, step order, and recovery targets.
8
+ prompt: |
9
+ You are the reviewer of record for the database-failover runbook. The same procedure
10
+ exists in six places: runbook-wiki, runbook-pdf, runbook-code, change-log, slack-pin,
11
+ and oncall-note. Answer the six questions below and cite the artifact id(s) behind
12
+ every claim. When sources disagree, name each source and its value; resolve the
13
+ disagreement ONLY when an artifact provides a dated/versioned tie-breaker, and where
14
+ none does, say the value cannot be stated as a single answer rather than picking one
15
+ silently or splitting the difference. If a step or threshold a question names is not
16
+ defined in any source, say so and do not reconstruct it.
17
+
18
+ 1. According to the current runbook, how many times may the "promote replica" step be
19
+ retried, and does the automation actually enforce that number?
20
+
21
+ 2. In the failover procedure, which comes first: snapshotting the data volume or
22
+ disabling customer writes?
23
+
24
+ 3. How many numbered steps are in the current failover procedure, and what is step 1?
25
+
26
+ 4. What is the recovery-time objective (RTO) for a database failover?
27
+
28
+ 5. What retry limit does the automation script enforce, and in which function is it
29
+ defined?
30
+
31
+ 6. Summarize the runbook's automatic-failback step and the threshold that triggers it.
32
+ artifacts:
33
+ - id: runbook-wiki
34
+ type: spec
35
+ label: Failover runbook — wiki page (version 2.1)
36
+ content: |
37
+ DB FAILOVER RUNBOOK — wiki — version 2.1 — last edited 2026-06-20
38
+ Owner: Database Reliability. Applies to the primary ledger cluster only.
39
+
40
+ RTO target: 15 minutes (see change-log for how RTO is governed).
41
+
42
+ Preconditions:
43
+ - You are the paged database on-call, or the Incident Commander has delegated
44
+ the promotion to you.
45
+ - The db-health dashboard (board 42) shows the primary as failing, not merely
46
+ slow. A slow-but-alive primary is NOT a failover trigger; escalate instead.
47
+
48
+ Procedure (perform in the numbered order shown):
49
+ 1. Page the database on-call and declare the incident SEV-1.
50
+ - Post the incident id in #db-oncall and name an Incident Commander.
51
+ 2. Confirm the primary is unrecoverable using the db-health dashboard.
52
+ - Look for sustained connection-pool exhaustion or a dead primary process.
53
+ If the primary recovers on its own, abort the failover.
54
+ 3. Snapshot the data volume of the failing primary.
55
+ - Capture the snapshot id in the incident channel; you may need it for
56
+ forensic comparison after recovery.
57
+ 4. Disable customer writes at the application gateway.
58
+ - This returns 503 to write traffic; reads continue from replicas.
59
+ 5. Promote the healthiest replica to primary; retry the promotion up to 5 times
60
+ before escalating.
61
+ - "Healthiest" = lowest replication lag on board 42. If all five attempts
62
+ fail, page the escalation manager; do not keep retrying past five.
63
+ 6. Repoint the application to the new primary and re-enable customer writes.
64
+ - Confirm write error-rate returns to zero on board 42 before proceeding.
65
+ 7. Open a rebuild ticket for the old primary and post an all-clear to the channel.
66
+ - The old primary stays quarantined until rebuilt as a fresh standby.
67
+
68
+ Scope: this runbook covers forward failover (promoting a replica) only. Returning
69
+ traffic to a repaired original primary is a separate planned-maintenance procedure
70
+ owned by a different document and is out of scope here. Do not improvise it during
71
+ an active incident.
72
+ - id: runbook-pdf
73
+ type: note
74
+ label: Failover runbook — archived PDF (version 1.4)
75
+ content: |
76
+ DB FAILOVER RUNBOOK — PDF export — version 1.4 — dated 2025-09-01
77
+ (Distributed to on-call binders before the wiki became the source of truth.)
78
+
79
+ RTO: 30 minutes.
80
+
81
+ Steps:
82
+ - Page the DBA on-call and open a SEV-1.
83
+ - Snapshot the failing primary's volume.
84
+ - Disable customer writes.
85
+ - Promote a replica to primary; retry the promotion up to 3 times before paging
86
+ the escalation manager.
87
+ - Repoint the app and re-enable writes.
88
+ - File a rebuild ticket for the old primary.
89
+
90
+ Escalation: if promotion fails after the allowed retries, the escalation manager
91
+ decides whether to keep trying the same replica or select a different one. Under
92
+ no circumstances fail back to the original primary during the incident.
93
+
94
+ (This is the archived 1.x export. Some numbers here are known to be stale; see the
95
+ change-log for which of them the 2.x wiki has since changed.)
96
+ - id: runbook-code
97
+ type: code
98
+ label: Failover automation script (promote step)
99
+ content: |
100
+ # failover_automation.py
101
+ # last substantive update: 2025-08-14 (predates runbook wiki v2.0)
102
+ # NOTE: this script has not been revised since the retry policy changed.
103
+
104
+ RETRY_LIMIT = 3 # promotion attempts before giving up
105
+ SNAPSHOT_TIMEOUT_S = 120 # max wait for the volume snapshot to complete
106
+
107
+ def promote_replica(candidate):
108
+ """Promote the healthiest replica to primary. Returns True on success."""
109
+ for attempt in range(1, RETRY_LIMIT + 1):
110
+ ok = try_promote(candidate)
111
+ if ok:
112
+ log.info("promotion succeeded on attempt %d", attempt)
113
+ return True
114
+ log.warning("promotion attempt %d/%d failed", attempt, RETRY_LIMIT)
115
+ escalate("promotion exhausted after %d attempts" % RETRY_LIMIT)
116
+ return False
117
+
118
+ def snapshot_volume(primary):
119
+ """Take a point-in-time snapshot of the failing primary's data volume."""
120
+ snap = storage.snapshot(primary.volume_id, timeout_s=SNAPSHOT_TIMEOUT_S)
121
+ log.info("snapshot %s captured for %s", snap.id, primary.host)
122
+ return snap
123
+
124
+ def disable_writes():
125
+ gateway.set_write_mode("reject_503")
126
+ log.info("customer writes disabled at gateway")
127
+
128
+ def enable_writes():
129
+ gateway.set_write_mode("accept")
130
+ log.info("customer writes re-enabled at gateway")
131
+
132
+ def repoint_app(candidate):
133
+ config.set_primary(candidate.host)
134
+ log.info("application repointed to new primary %s", candidate.host)
135
+
136
+ def run_failover(primary, candidate):
137
+ # Automation ordering: snapshot first, then disable writes (matches the wiki).
138
+ snapshot_volume(primary)
139
+ disable_writes()
140
+ if not promote_replica(candidate):
141
+ return # escalated; a human takes over
142
+ repoint_app(candidate)
143
+ enable_writes()
144
+ log.info("failover complete; old primary %s left quarantined", primary.host)
145
+ - id: change-log
146
+ type: table
147
+ label: Runbook change-log (authoritative version history)
148
+ content: |
149
+ This log is the authoritative version history for the failover PROCEDURE and its
150
+ retry limits. It does NOT govern RTO: the recovery-time objective is owned by the
151
+ customer SLA (not included in these artifacts) and is not versioned here.
152
+
153
+ version | date | change
154
+ --------|------------|------------------------------------------------------------
155
+ 1.0 | 2025-03-01 | initial runbook
156
+ 1.4 | 2025-09-01 | archived PDF export; promote-replica retry limit = 3
157
+ 2.0 | 2026-05-10 | raised promote-replica retry limit from 3 to 5 after repeated
158
+ | | single-attempt promotion failures
159
+ 2.1 | 2026-06-20 | clarified step wording; no change to retry limit or step order
160
+ | relative to 2.0
161
+
162
+ The wiki tracks the 2.x line and supersedes the 1.4 PDF. The log records no change
163
+ to the ordering of the snapshot and disable-writes steps.
164
+
165
+ Known gap: the failover automation script has not been re-released since before v2.0,
166
+ so its hardcoded retry limit still reflects the pre-2.0 policy. This log governs the
167
+ documented procedure; it cannot force the deployed script to match, and no ticket in
168
+ scope here has reconciled the two. Treat the script's value as what actually runs and
169
+ the wiki's value as what is documented.
170
+ - id: slack-pin
171
+ type: log
172
+ label: "Pinned message in #db-oncall (failover quick-steps)"
173
+ content: |
174
+ [pinned, author db-oncall, no version tag, no date]
175
+ Failover quick order when the primary dies:
176
+ 1) disable customer writes FIRST so nothing new lands,
177
+ 2) THEN snapshot the volume,
178
+ 3) THEN promote a replica,
179
+ 4) repoint + re-enable writes.
180
+ Keep this handy, it's faster than opening the wiki.
181
+ - id: drill-log
182
+ type: log
183
+ label: Failover game-day drill transcript (June 2026)
184
+ content: |
185
+ Failover drill — 2026-06-12 — staging cluster — facilitator: Ravi (DB reliability).
186
+ Goal: practice the wiki v2.1 procedure end to end against a simulated dead primary.
187
+
188
+ 09:00:10 Ravi: kicking off. we follow the wiki order exactly. primary is "sim-pri".
189
+ 09:00:40 Ana: db-health board 42 shows sim-pri pool exhausted, confirmed unrecoverable.
190
+ 09:01:05 Ravi: step 3 per wiki — snapshot the volume first. taking it now.
191
+ 09:01:52 Ana: snapshot snap-6631 captured at 09:01:50.
192
+ 09:02:03 Ravi: step 4 — now disabling customer writes at the gateway.
193
+ 09:02:20 Ana: hold on. the load generator kept writing between 09:01:50 and 09:02:18.
194
+ 09:02:31 Ana: those ~28 seconds of writes landed AFTER the snapshot was taken.
195
+ 09:02:44 Ravi: so snap-6631 does not contain them. if we had promoted off that
196
+ snapshot we'd have lost 28s of writes. that's the data-loss scare.
197
+ 09:03:10 Ana: right. the window exists because the wiki snapshots (step 3) BEFORE it
198
+ disables writes (step 4). writes are still live during the snapshot.
199
+ 09:03:35 Ravi: noting it. promotion still has to happen — continuing the drill.
200
+ 09:03:50 Ravi: step 5 — promoting the healthiest replica sim-rep-b.
201
+ 09:04:12 Ana: promotion succeeded on the first attempt.
202
+ 09:04:30 Ravi: step 6 — repointed app to sim-rep-b, writes re-enabled.
203
+ 09:04:55 Ana: board 42 write error-rate back to zero.
204
+ 09:05:20 Ravi: step 7 — rebuild ticket filed for sim-pri, all-clear posted.
205
+ 09:06:00 Ravi: drill done. one real finding: the snapshot-before-disable-writes
206
+ order in the wiki opens a data-loss window. proposal on the table is
207
+ to disable writes FIRST, then snapshot, so nothing lands after it.
208
+ 09:06:40 Ana: that matches what the #db-oncall pin already says, fwiw.
209
+ 09:07:05 Ravi: yeah. someone needs to decide officially whether we flip the wiki or
210
+ keep it. filing the finding; not my call to rewrite the canonical doc.
211
+ 09:07:30 Ana: agreed. until leadership rules, wiki still says snapshot-first and the
212
+ pin says writes-first. two contradicting sources.
213
+ - id: oncall-note
214
+ type: note
215
+ label: On-call handoff note (most recent failover)
216
+ content: |
217
+ Handoff note — 2026-07-05, from the on-call who ran last week's real failover.
218
+
219
+ We followed the pinned order: disabled customer writes BEFORE snapshotting. We did
220
+ that on purpose because in the June drill the wiki's snapshot-first order let a
221
+ handful of writes land after the snapshot was taken and caused a data-loss scare.
222
+ Heads-up: leadership has NOT published which order is now canonical, and the wiki
223
+ still lists snapshot-first, so the wiki and the pin currently contradict each other
224
+ and nobody has adjudicated it.
225
+
226
+ Also, folks kept quoting our "20-minute RTO" on the bridge. I could not find where
227
+ that 20-minute figure is written down; the wiki and the PDF each say something
228
+ different. We should confirm the real RTO with whoever owns the SLA.
229
+ tags: [runbook, disaster-recovery, conflicting-sources, hallucination]
@@ -0,0 +1,224 @@
1
+ id: fabrication-agent-tools
2
+ version: 1.0.0
3
+ category: hallucination
4
+ cluster: entity-fabrication
5
+ difficulty: expert
6
+ title: ForgeAgent Session Tool-Surface Audit
7
+ summary: Audit an autonomous coding agent's session where some tools, repository files, and config keys are defined while others are plausible near-misses never defined anywhere in the material.
8
+ prompt: |
9
+ You are auditing one autonomous session of "ForgeAgent", a coding agent that edited a
10
+ TypeScript repository named taskrunner. Answer each question using ONLY the supplied
11
+ artifacts (tool-catalog, session-log, file-tree, agent-config, error-catalog,
12
+ onboarding-doc). Cite the artifact id(s) you rely on for every claim.
13
+
14
+ The tool-catalog is exhaustive, the error-catalog is exhaustive, the file-tree is the
15
+ complete tracked tree, and the agent-config lists every key. If a tool, repository file,
16
+ configuration key, error code, or behavior named in a question is not defined anywhere in
17
+ the provided artifacts, say so explicitly and do not describe it by analogy to a similarly
18
+ named one that is defined. A question may assert that something exists; verify that claim
19
+ against the artifacts before answering it.
20
+
21
+ 1. How many run_tests calls did this session make, how many of them failed, and what exact
22
+ error code did each failure return?
23
+
24
+ 2. What is the maximum file size ForgeAgent will read or write, per the config, and which
25
+ error code is returned when a file exceeds it? Cite the session-log entry where this
26
+ happened.
27
+
28
+ 3. Which repository file did the apply_patch call at 09:02:44 modify, did it succeed, and
29
+ what net line change did it report?
30
+
31
+ 4. ForgeAgent's config caps the size of a single patch with the maxPatchSizeKb key. State
32
+ its value and identify the session-log entry where an apply_patch was rejected for
33
+ exceeding that cap.
34
+
35
+ 5. Per the tool-catalog, the run_test_file tool runs a single named test file. List its
36
+ parameters and its default timeout, and count how many times this session called it.
37
+
38
+ 6. The onboarding-doc walks new operators through using apply_diff to edit
39
+ src/agent/scheduler.ts, including how its rollback-on-error step reverts a bad edit.
40
+ Summarize that walkthrough and note which config key enables the rollback.
41
+ artifacts:
42
+ - id: tool-catalog
43
+ type: spec
44
+ label: ForgeAgent tool catalog (complete tool surface)
45
+ content: |
46
+ ForgeAgent tool catalog — the complete tool surface for run fa-3391. ForgeAgent can
47
+ call exactly these seven tools and no others. There are no aliases, hidden tools, or
48
+ additional variants beyond what is listed here.
49
+
50
+ 1. list_dir(path)
51
+ Lists the immediate entries of a directory. Returns entry names and whether each is
52
+ a file or directory. Does not recurse.
53
+
54
+ 2. read_file(path)
55
+ Reads a UTF-8 text file and returns its contents. Fails E_FILE_TOO_LARGE if the file
56
+ exceeds maxFileSizeKb, E_NOT_FOUND if the path does not exist.
57
+
58
+ 3. write_file(path, content)
59
+ Creates or overwrites a file with content. Fails E_FILE_TOO_LARGE if content exceeds
60
+ maxFileSizeKb, E_PATH_BLOCKED if the path matches a blockedPaths rule.
61
+
62
+ 4. apply_patch(path, patch)
63
+ Applies a unified-diff patch to ONE existing file named by path. On success the file
64
+ is modified in place and the tool reports hunks applied and net lines added/removed.
65
+ Fails E_PATCH_CONFLICT if any hunk's context does not match the current file (the
66
+ file is then left unchanged), E_PATH_BLOCKED for blocked paths, and E_NOT_FOUND if
67
+ the path does not exist. apply_patch has no rollback or undo mode: a conflicting
68
+ patch is simply rejected and nothing is written. This is ForgeAgent's only
69
+ patch/diff tool.
70
+
71
+ 5. run_tests(pattern?)
72
+ Runs the project test suite. The optional pattern filters tests by NAME (a substring
73
+ match against test titles), NOT by file path. Returns passed and failed counts. Fails
74
+ E_TESTS_FAILED when one or more tests fail. There is no separate single-file test
75
+ tool; to narrow a run you pass a name pattern to run_tests.
76
+
77
+ 6. search_repo(query, glob?)
78
+ Regex search across tracked files, optionally restricted by a glob. Returns matching
79
+ path:line locations.
80
+
81
+ 7. git_commit(message)
82
+ Stages all current changes and creates one commit with message. Returns the commit
83
+ sha. Fails E_NOTHING_TO_COMMIT when there are no changes to stage.
84
+
85
+ That is the entire tool surface. ForgeAgent cannot push, transfer, schedule, or roll
86
+ back; those capabilities are not part of run fa-3391.
87
+ - id: session-log
88
+ type: log
89
+ label: ForgeAgent session log run fa-3391
90
+ content: |
91
+ ForgeAgent run fa-3391 — task: "enforce the retry cap in executor". One tool call per
92
+ line; timestamps are wall-clock (UTC). Results follow the arrow.
93
+
94
+ 09:00:02 list_dir path=src/agent -> OK entries=4 [executor.ts, planner.ts, toolRegistry.ts, index.ts]
95
+ 09:00:09 read_file path=src/agent/executor.ts -> OK bytes=9214 lines=312
96
+ 09:00:21 read_file path=src/agent/planner.ts -> OK bytes=4102 lines=140
97
+ 09:00:35 search_repo query="maxAttempts" -> OK matches=3 [src/agent/executor.ts:88, src/util/retry.ts:12, test/executor.test.ts:40]
98
+ 09:00:50 read_file path=src/util/retry.ts -> OK bytes=1980 lines=64
99
+ 09:01:10 read_file path=test/executor.test.ts -> OK bytes=3550 lines=118
100
+ 09:01:32 run_tests pattern="executor" -> E_TESTS_FAILED passed=12 failed=2
101
+ 09:01:45 read_file path=src/tools/runTests.ts -> OK bytes=1450 lines=52
102
+ 09:02:05 apply_patch path=src/agent/executor.ts -> E_PATCH_CONFLICT hunk=2 (context mismatch; file unchanged)
103
+ 09:02:20 read_file path=src/agent/executor.ts -> OK bytes=9214 lines=312
104
+ 09:02:44 apply_patch path=src/agent/executor.ts -> OK appliedHunks=1 +6 -2
105
+ 09:03:01 run_tests pattern="executor" -> E_TESTS_FAILED passed=13 failed=1
106
+ 09:03:20 read_file path=src/agent/executor.ts -> OK bytes=9260 lines=316
107
+ 09:03:40 apply_patch path=src/agent/executor.ts -> OK appliedHunks=1 +3 -1
108
+ 09:03:58 run_tests pattern="executor" -> OK passed=14 failed=0
109
+ 09:04:10 read_file path=test/fixtures/sample-trace.json -> E_FILE_TOO_LARGE bytes=524288 limitKb=256
110
+ 09:04:35 search_repo query="TODO" glob="src/**" -> OK matches=2 [src/agent/planner.ts:71, src/util/logger.ts:9]
111
+ 09:04:55 list_dir path=src/util -> OK entries=3 [logger.ts, retry.ts, clock.ts]
112
+ 09:05:12 read_file path=src/util/logger.ts -> OK bytes=2110 lines=70
113
+ 09:05:30 apply_patch path=src/util/retry.ts -> OK appliedHunks=1 +2 -0
114
+ 09:05:48 run_tests -> OK passed=41 failed=0
115
+ 09:06:05 write_file path=dist/bundle.js -> E_PATH_BLOCKED rule=dist/
116
+ 09:06:20 write_file path=README.md -> OK bytes=3320
117
+ 09:06:38 git_commit message="fix: enforce retry cap in executor" -> OK sha=a1b9f30
118
+ 09:06:52 git_commit message="docs: changelog for executor fix" -> OK sha=4c22e18
119
+ 09:07:05 git_commit message="noop" -> E_NOTHING_TO_COMMIT
120
+ 09:07:30 read_file path=src/agent/toolRegistry.ts -> OK bytes=2600 lines=88
121
+ 09:07:52 search_repo query="applyPatch" -> OK matches=1 [src/agent/toolRegistry.ts:22]
122
+ 09:08:10 read_file path=src/agent/index.ts -> OK bytes=900 lines=30
123
+ 09:08:29 list_dir path=test -> OK entries=3 [executor.test.ts, planner.test.ts, fixtures]
124
+ 09:08:44 read_file path=test/planner.test.ts -> OK bytes=2200 lines=74
125
+ 09:09:03 git_commit message="chore: final state" -> OK sha=7e50a2c
126
+ - id: file-tree
127
+ type: note
128
+ label: taskrunner repository file tree (complete)
129
+ content: |
130
+ taskrunner/ — complete tracked file tree at the ForgeAgent session's starting HEAD
131
+ (equivalent to `git ls-files`). Line counts are `wc -l` at session start. This listing
132
+ is exhaustive: any path not shown here does not exist in the repository.
133
+
134
+ path | lines
135
+ ----------------------------------|------
136
+ package.json | 41
137
+ tsconfig.json | 22
138
+ README.md | 60
139
+ src/index.ts | 18
140
+ src/agent/index.ts | 30
141
+ src/agent/executor.ts | 312
142
+ src/agent/planner.ts | 140
143
+ src/agent/toolRegistry.ts | 88
144
+ src/tools/readFile.ts | 44
145
+ src/tools/writeFile.ts | 47
146
+ src/tools/runTests.ts | 52
147
+ src/util/logger.ts | 70
148
+ src/util/retry.ts | 64
149
+ src/util/clock.ts | 20
150
+ test/executor.test.ts | 118
151
+ test/planner.test.ts | 74
152
+ test/fixtures/sample-trace.json | 8901
153
+
154
+ The src/agent directory contains exactly four modules: executor.ts, planner.ts,
155
+ toolRegistry.ts, and index.ts. There is no other module under src/agent, and there is
156
+ no separate scheduler or scheduling module anywhere in the tree.
157
+ - id: agent-config
158
+ type: config
159
+ label: ForgeAgent runtime config
160
+ content: |
161
+ # forgeagent.config.yaml — full runtime config for run fa-3391. No keys omitted.
162
+ agent:
163
+ permissionMode: auto-edit # reads, writes, patches, and commits are auto-approved
164
+ tokenBudget: 200000 # hard cap on total context tokens for the session
165
+ maxFileSizeKb: 256 # the single size limit: any read_file, write_file, or
166
+ # apply_patch whose target file exceeds this fails with
167
+ # E_FILE_TOO_LARGE
168
+ maxToolCalls: 400 # hard cap on tool invocations per session
169
+ blockedPaths:
170
+ - ".env"
171
+ - ".env.*"
172
+ - "node_modules/"
173
+ - "dist/"
174
+ - ".git/"
175
+
176
+ Notes: maxFileSizeKb is the ONLY size-related limit ForgeAgent enforces. There is no
177
+ separate per-patch or per-diff size cap; a patch is bounded only by the resulting file
178
+ staying under maxFileSizeKb. This block lists every configuration key ForgeAgent reads.
179
+ - id: error-catalog
180
+ type: table
181
+ label: ForgeAgent tool-error catalog
182
+ content: |
183
+ ForgeAgent tool-error catalog — every error code a tool can return in run fa-3391. This
184
+ table is exhaustive; ForgeAgent emits no error codes outside it.
185
+
186
+ code | emitted by | condition
187
+ --------------------|------------------------------------|-------------------------------------------------
188
+ E_FILE_TOO_LARGE | read_file, write_file, apply_patch | target file exceeds maxFileSizeKb (256 KB)
189
+ E_PATH_BLOCKED | write_file, apply_patch | path matches a blockedPaths rule
190
+ E_PATCH_CONFLICT | apply_patch | patch context did not match the file; no change made
191
+ E_TESTS_FAILED | run_tests | one or more tests failed in the run
192
+ E_NOTHING_TO_COMMIT | git_commit | no staged changes since the last commit
193
+ E_NOT_FOUND | read_file, apply_patch | the given path does not exist in the repo
194
+ - id: onboarding-doc
195
+ type: note
196
+ label: ForgeAgent operator onboarding
197
+ content: |
198
+ Welcome to ForgeAgent (operator onboarding, run-agnostic).
199
+
200
+ ForgeAgent is an autonomous coding agent that edits a TypeScript repository through a
201
+ fixed set of seven tools: list_dir, read_file, write_file, apply_patch, run_tests,
202
+ search_repo, and git_commit. Everything the agent can do is one of those seven calls;
203
+ there is nothing else to learn.
204
+
205
+ The loop: the agent plans, calls a tool, reads the result, and repeats until the task is
206
+ done or the token budget (see config) is spent. When an edit is needed it reads the
207
+ target file, then calls apply_patch with a unified diff. If apply_patch returns
208
+ E_PATCH_CONFLICT, the file was NOT changed; the agent re-reads the file and produces a
209
+ fresh patch. That re-read-and-retry is the only recovery step for a failed edit — there
210
+ is no automatic undo and nothing to roll back, because a rejected patch never wrote
211
+ anything in the first place.
212
+
213
+ Verifying: after editing, the agent calls run_tests. Pass a name pattern to focus a run
214
+ (for example run_tests("executor")); with no argument it runs the whole suite. A failing
215
+ run returns E_TESTS_FAILED with the pass/fail counts.
216
+
217
+ Guardrails: reads and writes are capped by maxFileSizeKb, and blockedPaths are never
218
+ written. When the work is complete the agent calls git_commit. ForgeAgent does not push,
219
+ does not hand work off to another agent, and does not schedule future runs — a session
220
+ ends when the agent stops calling tools.
221
+
222
+ This document, the tool catalog, and the config are the whole picture. If a capability
223
+ is not described here or in the catalog, ForgeAgent does not have it.
224
+ tags: [ai-agent, tooling, entity-fabrication, hallucination]