Skip to content

research: measure whether Madar reduces work on supported coding tasks #754

Description

@mohanagy

User story

As a developer, I want a fair comparison of completing representative tasks with and without Madar, so that I can decide whether adding it is worthwhile.

Status

CLOSED — corrected execution v2 finished with an INCONCLUSIVE outcome (11 September 2026). All nine cells ran. Five review passes have no outstanding finding; two recorded Got passes have correctness withheld after a source audit found an options-absent serialization defect; two reviewers timed out without a verdict. The required native comparison is incomplete, and all six Madar-enabled authors left its context tools unused.

The bounded study is complete. Madar's main usefulness goal remains unproven; this is neither positive qualification nor proof of technical impossibility. No automatic rerun or repair chain follows. See the v2 terminal report for every cell, the static finding, exact versions, timing, usage and limitations.

V1 remains separately inconclusive. Its artifacts and results were preserved, and none of its author scores entered v2. The historical experiment contract below is retained for traceability, with the authorized v2 execution amendment and terminal report recording what actually happened.

Acceptance criteria

  • Before author runs, verify the identities below and seal the common task prompts, behavioral checks, commands, dependency identities and execution settings. Record preparation failures.
  • Apply the same behavioral correctness criteria and ordinary tools to all conditions. Include setup, indexing, source reading, errors and verification in elapsed time and work records.
  • Report all nine v2 scheduled attempts, including failures, unused Madar tools, missing measurements and per-task regressions. V1 results remain preserved separately.
  • End v2 with scoped benefit, no demonstrated benefit, or inconclusive using the rules below. No retries, threshold changes, replacement tasks or automatic repair chain.

The completed checklist records execution and transparent reporting, not product success. Missing review verdicts and the final static finding are retained in the terminal result.

Conditions and exact versions

Condition Identity Role
N — Native Codex CLI with ordinary local source-reading, editing and test tools; no Madar server Primary comparator
M — Madar main 3371ada8425efa7f8cabdac781fa227feaea7a6a Historical implementation control selected by #753
C — Madar next 2b144504ddf924d64cce51db601bb599be0b6c44 Candidate selected by #753; primary comparison is C versus N

Both Madar commits declare package version 0.32.1, so use commit, tree and built-artifact identities rather than the package label. #742 changed documentation after C; do not silently move C to a newer branch tip. Report M against N and C as secondary observations; do not select a winner after seeing results.

Use Node 22.22.3, Codex CLI 0.153.4, requested model gpt-5.6-sol, reasoning xhigh, service tier default. Node and CLI versions were checked locally on 11 September; model availability was observed in prior execution evidence and is not freshly tested by this plan. Preserve the requested model and any returned model identity; if the service does not report an exact backend revision, disclose that limitation.

Use the included ChatGPT subscription only: no API-key authentication, paid API, purchased credits, reset redemption, billing change or Actions workflow. Verify the authentication route and available subscription allowance in preparation without exposing credentials. Stop if the selected route/settings are unavailable; no silent model or provider substitution.

Reuse the existing direct codex exec --json execution and raw-event capture facilities. Use one fresh author session per attempt and no investigation/review/coding pipeline. Codex CLI owns any future test materialization and task implementation. This issue does not authorize a new evaluator platform.

Frozen task specifications

These are proposed feature requests for local comparison, not claims of upstream maintainer demand or permission to publish patches upstream. Give every author the same task text and ordinary repository instructions. Preparation-only source-navigation notes and prior result artifacts stay outside author workspaces.

T1 — Yup: UTF-8 byte limit

Repository: jquense/yup, commit ff31eee8a2b10c938bb3a22544d9e33957a8cf01.

Add string().maxBytes(limit, message?) to validate the UTF-8 encoded byte length after normal Yup transformations. Support a numeric limit or numeric Yup reference. Empty strings pass a zero limit; absent values retain existing optional/nullable behavior. Use standard UTF-8 replacement for unpaired UTF-16 surrogates. Repeated maxBytes calls replace the earlier constraint. Provide a default locale message and custom string/function messages receiving the resolved maxBytes parameter. Keep max() unchanged. Add focused public API tests and a short API documentation entry. Use browser-compatible code without a new dependency or Node Buffer.

The common checks cover ASCII, accented text, emoji, combining marks, a lone surrogate and empty strings; exact limits and one-byte overflow; sibling/context references; transformed versus strict validation; optional/null values; repeated constraints; locale/custom-message parameters; sync/async behavior and unchanged max(). Limit checks to these public behaviors, not an expected implementation.

T2 — Yup: flatten validation errors

Use the same Yup commit, starting from pristine source independently of T1.

