v1.16.0
Downstream-driven round: ArchCanvas's archlang-1.15 adoption surfaced two upstream gaps its own
ship gate + topology fixer had already filled locally, so those capabilities move upstream as
advisory data and the generated agent docs are re-pointed to teach the v1.13 placement sugar
where models actually imitate it — the worked examples. Core stays zero runtime dependencies; the
default SVG output is byte-identical throughout.
Added
-
suggestTopologygains two connectivity-fault kinds —Suggestion.codewidens 2 → 4 to
W_ROOM_UNREACHABLE | W_BEDROOM_NO_WINDOW | W_NO_ENTRANCE | W_BATH_VIA_BEDROOM. Both new builders
are ported from capabilities proven in ArchCanvas's production topology fixer and each mirrors the
semantics of the matchingarch lintrule so a suggestion fires iff the lint fires:W_NO_ENTRANCE— fires when the plan has an exterior wall but no entrance
(access.hasEntrance === false). Emitsdoor on <wall> at <pct>% width 900candidates on the
longest opening-free exterior run of an entrance-suitable room (not a bedroom, not a wet room),
falling back to the remaining rooms only when no suitable room touches an exterior wall; the
rationale names the room and that this creates the building's entrance.W_BATH_VIA_BEDROOM— reuses the two-BFS pattern from the reachability lint (reach-all vs
reach-excluding-bedrooms) to find a wet room reachable only through a bedroom, and suggests a
door onto a neighbour that itself has a bedroom-free route (non-bedroom neighbours preferred over
an exterior-wall fallback regardless of run length — reconnecting to circulation is the real fix).
One suggestion per affected wet room.
Both stay ADR 0005-compliant (facts and lint, not an architect):
deterministic, closed-form, data-only, fail-open ([]on ambiguity or a resolve error), ordered by
the existing free-run-length → wall-id → position tie-break, top 3 — never applied. -
Furniture-aware door candidates. For door candidates only, the blocked-span computation now
also subtracts wall runs where a furniture footprint intrudes into the door's approach corridor — the
strip inside the target room along that wall,APPROACH_DEPTH = 900mm deep — so a suggested door
never opens straight onto a piece. Windows are exempt (furniture under a window is normal). The three
door builders (W_NO_ENTRANCE,W_ROOM_UNREACHABLE,W_BATH_VIA_BEDROOM) feed the furniture-blocked
runs intolongestFreeRun; the window builder is unchanged. Fail-open — a furniture-free plan yields
no blocked runs, so every pinned golden (all furniture-free fixtures) stays byte-identical.
Changed
- The generated agent spec now teaches attachment-first through its worked example.
scripts/gen-llm-spec.ts'sSPEC_EXAMPLESswaps the coordinate-mathstudio.archfor the
attachment/strip/anchorattached.archas the flagship worked example (parametric.archstays second
as the sanctioned computed-atidiom); neitherexamples/*.archfile changed. The## Common mistakestable is rewritten from coordinate fixes to attachment-first guidance (off-wall opening →
on <wall> at <pos>, hosted by construction; hand-summed room offsets →strip; a guessed furniture
at→in <room> anchor <9-point>), keeping the genuinely universal rows (mm units, +y down, unique
ids). The fix-topology prose now names all four suggest kinds and leads witharch suggest --json.
spec.llm.mdregenerated (~15.9 → ~14.8 KB;llms-full.txtregenerated in the same chain). SKILL.mdanchor grammar corrected. The staleanchor <corner|edge>placeholder becomes the real
nine-point token list (top-left, top, top-right, left, center, right, bottom-left, bottom, bottom-right),
and the topology section names all four suggest faults and notes the candidates are furniture-aware.- CLI / MCP prose lists all four suggest kinds. The
arch suggestusage line (src/cli.ts), the
cmdSuggestdoc comment (src/cli/commands-author.ts), and the MCPsuggesttool description
(packages/mcp/src/server.ts) now name unreachable / no-entrance / bath-via-bedroom / windowless-bedroom
and note the attachment form + furniture-awareness. No wiring change — the rawSuggestion[]passes
through untouched. The MCP shim republishes as@chanmeng666/archlang-mcp@0.2.1(version-bump-only
release so the refreshed tool description actually reaches npm and the MCP registry — the release
workflow's idempotency guard would have skipped an unbumped 0.2.0). suggestTopology's pre-existingW_ROOM_UNREACHABLEbuilder is now gated on the plan having an
entrance. An entrance-less plan previously produced per-roomW_ROOM_UNREACHABLEsuggestions; it now
yields the singleW_NO_ENTRANCEsuggestion instead, matching the lint's own suppression behavior (the
reachability rule reports no-entrance, not per-room unreachability, when there is no way in). No pinned
golden is affected — the existingfaultyfixture has an entrance.- Note (eval baseline):
spec.llm.mdis the eval's author prompt, and this change replaces a worked
example in it, so it now differs from the prompt behind the calibrated live baseline. No scoring/judge/fixture
code changed; re-running the paid live baseline under the new prompt stays a separate, owner-approved action
(default: not run).