Open-source 3D architectural editor with a local CLI, MCP tools, and practical workflows for humans and AI agents.
This report summarizes scanner evidence for pascalorg/editor, a TypeScript project with 25,243 GitHub stars. SynthScan examined 1,007,733 lines of code across 4298 source files, recording 2293 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 2.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 2043 finding(s).
Are imports declared and package/API names verified? 20 finding(s).
Are wrappers, guards, and repeated structures necessary? 2087 finding(s).
Which changes need focused human review? 2293 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 2293 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/validate-skills.ts | 534 | function deriveFurnitureNextAction(context: FurnitureDecisionContext): FurnitureNextActionKind { | CODE |
| LOW | scripts/openai-tool-annotation-policy.ts | 115 | export function validateOpenAiToolAnnotationPacket(value: unknown): string[] { | CODE |
| LOW | scripts/clawhub-ignore-policy.ts | 19 | export function validateClawHubIgnorePolicy( | CODE |
| LOW | scripts/public-skill-discovery-policy.ts | 35 | export function parseSkillDiscoveryMetadata(content: string): { | CODE |
| LOW | scripts/public-skill-discovery-policy.ts | 62 | export function collectSkillDiscoveryEntries(repositoryRoot: string): SkillDiscoveryEntry[] { | CODE |
| LOW | scripts/public-skill-discovery-policy.ts | 95 | export function validatePublicSkillDiscoverySurface(entries: SkillDiscoveryEntry[]): string[] { | CODE |
| LOW | scripts/cursor-plugin-policy.ts | 5 | export function validateCursorPluginPackage(root: string): string[] { | CODE |
| LOW | packages/core/src/material-library.ts | 5003 | function notifyDynamicLibraryChange(): void { | CODE |
| LOW⚡ | packages/core/src/material-library.ts | 5018 | export function unregisterLibraryMaterials(ids: string[]): void { | CODE |
| LOW⚡ | packages/core/src/material-library.ts | 5026 | export function getDynamicLibraryMaterials(): MaterialCatalogItem[] { | CODE |
| LOW⚡ | packages/core/src/material-library.ts | 5030 | export function subscribeLibraryMaterials(listener: () => void): () => void { | CODE |
| LOW⚡ | packages/core/src/material-library.ts | 5037 | export function getLibraryMaterialsVersion(): number { | CODE |
| LOW | packages/core/src/material-library.ts | 5100 | export function getLibraryMaterialIdFromRef(materialRef?: string | null) { | CODE |
| LOW | packages/core/src/material-library.ts | 5106 | export function getSceneMaterialIdFromRef(materialRef?: string | null): string | null { | CODE |
| LOW | packages/core/src/capture/schema.ts | 246 | export function normalizeCaptureSessionManifest(value: unknown): CaptureSessionDescriptor { | CODE |
| LOW | packages/core/src/capture/schema.ts | 327 | function validateSurfaceMeshByteLength( | CODE |
| LOW | packages/core/src/agent-operations/scene-materials.ts | 35 | export function resolveInlinePaintMaterial( | CODE |
| LOW | packages/core/src/agent-operations/scene-materials.ts | 120 | export function referencedSceneMaterialIds(value: unknown): Set<string> { | CODE |
| LOW | packages/core/src/agent-operations/material-preset.ts | 49 | export function unknownMaterialPresetRefusal( | CODE |
| LOW | packages/core/src/agent-operations/add-object.ts | 646 | export function refuseParamsWithoutScript( | CODE |
| LOW | packages/core/src/agent-operations/scene-view.ts | 91 | export function sceneViewPresentationLevel( | CODE |
| LOW | packages/core/src/agent-operations/scene-view.ts | 109 | export function confirmSceneViewPresentation( | CODE |
| LOW | packages/core/src/agent-operations/layout-clearance.ts | 76 | export function collectOccupiedFootprints( | CODE |
| LOW | packages/core/src/agent-operations/layout-clearance.ts | 448 | export function generatePlacementCandidates( | CODE |
| LOW | …re/src/agent-operations/ceiling-object-observations.ts | 57 | export function ceilingObjectObservations( | CODE |
| LOW | packages/core/src/agent-operations/plan-geometry.ts | 30 | export function projectWorldPointToWallLocalX( | CODE |
| LOW | packages/core/src/contracts/reference-discovery.ts | 19 | export function discoverReferenceCandidates(schema: z.ZodType): string[] { | CODE |
| LOW | packages/core/src/runtime/dependencies.ts | 61 | export function matchesCollectionPredicate( | CODE |
| LOW | packages/core/src/runtime/apply.ts | 331 | export function applyPatchWithDependencies( | CODE |
| LOW | packages/core/src/runtime/scene-runtime.ts | 270 | export function declareActionDependencies( | CODE |
| LOW | packages/core/src/utils/ensure-scene-openings.ts | 5 | function ensureSceneOpeningsOnView(sourceNodes: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/floor-follow-migration.ts | 7 | export function migrateFootprintFollowing(nodes: Record<string, AnyNode>): Record<string, AnyNode> { | CODE |
| LOW | packages/core/src/utils/floor-plate-migration.ts | 94 | export function associateLegacyManualFloors( | CODE |
| LOW | packages/core/src/utils/floor-plate-migration.ts | 358 | function absorbCompleteManualFloors(source: Record<string, AnyNode>) { | CODE |
| LOW | packages/core/src/utils/floor-plate-migration.ts | 453 | function clearDanglingFloorSources(nodes: Record<string, AnyNode>) { | CODE |
| LOW | packages/core/src/utils/legacy-material-slots.ts | 61 | export function migrateWallSurfaceMaterials(node: Record<string, any>, minted: MintedMaterials) { | CODE |
| LOW | packages/core/src/utils/legacy-material-slots.ts | 106 | export function migrateSingleMaterialSlots( | CODE |
| LOW | packages/core/src/utils/legacy-material-slots.ts | 134 | function migrateStructuralMaterialSlotsOnView(sourceNodes: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/exterior-threshold-migration.ts | 64 | export function migrateExteriorThresholds( | CODE |
| LOW | packages/core/src/utils/floor-opening-migration.ts | 39 | function migrateFloorOpeningNodesOnView(sourceNodes: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/reconcile-structure-on-load.ts | 25 | function discardOrphanLegacySlabCuts(source: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/clone-scene-graph.ts | 30 | function remapFloorOpeningReferences(node: AnyNode, ids: Map<string, string>) { | CODE |
| LOW | packages/core/src/utils/vertical-scene-migration.ts | 42 | function migrateVerticalSceneNodesOnView( | CODE |
| LOW | packages/core/src/utils/wall-face-migration.ts | 174 | function migrateWallFaceKeysOnView(sourceNodes: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/wall-face-migration.ts | 259 | function migrateWallFaceBandsOnView(sourceNodes: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/clone-scene-graph.test.ts | 150 | function sceneWithControlledDimensions(): SceneGraph { | CODE |
| LOW | packages/core/src/utils/structure-id.ts | 70 | export function reconcileStructureWithStableIds( | CODE |
| LOW | packages/core/src/utils/wall-assembly-migration.ts | 17 | export function migrateLegacyWallAssemblies(nodes: Record<string, unknown>): WallAssemblyMigration { | CODE |
| LOW | …ckages/core/src/utils/owned-floor-opening-migration.ts | 126 | function materializeLegacyAutoOpeningsOnView( | CODE |
| LOW | …ckages/core/src/utils/owned-floor-opening-migration.ts | 350 | function migrateOwnedFloorOpeningsOnView(sourceNodes: Record<string, unknown>) { | CODE |
| LOW | packages/core/src/utils/room-zone-migration.ts | 232 | function migrateCeilingRoomLinksOnView( | CODE |
| LOW | packages/core/src/schema/compiled-node-parsers.ts | 34 | export function enableCompiledNodeParsers(value = true): void { | CODE |
| LOW | packages/core/src/schema/compiled-node-parsers.ts | 39 | export function compiledNodeParsersEnabled(): boolean { | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 139 | export function dormerWallFacePointToDormer( | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 168 | export function getDormerWallVerticalBounds( | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 197 | export function getDormerWallOpeningVerticalBounds( | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 213 | export function getDormerWallHorizontalBoundsAtHeight( | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 262 | export function getDormerDefaultWindowFace( | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 271 | export function createDormerDefaultWindow( | CODE |
| LOW | packages/core/src/schema/nodes/dormer.ts | 330 | export function getEffectiveDormerSurfaceMaterial( | CODE |
| 1797 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/src/agent-operations/__fixtures__/build-room-cases.ts | 151 | // ─── Checks the table cannot state: minted ids and derived construction ─────────────────────── | COMMENT |
| MEDIUM | …/src/agent-operations/__fixtures__/build-room-cases.ts | 688 | // ─── furnish_room ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/agent-operations/__fixtures__/node-read-cases.ts | 123 | // ─── Source ids: a slice of the converted /next house, as find_nodes' own tests seeded it ───────── | COMMENT |
| MEDIUM | …e/src/agent-operations/__fixtures__/node-read-cases.ts | 166 | // ─── Zones: what stands in one, by its plan point on the zone's level ────────────────────────────── | COMMENT |
| MEDIUM | …e/src/agent-operations/__fixtures__/node-read-cases.ts | 216 | // ─── Kinds, parents and the driveway Architect's method looks for ────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/agent-operations/__fixtures__/node-read-cases.ts | 843 | // ─── describe_node: its ancestry, children, properties and sentence, from get_node ──────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 142 | // ─── Hierarchy ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 188 | // ─── Hosts and supports ─────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 353 | // ─── Parts and topology owned by the node ───────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 371 | // ─── Connections (explicit and derived) ─────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 406 | // ─── Membership ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 502 | // ─── Control ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 584 | // ─── Measurements and dimensions ────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 597 | // ─── Content: materials, assets, sources ────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 711 | // ─── Typed provenance (D5) ──────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.ts | 859 | // ─── metadata.* ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.test.ts | 124 | // ─── metadata.* ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.test.ts | 215 | // ─── Dependents and labels ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/contracts/reference-inventory.test.ts | 365 | // ─── Clone columns, executed ────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/utils/wall-face-migration.test.ts | 19 | // ── The renderer before phase 7, restated as a pure oracle ─────────────────── | COMMENT |
| MEDIUM | packages/core/src/utils/wall-face-migration.test.ts | 117 | // ── The phase-7 renderer on a migrated node ────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/utils/wall-face-migration.test.ts | 145 | // ── Fixtures ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/schema/types.ts | 160 | // ─── Fidelity F0 contract names (frozen, type-only) ───────────────────── | COMMENT |
| MEDIUM | …ckages/core/src/schema/__bench__/node-parsers.bench.ts | 71 | // ── sections ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/core/src/schema/__bench__/node-parsers.bench.ts | 308 | // ── child mode ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/core/src/schema/__bench__/node-parsers.bench.ts | 329 | // ── parent ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 15 | // ─── GeometryContext ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 199 | // ─── FloorplanPalette ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 238 | // ─── FloorplanGeometry ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 301 | // ─── NodePort ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 350 | // ─── ToolHint ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 405 | // ─── ToolOption ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 819 | // ─── FloorplanAffordance ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 897 | // ─── FloorplanMoveTarget ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 979 | // ─── Plugin manifest ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 1028 | // ─── NodeDefinition ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 1564 | // ─── Keyboard actions ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 1599 | // ─── Presentation (tool palette + UI surface) ──────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 1703 | // ─── Capabilities ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 2738 | // ─── Relations ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 2751 | // ─── References (R3; F5a, F8 typed reference policy) ───────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 2853 | // ─── Evaluation context (F5a/§2.12; R2) ────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 2868 | // ─── Export identity (F4) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 2914 | // ─── ParametricDescriptor ──────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 3072 | // ─── Affordance ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 3085 | // ─── DragAction primitive ──────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 3102 | // ─── SceneApi ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/registry/types.ts | 3157 | // ─── Registry surface ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/lib/below-grade-footprints.test.ts | 364 | // ── What the house covers ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/lib/below-grade-footprints.test.ts | 689 | // ── Site flatwork is not a floor of the house ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/lib/below-grade-footprints.test.ts | 755 | // ── A split level under a hill: every floor is judged at its own height ─────────────────────── | COMMENT |
| MEDIUM | packages/core/src/lib/below-grade-footprints.test.ts | 848 | // ── The same split level on a flat site: every floor against the datum ────────────────────── | COMMENT |
| MEDIUM | packages/core/src/services/validate-dwv.ts | 92 | // ── Per-segment slope (waste only) ────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/services/validate-dwv.ts | 128 | // ── Component-scoped trap rules ────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/services/snap.ts | 23 | // ─── Grid snap ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/services/snap.ts | 104 | // ─── Angle snap ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/services/snap.ts | 182 | // ─── Top-level SnapServices facade ──────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/services/alignment.ts | 258 | // ─── Anchor extractors (pure) ───────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/building/opening-style-presets.ts | 11 | // ── Doors ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/building/opening-style-presets.ts | 139 | // ── Windows ────────────────────────────────────────────────────────────────── | COMMENT |
| 169 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tooling/release/release.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/bun-preload-three.ts | 1 | import { resolveSync } from 'bun' | COMMENT |
| LOW | packages/core/src/utils/heal-scene-graph.ts | 1 | // Repairs scene-graph corruption that pre-dates the source fixes, so existing | COMMENT |
| LOW | packages/core/src/schema/nodes/item.ts | 101 | // from `items.userId`: null → 'library', current user → 'mine', | COMMENT |
| LOW | packages/core/src/schema/nodes/item.ts | 161 | // later edits that translate or slope the face. | COMMENT |
| LOW | packages/core/src/schema/nodes/duct-segment.ts | 41 | // Cross-section. Round is the branch default; rect is the trunk / | COMMENT |
| LOW | packages/core/src/schema/nodes/duct-segment.ts | 61 | // Construction material. Spiral is round rigid sheet metal with the | COMMENT |
| LOW | packages/core/src/schema/nodes/duct-fitting.ts | 61 | // Adapter end profiles; omitted values use the fitting type's standard profiles. | COMMENT |
| LOW | packages/core/src/schema/nodes/door.ts | 81 | wallId: z.string().optional(), | COMMENT |
| LOW | packages/core/src/schema/nodes/gutter.ts | 61 | // "White" instead of "no material" on a freshly-placed gutter. | COMMENT |
| LOW | packages/core/src/schema/nodes/gutter.ts | 101 | // out the sides. Independent per-end because a downspout typically | COMMENT |
| LOW | packages/core/src/schema/nodes/roof-segment.ts | 121 | .min(-Math.PI * 2) | COMMENT |
| LOW | packages/core/src/schema/nodes/roof-segment.ts | 181 | fascia: z.boolean().optional(), | COMMENT |
| LOW | packages/core/src/schema/nodes/downspout.ts | 21 | // every other roof accessory). gutterId then drives the LOOKUP of | COMMENT |
| LOW | packages/core/src/schema/nodes/downspout.ts | 41 | // metres. The downspout's offset elbows step it back from the eave | COMMENT |
| LOW | packages/core/src/schema/nodes/turbine-vent.ts | 21 | position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]), | COMMENT |
| LOW | packages/core/src/schema/nodes/fence.ts | 61 | end: z.tuple([z.number(), z.number()]), | COMMENT |
| LOW | packages/core/src/schema/nodes/box-vent.ts | 41 | // cap's flange. Reads as the ventilation slot on real attic vents. | COMMENT |
| LOW | packages/core/src/schema/nodes/duct-terminal.ts | 21 | position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]), | COMMENT |
| LOW | packages/core/src/schema/nodes/window.ts | 41 | wallId: z.string().optional(), | COMMENT |
| LOW | packages/core/src/schema/nodes/shelf.ts | 81 | COMMENT | |
| LOW | …ore/src/hooks/spatial-grid/pointer-support-cap.test.ts | 261 | // move an item over the deck near its far edge with an angled camera. | COMMENT |
| LOW | packages/core/src/registry/types.ts | 301 | // ─── NodePort ──────────────────────────────────────────────────────── | COMMENT |
| LOW | packages/core/src/registry/types.ts | 821 | // 2D drag session contract for floor-plan interactions. The registry | COMMENT |
| LOW | packages/core/src/registry/types.ts | 901 | // | COMMENT |
| LOW | packages/core/src/registry/subtree.ts | 1 | import { EXISTING_REFERENCES, METADATA_REFERENCES } from '../contracts/reference-inventory' | COMMENT |
| LOW | packages/core/src/registry/registry.ts | 21 | // registry-version bump — plugins load asynchronously, after first mount. | COMMENT |
| LOW | packages/core/src/registry/handles.ts | 1 | // In-world resize / move arrow descriptors. Each `NodeDefinition` may | COMMENT |
| LOW | packages/core/src/lib/space-detection.ts | 101 | wall.height == null | COMMENT |
| LOW | packages/core/src/systems/wall/wall-assembly.ts | 961 | return offsets[0]! >= offsets[offsets.length - 1]! ? offsets : offsets.slice().reverse() | COMMENT |
| LOW | packages/core/src/systems/wall/wall-assembly.ts | 981 | // existing footprint miter exactly. | COMMENT |
| LOW | packages/core/src/systems/wall/wall-mitering.ts | 181 | } | COMMENT |
| LOW | …ore/src/systems/wall/__fixtures__/wall-assembly-ws5.ts | 521 | // need exactly the same treatment at an ARBITRARY offset from the centreline, | COMMENT |
| LOW | …ore/src/systems/wall/__fixtures__/wall-assembly-ws5.ts | 541 | // junctions), the corner it is NEARER to wins (priority = its index in | COMMENT |
| LOW | packages/core/src/services/opening-guides.ts | 1 | // Proximity / alignment guides for wall-hosted openings (doors, windows). | COMMENT |
| LOW | packages/core/src/services/alignment.ts | 161 | return { guides: result.guides, snap: { dx: dxL, dz: dzL } } | COMMENT |
| LOW | packages/core/src/validation/validate-build-json.ts | 181 | if (installedPluginsRaw !== undefined && installedPlugins === undefined) { | COMMENT |
| LOW | packages/core/src/store/use-scene.ts | 921 | mintedMaterials, | COMMENT |
| LOW | packages/core/src/store/use-scene.ts | 981 | } as AnyNode | COMMENT |
| LOW | …ckages/core/src/store/derived-writer-allowlist.test.ts | 1 | import { expect, test } from 'bun:test' | COMMENT |
| LOW | packages/nodes/src/lean-to-extension/arc.ts | 1 | import type { LeanToExtensionNode, Point2D } from '@pascal-app/core' | COMMENT |
| LOW | packages/nodes/src/dormer/definition.ts | 41 | // dragging one arrow grows the dormer outward from its own edge while | COMMENT |
| LOW | packages/nodes/src/dormer/definition.ts | 241 | dormerWallHeightHandle(), | COMMENT |
| LOW | packages/nodes/src/dormer/csg-geometry.ts | 381 | return geo | COMMENT |
| LOW | packages/nodes/src/wall/renderer.tsx | 121 | COMMENT | |
| LOW | packages/nodes/src/wall/move-tool.tsx | 481 | // Seeding a controller grab is not movement; don't snap an off-grid wall | COMMENT |
| LOW | packages/nodes/src/wall/floorplan.ts | 101 | // the assembly's layers, offset in from the footprint and mitered at the same | COMMENT |
| LOW | packages/nodes/src/wall/floorplan-affordances.ts | 341 | sceneState.markDirty(upd.id) | COMMENT |
| LOW | packages/nodes/src/wall/pointer-transparency.test.ts | 21 | // the wall's own render mesh) land in event.intersections at the wall's | COMMENT |
| LOW | packages/nodes/src/wall/move-endpoint-tool.tsx | 261 | // fences, items, slabs, ceilings, columns), gathered once (the set is | COMMENT |
| LOW | packages/nodes/src/wall/move-endpoint-tool.tsx | 281 | // handlers re-run the FULL snap pipeline immediately on a modifier change | COMMENT |
| LOW | packages/nodes/src/wall/move-endpoint-tool.tsx | 541 | // Drop the live overrides; the store write below is the source of truth. | COMMENT |
| LOW | packages/nodes/src/slab/definition.ts | 381 | module: () => import('./renderer'), | COMMENT |
| LOW | packages/nodes/src/stair-segment/definition.ts | 61 | (footprintBounds(n).minZ + footprintBounds(n).maxZ) / 2, | COMMENT |
| LOW | packages/nodes/src/gutter/renderer.tsx | 221 | ], | COMMENT |
| LOW | packages/nodes/src/gutter/renderer.tsx | 281 | // `node.position` is segment-local — the placement tool resolves the | COMMENT |
| LOW | packages/nodes/src/gutter/floorplan.ts | 61 | COMMENT | |
| LOW | packages/nodes/src/gutter/geometry.ts | 101 | // Z_cs = depth maps to mesh--X (left end). | COMMENT |
| LOW | packages/nodes/src/gutter/geometry.ts | 121 | // formula handles both. In mesh coords: | COMMENT |
| LOW | packages/nodes/src/gutter/geometry.ts | 401 | } | COMMENT |
| 113 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | wiki/blender-geometry-scripts.md | 25 | bpy.context.scene.collection.objects.link(obj) | CODE |
| CRITICAL | wiki/blender-geometry-scripts.md | 54 | bpy.context.scene.collection.objects.link(top) | CODE |
| CRITICAL | wiki/blender-geometry-scripts.md | 59 | bpy.context.scene.collection.objects.link(lamp) | CODE |
| CRITICAL | packages/mcp/src/tools/author-scene.test.ts | 595 | expect(room.floor.script.manifest.slots.map((s: { id: string }) => s.id)).toEqual(['wood']) | CODE |
| CRITICAL | …es/geometry-script/src/__fixtures__/blender/cabinet.py | 18 | bpy.context.scene.collection.objects.link(obj) | CODE |
| CRITICAL | …es/geometry-script/src/__fixtures__/blender/cabinet.py | 44 | bpy.context.scene.collection.objects.link(top) | CODE |
| CRITICAL | …es/geometry-script/src/__fixtures__/blender/cabinet.py | 48 | bpy.context.scene.collection.objects.link(lamp) | CODE |
| CRITICAL | …iewer/src/systems/item-light/item-light-system.test.ts | 219 | expect([...sprite.material.colorNode.value.array.slice(0, 6)].every(Number.isFinite)).toBe(true) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/core/src/schema/material.ts | 30 | // Coerce unknown presets (legacy/AI-generated data) to 'custom' instead of throwing. | COMMENT |
| HIGH | packages/nodes/src/wall/renderer.tsx | 189 | // Same for the dynamic library: AI-generated `library:mtl_*` presets | COMMENT |
| HIGH | packages/viewer/src/systems/wall/wall-materials.ts | 205 | // cache. A `library:` ref carries its resolution state instead: AI-generated | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/mcp/src/tools/clear-scene.ts | 35 | // Resetting drops the plugin state on every host; the scaffold is applied again with it. | COMMENT |
| MEDIUM | packages/mcp/src/tools/clear-scene.test.ts | 16 | // accident is refused, as the hosted store refuses it (the scaffold: a site, a building, a level). | COMMENT |
| MEDIUM | packages/mcp/src/tools/clear-scene.test.ts | 127 | // The walls and what they derived (the room, its floor and ceiling) go; the scaffold stays. | COMMENT |
| MEDIUM | packages/mcp/src/tools/clear-scene.test.ts | 139 | // A fresh session loads what was stored: the scaffold and the one new wall. | COMMENT |
| MEDIUM | packages/editor/src/components/editor/index.tsx | 1568 | // scene: an editor that renders the default scaffold after a failed load | COMMENT |
| MEDIUM | packages/editor/src/components/editor/index.tsx | 1569 | // autosaves that scaffold over the real project. | COMMENT |
| MEDIUM | packages/editor/src/hooks/use-auto-save.test.ts | 23 | // scaffold and only learns the real size when the load lands. Without this, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/cli/src/bin/pascal.ts | 463 | print(await readLogTail(paths.editorLog, lines)) | CODE |
| HIGH | packages/cli/src/bin/pascal.ts | 883 | print(JSON.stringify(run, null, 2)) | CODE |
| HIGH | packages/cli/src/bin/pascal.ts | 982 | print(json ? JSON.stringify(value, null, 2) : human) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/i18n-literals.ts | 52 | 'placeholder', | CODE |
| LOW | scripts/i18n-literals.ts | 69 | 'placeholder', | CODE |
| LOW | scripts/claude-mcp-config-policy.test.ts | 79 | pascal: { ...localServer, env: { PASCAL_API_KEY: 'placeholder' } }, | CODE |
| LOW | scripts/claude-mcp-config-policy.test.ts | 147 | pluginWithUserConfig({ pascal_api_key: { ...canonicalKeyOption, default: 'placeholder' } }), | CODE |
| LOW | scripts/i18n-pseudo-audit.ts | 79 | for (const name of ['aria-label', 'title', 'placeholder', 'alt']) { | CODE |
| LOW | …s/core/src/agent-operations/__fixtures__/site-cases.ts | 160 | mentions: ['placeholder'], | CODE |
| LOW | …s/core/src/agent-operations/__fixtures__/site-cases.ts | 620 | mentions: ['placeholder'], | CODE |
| LOW | …src/agent-operations/__fixtures__/scene-check-cases.ts | 546 | () => ground(...finished('placeholder', 'Room')), | CODE |
| LOW | packages/nodes/src/item/definition.ts | 206 | id: 'placeholder', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/nodes/src/door/floorplan.ts | 654 | // the leaf. Built as a polygon so it's robust to wall orientation. | COMMENT |
| MEDIUM | packages/ifc-converter/src/index.ts | 461 | // type id — robust across web-ifc versions. IfcCircleProfileDef has a | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/geometry-script/bpy/runner.py | 157 | except Exception as error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/geometry-script/bpy/runner.py | 30 | CODE |