constellation-map — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited constellation-map (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Converts a mind map PNG into a physics-based interactive HTML constellation visualization.
Follow these four steps in order. Do not skip the JSON confirmation step.
Carefully read every node and connector in the uploaded image. Extract:
Preserve all label text exactly as written in the image.
Output a JSON summary before writing any code:
{
"root": "Root Label",
"branches": [
{
"id": "b1",
"label": "Branch Label",
"kids": ["Leaf 1", "Leaf 2"]
},
{
"id": "b2",
"label": "Branch Label",
"subs": [
{ "id": "b2_s0", "label": "Sub Label", "kids": ["Leaf A", "Leaf B"] }
]
}
]
}Ask the user to confirm the structure is correct before proceeding.
Assign one color slot per branch, cycling through the palette if there are more than 6:
| Slot | Fill | Glow | Label text |
|---|---|---|---|
| 1 | #c084fc | #a855f7 | #1a0030 |
| 2 | #34d399 | #10b981 | #002918 |
| 3 | #fb923c | #f97316 | #2d0a00 |
| 4 | #60a5fa | #3b82f6 | #001638 |
| 5 | #fbbf24 | #f59e0b | #2a1400 |
| 6 | #f87171 | #ef4444 | #2d0000 |
#ffffff, glow #a0c8ff, label #03060fProduce a single self-contained HTML file. No external dependencies.
#### Canvas & Container
<div style="background:#03060f;border-radius:16px;overflow:hidden;
position:relative;user-select:none;">
<canvas id="c" style="display:block;width:100%;touch-action:none;"></canvas>
<div id="tip" style="position:absolute;pointer-events:none;display:none;
background:rgba(5,10,28,0.95);border:1px solid rgba(255,255,255,0.18);
border-radius:10px;padding:9px 14px;z-index:20;"></div>
<div style="position:absolute;bottom:10px;left:50%;transform:translateX(-50%);
color:rgba(255,255,255,0.35);font-size:11px;font-family:sans-serif;
pointer-events:none;">drag any star · click branch to focus</div>
</div>#### Canvas Setup
max(600px, width * 0.8)devicePixelRatio#03060f#### Node Sizes
| Type | Radius |
|---|---|
| root | 30px |
| branch | 20px |
| sub | 13px |
| leaf | 8–9px |
All non-leaf nodes get an inner bright core: rgba(255,255,255,0.35) circle at r * 0.4.
#### Labels
…), full label floating outsidergba(3,6,15,0.7) background, borderRadius:4, positioned radially outward from canvas center#### Edges
lineWidth 2, solid, shadowBlur 6lineWidth 1, solidlineWidth 1, dashed [4,5]globalAlpha 0.55 (active) or 0.06 (dimmed)#### Node Layout
Place nodes using polar coordinates from canvas center (W/2, H/2):
(i / numBranches) * 2π, radius ~0.28 * min(W,H). Use ax/ay offsets scaled by W/900 and H/700.~0.26 * min(W,H) from center0.28–0.43 * min(W,H) depending on depth⚠️ Critical — root node JavaScript `type` must be `'center'`, not'root'. The Step 1 JSON schema uses the key"root"for readability, but in the generated JavaScript the root node object must be created withtype: 'center'. The physics function guards withn.type === 'center'to exempt the root from all forces. Using any other string will cause the root to drift under repulsion and break the entire layout.
#### Physics
Read references/physics.md for all exact constants and the full physics function implementation.
#### Interactions
| Action | Behavior |
|---|---|
mousedown / touchstart on node | Begin drag, store offset |
mousemove / touchmove | Move dragged node, zero its velocity |
mouseup with movement < 5px | Toggle branch focus |
| Click root | Clear focus |
mouseleave | Hide tooltip, stop drag |
touchend | Stop drag |
⚠️ Critical — physics loop must keep running during drag. The animation loop (requestAnimationFrame) must never pause or skip physics while a node is being dragged. The physics function already skipsn === dragging, so the dragged node is positioned directly by the mouse. All other nodes — especially leaves and subs — must continue receiving spring forces every frame so they follow the moved branch naturally. If physics stops during drag, connected leaf/sub nodes will freeze completely and not follow.
Tooltip on hover: Node label (bold 12px white) + type and parent branch name (10px, 45% white). Hidden while dragging.
#### Draw Order Per Frame
#03060fleaf → sub → branch → root (root always on top).html fileBefore finalising, verify:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.