Add ValidationError#flatten() returning { formErrors, fieldErrors }. Collect messages from leaf errors in their existing order. Missing/empty paths belong in formErrors; other paths are literal fieldErrors keys, including items[0].name. Retain duplicates and exclude aggregate parent summaries when children exist. Without children, use the error's own messages. Preserve configured message values without string coercion. Return fresh containers/arrays without modifying the error. Treat proto and constructor as ordinary path keys. Support errors produced with or without disableStackTrace, through synchronous and asynchronous validation. Keep existing construction and serialization behavior unchanged. Add focused tests and a short API documentation entry.

The common checks cover root/field errors, nested object/array failures with abortEarly:false, ordered duplicates, root plus field failures, aggregate-summary exclusion, both stack modes, special path keys, fresh arrays, non-string messages and sync/async parity.

T3 — Got: bounded JSON error projection

Repository: sindresorhus/got, commit 687eb7dcc100ea3e548ebba227173b886789e670.

Add RequestError#toJSON() for structured logging. Return a fresh plain object containing name and code, plus method and url when available, and statusCode when a response exists. The URL retains protocol, host, port and path while omitting username, password, query and fragment. Omit unavailable fields. Exclude message, stack, input, headers, bodies, options, request, response, timings and cause. Do not alter existing error properties or mutate the underlying URL. Existing RequestError subclasses inherit this behavior. Direct calls and JSON.stringify(error) produce the projection. Add focused tests and a short API documentation entry. Keep HTTP execution and retries unchanged.

The common checks cover an error with normalized options and no response; HTTPError subclass fields/status; absent URL; URL filtering without mutation; additional enumerable data and circular cause exclusion; fresh objects; serialization parity; and the existing public localhost HTTP error path. No external endpoint is needed.

These prompts differ from the previously inspected Yup tuple-recursion and class-identity tasks. The repos were in the earlier comparison pool, and wider exposure was not exhaustively audited. Do not relabel them repository holdouts or training-fresh tasks. There are two Yup tasks and one Got task: report that limited diversity.

Preparation and fair execution

One bounded preparation phase must verify source/lockfile hashes, available dependency snapshots and both Madar builds using their pinned locks. Yup is version 1.7.1 and pins Yarn 4.10.0; its observed yarn.lock SHA-256 is b577c728675c5872d952549d8640770d80ad3c34c790272150e1616b19822494. Got is version 16.0.0, requires Node >=22, and has no tracked root dependency lockfile or node_modules in the selected source. Preparation must identify and seal an existing usable Got dependency snapshot, with package versions and content identity; dependency readiness is not established. Do not resolve changing latest versions separately for different conditions.

Materialize the common focused checks outside author access, with one Codex CLI preparation session. Confirm expected missing-feature failures at baseline, validate the expectations against the public semantics and parsed source, and record a small relevant unchanged-regression selection for each repository. Include typechecking of the new public API. A red unrelated baseline check must be named in advance, not discovered and excused after scoring.

If those checks, dependencies, isolation or existing execution facilities cannot be made ready within preparation's limit, stop with an inconclusive preparation result. Do not replace a task, repair Madar or enlarge the harness. The current plan makes no claim that these checks already exist, pass, or fit the execution deadline.

Each attempt starts from a separate pristine source snapshot and the same immutable local dependency supply. No retained Madar graph/index, target build cache, task history, author memory or another attempt's patch enters it. Keep unavoidable OS/provider cache effects visible; cold application state is not a claim of cold hardware or model cache.

N has ordinary tools. M and C have those same tools plus their pinned public Madar stdio MCP server, default-auto graph mode and the same short capability orientation. Preserve each version's shipped defaults; freeze configuration during preparation and do not tune retrieval for individual tasks. Tool use is optional; source reading and follow-up verification are allowed and counted. Disable unrelated personal plugins/memory/hooks equally, preserve common repository instructions and applicable execution rules, and verify tool configuration before authors start. Never expose the planned checks or earlier answers to one condition only.

Run serially in this fixed balanced order:

Task First Second Third
T1 N M C
T2 M C N
T3 C N M

No pilot attempt is a warm-up. No model/session is resumed across conditions. Authors receive their time limit and a direction to submit their best current patch and verification results before it expires. No fixed shell-call count is used as success or as an undisclosed cutoff.

Correctness, time and work

Freeze each submitted patch as-is. One fresh independent reviewer per attempt sees the task, pristine baseline, anonymously labelled patch and common behavioral checks, without the condition, author transcript or other patches. Reviewers assess behavior, regressions, public API/types, requested documentation and scope. Reviewers do not repair patches or coach authors. Run the same prepared checks on each submission and retain their raw results.

