Skip to content

Make agent chat replies a status line, not a document - #546

Open
MelbourneDeveloper wants to merge 3 commits into
mainfrom
claude/ci-pipeline-rust-build-8ces6m
Open

MelbourneDeveloper wants to merge 3 commits into
mainfrom
claude/ci-pipeline-rust-build-8ces6m

Conversation

@MelbourneDeveloper

Copy link
Copy Markdown
Collaborator

TLDR

Adds one standing prohibition to AGENTS.md: agent replies in chat are headlines, not essays, and anything critical carries an emoji.

Details

AGENTS.md already 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 wrote 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 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:

Headlines only. No essays. Chat replies are a status line, not a document: the result, the number that moved, the file path. No restating the request, no narrating the steps taken, no tables the emitted report already contains. Use an emoji to mark anything critical — 🛑 a blocker, 🔴 a regression or failing gate, ✅ a pass — so it is findable at a glance. Detail belongs in the mechanically-produced report above; point at it instead of retyping it.

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_RUNNER knob for sizing up the Rust jobs, is deliberately not merged: main's own comments in .github/workflows/ci.yml record that every org-provisioned label starved (linux-x64 queuing 16m+ per runner, Medium 20m+ 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.md is 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 HEAD is empty apart from the AGENTS.md line), so every gate that passed on main's merge commit covers this branch unchanged — the Rust suite, coverage thresholds from coverage-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: e37cc75 is a two-parent merge, 170cd6e (branch) + 47947dd (main), whose tree equals 47947dd'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.rscsharp_type1_type2_byte_truth.rs; the three fused_golden_* / fused_score_bounds files into tests/fixtures/fused-golden-* plus the grouped test modules) and one where scripts/typediagram-gen.mjs had moved to scripts/typediagram/generate.mjs. An earlier attempt at this resolution committed conflict markers in 109 files; it was corrected by resetting the tree to origin/main and amending the merge, which preserves both parents. e89d33c then carries the single AGENTS.md line.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CpWn82FwuJxjyrojMP8cT2


Generated by Claude Code

claude added 3 commits August 22, 2026 06:13
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.
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.

2 participants