Comparative dossier mapping the nine-phase change-request journey against
ISO/IEC/IEEE 15288, ISO/IEC/IEEE 12207, CMMI-DEV V1.3, and ITIL 4, plus
Anthropic Building Effective Agents, the OpenAI practical guide to building
agents, and the Agent Skills specification.
Conclusion: no material structural gaps. Three ADAPT-class documentation
recommendations (phase-9 rollback/follow-up triggers, phase-9 lesson capture
aligned with stages.md Stage 6, requester-outcome traceability at gate 3);
retirement/decommissioning confirmed as deliberate scope boundary; gate
placement converges with published agentic practice.
Co-authored-by: factory-droid[bot] <138933558+factory-droid[bot]@users.noreply.github.com>
feat(neckbeard): position-assessment entry mode and tracker-neutral intake
Closes#371. Merged at head 5aee6fc after branch update from main; CI green at that SHA on the merged tree (validate, paired-eval-smoke, paired-eval-tests).
Six rounds of droid-review did not converge to zero findings; per the documented stop, the four remaining non-blocking prose-consistency findings (two touching trust-boundary doctrine) are recorded in the PR timeline as follow-up material for a separate reviewed change.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add litellm/, an operational tool skill for the LiteLLM AI gateway (proxy)
and Python SDK, in the same vein as the vllm and llama-cpp engine skills.
Contents:
- SKILL.md: operating contract, operating loop, verification boundaries,
and hard boundaries; concise core sections routing depth to references
- README.md: human-facing install/use guide with required sections
- references/: nine dated, source-indexed references (source index,
quickstart + SDK, config & routing, keys/teams/budgets/spend, caching &
guardrails, observability & logging, deployment, security & public
hosting, troubleshooting), researched against litellm 1.97.0
(2026-08-22) including a live proxy probe of the health endpoints
- scripts/litellm-health: read-only GET-only probe (liveliness, readiness,
/v1/models, /model/info); stdlib-only Python 3.9+, --json, --help
without a server
- tests/test_litellm_health.py: 18 deterministic tests against a local
stub HTTP server, including the observed-traffic GET-only contract
- templates/proxy-config-record.md and proxy-deployment.md: fillable
records; the config record is the rollback unit
- evals/evals.json: schema_version 1, six output-quality cases
Also regenerates tracked catalog artifacts (.claude-plugin/marketplace.json,
.codex-plugin/plugin.json, llms.txt) and adds the root README catalog entry
plus the skill-triggers.md index row.
AI assistance: authored with AI assistance (Factory Droid) under human
direction; facts verified against litellm 1.97.0 and official docs dated
2026-08-22.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Round 5 returned 3 P2 (two security) + 3 P3. All resolved:
- Re-derivation escape hatch closed: it now applies only to technical or
factual judgments (re-check a no-delta note against the diff, verify
acceptance criteria against the contract) and never substitutes for an
approval verdict, which requires independent corroboration on the
remote platform.
- Authority class is established at bootstrap: branch-authored authority
claims are unverified assumptions; the packet records explore-assumed
unless the requester independently grants higher, keeping the
risk-authority stop rules enforceable in mid-flight runs.
- Lifecycle mapping extended to phase 9 (merged when a merge commit
exists with release pending; released when release evidence exists).
- Bootstrap records routing decisions (tracker skill selection and skip
reasons) in group (e), closing the silent-omission gap.
- Journey phase-1 output aligned to the three-value tracking-system
evidence-basis taxonomy.
- Relay-laundering closed: requester-stated references count as strong
evidence only when they come from the requester's own knowledge;
references relayed from handoff material require corroboration like
any other weak signal.
- Midflight eval aligned with all of the above.
Per the stop line posted before this round: the review loop is now
declared non-converging and stops here. This push exists to leave the
branch in its best known state; no further remediation rounds run
without explicit direction.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Round 3 findings missed in the earlier pass (reviewer was still posting
when the round was read as concluded) and round 4 findings, all resolved:
tracker-discovery.md:
- Signal table annotated: .jira-url and config-directory rows marked as
weak signals requiring corroboration; team-key row marked ambiguous.
Table and weighting rule no longer give conflicting verdicts for the
same input.
- Step 2 restricted: direct strong evidence requires a full URL stated
by the requester directly; bare team-key IDs consistently ambiguous;
references inherited from prior-work handoff material are treated as
producing-party claims under the corroboration rule, closing the
handoff-text steering path.
position-assessment.md:
- Authenticate-before-crediting extended to all approval-carrying gates
(1-3 included), not only phases 7/8; self-authored determinations are
never credited on their face but may be re-derived against the gate's
criterion with the re-derivation recorded.
- Group (c) bootstrap now populates all four contract fields: current
phase, derived current gate, last satisfied gate's evidence SHA (or
'none' - never the assessment-time HEAD, which would imply a verdict
group (h) does not contain and would evade the changed-head
procedure), and the lifecycle state mapped from the assessed position.
delivery-packet.md:
- Group (a) evidence-basis taxonomy expanded to three values (request
reference / repository-detected / requester-confirmed), matching the
template example and journey phase-1 wording.
evals: midflight case aligned with corrected group (c) semantics.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Four P3 findings on c5da020, all mechanical consistency defects:
- Notion fingerprint (notion.so/notion.site page links) added to the
detection signal table and direct-evidence sentence, so the notion
routing row is reachable by detection, not only by asking.
- Routing decision moved from packet group (a) to group (e): detected
system + evidence basis stays provenance; which tooling skill operates
the tracker is a specialist-selection record like every other routing
entry.
- Empty-inventory branch relocated after the inventory step where it is
actually decidable, and reconciled with Completion: empty inventory
still delivers a report (phase 1) and bootstraps the packet.
- Position report gains assessment head SHA; step 5 derives current gate
from the remaining checklist instead of reading a field the report
never emitted.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Resolves both droid-review findings on 074dac5:
- [P2/security] Scoring treated attacker-forgeable branch-authored
artifacts (committed VERIFICATION.md, claimed approvals, CI claims)
as self-authenticating while forbidding re-verification. Phase 7/8
evidence now requires authenticity confirmation from an independent
source (real reviewer identity on the remote, or CI results queried
from the remote bound to the exact head SHA) before scoring
satisfied; uncorroborated evidence caps at partial with the claim
recorded in the ledger. Aligns position-assessment with the same
signal-weighting doctrine tracker-discovery applies to repo content.
- [P2] Mid-flight bootstrap now populates the tracking-system field
(with evidence basis) into packet group (a) during the inventory
pass, so the packet satisfies the intake gate this PR added.
New head requires fresh CI and re-review; prior verdicts bound to
074dac5 are superseded by this material change.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
All five findings from the droid-review run on 2db3bd0 resolved:
- [P1] Path re-selection moved before scoring: step 2 now re-runs the
SKILL.md path-selection rule against the inventoried surface, so step 3
scoring and the report's selected-path field no longer depend on a
value produced later in step 5.
- [P2] Tracking-system field added to delivery-packet.md group (a) and to
templates/delivery-packet.md, so the phase-1 intake gate has a defined
packet home for the field tracker-discovery.md requires.
- [P2] tracker-discovery eval aligned with the documented procedure: a
bare team-key identifier (ENG-482) is treated as ambiguous between
Jira and Linear; the requester's explicit confirmation is the
disambiguating evidence recorded in group (a).
- [P3/security] Detection signals weighted: request references are strong
evidence; repository content (CONTRIBUTING.md, config files) is a weak,
attacker-influenceable signal requiring corroboration before it alone
selects a system. Unrouted-system fallback constrained to the system's
verified official interface.
- [P3] Frontmatter description extended with the new trigger vocabulary
(mid-flight continuation, Linear/Jira/Notion routing), compressed to
stay within the 1024-char validator cap.
Generated catalog artifacts regenerated for the description change.
All validators re-run green locally; new head requires fresh CI.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Two contained amendments to the delivery lifecycle bundle:
- references/position-assessment.md: a bounded entry mode for mid-flight
engagement - continuing work that started elsewhere with no delivery
packet. Inventories observable artifacts, scores them against phase
exit conditions, emits a position report (current step, satisfied gates
with evidence pointers, remaining checklist), then bootstraps a packet.
Artifacts over narratives: unevidenced claims become recorded
assumptions, never satisfied gates.
- references/tracker-discovery.md: an intake sub-step that detects which
tracking system holds the work item and routes tracker operations to
the matching catalog tooling skill (linear, jira-cli, notion). Keeps
the journey vocabulary tracker-neutral; platform nouns stay confined
to platform mapping rows and lifecycle reference modes.
Wiring: SKILL.md gains the conditional mid-flight section and file-map
rows; journey.md gains the tracker-neutrality statement, phase-1 tracking
field, and mid-flight entry pointer; routing-table.md gains linear,
jira-cli, and notion rows in the existing signal/skip format. README
triggers extended. Two eval cases added to keep the coverage ratchet
green.
Closes#371
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
* fix: SkillOpt epoch 1 for AI operating economics
Promote cold-load entry points, quick-start reference routing, the minimum decision-record contract, and trigger-oriented progressive disclosure.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: SkillOpt epoch 2 for AI operating economics
Add review-depth selection, evidence-to-disposition guidance, and scenario-led routing across adjacent skills.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: SkillOpt epoch 3 for AI operating economics
Expose a minimum claim ledger and explicit closure conditions for every bounded disposition.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: resolve SkillOpt review consistency findings
Align entry-point paths, canonical step routing, claim-ledger fields, and triage disposition wording.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: resolve final SkillOpt disposition wording
Keep review-depth outputs inside the canonical disposition set and distinguish supported claims from permitted language.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: complete SkillOpt routing correction
Route triage through the outcome-map step and identify the evidence-classification step explicitly.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: complete AI economics review template
Add the minimum decision-record fields required by the optimized skill routing contract.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
---------
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* feat: add AI operating economics skill
Add an evidence-led methodology for evaluating AI workflow value, cost, worker effects, quality guardrails, and authority expansion. Includes research references, durable decision templates, and six eval cases. AI assistance: Jasper, on behalf of Magnus Hedemark.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
* fix: resolve AI economics review findings
Align section numbering, evidence-language examples, and intervention-mode terminology identified by the exact-head review.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
---------
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add progressive DDIA handoff and focused replication, partitioning, fencing, and isolation eval coverage.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add audience, narrative, hierarchy, representation, accessibility, uncertainty, review evidence, and eval coverage for C4 and Mermaid artifacts.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add capability and portfolio mapping, state transitions, operating models, decision rights, stakeholder information, templates, evals, and neighboring-owner routing.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Replace board-centric defaults with consequence-driven governance modes, feedback loops, exceptions, and clear ownership boundaries.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add a lifecycle method and reusable record for connecting architecture decisions to checks, evidence, review, exceptions, and retirement.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add evidence lenses for characteristics, coupling, decomposition, data authority, workflows, health reporting, and eval coverage.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add portfolio, lifecycle, topology, policy-placement, assessment, and eval guidance while preserving contract ownership boundaries.\n\nAI-assisted: Jasper orchestrated implementation and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Document scripts and templates and add a concrete Quick Start command.\n\nAI-assisted: Jasper implemented and verified this late-review follow-up.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Add readiness, governance, recovery, pattern, workshop, and eval coverage for operational data architecture decisions.\n\nAI-assisted: Jasper orchestrated research, implementation, and verification with OpenCode.
Signed-off-by: Magnus Hedemark <magnus919@pm.me>
Merge authorized after exact-head validation and paired evaluation checks passed. The follow-up Droid review run on head df31b25 stalled in the model step and ended with an automation error; its actionable findings from the prior review were fixed and independently verified.
* feat(ascii-city-engine): deep enrichment — street furniture, signage, dense Raleigh
Enriches the merged v0.1 skill with a dense, real-data streetscape.
Schema (backward-compatible): props gain optional label + provenance; new
optional signs layer for street-name text; buildings gain name/address/use.
world.schema.json admits signs; all v0.1 packs still validate.
Validator: per-kind prop glyph map with unknown-kind flag; sign validation;
signs included in content-bounds; v0.1 guards (isinstance crash-guard,
O(n^2) DoS caps) intact.
Engine: spatially-indexed prop billboards (signals, trees, crossings, transit
stops, bollards, benches, hydrants) depth-tested at terrain(x,y);
perspective-projected street-name sign text as an overlay pass; road
surface-material and lit ground styling; crosswalk bands; wayfinding HUD
naming the current street and the building faced. Reads spawn + first tile
from manifest.json.
Raleigh sample regenerated dense (same authoritative bbox): 159 buildings
(64 named, addresses, uses), 899 surfaces (86 named, surface/lit/lanes),
298 props across 7 kinds, 29 real street-name signs. 520K, under 2 MB.
Docs + evals: contract/engine-architecture/gis-ingestion/raleigh-poc updated
for the new layers and acceptance checks; 2 new evals (no fabricated signage;
props anchored to terrain).
Verified: validator 1410 PASS / 0 FAIL; broken fixture + AttributeError repro
exit 1; 5000-vertex DoS rejected in 31 ms; node --check OK; HTTP smoke 200
on engine/manifest/tile; validate-skills.rb 154 green; eval-coverage passes;
blocklist clean; headless-Chrome render shows readable in-world 'North
Wilmington Street' sign, signals, crosswalks, and on-street HUD.
AI-assisted contribution (Hermes Agent, spec-driven-development pipeline).
* fix(ascii-city-engine): address droid-review findings on PR #322
1. [P1] facingBuilding(): wrap the heading delta to [-pi,pi] before taking
abs, so the Facing: HUD stops reporting a behind-the-camera building after
the player turns past ~180 degrees.
2. [P2] buildIndices(): rasterize surface polyline edges into grid cells so
long straight road segments register for surface styling and the On:
HUD street name, instead of only indexing endpoint vertices.
3. [P1] validator: guard the new props kinds comprehension and the props/
signs loops in all_points() against null, so 'props: null' or 'signs: null'
produce a structured FAIL instead of an uncaught TypeError traceback.
4. [P3][security] validator: enforce the previously-declared
MAX_FEATURES_PER_TILE (buildings+surfaces+props+signs) to keep the O(n^2)
geometry and duplicate-ID paths bounded in aggregate.
5. [P3] engine: paint marked crossings as a distinct ground band (=) instead
of a floating billboard, matching the documented crosswalk rendering.
6. [P3] eval: align prop-null-terrain expected_output with the render-time
skip behavior actually implemented.
Verified: dense pack 1411/0 exit 0; broken/crash/dos/null packs all exit 1
with clean FAIL reports (no tracebacks); JS node --check OK; validate-skills
154 green; blocklist clean.
* fix(ascii-city-engine): address droid-review round 2 on PR #322
1. [P1] Engine: skip crossing props in the billboard loop so crosswalks
render only as the documented ground band (no more floating '=' above
each of the 168 crossings — a regression from the prior fix).
2. [P3] Engine: nearestStreet() filters to kind==='road' so the HUD 'On:'
line names the street, not a named plaza/sidewalk ('Market Plaza' etc).
3. [P2] Validator: require each sign's text to be a recorded road name
(collected from surfaces), enforcing the documented never-invented
signage contract. A fabricated 'Made Up Avenue' sign now FAILs.
4. [P2][security] Validator: short-circuit the tile loop when
MAX_FEATURES_PER_TILE is exceeded, and replace O(n^2) duplicate-id
.count() scans with single-pass Counters, bounding the quadratic paths.
Verified: dense pack 1411/0 exit 0; fabricated-sign repro flags only the
injected sign and exits 1; broken/crash/dos/null packs all exit 1 with no
tracebacks; JS node --check OK; validate-skills 154 green; blocklist clean.
* fix(ascii-city-engine): address droid-review round 3 on PR #322
1. [P2] Validator: emit the signs rule unconditionally so a null/non-list
'signs' value FAILs instead of passing silently (was gated on a truthy
list check).
2. [P2] Validator: validate sign text against a pack-wide road-name set
gathered across all tiles, so a sign in one tile may name a road whose
surface lives in another (the documented multi-tile case).
3. [P2] Schema: require non-empty id/kind/text (minLength 1) on props and
signs so the schema and validator agree on empty-string rejection.
4. [P3] Engine: drop dead signGrid/IX.key (the sign overlay iterates
world.signs directly); cap edge-rasterization steps so a degenerate
resolution (0) or pathologically long edge cannot spin unboundedly.
5. [P3] Validator: unknown prop kinds now pass with a reported fallback-'?'
note instead of hard-failing, matching the documented fallback glyph and
the engine's behavior.
Verified: dense pack 1411/0 exit 0; signs:null FAILs; fabricated sign FAILs;
multi-tile sign-to-road reference PASSes; broken/crash/dos/null all exit 1;
JS node --check OK; validate-skills 154 green; blocklist clean.
* fix(ascii-city-engine): address droid-review round 4 on PR #322
1. [P2] Engine: render props as once-per-frame perspective-projected one-cell
billboards in an overlay pass (like signs) instead of during the ray march,
eliminating the multi-row vertical streak a close prop produced. Verified in
a live browser: signals/trees/crosswalks now render as discrete single cells.
2. [P3][security] Engine: bound aggregate rasterization in buildIndices() —
cap surfaces (5000) and cells per surface (40000) so a crafted pack cannot
freeze the tab on load (the validator's caps are not applied client-side).
3. [P2][security] Engine: guard sign text (missing/non-string text now skips
the sign instead of throwing in the rAF loop and freezing the view).
4. [P3] Validator: still collect building/surface IDs for oversized tiles so
pack-wide uniqueness detection runs even when the per-feature geometry checks
are short-circuited (duplicates in an over-cap tile are no longer hidden).
Verified: dense pack 1411/0 exit 0; live browser render shows discrete props
(no streaks); broken/crash/dos/null/nullsign/fabric all exit 1, valid
multi-tile pack exit 0; JS node --check OK; validate-skills 154 green;
blocklist clean.
* fix(ascii-city-engine): address droid-review round 5 on PR #322
1. [P2][security] Engine: guard terrain() against non-finite x/y and guard the
prop/sign overlay passes against non-array, non-object entries, so a
malformed pack (missing y, signs=42, null entries) degrades gracefully
instead of throwing in the rAF loop and freezing the view. Verified in a
live browser: a pack with signs=42 + a prop missing y renders with the
frame loop alive and no console errors beyond the favicon 404.
2. [P3] Engine: per-surface 'seen' set now dedupes cells across edges (was
per-edge), eliminating the repeated linear includes() scan that made the
rasterizer quadratic in the worst case.
3. [P3] Engine: raise the per-edge step cap to 20000 since the per-surface
cell cap bounds total work, so long edges are fully sampled at the 2-5 m
resolutions raleigh-poc.md recommends (fixes road-styling drops).
4. [P3] Validator: lower MAX_FEATURES_PER_TILE to 50,000 (shipped pack is
1,385), bounding the quadratic pair tests more tightly.
5. [P3] raleigh-poc: correct walkthrough step 3 — East Hargett sign is ~141 m
behind the spawn, not ahead; only North Wilmington is ahead. HUD count
guards signs/props as arrays.
Verified: dense pack 1411/0 exit 0; broken/crash/dos/null/nullsign/fabric all
exit 1, valid multi-tile pack exit 0; malformed-pack live render survives;
JS node --check OK; validate-skills 154 green; blocklist clean.
* fix(ascii-city-engine): address droid-review round 6 on PR #322
1. [P1] Engine: props/signs overlay passes now use the corrected perpendicular
distance (d*cos(ray_angle-heading)) for row projection, distance scaling,
and the depth test — matching the ray march — so FOV-edge objects project to
the right row and no longer falsely occlude or poison later depth tests.
2. [P2][security] Engine: terrain() guards malformed terrain metadata (missing
terrain/resolution, non-positive resolution, missing origin, null elevations),
so a crafted pack degrades to a clean error instead of freezing the tab.
Verified live: a resolution-0/null-elevations pack shows 'Cannot load...'
with no page errors.
3. [P3] raleigh-poc: walkthrough step 3 corrected — W/S only translate, so a
167-deg-off sign needs A/D rotation, not 'hold S'.
4. [P3][security] Validator: all_points() guards buildings/surfaces/props/signs
against truthy non-iterables (e.g. props=42), matching the other null guards,
so malformed packs report structured FAIL instead of an uncaught TypeError.
Verified: dense pack 1411/0 exit 0; crash/dos/null/nullsign/fabric/props42/
broken all exit 1 (no tracebacks); valid multi-tile exit 0; malformed-terrain
live render shows clean error, no freeze; JS node --check OK; validate-skills
154 green; blocklist clean.
* fix(ascii-city-engine): address droid-review round 7 on PR #322
1. [P2] Engine: spatial-index buildings (footprint bbox -> grid cells) so the
render loop and collision test find nearby buildings in O(nearby) instead of
scanning the whole O(buildings) list per ray sample. Browser-measured frame
cost dropped ~62ms (16 FPS) to 12.5ms mean (~80 FPS) on the dense pack.
2. [P2][security] Engine: terrain() guards null/ragged elevation rows, so a
pack with a null row degrades to a clean error instead of freezing the tab
(live-verified: null-row pack shows 'Cannot load...', no page errors).
3. [P2][security] Engine: cap sign text at 80 chars in the overlay pass, so a
pathological pack-supplied sign cannot drive an unbounded per-frame loop.
4. [P3] Validator: reference FALLBACK_GLYPH constant (was dead) in the
unknown-kinds report message.
5. [P3] raleigh-poc: fix stale expected validator tail (was 30/25; actual is
159/899, rules_passed=1411).
Verified: dense pack 1411/0 exit 0; crash/dos/null/nullsign/fabric/props42/
broken all exit 1, valid multi-tile exit 0; null-row pack shows clean error,
no freeze; ~80 FPS browser-measured on dense pack; JS node --check OK;
validate-skills 154 green; blocklist clean.
* fix(ascii-city-engine): address droid-review round 8 on PR #322
1. [P1][security] Engine: bound the building spatial-index rasterization with
MAX_BUILDING_PTS (2000) and MAX_BUILDING_CELLS (40000) and require >=3 finite
footprint points, so a ~100-byte crafted footprint cannot drive a ~1e10-
iteration synchronous hang on load (the surface rasterizer's cap, applied
to the building index I added in round 7).
2. [P2][security] Engine: facingBuilding() filters footprints to finite points
before reducing, so a building with a null element in its footprint no
longer throws in the rAF loop on frame 1.
3. [P2][security] Engine: collides() and pointNearPolyline() filter footprints/
polylines to valid array points before edge tests, so null footprint points
no longer throw once the player enters those cells.
4. [P3] Validator: correct the feature-cap comment to 'buildings + surfaces +
props + signs combined' (signs were already counted).
Verified: dense pack 1411/0 exit 0; ~85 FPS browser-measured (perf fix intact);
badfoot pack (null-point + missing-footprint buildings) renders with zero page
errors and frame loop alive; crash/dos/null/nullsign/fabric/props42/broken all
exit 1, valid multi-tile exit 0; JS node --check OK; validate-skills 154 green;
blocklist clean.