A correct completion meets every task behavior, the new API type checks and the predetermined relevant regression checks, with no material behavior regression. An incorrect feature or invented verification result fails. Ordinary ignored build outputs do not themselves fail correctness; deleting or changing source/tests to evade checks does. Keep any failed original submission unchanged.

Measure elapsed time from per-attempt workspace preparation through author completion and its independent verification/review, including provider setup/indexing, tool waits, source reading, author tests and errors. Run each attempt and its review consecutively; include any intervening coordination delay. Also report setup, author and review durations separately.

Record each shared preparation interval once, with disjoint categories. Allocate target-repository preparation equally to its scheduled attempts (six Yup attempts, three Got attempts), and each Madar version's install/build preparation to that version's three attempts. These allocations redistribute measured time; never add an allocated interval again as per-attempt setup or duplicate it in campaign totals. Common check creation and final experimental reporting are study overhead, excluded from the primary task-time ratio but included separately in complete campaign time/work totals. Report both the whole campaign clock and per-attempt clocks.

Record raw input, cached-input, output and reasoning counters when returned, without double-counting cached input or reasoning components. Report tool calls and follow-up reading descriptively. Token counts are work proxies, not dollars; do not translate them using API prices or claim equal monetary cost from missing billing measurements. Review/preparation usage must be included in campaign totals. Report missing counters explicitly; no token-savings claim without comparable counters.

Decision fixed before results

Primary time measure: each task's C/N ratio of task execution, independent verification/review and allocated product setup. Common check creation and final experimental reporting are excluded from this ratio and disclosed as study overhead above. These are practical decision thresholds chosen for this pilot, not an industry standard or a statistical confidence bound. Any benefit claim is about elapsed task time; work proxies and their tradeoffs remain separate reported results.

Apply decisions in this order: first assess the validity of the primary comparison. Invalid common expectations or primary measurement, an unresolved infrastructure interruption, or fewer than three correct N completions makes it inconclusive. If that comparison is valid, any C correctness failure or observed product timeout/noncompletion means no demonstrated benefit; such a failure is not missing timing merely because there is no successful completion time. Compute time thresholds only when all three C and N attempts completed correctly. A failure isolated to secondary M does not automatically invalidate C versus N.

  • Scoped benefit observed: all three C and all three N tasks complete correctly; median C/N ratio is at most 0.80; C is faster on at least two of three tasks; no C task is more than 20% slower; timings and required allocations are complete. Actual Madar use must occur in the C tasks supporting the benefit. If the time criteria pass without that use, Madar attribution is inconclusive; report the Madar-available workflow observation separately.
  • No demonstrated benefit: execution and measurement are valid, but C has a material correctness regression or does not meet those time thresholds. Preserve individual successes and failures.
  • Inconclusive: preparation, common-check validity, missing primary measurements, quota/infrastructure interruption or insufficient correctly completed N tasks prevents the defined comparison. Distinguish a product timeout/crash observed with valid measurement from an ambiguous infrastructure failure; do not discard either.

Report secondary M results even if unfavorable. Fewer tool calls, a correct graph, green retrieval tests or a passing retry cannot substitute for these criteria. Missing secondary token counters limit work claims; they do not silently invalidate a fully measured time-only conclusion. No statistical-significance, repeatability, universal trust or competitor ranking follows from one attempt per cell.

Finite budget and stopping boundary

The future pilot has at most 19 Codex CLI sessions: one preparation session, nine authors and nine independent reviewers.

  • Preparation: 45 minutes total, including at most 30 minutes of preparation CLI work.
  • Each per-attempt setup plus author: 20 minutes maximum.
  • Each independent verification/review: 5 minutes maximum.
  • Coordination/final reporting: 30 minutes maximum.
  • Entire campaign: 5 hours maximum, including preparation and reporting. Stop sooner if subscription allowance is unavailable.

Stop an attempt at its limit and retain its current result. Continue other scheduled attempts only within the remaining original budget; report any unstarted cells. No retries, author continuations, replacement tasks, threshold edits, API fallback, added sessions or extra diagnostic runs. Missing review at its deadline is unverified, not a pass. A failure does not start fixes under #697/#739/#710/#755/#756.

Before a later authorized execution, attach the compact preparation record containing the exact task/check/command hashes and verified environment identities. Preparation is part of the fixed budget, not a new project. Publishing this plan does not lift the existing execution pause.

Historical #736/#740 outcomes and their original criteria remain unchanged. Other-tool comparisons remain a separate later decision if a useful candidate is demonstrated. No code cleanup, upstream PR, release, issue closure or worktree deletion is included.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions