Skip to content

docs: observe where coding agents get stuck on bare gesso before writing a skill #511

Description

@wadakatu

Context

This is an observation task, not an implementation task. It produces evidence (issue comments), not code. Nothing in src/, docs/, or the CLI changes as a result of closing it.

The goal is to learn where a coding agent actually gets stuck when handed bare Gesso, before anyone writes an Agent Skill (SKILL.md) for it. A SKILL.md written from guesswork does not just fail to help — it permanently fixes the guesswork in place. It is worse than stale documentation, because an agent that loads a skill treats its contents as authoritative and stops reading the docs that would have corrected it.

Measured starting conditions (working tree at c9f988c, 731 tracked files):

  • There is no agent-facing entry point for consumers. No skills/ and no resources/boost/ directory exists; git ls-files | grep -i 'skill\|boost\|agent' returns exactly one file, the root AGENTS.md (153 lines). That file is contributor-facing — its first line is # Repository guide for coding agents and it documents composer ci, PSR-4 layout, and PHPStan levels. An agent installing Gesso into an application gets nothing from it.
  • docs/ is 54 markdown files and 10,926 lines. Of that, docs/superpowers/ is 12 files and 3,194 lines (29% of the corpus) of internal implementation plans and design specs (docs/superpowers/plans/2026-08-03-sdk-exercise-coverage.md alone is 820 lines). An agent grepping docs/ for an answer will hit these, and they read as authoritative product documentation.
  • README.md is 271 lines and the Features list is 14 bullets (README.md:29-42), each pointing at a different subsystem.
  • The onboarding path is bimodal: docs/quickstarts/laravel.md is 22 lines, docs/setup.md is 837 lines. There is nothing in between.

Current behavior

An agent configuring Gesso has to pick among four separate configuration surfaces with overlapping keys, and nothing tells it which one applies:

Surface Size Source
PHPUnit extension parameters 26 distinct parameter name="…" values documented in docs/*.md read at src/PHPUnit/OpenApiCoverageExtension.php:281-1200
Laravel config file 13 top-level keys src/Laravel/config.php:9-102
Environment variables 4 (OPENAPI_BASELINE_GENERATE, OPENAPI_COMMON_KEYS, OPENAPI_CONSOLE_OUTPUT, OPENAPI_VALIDATION_OUTPUT) grep over src/
CLI long flags 49 distinct src/Cli/, src/Coverage/CoverageMergeCommand.php, src/Laravel/Commands/

At least four keys exist on two surfaces at once — spec_base_path, strip_prefixes, acknowledged_unvalidatable_schemes, enforce_discriminator — and the repository's own config file documents that the user is responsible for keeping them in sync:

// src/Laravel/config.php:15-18
// Prefixes removed from registered Laravel route URIs before comparing
// them with OpenAPI paths. Keep this aligned with the PHPUnit extension's
// `strip_prefixes` parameter so static parity and runtime validation agree.
'strip_prefixes' => [],

This is not hypothetical. In studio-design/studio-api (a gesso ^2.0 consumer), the published config/gesso.php carries a hand-written comment instructing the developer to keep spec_base_path and strip_prefixes manually synchronized with phpunit.xml. A human hit this and wrote himself a note. An agent will hit the same fork with less context.

Two more places an agent can plausibly go wrong, both verifiable in the tree:

  • Publishing the config requires php artisan vendor:publish --tag=gesso (docs/quickstarts/laravel.md:5); the tag is GessoServiceProvider::CONFIG_KEY (src/Laravel/GessoServiceProvider.php:15), and a LEGACY_CONFIG_KEY = 'openapi-contract-testing' still exists one line below (:16).
  • Five example applications exist (examples/{core,laravel,pest,psr7,symfony}) but the quickstart links to the Laravel one by GitHub URL rather than by repository path, so an agent working locally may not find it.

Proposed change

Run three representative tasks against bare Gesso v2.4 — documentation only, no SKILL.md, no injected hints — with a coding agent, and record what happens.

Tasks:

  1. Green field: install Gesso into a new Laravel application and get one passing contract test.
  2. Diagnosis: given an existing failing contract test, identify the root cause and fix it.
  3. Coverage: find an operation the suite does not cover and add a test for it.

For each task, record:

  • Every configuration file the agent wrote to, and whether that was the correct surface for the setting (config/gesso.php vs. phpunit.xml extension parameter vs. env var vs. CLI flag).
  • Every CLI flag and extension parameter the agent invented — flags that do not exist in the 49 real ones, parameters absent from the 26 real ones.
  • Every case of the agent misreading output: coverage percentages, gesso doctor diagnostics, validation failure text, exit codes.
  • Which docs/ page the agent opened, in what order, how many times, and whether it landed in docs/superpowers/ (an internal plan) and treated it as product documentation.
  • Where the agent gave up, looped, or asked the human.

Report format: one comment per task on this issue, each containing the task prompt verbatim, the agent/model used, a chronological log of the failure points above, and total turns to completion (or the point of abandonment). Raw transcripts attached or linked.

Compatibility

No compatibility surface defined in docs/versioning.md is touched. This issue adds no public symbol, no CLI flag or exit code, no PHPUnit extension parameter, no env var, no Artisan command, and no versioned wire format. It produces issue comments only. Not breaking. No migration required.

Dependencies and sequencing

This observation runs now. It is a measurement of Gesso as released in v2.4.0, and it stays valid as a record of that state regardless of what v3 changes.

Authoring SKILL.md itself must not start until the v3 configuration-unification and CLI-flag-unification work is frozen. If v3 renames configuration keys or consolidates the four surfaces above into one, a skill written today documents key names that will not exist — and it will be believed anyway. The observation is the input; the skill is a later, separately-tracked deliverable that is blocked on that freeze.

Acceptance criteria

  • Task 1 (install into a new Laravel app, first passing test) has been run against bare v2.4 and its observation is recorded as a comment on this issue.
  • Task 2 (diagnose and fix a failing contract test) has been run and its observation is recorded as a comment.
  • Task 3 (find an uncovered operation and add a test) has been run and its observation is recorded as a comment.
  • Each comment names the agent/model and includes the task prompt verbatim.
  • Each comment lists, explicitly: config files written (and whether each was the right surface), non-existent flags or parameters used, output misreadings, and the ordered list of docs/ pages read with visit counts.
  • Each comment states whether the agent read anything under docs/superpowers/ and whether it acted on it as if it were product documentation.
  • No code, documentation, or configuration change is included in this issue's resolution.

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationepic:dxDeveloper experiencepriority:mediumMedium priority

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions