testsAndMisc/docs/superpowers/evidence/app-icons-anvil-octoforge-2026-08-09.json
Krzysztof kuhy Rudnicki 137fc99a2e app_icons: add the anvil glyph and register octoforge
OctoForge (~/octoforge) is app #10 in the shared launcher-icon family. It was
still shipping the stock Flutter icon, which is not a finished state.

The glyph is a filled silhouette rather than a stroked outline: a stroked
anvil is a long thin horn plus a narrow waist, and at the family's 72px stroke
weight the waist closes up solid at 48dp. An octopus (GitHub trade dress, and
a tangle of thin curves that blurs at launcher size) and a bare hammer (reads
as a generic tool, not a forge) were both rejected.

The horn is a separate wedge projecting off the face, not a rounded corner on
it. Two earlier drafts folded the taper into the slab's left end and both
rendered as a bump, leaving the shape reading as an I-beam. It now tapers to a
40px blunt tip, above MIN_NEGATIVE_SPACE so it survives at 48dp.

Registered with linux=True: unlike the other phone-first apps this one has a
real desktop target with a .desktop entry, so it needs the hicolor set.

Verified: generated for Android and Linux, checked against the family preview
sheet at all three sizes, and confirmed in the device app drawer next to todo.

Committed from a temporary worktree: the working tree held another session's
in-flight kuhylog entry in the same hunk, and git-rules.md forbids stashing
around other agents' uncommitted work. That work is untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzEA5srk8VPn6mKKjCaGpb
2026-08-09 15:24:09 +02:00

53 lines
4.0 KiB
JSON

{
"intent": "Give OctoForge (~/octoforge) an on-style launcher icon from the shared family, replacing the stock Flutter logo it was still shipping. Registers it as app #10 with a new anvil glyph.",
"scope": [
"python_pkg/app_icons/glyphs.py: adds the _ANVIL fragment and its GLYPHS entry",
"python_pkg/app_icons/apps.py: adds the octoforge AppIcon registry entry",
"Non-goal: no change to style.py, the renderer, or any existing app's icon - a style change would restyle the whole family",
"Non-goal: no iOS assets; OctoForge cannot be built for iOS here (no Xcode)"
],
"changes": [
"Anvil drawn as a filled silhouette rather than a stroked outline: at the family's 72px stroke weight the narrow waist closes up solid at 48dp. Same reasoning as the existing quill-nib and receipt-split glyphs.",
"The horn is a separate wedge projecting off the face, tapering to a 40px blunt tip (above MIN_NEGATIVE_SPACE so it survives at launcher size). Two earlier drafts folded the taper into the face slab and rendered as a bump, leaving the shape reading as an I-beam.",
"Registered with linux=True: OctoForge has a real desktop target with a .desktop entry, unlike the phone-first apps that scaffolded linux/ but ship no entry.",
"Accent is the shared #B8862E, matching all nine existing apps - apps are distinguished by glyph shape, not colour."
],
"verification": [
{
"command": "pre-commit run --files python_pkg/app_icons/glyphs.py python_pkg/app_icons/apps.py",
"result": "pass",
"evidence": "All hooks Passed or Skipped, including ruff, mypy, pylint, bandit, 'pytest with coverage enforcement' and 'Block binary/image files'."
},
{
"command": "python3 -m pytest python_pkg/app_icons/tests/ -q --cov=python_pkg.app_icons",
"result": "pass",
"evidence": "44 passed; every app_icons module at 100% (apps.py, glyphs.py, cli.py, generate.py, preview.py, render.py, style.py). Registry tests are data-driven so they cover the new entry."
},
{
"command": "python3 -m python_pkg.app_icons generate --app octoforge --android --linux-out <app>/desktop/icons",
"result": "pass",
"evidence": "Wrote 6 asset files, 8 hicolor PNGs and regenerated the Android mipmaps with no safe-box warning. All five mipmap-*/ic_launcher.png md5s changed from the stock Flutter values."
},
{
"command": "python3 -m python_pkg.app_icons preview -o sheet.png",
"result": "pass",
"evidence": "Inspected the three rows (full size, circle-masked, 48dp). The anvil is legible at 48dp and sits with the family in weight and style."
},
{
"command": "adb -s 23181JEGR08034 install -r app-debug.apk && open the app drawer",
"result": "pass",
"evidence": "Icon renders correctly in the launcher on the physical device, next to todo's checklist glyph on the same charcoal field."
}
],
"risks": [
"Glyph legibility is a visual judgement; it was checked on the preview sheet at 48dp and in the real device app drawer, not asserted by a test.",
"Committed from a temporary git worktree because the working tree held another session's in-flight kuhylog registry entry in the same hunk. Only the anvil and octoforge additions are in this commit; the kuhylog work is untouched and still uncommitted in the main checkout.",
"app-icon/SKILL.md still documents charcoal #1B1D21 and accent #4C7DF0, which the live generator and all ten registered apps contradict. Following the skill text literally would produce an off-palette icon. Not fixed here."
],
"rollback": [
"git revert the commit; it only adds a glyph and a registry entry, so nothing else depends on it.",
"After rollback, run python3 -m python_pkg.app_icons list and confirm nine apps and nine glyphs, then re-run the app_icons test suite.",
"OctoForge's already-generated icon assets live in its own repo and are unaffected by a revert here; regenerating them would then fail with 'unknown app octoforge', which is the expected signal."
]
}