Make agent chat replies a status line, not a document - #546
Open
MelbourneDeveloper wants to merge 3 commits into
Open
MelbourneDeveloper wants to merge 3 commits into
MelbourneDeveloper wants to merge 3 commits into
Conversation
The Rust gates were not slow because the runner was small. Two defects made every job rebuild work it had already cached. 1. One test binary per crate, not one per file. Cargo builds an executable for every `tests/*.rs`, and each one statically links the whole workspace under a `lto = "thin"` / `codegen-units = 1` release profile — the most expensive link settings there are, paid 176 times. Measured here: 8 of those targets rebuilt in 74.3s after touching deslop-core, so the full set is ~27 minutes, which matches the 19m54s "Compile release test binaries" step on CI. The suites are now modules of one binary per crate (`tests/suite.rs`), so the workspace is linked 4 times instead of 176. Every former test file is unchanged apart from its `mod common;` line: the shared helpers are declared once at the suite root, so `crate::common::…` still resolves. 2. The wire-model generator rewrote its output unconditionally. `crates/deslop-core/src/wire_generated.rs` is a source file of deslop-core, and cargo fingerprints local sources by mtime — so rewriting it with byte-identical content invalidated deslop-core and everything downstream. It is a prerequisite of `fmt`, `lint`, `test`, `test-shard`, `coverage` and `_vsix-build`, so each of those threw away the build the previous one had just produced. A no-op workspace rebuild is 0.13s; the same rebuild after one generator run was 1m30s. It now compares before writing, and `typediagram-gen.test.mjs` pins both halves — unchanged models leave the mtime alone, a clobbered file is still rewritten. Together, on the same 4 cores: rebuilding every test target after touching deslop-core goes from ~27 minutes to 1m23s. Also adds `[profile.release-test]` — `release` with the two shipping-only settings dropped, worth 2.9x on its own (74.3s to 26.0s over the same 8 targets). `make build`, `dup-gate` and `deployment-verify` still use `release`, so everything that ships stays fully optimised. `runs-on` for the Rust job now reads `vars.RUST_RUNNER`, defaulting to `ubuntu-latest`: one variable moves the Rust gates to a larger runner without hardcoding a label the org may not have provisioned. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CpWn82FwuJxjyrojMP8cT2
This branch linked the integration suite once per crate instead of once per test file. That work reached main through #424 and was reorganised there into logical test folders, so all 113 conflicts resolve to main's side: it holds the same change, finished, plus the grouping and the relocations that came after. The runner knob this branch also carried is dropped rather than merged. It offered `vars.RUST_RUNNER` so the Rust jobs could be sized up, and main's own comments record why that cannot help — every org-provisioned label starved, `linux-x64` queuing 16m+ per runner and `Medium` 20m+ with none arriving. Linking once already took the compile to ~1m02s, so the job the knob existed to rescue is no longer slow. Nothing unique to this branch survives the merge, which is the correct outcome: the change shipped.
The comparison run between v0.32.0 and main emits SCORE.md with every figure in it, and the reply that followed retyped the scorecard, the per-repository cost table and a narration of the steps taken. The mechanically-produced report is the artefact; restating it in chat buries the one thing the reader needed — the gate failed — inside an essay, and invites an agent to paraphrase numbers it should be pointing at. Standing prohibition now: the result, the number that moved, the file path. Critical findings carry an emoji so they survive a skim.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TLDR
Adds one standing prohibition to
AGENTS.md: agent replies in chat are headlines, not essays, and anything critical carries an emoji.Details
AGENTS.mdalready says every report is a markdown file produced mechanically by the code that measured it, and that the agent should point at the file path. Nothing said how long the reply should be, so the two rules pulled apart in practice: the corpus comparison between v0.32.0 and main wroteSCORE.mdwith every figure in it, and the reply that followed retyped the scorecard, the per-repository cost table, and a narration of the steps taken to produce it.The cost is not only length. Restating a mechanically-produced table invites an agent to paraphrase numbers it should be linking to, and it buries the one thing the reader needed — the gate failed — in the middle of an essay.
The new bullet sits directly under the report rule, because it is the other half of the same idea:
The three emoji are fixed rather than left to taste, so a skim finds the same marker for the same severity every time.
The merge commit
This branch previously carried the per-crate test-suite consolidation — linking the integration suite once per crate instead of once per test file. That work reached main through #424 and was reorganised there into logical test folders, so merging main in resolved all 113 conflicts to main's side and left the branch's tree byte-identical to main. The branch's second change, a
vars.RUST_RUNNERknob for sizing up the Rust jobs, is deliberately not merged: main's own comments in.github/workflows/ci.ymlrecord that every org-provisioned label starved (linux-x64queuing 16m+ per runner,Medium20m+ with none arriving), and linking once already took the compile to ~1m02s — so the job the knob existed to rescue is no longer slow.The result is that the only change this PR makes to main is the one line above.
How Do The Automated Tests Prove It Works?
They do not, and no test is claimed.
AGENTS.mdis agent instruction prose with no executing code path and no assertion surface — a test over it could only assert that a sentence is present, which pins nothing about whether the instruction is followed.The merge half of the branch is covered, by the whole existing suite: the branch's tree is byte-identical to
origin/main(git diff origin/main HEADis empty apart from theAGENTS.mdline), so every gate that passed on main's merge commit covers this branch unchanged — the Rust suite, coverage thresholds fromcoverage-thresholds.json,dup-gate,deployment-verify, and the VSIX and JetBrains gates. No test was deleted, skipped, or weakened; the 113 conflict resolutions all took main's finished version of files this branch held an earlier draft of.For AI
AGENTS.md:40, inserted between the "Never host a report anywhere" bullet and the "No git" bullet, so the report-artefact rule and the reply-brevity rule read as one pair. The rule's operative clauses: (1) reply content is restricted to result + changed figure + path; (2) three enumerated negative constraints — no request restatement, no step narration, no duplication of tables the emitted report contains; (3) a fixed severity→emoji mapping, 🛑 blocker / 🔴 regression-or-failing-gate / ✅ pass, chosen as a closed set so the marker is greppable and stable across replies rather than per-agent taste; (4) an explicit redirection of detail to the mechanically-produced artefact, binding this bullet to the one above it.Merge topology:
e37cc75is a two-parent merge,170cd6e(branch) +47947dd(main), whose tree equals47947dd's exactly. Conflict resolution took stage 3 for all 113 paths, including four modify/delete conflicts where main had relocated tests under the logical-grouping rule (csharp_type1_type2_distinct_buckets.rs→csharp_type1_type2_byte_truth.rs; the threefused_golden_*/fused_score_boundsfiles intotests/fixtures/fused-golden-*plus the grouped test modules) and one wherescripts/typediagram-gen.mjshad moved toscripts/typediagram/generate.mjs. An earlier attempt at this resolution committed conflict markers in 109 files; it was corrected by resetting the tree toorigin/mainand amending the merge, which preserves both parents.e89d33cthen carries the singleAGENTS.mdline.🤖 Generated with Claude Code
https://claude.ai/code/session_01CpWn82FwuJxjyrojMP8cT2
Generated by Claude Code