Documents the dumbbell in type-bar.md's existing Variants section,
alongside grouped and stacked bars. Reference-only, matching the
precedent those two set and the one #100 landed for datalake: no
example assets, no gallery entries.
Not a new visual type. The count stays at 28 and SKILL.md is untouched
-- no selection-table row, no frontmatter hook, no manifest description
change.
Covers layout on the shared 1000x500 composition, an element pattern,
and five honesty rules: no truncated axis, one scale with both endpoints
labelled, the connector is a gap and not a trajectory, a stated row
order, and no imputed or silently dropped endpoints.
Two of those rules live in a formula rather than a drawing, so they ship
as a checker with adversarial fixtures per ADR 0005:
- Domain resolution is exhaustive over sign. A rule phrased as
"all-positive / all-negative" silently drops data that only touches
zero, and drops all-zero data entirely -- where floor == ceil == 0 and
the position formula divides by zero. resolve_domain() partitions the
space, guarantees ceil > floor, and returns a finite fallback span for
all-zero input so every dot lands on the floor.
- Non-text contrast is carried by the boundary, not the fill. Accent on
paper is 2.86:1 skin-wide, and shape redundancy does not waive WCAG
1.4.11, so the solid endpoint takes a 1px ink stroke (11.82:1) and the
connector 55% ink on light / 40% on dark (3.19:1 and 3.24:1). The
checker reads these tokens out of the reference, so prose and
thresholds cannot drift apart.
scripts/test-verify-dumbbell.py covers both polarities: all-zero,
zero-touching, mixed-sign, empty and non-finite input, observed-extremes
truncation, and the sub-3:1 treatments this replaces. Wired into CI and
CONTRIBUTING alongside the treemap and geometry gates.
Other things the geometry and house style forced: the focal bar pattern
(12% tint plus accent stroke) does not survive at a 6px dot, so the pair
separates by fill weight; a 64px row pitch from y=96 overflows the y=420
plot floor at seven rows, so pitch and origin are tabulated per row
count; rgb(45,49,66) IS the dark paper, so light-theme hairlines
composite to 1.000:1 and must invert; label offsets keyed to start/end
put both labels inside the pair on a decreasing row; a value on the
domain floor collided with its category label; and the value axis was
missing the Geist Mono 7px title every other cartesian type carries.
Co-authored-by: 0xDarkMatter <0xDarkMatter@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Added descriptions for the shipped datalake examples (example-datalake.html,
-datalake-dark.html, -datalake-full.html) to the High-Level type reference,
categorising the five-phase data stack as an unclustered High-Level variant.
Fold all line-boundary forms and escape Markdown/HTML syntax in draw.io digest headings, lists, and tables; add adversarial injection coverage; publish synchronized plugin version 2.5.1. Fixes#81.
Add Treemap as the 28th visual type with light, dark, and editorial variants; area, label, and information-marker verification; synchronized documentation and manifests; and plugin version 2.5.0.
Recognize compact Mermaid edge labels without phantom nodes while preserving near-miss operators and chained links, with regression coverage and synchronized plugin version 2.4.8. Fixes#80.
Extend the verified label-mask width range to 200px while retaining the 14px height cap, with adversarial and shipped-asset coverage, and publish synchronized plugin version 2.4.7.
Align the documented draw.io import and diagram export commands with the shipped plugin command filenames, and publish synchronized plugin version 2.4.5.
* fix(mermaid): parse quoted participants, create, and the full sequence arrow vocabulary
The shipped sequenceDiagram extractor silently dropped or rejected
Mermaid-valid constructs:
- `participant "Alice Smith"` (quoted name, no alias) vanished from the
IR because the participant regex only accepted bare [\w.:-]+ ids.
- `participant "Alice Smith" as A` and `actor "Bob Builder" as B`
lost their quoted display names and aliases.
- `create participant B` directives were ignored.
- Bidirectional messages `A<<->>B` / `A<<-->>B` (Mermaid v11.0+)
hard-failed with "malformed edge".
- `->` / `-->` (open arrows with no arrowhead per the Mermaid docs)
were misclassified as filled arrows.
- A message touching a declared `actor` overwrote its shape with
"lifeline" because endpoints were force-added as lifelines.
The fix expands the participant regex to quoted names (with or without
an `as` alias) plus the `create` prefix, teaches the message regex the
bidirectional and open arrow forms, preserves declared actor shapes, and
classifies open arrows as undirected with no arrowhead. Multi-word
endpoints introduced by quoted declarations resolve correctly while
compact forms like `A-->>B` keep their ids. All forms were verified
against the real Mermaid v11.16.1 parser.
Adds a verification gate covering every form and updates the import
reference to document the supported sequence grammar.
* chore: bump plugin version to 2.4.2
---------
Co-authored-by: Cathryn Lavery <50469282+cathrynlavery@users.noreply.github.com>
Co-authored-by: Cathryn Lavery <cathryn@bestself.co>
Extend lint-skin.py font allowlist with the Hiragino/Noto/Yu Gothic
families from output-spec.md §4 and add adversarial tests including a
Yu Gothic UI rejection case.
Fixes#74
* feat: add client profiles
* ci: pin shell to bash for docs_sync step
The docs_sync step runs two commands in a multi-line block. Without a
pinned shell, the windows-latest matrix leg uses pwsh, where a non-zero
exit from the first command may not abort the block, masking a gate
failure. Pin shell: bash to match the icons and summary steps.
Rename remaining "Schematic" references to diagram / diagram-design / Diagram Design across SKILL.md, onboarding.md, and style-guide.md. Rebased onto current main and bumped both plugin manifests to 2.3.5. Thanks @philyuchkoff.
* feat(motion): add base SVG layout and trust boundaries for example-paved-road-animated.html
* feat(motion): add 5-step interactive semantic items for Pattern #5 (Secure Paved Road)
* feat(motion): attach canonical SHA-pinned controller and WCAG AA controls
* docs(gallery): register example-paved-road-animated.html in assets/index.html gallery
* fix(motion): adjust attacker node Y and bypass connector to run cleanly through empty gap without crossing audit service box
* fix(motion): redesign paved road architecture with dedicated firewall node and solid opaque badge chips
* fix(motion): add signature legend bar and route audit connectors clear of firewall node
* docs(motion): add footer legend bar to fan-in queue animated diagram
* fix(motion): implement true SVG visual legend footer with mini-arrows and mini-rects
* fix(motion): correct Security Gate deployment flow, SOC arrow direction, and footer legend labels
* fix(motion): complete footer legend with 4 distinct box types matching diagram elements exactly
* chore(clean): remove queue diff from paved-road branch so diff contains only paved-road example
* chore(release): bump plugin version to 2.3.4 for synchronized version gate
* feat(motion): add example-queue-animated.html for Semantic Pattern #1 (Fan-in Queue / Bottleneck)
* docs(gallery): register example-queue-animated.html in assets/index.html gallery
* fix(motion): adjust queue container height and step 5 box placement to prevent overlap
* fix(motion): expand slot rects and right column nodes to eliminate text overflow
* chore(release): bump plugin version to 2.3.3 for synchronized version gate
* docs(motion): add footer legend bar to fan-in queue animated diagram
* fix(motion): implement true SVG visual legend footer with mini-arrows and mini-rects
* fix(motion): unify queue depth status badge into a single dynamic full-height badge
* fix(motion): refine queue traffic rates and state description for realistic backpressure math
Moves six clipped labels onto free connector segments and adds scripts/verify-geometry.py with tests, CI wiring, ADR 0005, and SKILL.md rule 6 so the defect cannot recur. Fixes#45.
Installs previously drifted: a standalone `npx skills add` copy never
followed the repo, and Claude Code disables auto-update for third-party
marketplaces by default. Route every client through its own marketplace so
merged changes reach users through the native update path.
- Add `.agents/plugins/marketplace.json` so Codex resolves the plugin from
a Git marketplace it refreshes at startup.
- Add `author` to the Claude manifest so both native manifests agree.
- Add `scripts/bump-plugin-version.py` to increment the Claude and Codex
versions together; it refuses to run when they already differ.
- Add `scripts/verify-plugin-package.py` to gate synchronized, strictly
increasing semver against the base ref, marketplace paths that stay
inside the repo root, and the packaged skill.
- Add `scripts/test-plugin-package.py` covering the adversarial cases:
missing bump, mismatched manifests, malformed semver, and a marketplace
target that does not exist.
- Add a `plugin-package` CI job running the tests, the version gate against
the PR base sha, and `claude plugin validate . --strict`.
- Document the per-PR bump requirement, the new gates, and the per-client
install/update paths, including the one-time migration off standalone
copies.
Version bumps 2.3.0 -> 2.3.1 to satisfy the new gate.
- SKILL.md: confirm type/pattern/size/cuts with the user before rendering;
checklist hooks for the checkpoint and the packaged self-check
- scripts/verify-docs-sync.py: CI now fails when the frontmatter description
loses a type's lexical hook, the gallery can't reach a shipped example, or
the README tree names a missing file
- skills/diagram-design/scripts/self_check.py: distilled output checker that
ships with the skill so installed agents can verify their own diagrams;
adversarial suite in scripts/test-self-check.py
- assets/index.html: six new tabs (OAuth sequence + five single-variant
examples with a data-single variant lock) so every shipped example is
browsable
- docs/adr/0001-0004: settled policies recorded (pinned controller, taxonomy
freeze, reveal-only autoplay, byte cap + trigger-rich description)
- README: It's-working-if section, new gates documented; CONTRIBUTING: gate
table, ADR guidance, type-addition invariants; CI: two new steps
The README's "Browse the live gallery" link pointed at the raw HTML blob,
which GitHub renders as source code rather than the gallery. Add a Pages
deployment workflow that publishes skills/diagram-design/assets as a static
site, and point the README at the deployed gallery (closes#33).
Add CONTRIBUTING.md covering all validation gates and contribution
workflows, CODE_OF_CONDUCT.md (Contributor Covenant 2.1), GitHub issue
templates (bug/feature), and a pull request template; add a Contributing
section to the README.