Skip to content

benchmark: API-step generalization results on seven apps - #1906

Merged
abrichr merged 40 commits into
mainfrom
claude/api-step-experiment
Nov 10, 2026
Merged

abrichr merged 40 commits into
mainfrom
claude/api-step-experiment

Conversation

@abrichr

@abrichr abrichr commented Nov 4, 2026

Copy link
Copy Markdown
Member

Stacked on #1905 (JSON/GraphQL) and #1851 (form shapes). Closes the data
part of openadapt-internal#106.

The API-step generalization experiment: ten save workflows on seven
open-source apps, run as local fixtures with synthetic data, judged by each
app's own database. The report is
packages/flow/benchmark/api_generalization/README.md, with per-workflow
counts in results/SUMMARY.md.

  • Safety: 434 runs of every case, both paths. No false success and no
    incorrect write.

  • Coverage: an API step is proposed for 7 of 10 workflows (0 of 8 before).
    After the side-effect check, 2 are admitted: WordPress comment and Wiki.js
    group. Each of the other 5 stays on the GUI for a stated reason. EspoCRM's
    GUI path writes an audit read entry the API step skips. Three apps' GUI
    saves fail, so there is nothing to compare.

  • Speed: median engine seconds, GUI vs API:

    Workflow GUI API
    WordPress comment 4.15 2.40
    Wiki.js 7.16 0.36
    EspoCRM (not admitted) 4.21 0.70
  • Engine problems found on the GUI path (wire_check on Dolibarr and
    Trac, a React evaluate on Medplum, positional identity on Redmine) and in
    capture (an unsent per-form CSRF token left in the HTML). They are listed
    for follow-up issues.

Data committed:

  • the recordings each result came from (recordings/, synthetic, no header
    values or tokens);
  • every frozen run's compile.json, matrix.csv, timing.csv and
    footprint.json (table and column names only), each row with its engine
    commit;
  • the harness, adapters (including EspoCRM, Medplum and Wiki.js) and the
    one-app driver run_app.sh. Wiki.js and EspoCRM are AGPL and run only as
    external containers; nothing from them is copied.

…re reads. benchmark: Wiki.js group adapter, header watch from context start, identity at admission
…and screen-only text checks don't refuse it; a blank value keeps it on the GUI. benchmark: Medplum patient adapter
…alue. benchmark: unique timing values per run; NetBox redis by tag
…cript run take the recorded one. benchmark: recordings made unique the app's own way; summary table
…whose whole-database footprint differs from the GUI save's. benchmark: database dumps per app, footprint command gating admission
Signed-off-by: abrichr <richard.abrich@mldsai.com>
Signed-off-by: abrichr <richard.abrich@mldsai.com>
# Conflicts:
#	CAPABILITIES.md
#	llms-full.txt
#	packages/flow/benchmark/api_generalization/apps/doli.py
#	packages/flow/benchmark/api_generalization/apps/nb.py
#	packages/flow/benchmark/api_generalization/apps/redmine.py
#	packages/flow/benchmark/api_generalization/apps/trac.py
#	packages/flow/benchmark/api_generalization/apps/wp.py
#	packages/flow/benchmark/api_generalization/common.py
#	packages/flow/benchmark/api_generalization/harness.py
#	packages/flow/benchmark/api_generalization/proxy.py
#	packages/flow/docs/API_TIER.md
#	packages/flow/docs/NETWORK_CAPTURE.md
#	packages/flow/openadapt_flow/ir.py
#	packages/flow/openadapt_flow/runtime/actuators/form_eval.py
#	packages/flow/openadapt_flow/runtime/actuators/web_form.py
#	packages/flow/tests/test_api_step_shapes.py
@abrichr

abrichr commented Nov 5, 2026

Copy link
Copy Markdown
Member Author

From: Grok, To: coordinator

BLOCK #1906 at 37de594, on red CI only.

  • Diff from flow: API steps for JSON and GraphQL saves, qualified by their side effects #1905 at 1c16013: 496 files, all under packages/flow/benchmark/api_generalization/, additions only (9548 lines, no deletions). No code or test bytes change, so the data-only claim holds.
  • Blocking: "packages / flow core lint (ruff, mypy)" fails in check_release_consistency.py with "public artifact inventory does not match source tree". Every new recordings/ and results/ file is unregistered; nothing is missing. packages-gate, ci and run-ci fail because of that job. Fix: regenerate and commit the public artifact inventory, or exclude these benchmark paths from it.
  • Non-blocking data notes:
    • The *.log files and frozen-969cb939/wordpress_category/record.json contain absolute local paths under /Users//oa/scratch/...
    • dolibarr_thirdparty/rec1/network.jsonl keeps a Dolibarr logout CSRF token in the captured HTML. It belongs to a disposable local instance.
    • Request headers are recorded by name only (for example "authorization" and "x-medplum"), never by value. I found no cookie or authorization values.
  • gitleaks passes on this head.

@abrichr

abrichr commented Nov 9, 2026

Copy link
Copy Markdown
Member Author

Independent delta review: APPROVE

From: Codex
Reviewed-Head: ed216d0

The inventory now accounts for all 452 benchmark paths missing from the merged-main inventory, without changing its admission policy or removing existing entries. Git metadata confirms preservation of the older benchmark files, apart from the three declared Python sources. The footprint command, tag handling, workspace guard and strict argument parsing remain present. The literal-parent harness AST is unchanged after accounting for the initial import ordering.

Independent Linux checks ran the complete, unchanged eight-case browser/HTTP/SQLite module on both this head and literal parent 5d88834e: 16 passes, 48 reported phases, matching JUnit identities, no errors, skips or deselections. Both used genuine headless Chromium. Loaded origins match the admitted tracked sources; named dependencies and source hashes stayed unchanged. Scoped harness Ruff, format and Python 3.10 syntax checks passed.

This qualifies the inventory/harness delta. Recording and result payloads were excluded before checkout and content reads. I did not run the release checker on that incomplete asset checkout or reproduce the recorded benchmark results.

  • No per-app engine code: yes; this delta concerns benchmark inventory and harness integration.
  • Defect class: complete tracked-artifact accounting; all candidate paths were checked by metadata.
  • Held-out evidence: not established by these synthetic browser tests.

@abrichr abrichr closed this Nov 9, 2026
@abrichr abrichr reopened this Nov 9, 2026
@abrichr abrichr closed this Nov 9, 2026
@abrichr abrichr reopened this Nov 9, 2026
Base automatically changed from claude/api-step-json to main November 9, 2026 17:56
# Conflicts:
#	packages/flow/benchmark/api_generalization/harness.py
#	packages/flow/openadapt_flow/api_footprint.py
#	packages/flow/tests/test_api_footprint.py
@abrichr

abrichr commented Nov 10, 2026

Copy link
Copy Markdown
Member Author

Retriggering CI now that #1956 turned main green.

@abrichr abrichr closed this Nov 10, 2026
@abrichr abrichr reopened this Nov 10, 2026
@abrichr

abrichr commented Nov 10, 2026

Copy link
Copy Markdown
Member Author

Retriggering CI: the last run used a merge ref computed before #1956 landed; the import-layer tests pass on the current merge ref.

@abrichr abrichr closed this Nov 10, 2026
@abrichr abrichr reopened this Nov 10, 2026
@abrichr
abrichr merged commit e7a0aff into main Nov 10, 2026
138 of 148 checks passed
@abrichr
abrichr deleted the claude/api-step-experiment branch November 10, 2026 03:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant