Habit · loads whenever its situation comes up, at any step

boundaries

about 1,100 tokens

boundaries as it installs, each line coloured by where its words came from.

  • 1 file
  • 0 edits
  • 2 sentences left out
  • 2 sources
  • last changed 2026-10-09

Replaces boundary-discipline and fail-loud (retired 2026-10-08).

The text

SKILL.md

about 1,100 tokens
  • Freddie Northam
  • pstack
  • greenline

---

name: "boundaries"

description: "Concentrate validation, parsing and error handling at system boundaries (CLI, config, network, external APIs), trust internal types and keep business logic in pure functions; and let no failure become success-shaped output: no catch block returning a default, no fabricated data, a test that forces each changed integration to fail. Use when validating input or handling an error at a boundary, when writing a catch block, a default value, a retry or a fallback, when a dependency fails during the work, and when a deadline or a demonstration makes a working-looking result tempting."

---

greenlineOpens the habit: when it applies; boundaries are where outside data enters

boundaries is the habit for the moment input is validated or an error handled where data enters the system, a catch block, a default, a retry or a fallback is written, a dependency fails during the work, or a deadline or a demonstration makes a working-looking result tempting, at whatever step the work is in, most often build. It writes no record of its own: the negative-path tests it asks for are named in the step's section and the reply. A system boundary here is where outside data enters, a CLI, a config file, the network, an external API; between two modules of one program, deep-modules' word is seam.

pstackprinciple-boundary-discipline/SKILL.md

Place validation, type narrowing, and error handling at system boundaries. Trust internal code unconditionally. Business logic lives in pure functions. The shell is thin and mechanical.

**Why:** Scattered validation is noisy, redundant, and gives a false sense of safety. Keep logic out of framework wiring so it can be tested without the framework.

**The pattern:**

- **At boundaries** (CLI args, config files, external APIs, network protocols): validate, return errors, handle defensively.

- **Inside the system:** typed data, error propagation, no re-validation. Trust the types.

- **Across the boundary.** Expose domain concepts, not the boundary's private representation. Keep general-purpose mechanism inside and special-purpose policy at the edge.

**Applications:**

Validation and error handling:

- Validate config at parse time (the boundary), not inside business logic

- Parse raw data into domain types at the boundary

- Do not re-export transport, storage, framework, or wire types through the public surface

- No redundant nil checks deep in call chains if the boundary already validated

Code organization:

- Business logic in pure functions with no framework dependencies

- Parse functions: pure transforms from raw bytes to typed state

- Prompt construction: structured state in, string out

- Scoring and assessment: pure transforms from state to results

**The tests:**

- "Is this data crossing a system boundary right now?" If not, validation is redundant.

- "Can this be a pure function that the shell just calls?" If yes, extract it.

Freddie Northamfail-loud/SKILL.md

Software that hides a failure looks finished and is not.

**A failure may not become success-shaped output.** No catch block returns a default in place of an error. No missing integration returns a plausible value. No absent credential quietly downgrades to a local stub.

## What a catch block may do

A catch block does one of three things, and the code says which:

1. Rethrows, with context added.

2. Handles a named condition that the code states.

3. Reports the failure to the caller as a failure.

A catch block that returns a normal-looking value is none of the three.

## Fabrication

Data that did not come from the source may not appear as though it did. No invented rows, no placeholder totals, no example values standing in for a call that failed. When the source is unavailable, that is the result.

## Prove it with a failing dependency

Some fallbacks are correct. A cache miss falls back to origin. A missing optional setting falls back to a documented default.

A list of them in your report proves nothing. A list is a claim, it rewards confidence rather than completeness, and it assumes every fallback has one obvious line, which is false for configuration, injected dependencies, middleware and caches.

**For every production integration you changed, add a test that forces the dependency to fail and asserts that no success-shaped output crosses the public boundary.** Name that test in the closing report.

A negative-path test is checkable by someone who does not trust you. An inventory is not.

## The demonstration case

Pressure to show something working is the moment this rule earns its place. A demonstration built on a hidden fallback demonstrates the fallback. Say the integration is down and show the part that works.

## It's working if

- A broken integration announces itself on the first run, not in production.

- The closing report names a negative-path test for each changed integration.

- A failed call produces an error, not an empty array.

- Mocks appear only under a test directory.

SKILL.md as installed, byte for byte SHA-256 30ae84376e7e8cbeb45147cc78b3753b69d8ed5038bdb5d7b796b1402c0978ff

What greenline wrote

The full reason for every passage greenline wrote, in the order of the text.

  1. SKILL.md:6 rename

    The habit's title is its roster name, boundaries, which R22 gives the habit boundary-discipline and fail-loud became.

  2. SKILL.md:8 scope

    One opening paragraph in the habit's own voice: the situations the block's rows key it by, that it writes no record of its own and where its tests are named, and which boundary it means, since deep-modules says seam for the place between modules.

  3. SKILL.md:37 method

    fail-loud joins boundary-discipline as one habit: what a boundary does with a failure, its title becoming the section's heading. R1

What it left out

pstack

pstack, principle-boundary-discipline/SKILL.md: 1 of 30 sentences left out
  1. # Boundary Discipline left out: The title gives way to the habit's roster name (R22). replaced by line 6 of SKILL.md

Freddie Northam

Freddie Northam, fail-loud/SKILL.md: 1 of 35 sentences left out
  1. # Fail loud left out: The title becomes the section's heading. replaced by line 37 of SKILL.md

The ledger entry

greenline's ledger logs how each skill was made and changed, with a reason for each entry.

2026-10-09 2026-10-09-boundaries-gists

Every account gets a short gist for the website

Adds a gist of at most twelve words, for the website's edition, to every account of the recipe whose reason is stated. No text, measure or method changes.

Authorised by
2026-10-09 J-59, on the operator's words of 2026-10-09 ('okay then implement all of this'): a gist of at most twelve words on every account whose reason is stated; no text, measure or method changes
Pages it touched
none
Rulings, R1 to R6
  1. the operator's rulings of 2026-10-08 on the intake R3 ("everything is good", and "yes go ahead" on the portable forms of R21), the verdicts standing and every contradiction ruled as recommended: boundary-discipline and fail-loud are one habit, boundary-discipline its spine
  2. The method items carry the operator's rulings of 2026-10-08 on the intake R3 ("everything is good", and "yes go ahead" on the portable forms of R21), the verdicts standing and every contradiction ruled as recommended: boundary-discipline and fail-loud are one habit, boundary-discipline its spine
  3. the operator's ruling R22 of 2026-10-08 on the re-cut brief, "yes amend, with one change": the roster table's names stand, deep-modules, domain-and-types, boundaries, concurrency, secrets and prose among them, tdd and ponytail keeping theirs
  4. the operator's rulings of 2026-10-04, "cool then lock everything in": every change has one record its steps write, and a habit writes none of its own
  5. R16 of 2026-10-07, a habit loaded when its situation arises at any step ("update the agents md created by greenline product to mention the kind with the skill table and also prose about when to use what kind skill")
  6. J-59, on the operator's words of 2026-10-09 ('okay then implement all of this'): a gist of at most twelve words on every account whose reason is stated; no text, measure or method changes
1 earlier entry
  1. 2026-10-08 2026-10-08-boundaries-recipe

    Boundary-discipline and fail-loud become one habit

    Pages it touched: SKILL.md