Cloud baseline
anthropic/claude-haiku-5.5 · Build 1
anthropic/claude-haiku-5.5 · scorer forge-2.0
- Overall
- 0.0632
- Benchmark
- Forge 2.0
- Model build
- 16m 54s
Tier breakdown
Each bar is the tier's mean, from 0 to 1 (for E, its mean × the excellence gate). The percentage is the tier's share of the score. Mean × share, added over all tiers, is the tests earned figure below.
Scoring detail
How this score was built
Per-test scorer output, as posted by the app. Expand a section to inspect its tests.
The rules behind these numbers: Forge 2.0 requirements, weights and score caps.
The score, step by step
0.2526 tests earned × 1.0000 critical defects × 0.2500 reliability at the floor = 0.0632 final score
tests earned = 0.15 × 0.5058 v1 + 0.1767 v2 (out of 0.85)
v1 = 0.88 × 0.5438 tiers L–A + 0.12 × 0.6667 gate × 0.3412 excellence
Reliability: every tier in the breakdown above, except Excellence, is a group of tests. Each group of tests multiplies the score by 1 − 0.10 × the shortfall of its worst test: by 0.90 when that test fails completely, by 0.95 when it scores 0.5.
- L Lint and bundles: worst test
l_deployable, score 0 × 0.9000Already counted in this group: l_bundles_load, l_lint_warnings, l_manifest_rules, l_scopes
- K Platform currency: worst test
k_llm_model_current, score 0 × 0.9000Already counted in this group: k_widget_edit_bridge
- T Event pipeline: worst test
t_reestimate_followed, score 0 × 0.9000Already counted in this group: t_out_of_order, t_multi_sprint_parse
- R Reconcile: worst test
r_backfill_complete, score 0 × 0.9000Already counted in this group: r_removals_found, r_heal_dropped, r_pagination, r_rate_limit
- S Storage: worst test
s_index_order, score 0 × 0.9000 - B Resolvers and permissions: worst test
b_no_permission_leak, score 0 × 0.9000Already counted in this group: b_hidden_count, b_comment_adf_as_user, b_comment_exactly_once, b_realtime_payload_clean
- U UI function: worst test
u_ledger_table, score 0 × 0.9000Already counted in this group: u_widget_numbers, u_widget_chart, u_widget_edit_config, u_ledger_sort, u_issue_router, u_comment_flow, u_widget_live, u_llm_explain
- V Visual: worst test
v_widget_sizes, score 0 × 0.9000 - A Rovo: worst test
a_action_result, score 0 × 0.9000Already counted in this group: a_action_permissions
- R1 Migration: worst test
r1_v1_rows_migrated, score 0 × 0.9000Already counted in this group: r1_v1_rows_intact, r1_events_during_migration, r1_progress_visible
- R2 Dosing: worst test
r2_person_never_quota_refused, score 0 × 0.9000Already counted in this group: r2_background_share, r2_rate_limit_reaction, r2_backfill_complete
- R4 Changing world: worst test
r4_sprint_close_final, score 0 × 0.9000Already counted in this group: r4_move_new_board, r4_field_switch, r4_deleted_history, r4_permission_revoked
- R5 Admin panel: worst test
r5_panel_labels, score 0 × 0.9000Already counted in this group: r5_admin_actions_apply, r5_nonadmin_refused
- R6 CI web trigger: worst test
r6_unsigned_no_effect, score 0 × 0.9000Already counted in this group: r6_replay_once, r6_status_codes, r6_valid_applies, r6_secret_never_disclosed
- R7 Custom field: worst test
r7_values_fresh, score 0 × 0.9000Already counted in this group: r7_writes_accepted
- R8 Forge LLM: worst test
r8_tool_call_scope, score 0 × 0.9000Already counted in this group: r8_failure_handling, r8_cost_controls
- R9 Boot budget: worst test
r9_sprint_boot, score 0 × 0.9000Already counted in this group: r9_widget_boot, r9_admin_boot
- R10 Native JQL: worst test
r10_initial_membership, score 0 × 0.9000Already counted in this group: r10_precomputation_refresh, r10_shared_permissions, r10_empty_and_closed
At the floor: the groups multiply to less than 0.25, and together the groups never take the score below 0.25 of what the tests earned, so reliability stays at 0.25. A critical defect still multiplies on top.
v1 is this run's score on the tests carried over from Forge 1.0: 15% of the total. v2 is the requirements R1–R10, each at its share of the score: the other 85%. Critical defects multiply the whole score, and so does each group of tests, by 1 − 0.10 × the shortfall of its worst test.
Excellence gate 0.6667: the average of the 18 conditions below, each counted at the value shown. Green is met in full; red is not, and lowers the gate. The 3 excellence tests are paid in proportion to the gate; together they are 1.8% of the total.
Earned score 0.0632 · Cap 0.499 · Final score 0.0632
Under a cap the final score is min(earned, cap − 0.05 × (1 − earned)): always below the cap, and closer to it the more the run earned. With no cap it is the earned score. Avoiding a cap adds no points.
- Maximum 0.499Lint errors, or manifest functions that do not bundle and load.Failed:
l_deployablel_bundles_load
Forge's own linter reports no errors (warnings cost points), every manifest function bundles and loads, packages resolve at the kit's pins, the manifest rules the linter misses, and only the scopes the app's calls need.
l deployable
0.00lint: 1 error(s), stage ResourcesValidator/26: ["missing resource 'src/frontend/admin.jsx' is being referenced by 'admin' in resources"]
l bundles load
0.505/10 functions bundle, load and export their handler; failing: {'on-issue-deleted': 'Handler "onIssueDeleted" is not an exported function of src/index', 'migrate': 'Handler "migrate" is not an exported function of src/in
l lint warnings
0.005 distinct lint warning(s): ['Cannot find exported function "adminResolver", which is required by module "admin-resolver" handler defined in your app\'s manifest.yml file', 'Cannot find exported function "ciWebtrigger",
l real packages
1.0010/10 bundles resolve @forge/* at the kit pins only
l manifest rules
0.83335/6 manifest rules met: referenced_functions_exist_and_export
l scopes
0.50scopes: missing [], extra ['read:app-data:jira', 'write:app-data:jira']
Current modules and APIs: dashboards:widget with its edit API, the rovo:skill and rovo:mcp wiring, a Forge LLM model the platform lists as active, no /rest/api/3/search, no @forge/api storage, a nodejs22.x or nodejs24.x runtime, the consumer shape, the declared KVS entity, and deploy readiness: a manifest and permissions real Forge would accept and no code predicted to fail there.
k dashboard widget
1.00dashboards:widget 2/2: {'custom_ui_resource': True, 'edit_resource': True}
k widget edit bridge
0.753/4 board picks reached the dashboard through the widget edit API (updateConfig/onProductSave)
k rovo skill
1.00rovo:skill 7/7:
k current apis
1.00current APIs 5/5:
k consumer shape
1.00consumer shape 3/3
k entity declared
1.00entities with a sprint-partitioned, ranged index: ['scope-change', 'scope-ledger', 'sprint-issue']
k v2 surfacesdiagnostic, no weight
1.00v2 surfaces declared: ['jira:adminPage', 'webtrigger', 'scope-ledger']
k rovo mcp
1.00rovo:mcp 4/4:
k llm model current
0.00vacuous — precondition unmet: >= 1 LLM call
k manifest semantics
1.00deploy readiness, manifest + permissions: 17 rules checked, none failing here
k runtime risks
1.00deploy readiness, predicted runtime failures: 10 rules checked, none failing here
Issue updates flow trigger to queue to consumer: one ledger row per change under duplicate, reordered, dropped and concurrent deliveries, multi-sprint changelog values, re-estimates followed, Retry-After honoured, no user context in background work.
t trigger handoff
1.001023/1023 deliveries handed off correctly
t event rows
1.00event rows: 170/170 exact (precision 1.00, recall 1.00)
t no double count
1.00every change holds at most one ledger row in every phase (duplicated deliveries included); 7041 concurrent group(s) raced (independent 7010, same-event 22, same-issue 9)
t out of order
0.7333worst of 3 scoring sites (seed 3c04f61f28a4a511): permuted deliveries: 11/11 rows exact, 0/4 sprints with oracle numbers
t multi sprint parse
0.3511worst of 3 scoring sites (seed 3aaa6d6b73d37669): 46/131 multi-id Sprint changes recorded exactly
t reestimate followed
0.000/6 re-estimated sprints show the oracle numbers
t retry after honoured
1.00InvocationError retryAfter 30s >= 30s
t no user in async
1.00background work is asApp only
The first scheduled run starts the backfill of every change since each active sprint started, removals included; later runs heal what the event stream missed and a run with nothing new writes nothing; they page through results in each endpoint's own style, never retry before Retry-After and finish inside the module timeout, queue continuations included.
r backfill complete
0.000/130 historical changes v1 never recorded, recorded one virtual hour after the upgrade (the backfill is dosed; v1 rows are R1's, at 2 h)
r removals found
0.000/24 removed-to-backlog changes found
r heal dropped
0.000/4 dropped changes healed exactly once; 0 other row(s) added
r pagination
0.9524worst of 3 scoring sites (seed 3aaa6d6b73d37669): 40/42 reads the site served in two or more pages walked to their end through the cursors the site offered (/rest/agile/1.0/board 14/14, /rest/agile/1.0/board/{id}/sprint
r rate limit
0.00run 2 (backfill) request 2: the invocation threw/timed out on the 429 (platform backoff, not Retry-After): The schema provided does not exist
r as app
1.00170/170 Jira calls of the scheduled runs and their queue continuations asApp (scheduled 170)
r completes in timeout
1.0016/16 invocations of the scheduled runs and their queue continuations inside their module timeout (scheduled 16)
r idempotent rerun
1.000 ledger write(s) (scope-ledger) on a no-change run over 170 rows
Forge KVS with the storage scope, ledger reads through the declared entity index in change-time order, no KVS limit errors.
s storage scope
1.00KVS used, no 403 from the KVS proxy
s entity index used
1.0023/23 ledger reads are entity queries on a declared index
s index order
0.00vacuous — precondition unmet: table rows rendered
s limits
1.00no KVS limit errors
Every invoked resolver exists and answers structured errors, nobody sees changes to issues they cannot browse (not on screen, not in an LLM prompt, not in a Realtime payload), the hidden-change count is right, and each click posts exactly one ADF comment as the viewer.
b invoke contract
1.0028/28 invokes returned a defined, structured result; a Jira 500 on sprintLedger's read: handled
b no permission leak
0.00vacuous — precondition unmet: >= 1 person-facing change list returned or rendered
b hidden count
0.000/18 hidden counts equal the oracle
b comment adf as user
0.00vacuous — precondition unmet: >= 1 comment POST
b comment exactly once
0.00vacuous — precondition unmet: >= 1 comment POST
b realtime payload clean
0.00vacuous — precondition unmet: >= 1 realtime publish
The dashboard widget's numbers and chart, its board choice saved through the host, live updates through Forge Realtime, the sprint action's ledger table, sorting, issue links, comment flow, the Forge LLM explanation, close and not-started states.
u widget loadsdiagnostic, no weight
0.000/8 configured widget views render a sprint with its numbers
u widget numbers
0.25widget numbers: 2.00/8 views exact (sprints by startDate, four §1 numbers each)
u widget chart
0.252/8 charts on one linear scale within 1px; ['no single svg[data-testid=chart]', 'no single svg[data-testid=chart]']
u widget edit config
0.50edit/config 5/10: pick0_view_shows_board, pick0_reopen_pressed, pick1_view_shows_board, pick2_view_shows_board, second_instance_own_board
u ledger table
0.00ledger tables: 0.00/6 exact (rows, cells, default order)
u ledger sort
0.00vacuous — precondition unmet: table rows rendered
u issue router
0.00vacuous — precondition unmet: table rows rendered
u comment flow
0.00required app surface absent: post-summary flow
u modal close
1.006/6 close clicks reached bridge close
u not started
1.00future sprint shows not-started only
u widget live
0.00vacuous — precondition unmet: widget rendered sprints
u llm explain
0.00vacuous — precondition unmet: explain control rendered
Atlassian design tokens with 4.5:1 contrast in light and dark, a painted surface, no Content Security Policy violations or console errors, and the widget readable at 380 px wide.
v theme tokens
1.0017/17 surfaces themed with --ds-text* at >= 4.5:1
v dark mode
1.0017/17 surfaces paint a --ds-surface* background in their mode
v csp clean
1.000 CSP violation(s), 0 failed asset request(s)
v console clean
1.000 console/page error(s) on nominal scenarios: []
v widget sizes
0.00vacuous — precondition unmet: widget rendered sprints
The get-sprint-scope action returns exact numbers and the visible changes for the invoking person, returns errors instead of throwing, and the skill's SKILL.md tells the agent how to use it.
a action result
0.000/5 active sprints answered exactly
a action errors
1.002/2 bad sprintId inputs return {error} without throwing
a action permissions
0.000/12 per-person answers list exactly what that person may browse
a skill instructions
1.00SKILL.md body 5/5: result fields named ['sprintName', 'committed', 'added', 'removed', 'creepPercent', 'hiddenChanges', 'changes']
Few Jira requests in the first scheduled run and per relevant change in triggers and consumers, and surfaces that paint after one round trip — paid only in proportion to the excellence gate.
e reconcile economy
0.00mean over 3 scoring sites: backfill incomplete — economy is not credited on unfinished work
e event economy
0.0235mean over 3 scoring sites: 25682 Jira calls (by lineage, every phase) / baseline 214 (213 delivered relevant change(s) x 1 read + 1 forced 429 repeat; a normalizer, not a reachable optimum) = 120.01x; 1.0 at <= 2.86x; 0
e ui round trips
1.00mean over 3 scoring sites: round trips before first paint: {'widget-view': 0, 'widget-edit': 1, 'sprint-action': 1}
Every v1 row moves to the new scope-ledger entity exactly once, with its change id and time, while events keep flowing and across invocation limits, within 2 virtual hours of the upgrade, with its progress in the admin panel; v1's entity stays intact.
r1 v1 rows migrated
0.00h2: 0 of 59 v1 rows in scope-ledger with the source attributes recorded by the probe; missing 59 (e.g. ('1441258', '808'), ('1441280', '916'), ('1441287', '947') (+56))
r1 v1 rows intact
0.00vacuous — precondition unmet: v1 source is intact but no v1 row reached scope-ledger
r1 events during migration
0.9787worst of 3 scoring sites (seed 3aaa6d6b73d37669): 46 of 47 changes made while the migration ran are in scope-ledger at the end; missing e.g. ('1487324', '1027')
r1 progress visible
0.00required app surface absent: jira:adminPage as a UI Kit panel (the migration progress lives in the admin panel) — BUILD_FAILED: Could not resolve "/Users/workhorse/goose-builds/forge2-repair-campaign-profile-resource-own
On a site of about 1,000 issues, background work stays inside its share of the 2,400-point hour, no person-facing request meets a quota 429, and Retry-After and RateLimit-Reason (quota, burst, per-issue write) decide every retry; the backfill still completes.
r2 background share
0.6962worst of 3 scoring sites (seed 3c04f61f28a4a511): 55 of 79 hours kept background within 70 % (1680 points; the contract default; the probe recorded no change); busiest hour 2577; over in hours 4, 5, 6 (+21); mandatory fi
r2 person never quota refused
0.0014 of 219 person-facing requests refused for quota (e.g. /rest/agile/1.0/sprint/{sprintId}, /rest/agile/1.0/sprint/{sprintId}, /rest/agile/1.0/sprint/{sprintId} (+11))
r2 rate limit reaction
0.0098worst of 3 scoring sites (seed 3c04f61f28a4a511): 10 of 1016 429s answered by their reason (quota: all background paused; burst: the endpoint; per-issue: the issue); broken: jira-quota-tenant-based at 1793277017265 ms: 1
r2 backfill complete
0.000 of 130 pre-upgrade changes v1 never recorded are in scope-ledger, right; missing 130 (e.g. ('1442411', '808'), ('1442434', '808'), ('1442461', '808') (+127))
Work longer than one invocation continues in the next, no function waits past its limit (a long Retry-After is handed back, not waited out), and a killed invocation leaves no duplicate.
r3 never killed
1.009 of 9 functions never exceeded their limit
r3 long retry after deferred
1.00372 of 372 invocations handed a Retry-After longer than their limit stopped and resumed later (results: error, ok, retry)
r3 no duplicate rows
1.00every (changeId, sprintId) appears once at each of 7 checkpoints; 7041 concurrent group(s) raced (independent 7010, same-event 22, same-issue 9)
Sprints close, issues move to another board's sprint, a board's estimation field changes, issues are deleted and a person loses browse permission while the app runs; the ledger and every view come out right.
r4 sprint close final
0.000 of 1 closed sprints kept exactly their final ledger; sprint 977: 22 rows gone (e.g. ('1444278', '977'), ('1444351', '977') (+20))
r4 move new board
0.000 of 17 cross-board moves recorded with the new board's estimate; BILL-182 (1442633): removed row wrong/missing, added row wrong/missing (estimate none, want 0)
r4 field switch
0.000 of 42 rows after the switch use the new field; 0 of 20 earlier rows keep their estimate; wrong after: ('1453658', '1026'), ('1455633', '1026'), ('1455746', '1026') (+39); wrong before: ('1447402', '1026'), ('1447531',
r4 deleted history
0.000 of 2 rows of deleted issues kept as history with deleted: true; erased ('1444807', '977'); not flagged ('1452646', '1026')
r4 permission revoked
0.00vacuous — precondition unmet: no request after the browse revoke showed any ledger data, so hiding proves nothing
A jira:adminPage built in UI Kit with the contract's controls, and every admin resolver checking Jira's ADMINISTER permission on the server, never trusting the payload.
r5 panel labels
0.00required app surface absent: jira:adminPage as a UI Kit panel — BUILD_FAILED: Could not resolve "/Users/workhorse/goose-builds/forge2-repair-campaign-profile-resource-owner-revision-4/tmp/forge2-score-6du2udfo/app/src/fr
r5 admin actions apply
0.00required app surface absent: jira:adminPage as a UI Kit panel — BUILD_FAILED: Could not resolve "/Users/workhorse/goose-builds/forge2-repair-campaign-profile-resource-owner-revision-4/tmp/forge2-score-6du2udfo/app/src/fr
r5 nonadmin refused
0.00required app surface absent: jira:adminPage as a UI Kit panel — BUILD_FAILED: Could not resolve "/Users/workhorse/goose-builds/forge2-repair-campaign-profile-resource-owner-revision-4/tmp/forge2-score-6du2udfo/app/src/fr
Signed deployment events: a missing or wrong signature, a tampered body or a stale timestamp is refused with no effect, a replay applies once, a valid event records the deployment, and the secret is never disclosed.
r6 unsigned no effect
0.00vacuous — precondition unmet: no valid event had an effect, so a refusal proves nothing
r6 replay once
0.00vacuous — precondition unmet: concurrent pair statuses 500, 500 did not demonstrate one 202 and one 200
r6 status codes
0.000 of 10 cases answered with their status; wrong: valid: 500 (want 202), replay: 500 (want 200) (+7)
r6 valid applies
0.000 of 3 validly signed events accepted (202) and recorded as `Deployed to <env>` on every ledger row of the issues they name; valid: status 500, header-case: status 500 (+1)
r6 secret never disclosed
0.00required app surface absent: jira:adminPage as a UI Kit panel (where the CI secret is rotated) — BUILD_FAILED: Could not resolve "/Users/workhorse/goose-builds/forge2-repair-campaign-profile-resource-owner-revision-4/tmp
The read-only scope-status field holds committed or added +points for an issue in an active sprint, removed for one that has left an active sprint since that sprint started, and nothing for any other issue, written in bulk through Jira's app field-value API and fresh within the virtual hour.
r7 values fresh
0.00mean over 7 checkpoints; worst h1: 0 of 333 issues right; AUTH-10 None (want committed); AUTH-107 None (want committed)
r7 writes accepted
0.00vacuous — precondition unmet: the app wrote no field value
Tool calls validated against the viewer's sprint scope, back-off on a 429 without Retry-After, answers with no finish reason refused, a 10-minute cache, and the admin's kill switch and daily token budget enforced on the server.
r8 tool call scope
0.000 of 2 manipulated calls respected function and visible sprint scope; tool-injection: no [data-testid="explain"] control, wrong-function: no [data-testid="explain"] control (+1)
r8 failure handling
0.00vacuous — precondition unmet: no LLM failure case reached a model call
r8 cost controls
0.00vacuous — precondition unmet: the app never called the model, so making no call proves nothing
The widget and the sprint action each make at most one invoke and load at most 150 KB before their first data paint, with no external origin; the admin page renders after one invoke.
r9 widget boot
0.6667widget-view: 0 invoke(s) before first paint (<= 1), 244622 bytes of JS+CSS (<= 153600), 0 external request(s)
r9 sprint boot
0.00sprint-modal: never reached its first paint, so no boot budget was met
r9 admin boot
0.00required app surface absent: jira:adminPage as a UI Kit panel — BUILD_FAILED: Could not resolve "/Users/workhorse/goose-builds/forge2-repair-campaign-profile-resource-owner-revision-4/tmp/forge2-score-6du2udfo/app/src/fr
scopeChanged(sprintId) is a jira:jqlFunction returning native issue predicates from the ledger. Jira shares its precomputed expansion across users, applies each viewer's browse permissions, and keeps the same cached mapping fresh through the documented precomputation update API after changes and reconciliation. Empty, future and closed sprints, IN and NOT IN, and invalid arguments are checked by running actual native JQL.
r10 manifest
1.00scopeChanged manifest declares issue IN/NOT IN, required sprintId, and bound function
r10 initial membership
0.000/24 initial_membership cases correct; initial: missing=['34241', '34345', '34355'], extra=[], invoked=1; cache: missing=['34241', '34345', '34355'], extra=[], invoked=1
r10 precomputation refresh
0.000/24 precomputation_refresh cases correct; refresh: missing=['34241', '34345', '34355'], extra=[], invoked=1; refresh: missing=['34100', '34101', '34108'], extra=[], invoked=1
r10 shared permissions
0.00JQL disclosure not observed: 0/72 shared_permissions cases correct; shared-user: missing=['34241', '34345', '34355'], extra=[], invoked=1; shared-user: missing=['34241', '34345', '34355'], extra=[], invoked=1
r10 empty and closed
0.000/4 empty_and_closed cases correct; empty: missing=[], extra=[], invoked=1; empty: missing=['34100', '34101', '34108'], extra=[], invoked=1
r10 invalid arguments
1.004/4 invalid_arguments cases correct
Run notes and corrections
Canonical native verdict summary reports $0.66878766, 17 billed generations and 2176513 prompt / 2002777 cached / 203072 completion tokens. Per-call request and invoice correspondence remains an observation; no independent raw invoice audit is claimed.
Graded browser recording
Loading duration…Watch the full graded browser recording at its original speed: the dashboard widget, the sprint action, the not-started sprint and the Forge LLM cases, as the scorer drove them on the run's own seed, the first of the three scoring sites. The test results and screenshots on this page provide the wider evidence. Pause or scrub to inspect a view.
The UI Kit admin panel is not in the recording: it is graded from its component tree.
Drag the timeline to seek. Keyboard: arrow keys move 5 seconds; Home and End jump to the start and end.
SHA-256: 88597236cd12307ef63c79ffd85cdf46a3758143d1637cee802c7db243f04cce
Screenshots
Pictures from one of the three scoring sites, the one on the run's own seed. The dashboard widget and the sprint action are captured from the built app in a browser during grading. A test keeps the score of its worst site (the excellence measurements keep their mean), so a test can fail on a site these pictures do not show. A detail that opens "worst of …" names the seed of the site the test scored worst on, which can be the pictured one.
Run details
- Model
- anthropic/claude-haiku-5.5
- Engine events
- 0
- Repair rounds
- 0
- Started
- Oct 14, 2026, 11:17 AM
- Finished
- Oct 14, 2026, 01:13 PM