Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ All notable changes to this project are documented here, following [Common Chang

### Changed

- Redraw `docs/assets/hero.png` with a real alpha channel: the previous file carried an opaque cream background remnant above the forge and 250 speckle regions of keying debris, and it showed four stages with `forge anvil temper quench` painted into its pixels. The new plate is five objects and no lettering — 5 regions for 5 objects, 2.06% partial alpha, no border bleed — with the stage names moved to a README caption
- Make `install.sh` portable to bash 3.2 / stock macOS (replace `declare -A` and `readlink -f` with portable equivalents)
- Replace the external-API review gate in `temper` with a fully local adversarial panel (3 critic lenses + judge; A++ = two consecutive zero-blocking rounds, max 5 rounds)
- Change forge's Norms section to require machine-checkable form (the tool + config that enforces each norm, installed as gates by quench) and mark each Safeguard as the source of a property test or runtime assertion
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

**Structured Prompt-Driven Development, or BDD/TDD carnival, or Spec-it-to-death.** A raw idea enters; folded, hardened, tested steel leaves. Damascus packages the SPDD pipeline — five gated stages plus an orchestrator — as skills you symlink into any repo.

![The Damascus pipeline](docs/assets/hero.png)
![The Damascus pipeline: a coke forge, an anvil, a tempered blade, a quenching tub and a whetstone](docs/assets/hero.png)

<sub>Left to right: **forge** · **anvil** · **temper** · **quench** · **hone**.</sub>

## The Pipeline

Expand Down
51 changes: 51 additions & 0 deletions docs/assets/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# The hero image — provenance

`hero.png` is the five stages of the pipeline drawn as five smithing implements, reading left to
right: a brick coke forge with a bed of glowing coals (**forge**), a wrought-steel anvil
(**anvil**), an arming sword whose blade carries the temper colours from straw yellow through
bronze to peacock blue (**temper**), an oak quenching tub with steam rising off the water
(**quench**), and a whetstone in its holder (**hone**).

Drawn with the [`transparent-logo`](https://github.com/forkrul/dotfiles-agents) skill
(`gemini-3-pro-image`, Audubon-era engraved-plate style reference) and cut to a real alpha channel.
**It cannot be reproduced.** An image model draws a different picture every run, so the command
below records *how* it was made and will make another one — not this one. That is why the prompt is
committed beside the asset.

## No lettering

The previous hero baked the words `forge anvil temper quench` into its pixels. Painted text cannot
be re-cropped, restyled or localised, it is illegible at favicon size, and it goes stale silently —
that image still read as a four-stage pipeline long after `hone` became stage five. The stage names
belong in the README's caption and in the pipeline table, never in the image.

## Command

```bash
export GEMINI_API_KEY=... # never as an argument: it lands in shell history

uv run python3 .claude/skills/transparent-logo/assets/generate_plate.py \
--objects 5 --warm --size 4K --ratio 21:9 --out plate.jpg --subject "$(cat subject.txt)"

uv run --with pillow python3 .claude/skills/transparent-logo/assets/cut_background.py \
plate.jpg docs/assets/hero.png --width 1536 --report
```

The subject line is in [`hero-subject.txt`](hero-subject.txt), verbatim.

**Cut:** 5 regions for 5 objects, partial alpha 2.06%, zero opaque key-coloured pixels, zero border
bleed, no fringe over white, mid-grey or `#0d1117`. A region count matching the object count is the
skill's artefact detector; partial alpha in the 2–4% band is the second one.

## What the four rejected plates taught

Five generations, four rejected. Each failure is a property of the *subject*, not of the keyer:

| # | Defect | Cause | Fix applied to the next subject |
| :--- | :--- | :--- | :--- |
| 1 | 28 regions; 69 opaque magenta pixels dithered through the forge's ash arch | An open recess is drawn as dark hatching, so the key colour bleeds between the strokes and the cut half-takes it | Close the recess: *"the brick base is solid and closed, with no arch, no opening, no recess and no cavity"* |
| 2 | 7 regions; flame tips painted **pink**, two of them detached into their own regions | A thin glowing wisp tints towards the magenta key however firmly `--warm` bans rose, and then breaks off | Remove the wisps and name the fire's colours: *"coals glowing in orange, amber and straw yellow only … no flame, no wisp and no spark"* |
| 3 | Clean at 5 regions / 2.48%, but the sword lost its hilt and read as a shard | "A sword blade" is a blade, not a sword | Name every part: *"a straight double-edged blade, a plain straight iron crossguard, a leather-wrapped grip and a rounded iron pommel"* |
| 4 | Clean at 5 regions / 2.33%, but an 18px magenta sliver under the honing guide's clamp | A **narrow enclosed** gap is mostly antialiased fringe, so it fails the keyer's hole test (a hole needs half its pixels above the clear threshold) and survives as opaque key colour | Remove the bridge rather than loosen the keyer: *"the guide lies flat against the stone … with no arch, no bridge, no clamp jaw, no leg and no gap"* |

Findings 1, 2 and 4 are recorded upstream as `L15`–`L17` in the skill's running log.
1 change: 1 addition & 0 deletions docs/assets/hero-subject.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Five blacksmith's implements from a 19th-century smithy, arranged in a single horizontal row reading left to right, evenly spaced and none touching. First, a square coke forge of brick with a riveted wrought-iron band around its top, its open top holding a bed of coals glowing in orange, amber and straw yellow only; the coals sit low and flat with no flame, no wisp and no spark rising above them, and the brick base is solid and closed, with no arch, no opening, no recess and no cavity anywhere beneath the fire. Second, a heavy wrought-steel anvil, horn pointing to the left, drawn in three-quarter view. Third, a complete arming sword shown whole and held at a slight diagonal with its point up to the right: a straight double-edged blade, a plain straight iron crossguard, a leather-wrapped grip and a rounded iron pommel, the crossguard, grip and pommel all drawn solidly and joined to the blade with no gap of background between them; the polished blade carries a band of temper colours along its length running from pale straw yellow through bronze and deep blue to peacock blue. Fourth, a hexagonal oak quenching tub bound with three iron hoops, brimming with dark water, one thin curl of cool grey-white steam rising from its centre; the steam is plain white and cool grey only. Fifth, a long rectangular grey whetstone lying at a slight angle, with a flat steel honing guide resting directly on top of it; the guide lies flat against the stone along its whole length and width, pressed down against it with no arch, no bridge, no clamp jaw, no leg and no gap, slot or opening of any kind between the guide and the stone. Every opening in every object is filled with solid opaque drawn detail; no object contains a hole, window, gap or see-through cavity of any kind, and no object has a thin trailing wisp, thread or tendril leaving its outline. Aged wrought iron, tarnished steel, oak, leather, brick and bone white, in ochre, umber, slate blue-grey and rust red.
Binary file modified docs/assets/hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.