Lifecycle diagrams generated from real repositories looked tangled: lower
bands used a column grid offset from the main rail, fixed 36px gaps could not
hold reciprocal transitions or labels, the implied rail doubled authored main
transitions, and the runtime source badge sat on the lifecycle sigil.
Schema v2 renders one row per lane on a shared column grid with a dedicated
orthogonal router, adaptive gaps, and vertical row headers. Start and final
states get UML marks explained by the legend, decision no longer shares the
failure color, and label layout reserves the source badge. Schema v1 keeps
its exact state geometry.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
The 860ms cleanup may run before a delayed 780ms CSS animation finishes. Hold cleanup timers only in the real animationend assertion, retain separate fallback coverage, and reproduce a busy first frame with a 350ms delay.
examples/locales/*.json are translation examples only. SKILL.md,
references/authoring-contract.md, and schemas/README.md no longer mention
them; the agent translates meta.translations from the English source
(catalogKeys() + translateMessage('en', key)) fresh for each diagram.
The skill-metadata test now asserts the skill does not reference them.
Rebuilt archify.zip.
Regenerate the three maintained README architecture examples from their JSON sources so they no longer expose ordinary Share Card and Copy Share Card actions. Add a regression against the checked-in examples. Authored nodes, edge paths and labels are preserved; automatic Viewer layout follows the current renderer.
Follow-up for tt-a1i/archify#580.
Remove Share Card and Copy Share Card from the export menu, their ordinary export APIs, and unused rendering fallbacks. Preserve full-diagram exports and route/reach cards, update regression coverage, and regenerate affected examples and packaged artifacts.
Fixestt-a1i/archify#580
The ko finder nouns already started with 개, so the status templates
rendered "12개 중 3개 개 노드". Remove 개 from the three *.noun keys and
put the noun first: "{noun} {available}개 중 {visible}개" / "{noun} {available}개".
Mirrored in the Korean test fixture.
SKILL.md described examples/locales/ as reusable catalogs to copy. They are
format references only; the authoring agent translates meta.translations
for each diagram itself. Rebuilt archify.zip.
Most tangled Architecture drafts come from node placement, which the
router cannot change. Give authors a concrete placement procedure and
turn existing route evidence into node moves.
- Authoring defaults classify relationships (main path, branch/store,
return, second entrance, fan-out) before placement, with a measured
fan-out side length.
- check records which node a crossing pair shares and which node sides
face more neighbours than they have ports; a passing finalize receipt
turns this into node-move hints.
- The Skill allows one bounded, position-only repair when crossings
remain, with a fresh evidence directory and a restore path.
- Automatic routing steps fan-out siblings into free parallel channels
and reaches a blocked row of neighbours through one vertical side.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Keep repository evidence diagnostics in source order and batch-check path-only
references without loading their contents. Preserve the per-file read limit
and fallback behavior for oversized or failed batches.
Restore near-zero geometry semantics, bound text measurement caching, and
remove the redundant brand-loading gate and duplicate distance calculation.
Rebuild the canonical ZIP and add four regressions.
Validation: npm test passed (2307 pass, 0 fail, 84 skipped); 47 fixed inputs
match dev output, exits and diagnostics. Three representative before/after
performance cases retain the compile gains with identical output.
The first batch version normalized every cited path before the batch, so a later invalid path could be reported before an earlier missing file. Path normalization now happens without diagnostics during collection, and the ordered verification loop reports the same first diagnostic as before the batch existed. A document whose first citation is missing while a later one has an invalid path now reports file-missing again; the batch remains a pure optimization.
The review of the indexing changes found five inputs that could go wrong. An unbounded coordinate could push a cell index past the safe integer range, where incrementing it no longer advances, or name more cells than the grid is worth; both grids now come from one shared createSpatialGrid that keeps such an item out of the buckets, still offers it to every query, and returns all items when the query range itself cannot be walked. A whitespace-only brand was skipped before the preparer could report it as unknown, so the gate now uses the preparer own truthiness check. The evidence prefetch validated every path before the first line-range check, which could reorder the first diagnostic; the same checks now run in source order while the objects are collected. The normalized route cache returned a shared mutable array, so cached arrays are frozen and documented as read-only.
The mask test compared every candidate label position against every route segment. The segments now go into a uniform grid once and a candidate asks only the cells it covers, with the bounded clearance deciding the rest. The automatic-label suite and the geometry suite pass, all nineteen corpus documents stay identical, and the DSH diagram renders byte-identically. A doubled architecture document drops from 0.68s to 0.51s and an eight-fold one from 2.37s to 1.19s.
The label placement asks for a segment-to-rectangle clearance only to compare it with a threshold, and it asked millions of times: an axis gap larger than the threshold proves the distance cannot be smaller, so the exact distance is never computed. The exact function also stopped building its four corner arrays on every call. All nineteen corpus documents stay identical, the geometry suite passes, the DSH diagram renders byte-identically, and a doubled architecture document drops from 1.07s to 0.64s with an eight-fold one from 6.45s to 2.13s.
Verification ran two git processes per citation: one for the object type and one for the content. A sixty-five citation diagram therefore spawned about a hundred and thirty processes, and on Windows that dominated the whole render. One cat-file --batch session now answers all of them and the checks read from memory, with the per-citation calls kept as a fallback when the batch session fails. The DSH diagram renders in 0.69s instead of 7.47s with byte-identical output, and all nineteen corpus documents stay identical.
Each port candidate search walked every routed path to find the ones with an endpoint at the node; registration now records those per node, so the search reads only the routes that touch it. Nineteen documents keep identical bytes and diagnostics; the 384-node compile drops from 0.85s to 0.81s and the 768-node one from 1.55s to 1.34s.
Both directions of the placed-label check computed a segment distance for every nearby label and route; a gap of four pixels on either axis proves no segment can violate the clearance, so the per-segment loop is skipped. The routed-item bounds come from the ones the grid insert already computed. Nineteen documents keep identical bytes and diagnostics; both measured sizes improve by a little over two percent.
Measured over one 384-node compile: the legend check costs 40ms and rejected five of ten thousand candidates, the frame border check 27ms with none, while the label-versus-node check rejects 55 percent in 26ms and the endpoint-node check 51 percent in 39ms. Every predicate is pure, so their order cannot change the result and only decides how many candidates reach the expensive ones. The 384-node compile drops from 0.94s to 0.86s and the 768-node one from 1.71s to 1.61s.
Every candidate in the automatic set was built as an array and then normalized, nine per evaluation. joinRoutePoints applies the same normalization while assembling and seeds the cache, so later predicates read it straight away. Nineteen documents keep identical bytes and diagnostics; the 384-node compile drops from 1.03s to 0.92s and the 768-node one from 1.98s to 1.68s. A second change that normalized once inside the endpoint side check was measured and reverted for showing nothing.
The scene label obstacles now join the same grid when they are built, and both the scene-obstacle check and the interaction metrics ask for what is near the candidate; the metrics keep registration order so the floating-point sums are unchanged. The first attempt shipped without publishing the scene obstacles, which the identity check caught by making two rejected dense documents pass; a second difference turned out to be a stale artifact in the verifier itself, which now clears the output before each run. With both fixed, nineteen documents are identical again and the 768-node compile drops from 4.86s to 1.98s.
That path walked every node and every routed path twice per edge to find the rightmost obstacle and the label-deficit push. The node edge is computed once, the routed edge is maintained as routes are registered, and the deficit now asks the grid for the obstacles that can reach the label rectangle. Nineteen documents keep identical bytes and diagnostics; the 768-node compile drops from 7.1s to 5.0s.
The filter, dedupe and collinear collapse now run in a single loop without the intermediate arrays or the argument spread. Nineteen documents keep identical bytes and diagnostics; the 384-node compile drops from 2.34s to 2.06s and the 768-node one from 8.67s to 8.06s.
Three scans became queries or cached values: the label-versus-node check asks the grid, the label clearance deficit asks the grid and accumulates in registration order so the floating-point sum is unchanged, and the scene label obstacles and composition frames are built once per compile instead of once per candidate (the frames are also filtered to those a candidate can reach). Nineteen documents across all five types keep identical bytes and diagnostics. The 768-node compile drops from 14.1s to 8.7s and the fitted growth exponent from about 1.86 to about 1.55.