From 5d54f1d227b3f81cd5aabb78d1dca44f61ed1a93 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 30 Apr 2026 18:18:26 +0000 Subject: [PATCH 1/2] feat(output-craft): reject "/schedule X" trailing offers as closing-flourish variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rule 3 of docs/output-craft-discipline.md already named the explicit form of trailing offer ("Let me know if you have any other questions!") but did not name its slow form: the agent ending a delivery with "I'll schedule X" or "/schedule Y" when the X / Y in question is something the agent could do in the same turn. Both forms share a fingerprint — performative completion that does not serve the user — but the slow form was reading as cooperative next-step planning and escaped Rule 3 enforcement. The new bullet states the discriminator: schedule only what is gated on something the agent does not control — an external release, a methodology-defined cadence (e.g. harness-evolution-discipline.md's per-material-model-release sweep), a user decision still pending, an upstream artifact that has not landed. If the next step is gated only on the agent doing the work, doing the work is the only honest option. AGENTS.md §10 Rule 3 summary line is extended with the criterion in compressed form per CLAUDE.md §5 cross-cutting term update obligation. SoT detail lives in docs/output-craft-discipline.md. No schema change, no new file, no other consumer touched — ai-operating-contract.md §7 already routes readers to output-craft as the application target for summary-slot rules, so the cross-reference topology stays intact. CHANGELOG: [Unreleased] / Added. ROADMAP: no-trailing-schedule-offer initiative (Full mode, P0-P7 passed). Co-Authored-By: Claude Opus 4.7 (1M context) --- AGENTS.md | 2 +- CHANGELOG.md | 4 ++++ ROADMAP.md | 29 +++++++++++++++++++++++++++++ docs/output-craft-discipline.md | 1 + 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 47ab5d9..3a452a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -134,7 +134,7 @@ Every output the agent produces — code, prose, manifests, summaries, UI, deliv - **Every element earns its place.** For each element added (a section, a paragraph, a control, a comment, an emoji, a graphic), the agent must answer "what would be lost if this were removed?" If the answer is "nothing, but it fills the space", the element is filler and must be removed. Default to omission, not inclusion. Treat empty space as content. - **Output adapts to its medium; the AI default is rejected.** The default styling an AI produces is a fingerprint, not a feature. A motion graphic does not look like a marketing page. A slide deck does not look like a Notion document. A system diagram does not look like a UI prototype. The persona declared per §9 picks the styling vocabulary; conventions that arrive by default (three-column hero, six-card grid, gradient CTA, emoji-as-icons, ornament SVG, layout-balancing sections, dummy data) are filler everywhere they are not part of the medium. Inventing data to populate a layout is also a §1 / §9-of-`ai-operating-contract.md` non-fabrication violation. -- **Summaries are caveats and next steps, not recap.** The diff and the manifest are the record; the agent's contribution at the summary slot is what those records do not say — caveats (residual risk, gotchas, what was assumed), next steps (what is still pending, what to confirm). Do not restate completed actions; do not open with preamble; do not close with flourish. +- **Summaries are caveats and next steps, not recap.** The diff and the manifest are the record; the agent's contribution at the summary slot is what those records do not say — caveats (residual risk, gotchas, what was assumed), next steps (what is still pending, what to confirm). Do not restate completed actions; do not open with preamble; do not close with flourish; do not offer to schedule what the agent could simply do — schedule only what is gated on something outside the agent's control (external release, methodology-defined cadence, user decision still pending, upstream artifact). The rules are stated as principles, not as exhaustive trope lists, so they remain medium-agnostic as new AI defaults emerge. diff --git a/CHANGELOG.md b/CHANGELOG.md index 90d8b20..1dcca6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ Format inspired by Keep a Changelog; versioning policy in `VERSIONING.md`. ## [Unreleased] +### Added + +- **`docs/output-craft-discipline.md` Rule 3 §Must not do — new bullet rejecting trailing "/schedule X" offers as a closing-flourish variant, plus consumer mirror in `AGENTS.md §10` Rule 3.** Rule 3 already named the explicit form of trailing offer ("Let me know if you have any other questions!") but did not name its slow form: the agent ending a delivery with "I'll schedule X" or "/schedule Y" when the X / Y in question is something the agent could do in the same turn. Both forms share a fingerprint — performative completion that does not serve the user — but the slow form was reading as cooperative next-step planning and escaped Rule 3 enforcement. The new bullet states the discriminator explicitly: schedule only what is **gated on something the agent does not control** — an external release, a methodology-defined cadence (e.g. `harness-evolution-discipline.md`'s per-material-model-release sweep), a user decision still pending, an upstream artifact that has not landed. If the next step is gated only on the agent doing the work, doing the work is the only honest option; "I'll queue a follow-up" when the follow-up is one tool call away is the trailing offer's slow form. `AGENTS.md §10` Rule 3 summary line is extended with the criterion in compressed form per `CLAUDE.md §5` cross-cutting term update obligation; the SoT detail lives in `docs/output-craft-discipline.md`. No schema change, no new file, no other consumer touched — `docs/ai-operating-contract.md §7` already points readers to output-craft as the application target for the summary-slot rules, so the cross-reference topology stays intact. + ## [1.35.0] - 2026-04-30 Minor release with two themes. **Pattern C runtime isolation** closes the multi-cluster parallelism gap where `cluster-parallelism.md` declared file-disjoint scope but had no operational discipline binding the declaration to runtime enforcement — adds `§Runtime isolation` (per-cluster exclusive write region, manifest field collision rule, merge-back ordering at fan-in), an optional `implementation_clusters[*].isolation_root` schema field giving the Reviewer a verifiable audit target, and a six-row failure-mode catalog of concrete races (lockfile conflicts, build-cache poisoning, ambiguous notes attribution, git-commit collisions, shared `/tmp` contamination, parallel write-locks). **Anthropic harness-engineering integration** closes seven canonical-methodology gaps surfaced by cross-referencing Anthropic's *Harness Design for Long-Running Agentic Applications* (Mar 2026) against the existing repo: new `§12 Context anxiety` in `ai-operating-contract.md` (intra-session premature task-shrink, distinct from §4 cross-session loss and §11 verbal-completion illusion), new `§Acceptance criteria as a Sprint Contract` in `multi-agent-handoff.md` (Planner-side time-axis discipline catching unverifiable AC at write-time), new `harness-evolution-discipline.md` Tier-3 file (per-material-model-release re-evaluation of canonical methodology components) with sweep-backed canonical retirement Lean-eligibility symmetric to `anti-entropy-discipline.md`'s project-local row, self-evaluation-bias preamble for the anti-collusion rule, capability-frontier axis callout for the risk-gating matrix, and the first canonical three-evaluator comparison (Mechanical / Application-driven / Agentic Reviewer audit) in `mechanical-enforcement-discipline.md` with a Planner-side allocation rule at Phase 3. Plus minor: `Agent loop` glossary term unification + `long-running-delegation.md §Mapping the runtime loop to phase boundaries` + back-pointers from the four consuming files; new `§Where inter-agent communication is recorded` routing table in `multi-agent-handoff.md`. Schema additions are optional and backwards-compatible; no existing manifest fails validation against the updated schema. diff --git a/ROADMAP.md b/ROADMAP.md index 6629418..76259ba 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -41,6 +41,35 @@ _None._ ## Closed initiatives +## no-trailing-schedule-offer — extend output-craft Rule 3 to reject "/schedule X" as a closing-flourish variant + +- **Opened:** 2026-04-30 +- **Closed:** 2026-04-30 +- **Driver:** User question — "為何很多任務最後都會提出 /schedule 建議?為何不立刻執行?" The pattern named: agents ending tasks with a trailing offer to schedule something they could have just done. The existing Rule 3 anti-pattern list (`docs/output-craft-discipline.md`) named the explicit form ("Let me know if you have any other questions!") but not the slow form ("I'll schedule X"). The slow form was reading as cooperative next-step planning but is the same fingerprint — performative completion stretched across sessions instead of a single line. Branch `claude/schedule-harness-sweep-tw5xJ` was itself opened under the anti-pattern (a "schedule a harness sweep" framing) before being redirected into this initiative; the branch name remains as historical evidence of the pattern's pull on agent behaviour. +- **Status:** closed +- **Target version:** 1.36.0 (minor — new normative rule on output craft per `VERSIONING.md` minor category) +- **Mode:** Full (L1 normative addition to SoT + cross-cutting consumer mirror per `CLAUDE.md §5`) + +| Phase | Scope | Artifact(s) | Gate verification | Status | Commit | Notes | +|---|---|---|---|---|---|---| +| P0 | User confirms B + Full | Conversation log: option B chosen, Full ceremony confirmed | User: "B + Full (Recommended)" then "GO" | ✅ passed | _(this change)_ | Three options presented (B+Full / B+cross-session / step-back-to-A); user picked B+Full | +| P1 | Surface mapping | SoT = `docs/output-craft-discipline.md` Rule 3 §Must not do; consumer = `AGENTS.md §10` Rule 3 bullet; CHANGELOG + this ROADMAP for release/audit | `grep -rn "output-craft\|closing flourish" docs/ skills/` confirms no other Rule-3-bullet-level consumer; thin-bridges (`CLAUDE.md`, `GEMINI.md`, `.windsurfrules`, `.cursor/rules/*.mdc`, `agents/*.md`) inherit per `docs/file-role-map.md` | ✅ passed | _(this change)_ | `docs/ai-operating-contract.md §7` not edited — it points to output-craft as application target, so the cross-reference topology already routes there | +| P2 | Draft Change Manifest | conversation manifest sketch (change_id `2026-04-30-no-trailing-schedule-offer`, `mode: full`, `breaking_change.level: 1`, `rollback_mode: 1`, `surfaces: [information]`, AC × 5) | manifest fields complete; AC enumerate (1) SoT bullet text + discriminator, (2) AGENTS.md mirror, (3) CHANGELOG entry citing `CLAUDE.md §5`, (4) ROADMAP closure, (5) `grep -n "/schedule"` hit count expected | ✅ passed | _(this change)_ | Single change, no decomposition | +| P3 | Plan confirmation + exact text drafts | conversation log: text for output-craft / AGENTS.md / CHANGELOG / this row | User approval ("GO") to execute P4-P7 | ✅ passed | _(this change)_ | | +| P4 | Implement four edits | `docs/output-craft-discipline.md` Rule 3 (new bullet after closing-flourish line); `AGENTS.md §10` Rule 3 (extended summary line); `CHANGELOG.md [Unreleased]` (new Added bullet, long-paragraph style matching 1.35.0); this `ROADMAP.md` row | All four files contain the new content; line counts increase by expected amounts | ✅ passed | _(this change)_ | | +| P5 | Self-review | re-read each edit; anti-rationalization check (the new bullet must not over-fire on legitimate harness sweep schedules); confirm AGENTS.md mirror does not contradict SoT; confirm new bullet's "external trigger" discriminator is unambiguous | review pass: discriminator names four concrete categories; harness-evolution sweep cited as positive example so it does not over-fire; AGENTS mirror compresses the same criterion without contradiction | ✅ passed | _(this change)_ | | +| P6 | Verify cross-cutting | `grep -n "/schedule\|trailing offer\|closing flourish in scheduling" docs/ AGENTS.md skills/` returns expected hits only (SoT bullet + AGENTS.md mirror compressed + CHANGELOG + this ROADMAP row); CHANGELOG well-formed; ROADMAP row complete | grep verified: matches only in `docs/output-craft-discipline.md:79`, `CHANGELOG.md:11`, this ROADMAP row; AGENTS.md uses the compressed prose form (no literal "/schedule" string, by design); `git diff --stat` shows exactly four expected files modified | ✅ passed | _(this change)_ | | +| P7 | Commit + push + ROADMAP closure | branch `claude/schedule-harness-sweep-tw5xJ`; single commit covering all four files; push with `-u origin`; status flipped to `closed`; section moved to Closed initiatives block | commit on branch; `git status` clean post-push | ✅ passed | _(this change)_ | No PR — per harness default | + +### Phase log + +- Why minor (1.36.0), not patch: new normative rule on agent output craft. Per `VERSIONING.md` minor category for new rules in operating contract. Existing Rule 3 enforcement is unchanged for callers; the new bullet adds a previously-unstated discriminator. +- Why Full mode, not Lean: per `CLAUDE.md §5 Mode implication` — adding a new normative rule to SoT is a forced-Full trigger via `mode-decision-tree.md §Scenarios that force Full` "Canonical methodology content edit (L1+)" row. The user explicitly accepted the Full ceremony cost when picking B+Full over A. +- Self-applying-methodology check: the conversation that produced this initiative did not itself end with a "/schedule X" offer — the discipline applied to the act of writing it down. The branch name `claude/schedule-harness-sweep-tw5xJ` carries the pre-correction intent; renaming the branch was rejected as a destructive operation that would erase the audit trail. +- Scope boundary: this initiative does not edit `docs/ai-operating-contract.md §7`. The new rule is a Rule 3 sub-clause of output-craft (the application target of §7); §7 already states "do not close with flourish" generically and points to output-craft for the format detail. Re-stating the /schedule discriminator at §7 would violate `CLAUDE.md §5`'s SoT-discipline (one canonical home per concept). +- Scope boundary: thin-bridges (`CLAUDE.md`, `GEMINI.md`, `.windsurfrules`, `.cursor/rules/*.mdc`, `agents/*.md`) are not edited. Per `docs/file-role-map.md`, normative content lives in `docs/` + `AGENTS.md`; bridges inherit automatically. Adding the criterion to bridges would re-encode it in 5+ places, creating exactly the cross-cutting drift `CLAUDE.md §5` warns against. +- Scope boundary: schema files (`schemas/change-manifest.schema.yaml`) are not edited. The new rule binds on agent prose output, not on manifest fields. + ## four-mode-canonicalization — promote Zero-ceremony and Three-line delivery to first-class modes across glossary, decision aids, phase-gate rules, and misuse signals (minor 1.15.0) - **Opened:** 2026-04-23 diff --git a/docs/output-craft-discipline.md b/docs/output-craft-discipline.md index 922cb77..2a2611e 100644 --- a/docs/output-craft-discipline.md +++ b/docs/output-craft-discipline.md @@ -76,6 +76,7 @@ The illustrations above are **not exhaustive**. The rule is general: the AI defa - Recap "what I just did". The diff and the manifest are the record. Restating them is filler. - Open with "I understand your requirement…" or "this is a complex issue and I will…" or any preamble that delays the load-bearing content. See [`ai-operating-contract.md`](ai-operating-contract.md) §7. - End with a closing flourish ("Let me know if you have any other questions!"). The work speaks; the closing line does not. +- Offer to schedule next steps the agent could simply do. A trailing "I'll schedule X" or "/schedule Y" is a closing flourish in scheduling clothing. The discriminator is whether the next step is **gated on something the agent does not control** — an external release, a methodology-defined cadence (e.g. [`harness-evolution-discipline.md`](harness-evolution-discipline.md)'s per-material-model-release sweep), a user decision still pending, an upstream artifact that has not landed. If the next step is gated externally, schedule it; if it is gated only on the agent doing the work, doing the work is the only honest option. "Let me queue a follow-up" when the follow-up is one tool call away is the trailing offer's slow form — same shape, same fingerprint, same Rule 3 violation. This rule is the explicit form of [`ai-operating-contract.md`](ai-operating-contract.md) §7 ("Difference > repetition") applied to the summary slot specifically. The contract names the principle; this rule names the format. From fa78f8fd9599d91864d8c94b475c34f93f1fb5b9 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 30 Apr 2026 18:33:25 +0000 Subject: [PATCH 2/2] fix(ci): regenerate CHANGELOG.json after [Unreleased] entry added MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 5d54f1d commit added a new [Unreleased] entry to CHANGELOG.md but did not regenerate CHANGELOG.json, so the changelog-drift CI job (.github/scripts/generate-changelog-json.py --check) failed. This commit syncs CHANGELOG.json from CHANGELOG.md via the generator script — pure regeneration, no manual edits. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.json b/CHANGELOG.json index 6509b2e..5bbaaa8 100644 --- a/CHANGELOG.json +++ b/CHANGELOG.json @@ -1,5 +1,17 @@ { "releases": [ + { + "version": "Unreleased", + "date": null, + "sections": { + "added": [ + { + "title": "`docs/output-craft-discipline.md` Rule 3 §Must not do — new bullet rejecting trailing \"/schedule X\" offers as a closing-flourish variant, plus consumer mirror in `AGENTS.md §10` Rule 3.", + "body": "Rule 3 already named the explicit form of trailing offer (\"Let me know if you have any other questions!\") but did not name its slow form: the agent ending a delivery with \"I'll schedule X\" or \"/schedule Y\" when the X / Y in question is something the agent could do in the same turn. Both forms share a fingerprint — performative completion that does not serve the user — but the slow form was reading as cooperative next-step planning and escaped Rule 3 enforcement. The new bullet states the discriminator explicitly: schedule only what is **gated on something the agent does not control** — an external release, a methodology-defined cadence (e.g. `harness-evolution-discipline.md`'s per-material-model-release sweep), a user decision still pending, an upstream artifact that has not landed. If the next step is gated only on the agent doing the work, doing the work is the only honest option; \"I'll queue a follow-up\" when the follow-up is one tool call away is the trailing offer's slow form. `AGENTS.md §10` Rule 3 summary line is extended with the criterion in compressed form per `CLAUDE.md §5` cross-cutting term update obligation; the SoT detail lives in `docs/output-craft-discipline.md`. No schema change, no new file, no other consumer touched — `docs/ai-operating-contract.md §7` already points readers to output-craft as the application target for the summary-slot rules, so the cross-reference topology stays intact." + } + ] + } + }, { "version": "1.35.0", "date": "2026-04-30",