Files
AgentCompany/builtin-skills/software-engineer/clean-code/references/cmt-warning-consequences.md
T
ZacharyZhang-NY e74dafcd36 Silence render-disposed spam, unbreak bundled skills, drop board wake
Three independently ugly bugs that all fed the same log flood:

* Electron's `WebFrameMain.send` writes every "Render frame was disposed"
  to stderr via `console.error`. When the worker fans a second
  agent-event past a reloading renderer, we produced thousands of
  identical lines and stalled the main loop on stderr I/O. Added a
  `mainFrame.detached` guard so the send is short-circuited before
  Electron's own catch block fires, and installed a targeted filter in
  `suppress-warnings.ts` (now actually imported from the entry point)
  so the specific `console.error("Error sending from webFrameMain:"…)`
  noise never reaches the terminal. Any other payload still surfaces.

* `dispatchAgentMessage` accepted the human-reader sentinel as a wake
  target when an agent replied to `__board__` — `wakeAgentIfPossible`
  then called `db.getAgent("__board__")`, threw, and the dispatcher
  kept repeating on every send. Strip `HUMAN_SENDER_ID` at
  `resolveMessageWakeTargets`, and keep a defense-in-depth guard in the
  heartbeat so a stray caller (future automation fan-out) cannot
  reintroduce the crash.

* Pi's skills loader rejects any SKILL.md whose frontmatter `name`
  diverges from its parent directory. The four bundled `my-writing-style`
  copies declared `name: writing-style-skill`, so every install emitted
  a warning and dropped the skill. They also lived as orphan gitlinks
  (mode 160000 without .gitmodules), and the global `*.md` gitignore
  hid every other SKILL.md from version control. Fixed the frontmatter
  to match the dir, converted the dangling submodules to plain trees,
  and allowlisted `builtin-skills/**/*.md` so a fresh clone carries the
  catalogue instead of silently losing it.
2026-04-20 08:13:48 -04:00

1.9 KiB

title, impact, impactDescription, tags
title impact impactDescription tags
Use Warning Comments for Consequences MEDIUM prevents costly mistakes by future maintainers cmt, warning, consequences, safety

Use Warning Comments for Consequences

Comments that warn other programmers about certain consequences are valuable. They prevent others from making mistakes that have non-obvious impacts.

Incorrect (no warning about hidden dangers):

public static SimpleDateFormat makeStandardDateFormat() {
    return new SimpleDateFormat("yyyy-MM-dd");
}

public void runExpensiveOperation() {
    // Process all historical data
    processAllRecords();
}

@Test
public void testWithRealDatabase() {
    database.connect();
    // ...
}

Correct (warnings prevent mistakes):

// WARNING: DateTimeFormatter is thread-safe, but this legacy method returns
// SimpleDateFormat which is NOT thread-safe. Do not cache or share the result.
// Consider migrating callers to use DateTimeFormatter.ISO_LOCAL_DATE directly.
public static SimpleDateFormat makeStandardDateFormat() {
    return new SimpleDateFormat("yyyy-MM-dd");
}

// Preferred (Java 8+): thread-safe, no warning needed
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");

// WARNING: This operation takes ~30 minutes on production data
// and consumes significant memory. Run only during maintenance windows.
public void runExpensiveOperation() {
    processAllRecords();
}

// Don't run this test unless you have several hours to kill.
// Requires real database connection and processes 10M+ records.
@Ignore("Long-running integration test")
@Test
public void testWithRealDatabase() {
    database.connect();
    // ...
}

Good warnings include:

  • Thread-safety concerns
  • Performance implications
  • External dependencies or side effects
  • Security considerations

Reference: Clean Code, Chapter 4: Comments