You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ALGO-01.1 — ADR: ownership, taxonomy, knowledge-pack format and product-workspace distribution #5223
Parent Outcome: #5222
Work level: Delivery · Track: Active delivery · Intended Status: Ready
Owner
Root/fdev assigns.
Done when
An accepted ADR (in .github/docs/adr) plus a framework Atlas pointer record. It decides:
Producer: the producer repository, either a new FS.GG.Algorithms repo or FS.GG.Game, with reasons covering dependency direction (Game, Rendering and RuneScape consume it) and release cadence.
Pack format: the knowledge-pack entry schema, reusing the Atlas record format and atlas.py tooling as a product-local archive inside the skill. Covers fields, citation and licence rules (summarise and cite, never copy textbooks or wikis), and size limits.
Distribution: the producer's template/skill-manifest/skill-manifest.json, registry/skills.yml rows, ADR-0017 materializes-when predicates (which templates get it), and the fsgg-sdd upgrade re-seed path. Verified against how fs-gg-grids, fs-gg-collision, fs-gg-line-drawing and fs-gg-visibility ship today.
Existing skills: how those four skills relate, whether folded in or indexed by the umbrella.
Growth loop: the framework capture rule at Delivery closure, plus the upstream contribution route from product workspaces.
Taxonomy and seed list: the taxonomy, and the first-tranche entry list harvested from existing reviewed code.
Root/fdev: the ADR owner is dispatched. Three analysts are inventorying the FS-GG repos for seed content (engine and product, games and netcode, coordination and formal), and their findings will be posted here.
Root/fdev analyst (coordination & formal repos): inventory of algorithm and optimization techniques for ALGO-01.1 (analysis only; nothing modified; Outcome #5222).
Method. Read local checkouts (.github 936283c0, Governance 3b8543e8, SDD 2a2770be, FsQuint 69fa62a, Authority e5ebd077, Coordination c0e7afc; see Unknowns for the last). Sources read directly; SHAs below are the last commit touching the cited path. Tested? and Benched? come from reading the test tree. I ran no tests or benchmarks.
Property tests are rare. FsCheck appears in .github/tests/FS.GG.Coord.Core.Tests/TouchSetTests.fs (5d7e2328) and in some Governance JSON/budget tests. The graph, diff and scheduling code has example-based xUnit only.
The LEARN-01 statistics are design only. The roadmap (docs/roadmaps/2026-09-12-095059-...-statistical-learning.md@02e6839a) specifies block randomization, cluster-resampling intervals, sequential error budgets, IPS/effective-sample-size checks and logged-bandit caveats. I found no executable randomizer, bandit, estimator or power calculation in scope. LearningAssignmentAdapter.fs@513acdb only persists and replays an immutable assignment (SHA-256 bound), not a draw. The pod design (docs/coordination/2026-10-30-learn-finite-executor-pod-design.md@18d2fb7a) is container/infra, with no algorithm content.
Not present anywhere in scope: topological sort, critical path, exponential backoff with jitter, token bucket, Merkle trees, constraint solvers, LP, bandits. Retry is fixed tables or constants (scripts/release-successor-publish.py@eb41faf3ADMISSION_READ_BACKOFF_SECONDS=(0.5,1.5); MainHostComposition.fs@5d525ad constant 15s). Errors.fs@5d7e2328 only advises "honour Retry-After, else back off with increasing delay". These are gaps a library entry could fill, not harvestable code.
Authority repo (FS.GG.Coordination.Authority) holds state and evidence JSON only; no algorithms.
1. Table
Audience: G = game product, F = framework only, B = both. Rec: H = harvest into library plus entry, E = entry only, L = leave.
No visited set across roots or branches, so it can re-explore shared sub-DAGs (read, not measured; likely exponential on diamond-heavy graphs). Use as the "pitfall" in the Tarjan entry.
Deterministic: ranked fold, number as final tiebreak. Entry covers greedy MIS, fail-closed on unknown, determinism across cached windows. Domain types are board-specific.
Lexicographic rank with aging/starvation and blocking-count (out-degree) term
Conjunctive threshold gate, min over cgroup chain, fail-closed. Host-side Python; not an F# candidate. Game analogue: frame/memory budget gates, load shedding.
Recursive backtracking: worst case exponential with many * (read, not measured). Asset-path routing. A DP or linear matcher would be a better harvest target.
Arbitration: lease-free election, lowest comment id wins, append-only, keyed on opkey
Sequence-gated append-only event log: expected-sequence CAS, FOR UPDATE, SERIALIZABLE, SHA-256 per event, idempotent inbox by (command id, body hash), 40001/23505 maps to retry
FS.GG.Coordination:src/FS.GG.Coordination.Orchestration.PostgreSql/PostgreSqlObserverStore.fs@513acdb (same shape in PostgreSqlPilotStore.fs, PostgreSqlStore.fs)
CAS + journal, F#/SQL
Yes (Observer.PostgreSql.Tests, native PG 40/40 per LEARN roadmap)
No
B
E (+ small in-memory reference impl if wanted)
Event sourcing for save/replay and rollback netcode. SQL part is not portable; a pure append expectedVersion events reference is.
Release journal on protected git refs: optimistic parent check, immutable object reads, bounded history walk
Thin wrappers on SHA256.HashData; value is the canonicalization discipline (sorted sets, lowercase hex, schema-version prefix). Asset hashing and save integrity.
Full-text search: SQLite FTS5 with bm25() ranking, deterministic tiebreak by id and digest
.github:.agents/skills/atlas/scripts/atlas.py ORDER BY bm25(search),r.id,r.digest@2efc10c0 (also SDD Knowledge/Store.fs@47c11251)
information retrieval, Python
Yes (tests/atlas/check.py)
No
G (pack tooling)
E
The mechanism the product-local archive will reuse; BM25 entry should record this exact configuration.
Rule engines over GitHub state, not a general merge algorithm. No three-way merge exists in scope.
Model checking: Quint specs, seeded random schedule sampling (100 runs, seed 42), counterexample traces; ITF decode with exact BigInteger and limits; replay against implementation driver
Yes (FsQuint.Tests, custom Program.fs runner; examples run in CI)
No
B
E
Bounded (trace/sample) evidence, not proof; README says so. Templates already ship game models (fs-gg-fable-game/models/svg-arena). Good fit for a "model-based testing of game rules" entry.
Pipeline-order exploration for missing dependency (model of build/shard/report)
FsQuint:examples/CiPreflight@88d9985
model checking
Yes (check.sh)
No
F
E
Worked example of schedule interleaving; same idea as topological-order testing.
Gate ordering by ordinal id (explicitly no topological pass, "trivially acyclic")
FS.GG.Governance:Gates/Gates.fs@c4c188a5
ordering
Yes (Gates.Tests/DeterminismTests.fs)
No
F
L
Documents why no toposort is needed.
Cost-budget ceiling: min of two monotone projections over an ordered Cost DU
FS.GG.Governance:CostBudget/Budget.fs@c4c188a5
budgeting/lattice
Yes (CostBudget.Tests, FsCheck referenced)
No
F
L
Small lattice idiom.
Advisory promotion on repeated-review confidence threshold (count >= t, no single-sample floor)
2. Top 10 seed candidates (ranked by reuse value for game workspaces, existing tested code, harvest effort)
Tarjan SCC (Blockers.cycles): tested, pure, universally useful; also fixes the framing for the SDD naive-DFS pitfall. Pair with a new Kahn topological sort and longest-path/critical-path entry (absent today).
Nearest-rank percentile + frame-time summary (Performance.fs): small, game-native, and the library needs it to publish its own bench numbers.
Union-find components (Lanes.partition): generalise over a conflict predicate; add a property test against BFS components.
Interval union / sweep merge (TelemetryBudget.unionNanoseconds): tiny, exact, tested.
Patience-diff anchors + binary-search LIS (SemanticDiff.fs): harvest the generic LIS and anchor diff, leave rename inventory.
Priority-greedy conflict-free admission (Batch.scheduleWith + Rank): entry first (greedy independent set, aging, fail-closed on unknown); library only after a generic signature is designed.
Sequence-gated append-only log (expected-version CAS + per-event hash + idempotent inbox) (PostgreSqlObserverStore.fs): entry plus a pure in-memory reference; save/replay and rollback netcode.
Glob / wildcard matching: entry with the existing backtracker as the "naive" version and a DP or linear matcher as the harvested one (assets routing).
Model-based testing with Quint + ITF replay (FsQuint, CiPreflight, template svg-arena models): entry; game rule engines already use this.
SQLite FTS5 BM25 search (atlas.py): entry; documents the exact search configuration the product-local archive depends on.
Next in line: exact-rational apportionment (ProcessEfficiency.allocate), content-addressing canonicalization discipline, LEARN-01 randomized-block and sequential-test entries (blocked on implementation).
3. Unknowns
Checkout currency:FS.GG.Coordination local checkout is c0e7afc with 3 modified files; origin/main was 27d3c66 after a fetch (read-only fetch only). Coordination rows cite my local SHA and may be stale. .github checkout is detached at 936283c0.
Test depth: I counted facts and read assertions for Blockers.cycles, but did not run or mutate tests; I do not know coverage or deep-graph behavior (Tarjan recursion depth, SDD DFS blow-up, glob worst case are read-only inferences).
Not read in detail:board-drift-observer.py, board-currency-rules.py, Governance Calibration, EvidenceReuse/VerdictReuse, Coordination Core/Orchestration.fs, Execution.Processes, and the Quint models under docs/quint and Coordination eng/. Calibration and verdict-reuse may hold additional threshold or invalidation logic.
Licensing/provenance: all rows are first-party FS.GG code, but ADR-0017 and licence headers for harvest into a nuget.org package were not checked. FsQuint's NOTICE.md was not read.
Fable portability: none of the F# candidates were checked for Fable compatibility (several use System.Collections.Generic.Dictionary, Stack, bigint; the bigint and Checked arithmetic uses may need review).
Product-skill audience: I judged game relevance from algorithm shape, not from any existing template usage; whether the templates already carry their own copies (e.g. in fs-gg-fable-game) is outside this scope.
Root/fdev analyst (games & netcode repos): inventory for ALGO-01.1 (#5223) under Outcome #5222. Analysis only; nothing modified, nothing filed, no packet.
Scope and method. Shallow clones of default branches taken 2026-11-01 into ~/.fsgg-scratch/algo-inv-2/. Commits read: RuneScape 494e32f (main), SC2.Client c1e67cd, FSBarV2 f59c886, FourD 4d4909a, Unity.Client af04307, Net 3b24190. The RuneScape controller-arbitration code is NOT on main: it lives on open PR #14 (branch routine/rs-01-3-control, head 5905ac9), so rows citing it are tagged @5905ac9 (PR #14, unmerged).
Private-repo constraint. RuneScape, SC2.Client, FourD and Unity.Client are PRIVATE; FSBarV2 and Net are public. This comment carries paths and descriptions only, no source. A nuget.org library or a product-workspace knowledge pack is public, so harvesting from a private repo needs an explicit owner decision on re-publishing that code. I treat every "harvest" below as conditional on it. "External, not harvestable": RecoilEngine and HighBarV3 (third-party C++ forks), excluded.
Test-style note (applies to the Tested column). None of these repos uses FsCheck or Hedgehog. RuneScape, FourD and SC2 use hand-rolled harnesses or fixtures. RuneScape's one "property" is a seeded System.Random invariant run. Net and Unity use Expecto or xUnit-style example cases. No repo has BenchmarkDotNet or any algorithm benchmark (the only "bench" files are a RuneScape browser render spec and FourD browser/startup measurement scripts), so Benched is "no" throughout. All of it would need the #761/#792 harness before admission.
1. Inventory
Technique
Repo:path@commit
Kind
Tested (property or unit, which)
Benched?
Reusable beyond its game?
Fable-portable?
Recommendation
Notes
A* over a collision grid: 8-direction, Chebyshev heuristic, bounded search window (max reach), goal tolerance, typed failures (blocked destination, different plane, unreachable), waypoint thinning
Unit, example-based: wall with one gap, legal steps, the three failure kinds, tolerance, waypoint spacing (tests/FS.GG.RuneScape.Bots.Tests/PathTests.fs). No property test; no BFS-optimality comparison
No
Yes once the flag test is abstracted to a walkability predicate
Partial: uses PriorityQueue, Dictionary and struct tuples; heap needs a Fable-friendly replacement
Harvest into library + entry
The named seed. Single-plane only: a different plane is a typed failure, so there are no stairs or plane transitions. The "optimality against BFS" property named in the Outcome does not exist yet and must be written
Collision flags, diagonal-clipping step rule, zone-chunked (8x8) flag store, door index with a mask-at-load and a per-session re-close overlay
The door-overlay and zone-chunk ideas yes; the flag constants are the rsmod and rs-sdk bit layout
No (mutable Dictionary, locks)
Entry only (door-as-overlay, per-session blocks), plus a generic zone-chunked grid if wanted
Entanglement: flag values mirror the vendored rsmod pathfinder (MIT, Lost City); docs/THIRD-PARTY-NOTICES.md carries the notice. Real collision data is never committed (eng/check-no-assets.py enforces it), so only synthetic-tile tests are harvestable
Controller arbitration: priority bands (human over AI over script), pre-emption with suspend and resume, token-bucket submit rate limit, per-controller queue and action budgets, cancel-all semantics, bounded duplicate-id memory
Seeded randomized invariant test, 400 runs (one active goal, order rules, human never ended by a lower kind, cancel permissions) in tests/.../ControlTests.fs, plus example cases. Hand-rolled, not FsCheck
No
Yes: pure state-machine step function, no game types in the rules
Likely (pure, ms integers, lists/maps); not verified
Strongest "decision making" seed after A*. Port the invariant run to FsCheck for admission
bot { } computation expression: every bind checks cancellation, pre-emption and deadline; tick-budgeted waits; failure ADT with retryable vs final classification
RuneScape:src/FS.GG.RuneScape.Bots/Bot.fs@494e32f
behaviour model / combinators
Unit via the simulator (tests/.../SimTests.fs, 617 lines)
No
Pattern yes; implementation is Task-based and tied to IBotIo
No (Task, threading)
Entry only
Design rationale in docs/decisions/0001-bot-behaviour-model.md and docs/BOTS.md. Not a classic behaviour tree: it is a monadic goal runner
Policy driver: pure Observe/Decide split from IO Execute, bounded consecutive and per-step failure counters (catches alternating fail/succeed livelock), persistence window before a Blocked decision ends a goal, death/respawn handling
Unit: replay of recorded decision fixtures (tests/.../DecisionTests.fs, fixtures/woodcutting-decisions.jsonl)
No
Yes as a pattern; the decision core is pure
Core: likely; driver: no (Task)
Entry only; consider harvesting just the pure retry/livelock accounting
Good bridge toward utility-AI/FSM entries
Effect-proof and reconciliation: plan from one fresh snapshot, baseline at ack, prove the effect from later state, uncertain-dispatch ledger with a settle window, never blind re-send, convergent (idempotent) actions
Unit against a generated DB (tests/FS.GG.RuneScape.Knowledge.Tests/Program.fs: nearest bank, ordered top-3, other-plane)
No
The idea yes; the implementation is a full scan inside SQLite, no spatial index
No (SQLite)
Entry only, flagged as a baseline for a k-d tree or spatial-hash entry
Data is RuneScape game data generated at build time. Tests depend on that data, so only the technique is harvestable
Name resolution: id then config name then display name then FTS5 candidates, returned as Exact / Ambiguous / Fuzzy / NoMatch so a caller can never silently take the first of several matches; FTS query sanitising and word cap
RuneScape:src/FS.GG.RuneScape.Knowledge/KnowledgeDb.fs and Knowledge.Model/Types.fs@494e32f
search / disambiguation
Unit, including seven same-named items and five same-named NPCs (Knowledge.Tests/Program.fs)
No
The tagged-result idea yes; search itself is delegated to SQLite FTS5 and bm25 rank
No
Entry only (small, about tagged resolution results)
There is no in-house fuzzy matching (no edit distance or trigram). If a pure fuzzy matcher is wanted for the pack it must be written, not harvested
Frontend BFS "current path" for display, ignores directional walls
Superseded by the Bots A*; its own header says it is not the server route
Weighted Dijkstra reachability and shortest path on a 4D cell grid with an expansion budget, explicit budget-exhausted result, deterministic tie order (cost, insertion order, cell)
Unit with an independent tiny-map oracle: the oracle enumerates simple routes from raw fixture data without calling production code and compares route and cost (tests/FS.GG.FourD.Kernel.Tests/*Fixtures.fs, docs docs/FOURD-01.1.md)
No (only coarse browser timing in docs/evidence/FOURD-01.5a-measurement.json)
Yes: generic over a transition function; the 4D cell type is incidental
Likely: the product runs in the browser on the shared Fable foundation (docs/FABLE-ADOPT-01.5.md, Fable.Core referenced by the kernel tests); I did not confirm this module compiles
Harvest into library + entry
Frontier is a list re-sorted on every pop, so complexity is poor: swap for a real heap on harvest and re-run the oracle. This is the only pathfinder in scope that already has a differential oracle
Exact-rational segment-versus-box (slab) intersection in 4D with bigint arithmetic, face attribution, multi-blocker ray scene with sorted hits and range checks
FourD:src/FS.GG.FourD.Core/Geometry.fs@4d4909a
computational geometry / ray casting
Unit with an independent oracle fraction implementation (GeometryFixtures.fs)
No
Yes: n-dimensional AABB segment test with exact arithmetic; nothing game-specific
Probably (bigint is supported by Fable, cost unmeasured)
Harvest into library + entry
Possible overlap with fs-gg-collision for the 2D/3D case; entry should cover the exact-arithmetic variant
Visibility by multi-sample rays from soldier eye to cell sample points, with exposure fraction
Budgeted tactical AI: enumerate shot and move candidates, expansion and destination budgets with a Complete versus BudgetLimited disposition, per-W-layer representative retention, deterministic tie string
FourD:src/FS.GG.FourD.Core/TacticalAi.fs@4d4909a; SkirmishAi.fs (a commitment/pressure rule policy)
decision making / bounded search
Unit fixtures (OpponentFixtures.fs, SkirmishAiFixtures.fs)
No
The budget-disposition idea yes; scoring is game-specific
Likely
Entry only
Closest thing to GOAP/utility scoring found; small (88 lines)
Simultaneous-commitment turn resolution and replay canonicalisation
Rules are game-specific; canonical-replay approach is reusable
Likely
Leave (maybe one replay-determinism entry)
Mostly rules, not classic algorithms
Revision-monotonic delta publication, bounded pending queue that coalesces to a full snapshot when saturated, ack pruning that cannot discard newer deltas, reconnect ticket with identity, token and expiry window
Net:src/FS.GG.Net.Core/Delivery.fs@3b24190
netcode: delta/snapshot delivery, reconnect
Unit (Expecto): delayed ack, saturation coalescing, reconnect validation, dispose (tests/FS.GG.Net.Core.Tests/DeliveryTests.fs). No property tests
No
Yes: pure state machine, generic in delta and snapshot types
Likely (pure; .fsi present; the Core project also holds Task transports, so split needed)
Harvest into library + entry (or leave in FS.GG.Net and index it; ownership question for the ADR)
Public repo, no entanglement. It is already a published package line, so duplicating it into an algorithms library is wasteful: an index entry that points to FS.GG.Net may be better
Unit and integration (ChannelTests.fs 477 lines, tests/FS.GG.Net.Integration.Tests)
No
Already a reusable library
No (Task, sockets)
Leave (maybe an index entry)
Net contains NO client-side prediction, rollback, interpolation, snapshot delta compression or lag compensation. Those techniques do not exist anywhere in scope, so they would be new work, not harvest
Browser state: baseline then delta, base-sequence gap detection triggering a resync request, stale-context rejection, removal by lifetime generation
C# and Unity-engine adjacent; the stubs under tests/unity-api-stubs keep Unity code out of the tests. Generation-checked handles are the notable technique
Bresenham line of sight on a grid; reference server rules (range, cooldown, capture ticks)
Covered by fs-gg-line-drawing and fs-gg-visibility
n/a (C#)
Leave
Reference game for a Unity qualification; Unity assets or licences are not committed (admission doc docs/admission/nebulous/2026-09-30-nebulous-admission.md)
Bounded command queue with an authority gate (slot ownership, admin only when hosting), drained in capped batches
Unit (tests/Broker.Core.Tests/CommandPipelineTests.fs)
No
Pattern yes; thin wrapper over System.Threading.Channels
No (Channels)
Entry only, one shared "bounded queue + backpressure" entry across BAR, Unity, Net and SC2
Public repo. Wire types come from the HighBar proto (third-party, excluded)
Live-slice decode with limits: JSON observation decoder with escape handling, max frame bytes and max entities from the bootstrap; unit and feature bounds for hit-testing (paint order, centre-plus-radius rectangle, box vs ellipse)
On inspection this is validation of a selection or move intent returned by a WASM guest, plus input routing. I found no selection-box, placement-search, build-order or tactical-evaluation algorithm. The "production placement" is a click-routing mode, not a placement solver
2. Top 10 seed candidates (value and readiness, in order)
RuneScape A with collision rules* (Bots/Pathfinding.fs, Collision.fs@494e32f). Named in the Outcome; clean typed failures. Gap: BFS-optimality property and a Fable-friendly heap.
FourD weighted reachability and shortest path with budget (Core/Kernel.fs@4d4909a). Only pathfinder with an independent oracle; Fable plausible. Gap: list-sorted frontier.
Net delta/snapshot delivery with coalescing and reconnect (Net.Core/Delivery.fs@3b24190). Public, pure, tested. Ownership decision: library vs index entry pointing at FS.GG.Net.
FourD exact segment-vs-AABB (slab) ray cast with bigint (Core/Geometry.fs@4d4909a). Oracle-tested and generic.
Unity baseline+delta with sequence-gap resync (BrowserState.fs@af04307). Fable-proven; completes the netcode story with item 4.
FourD budgeted tactical AI (TacticalAi.fs@4d4909a): bounded search with an explicit Complete/BudgetLimited result.
RuneScape effect-proof and reconciliation with fault-injection simulation (Act.fs, Simulation.fs@494e32f): pattern entry, strong test matrix.
Bounded queue and backpressure family (BAR CommandPipeline.fs, Unity BoundedDispatchQueue.cs, Net WebSocket.fs, SC2 MetadataBudget.fs): one cross-repo entry; plus RuneScape nearest/Exact-Ambiguous-Fuzzy resolution as the first runner-up.
Counts toward the Outcome's 15-entry floor: these ten, plus visibility-by-sampling (FourD), nearest query baseline and tagged name resolution (RuneScape Knowledge), stale-frame admission (SC2) and door-overlay collision (RuneScape) give about 14 from this slice alone; the remainder is expected from the grids, collision, line-drawing and visibility skills and FS.GG.Game.
3. Unknowns
Visibility policy. Whether code from private repos (RuneScape, FourD, SC2.Client, Unity.Client) may be republished in a public nuget.org package or a scaffolded product pack. Owner decision; I assumed nothing.
Fable status is asserted from in-repo proofs only for FourD (compile target), Unity BrowserState and SC2 contract vectors. I did not run any Fable build. PriorityQueue support in Fable is unverified for the RuneScape A*.
Overlap with FS.GG.Game is unchecked: FS.GG.Game/tests/Game.Core.Tests/AiTests.fs and HexTests.fs show it already has some AI and grid code, and its four algorithm skills were not read by me. Entries here should be reconciled against it before the ADR fixes the seed list.
Licences: RuneScape collision flag values derive from the rsmod pathfinder and rs-sdk (MIT, Lost City; notice in docs/THIRD-PARTY-NOTICES.md); FourD, SC2.Client and Unity.Client licence terms were not found in the paths I read.
Not found at all in these repos: client-side prediction, rollback, interpolation, snapshot delta compression, lag compensation, MCTS, minimax, HTN, GOAP, influence maps, k-d trees, spatial hashing, JPS, flow fields, and any BAR or SC2 AI. The netcode technique entries would be new implementations, not harvests.
Root/fdev decision on the analysts' open question (private-repo content in a public package or pack). FS-GG owns the code in its private repositories.
Allowed:generic algorithm code authored by FS-GG may be re-implemented in the public ALGO library and described in the public pack. Examples: A*, budgeted Dijkstra, the exact-rational segment/box ray cast, arbitration and priority banding, effect-proof and reconciliation patterns, and the delta/snapshot delivery state machine.
Forbidden in public artefacts:
game data, asset- or cache-derived values, or game-specific constants (for example RuneScape collision flags as data, coordinates, ids);
code derived from third-party upstreams (rs-sdk or LostCity, RecoilEngine, HighBarV3) unless its licence allows it and the notice is carried. MIT rs-sdk code is allowed only with its notice; prefer clean re-implementation;
any private repository's non-algorithmic product code.
Harvest is a clean, generic re-implementation with its own tests, not a copy-paste of game modules. Entries may cite a private repo path, but the pack must not reproduce private source.
Licences: where a repo's licence is unknown (FourD, SC2.Client, Unity.Client), FS-GG authorship is the basis. The ADR records the rule.
Root/fdev analyst (engine & product repos): inventory of FS.GG.Game, FS.GG.Rendering, FS.GG.Audio and FS.GG.Templates for ALGO-01.1 (analysis only; nothing modified).
Evidence base: origin/main read with git show/git grep after git fetch (refs only). The local Game checkout (detached d602c2d) and Templates checkout (detached d867ea9) are behind origin, so I did not use their working trees. Atlas consulted first: game/core-host-and-portable-profile (Core publishes a curated Fable subset), contract/game-sim-core, contract/game-physics-box2d; both confirmed against source. Test counts are grep approximations (FsCheck = testCase ... (FsCheck)/Check. hits).
Legend. G = FS-GG/FS.GG.Game@eb48a19 (GC/ = src/Game.Core/, GH/ = src/Game.Harness/). R = FS-GG/FS.GG.Rendering@2d35dc9. A = FS-GG/FS.GG.Audio@8ce4f33. T = FS-GG/FS.GG.Templates@858b624. Fable column is the grade in GC/Fable/compatibility-profile.v1.json: LE LockstepExact, Port compiles in the curated Fable view with no byte promise, Unc in the Fable view but Unclassified, .NET DotNetOnly. Tests live in G:tests/Game.Core.Tests/ unless stated.
1. Technique inventory
Technique
Repo:path@commit
Kind
Tested?
Benched?
Reusable beyond its game?
Fable
Recommendation
Notes
A* (4/8-way, integer 14/10 octile, total key (f,h,Col,Row), maxVisited)
G:GC/Pathfinding.fs (997 lines)
both (code + fs-gg-game-core Pathfinding section)
PathfindingTests.fs: 86 tests, ~40 FsCheck (determinism, differential vs other searches, int64 overflow)
No (node-count assertions only)
Yes: walkability predicate is the map
LE (astar only)
Harvest + entry
Already consumed by T:templates/fs-gg-fable-game/Domain/Room.fs and Client/Movement.fs. I did not find an explicit A*-vs-BFS cost property; the closest are astar vs distanceField cost and the jps/ALT/astarStraight differentials.
BFS (hop-minimal)
G:GC/Pathfinding.fs bfs
both
PathfindingTests.fs (hop-minimal unit, determinism FsCheck)
No
Yes
Unc
Harvest + entry (oracle for A* property)
Cheapest oracle for the ALGO-01 admission property.
No (the only perf artifact is Box2D portals, below)
Medium (game-sim shaped)
.NET
Entry; library later
Own implementation. No attribution header to Box2D-Lite or other sources (only comments contrasting with Box2D). Provenance not independently verified.
Third-party dependency Box2D.NET 3.1.654 (ikpil's C# port of Erin Catto's Box2D v3, MIT), referenced as a package, not copied. Core's Fable list excludes it.
tests/FS.GG.Audio.Engine.Tests/EngineTests.fs: 29 tests, no FsCheck
No (Stopwatch only for monotonic clock)
Low
Core has a Fable build; Engine does not
Entry only
There is no DSP in these repos (no filters, synthesis, resampling, FFT). Licence: FS.GG.Audio.Host redistributes OpenAL Soft (LGPL-2.0-or-later) per A:THIRD-PARTY-NOTICES.md, so nothing from Host/Engine should enter a shared MIT library.
The template's template/skill-manifest/skill-manifest.json ships only Fable/Go/Node/Rust language skills; it carries no algorithm skill.
Provenance and licence summary: every algorithm in G/R/A/T that I read is original F# with literature cited only as references (Red Blob Games for grids, line drawing, visibility and hex; Ford/Milazzo; Steele/Lea/Flood; Bridson; Goldberg-Harrelson ALT; Tarjan). Third-party code is only consumed as packages: Box2D.NET 3.1.654 (MIT), OpenAL Soft (LGPL, via Audio.Host), Noto Sans (OFL, T:SvgFoundation/THIRD-PARTY-NOTICES.md). I ran no text-similarity scan against external sources, so "original" is from header comments and history, not a clean-room check. The Red Blob skills carry links, not copied text.
2. Existing algorithm product skills
Two producers currently ship the four ids. The registry (.github:registry/skills.yml rows 202-205, @936283c0) names FS.GG.Rendering the owner, with Rendering's shas. FS.GG.Game's template/skill-manifest/skill-manifest.json @eb48a19 also carries all four with different bytes and (for collision) a different predicate.
Skill
R copy (registry owner)
G copy (code-owning repo)
Kind
Materializes when
fs-gg-grids
R:template/product-skills/fs-gg-grids/SKILL.md, 190 lines, sha 9b1b2bd0. Describes face/edge/vertex over a product-owned adaptable Grids.fs (R:template/fragments/grids/src/Product/Grids.fs, 237 lines).
G:template/product-skills/fs-gg-grids/SKILL.md, 336 lines, sha bda8b1bd, last 5605e6c (2026-07-21). Covers Grids, Hex, Edges and AoE templates in Game.Core.
Both: guidance + adaptable source (R); guidance over a published package (G)
profile in [game, sample-pack] (both)
fs-gg-collision
357 lines, sha cf22a55d; adaptable Collision.fs (372 lines); includes pierce+prune combat resolution and slideCircle.
Neighbouring algorithm-bearing skills, all in G:template/product-skills/ (single SKILL.md each; owner fs-gg-game in the registry): fs-gg-game-core (888 lines: fixed step, RNG, collision, culling, pathfinding choice guide, spatial queries, dice, ballistics, AI pointers; the de facto umbrella today), fs-gg-ai (322), fs-gg-physics (309), fs-gg-ballistics (242), fs-gg-effects (475), fs-gg-mapcraft (362), fs-gg-replay (55), fs-gg-rules (52), fs-gg-game-fable (91, the lockstep profile), fs-gg-playtest (512), plus R fs-gg-svg-performance (27 lines, culling/retained-scene guidance) and A fs-gg-browser-audio (34).
Recommendation: index, do not fold in.
The skills are 190-888 lines each, sha-pinned and registry-gated (registry = manifest = bytes), owner-sourced, and already link into each other with [[fs-gg-game:...]] references. Folding them moves ownership and forces new shas, re-seeds and registry migration for no knowledge gain. The umbrella fs-gg-algorithms entries should cite them by id and path and carry only the cross-cutting facts (taxonomy, complexity, bench numbers, when-not-to-use).
Before or inside this ADR, the duplicate ownership needs a decision. Game's copies are the current ones (Rendering's grids still teaches a product-owned Grids.fs while Core has shipped Grids/Hex/Edges), the code lives in Game.Core, and Rendering already retired its second copies of the four Game-migrated skills at P6 (.github#1862, FS.GG.Rendering#1147). The precedent points to retiring the Rendering copies and migrating the four rows to owner fs-gg-game. That is a proposal for the ADR owner to confirm with the Rendering owner; I made no change.
The new skill's materializes-when should say template == fable-game explicitly: G's grids, line-drawing and visibility rows are profile in [game, sample-pack] only (see Unknowns).
3. Top 10 seed candidates (value and readiness)
Readiness = tested implementation exists in reviewed code, Fable grade, and API stability.
A* with BFS oracle: G:GC/Pathfinding.fs astar/bfs. LockstepExact, ~40 FsCheck, already used by the fable-game template. Ready now.
Jump Point Search: same file. Differential property vs astar already exists; only a timing bench is missing.
Dijkstra map and flow field (distanceField/flowField, plus reachable/pathTo as the tactics variant). Property-tested; many-agent use.
Bresenham, supercover and symmetric LOS: G:GC/Los.fs. LockstepExact; exhaustive symmetry test.
Fixed-timestep accumulator, double buffer, interpolation: G:GC/FixedStep.fs, GC/Loop.fs. Covers the scheduling and interpolation topics.
SplitMix64 RNG with splittable streams: G:GC/Rng.fs. Small, integer-only; needs a Fable grade.
Procedural generation (CA caves, BSP dungeon, Bridson Poisson-disk, value noise): G:GC/MapGen.fs. Seeded byte-identity properties; several entries from one file.
Hex grids and thin-wall edges: G:GC/Hex.fs, GC/Edges.fs. ~32 FsCheck combined; rounds out the grid taxonomy.
Next tier (also ready): ALT landmarks, Regions early-out, astarStraight, smooth; Tarjan articulation and map analysis (MapAnalysis.fs); R:src/Scene/SpatialWorkingSet.fs (culling); R:src/Scene/Animation.fs easing/tween; visibility polygon (Core version); deterministic replay/lockstep (entry; Core code); Dice. That is 20+ candidates from my scope, so the "at least 15 entries" bar is reachable from G alone without Rendering, Audio or Templates code.
4. Unknowns
Bench source for the admission bar. FS.GG.Game#761 (merged 2026-11-01) is the GPU rendering benchmark harness and fix(engine): next/take name the observed reason, not a guessed list of causes (#440) (case 41) #792 (open) is publishing its BenchGame runner. Both measure frame cost through SVG/Pixi/Babylon. Nothing in G measures an algorithm kernel (A*, FOV, spatial hash) in time; the existing evidence is deterministic node/work counts (PathfindingTests.fs, Workload.fs). The ADR must either define a micro-bench route (and where numbers are recorded) or state that library admission uses work-count evidence until one exists.
Which copy of the four skills reaches a scaffold. Registry shas follow Rendering; G's manifest ids collide. G's fs-gg-collision sha (8bd79af6) differs from the registry row (cf22a55d) and its predicate adds template == fable-game. I did not run fsgg-sdd scaffold; whether a fresh fs-gg-fable-game workspace (no profile) receives fs-gg-grids, -line-drawing or -visibility is unverified. The template repo's own manifest (T) contributes none.
Fable portability gaps. Only Pathfinding.astar, Los.lineOfSightBy, Edges.edgeBetween, Kinematics.advance (one path) and the session/replay/planning/network/save surfaces are LockstepExact. jps, fields, ALT, Regions, Fov, Rng, Hex, MapGen and FixedStep are Unc/.NET even where they use only integers. Promoting them is an unscheduled Game.Core decision.
Fixed-point and float determinism. No fixed-point library exists; float-based pieces (Physics, Ballistics, Visibility, Kinematics) are deterministic only on a fixed compiler and ISA per their own docs.
Physics.fs provenance. The mini rigid-body engine is original code with no attribution header; I did not verify derivation from Box2D-Lite or Catto's published solver notes. A harvest decision for it should be preceded by an author statement.
Test depth. FsCheck counts are greps. Replay/session (5-11 tests), Kinematics (6), Layout/Graph (none found), Animation and the retained-render bench numbers were not deeply verified. No A*-vs-BFS optimality property was found by name.
Duplicate implementations to reconcile in the entries: visibility (Core, Harness, Rendering fragment), edge/vertex vocabularies (Grids vs Edges), spatial indexes (SpatialGrid vs SpatialWorkingSet).
Outside my scope / not found here: HPA*, D* Lite, behaviour trees, HTN, GOAP, utility AI, minimax, MCTS, LP/ILP, annealing, GA, constraint solving, k-d trees, quadtrees and instancing/batching code do not exist in G, R, A or T (the AI design doc excludes BT/utility by decision). RuneScape A* with doors, FourD, SC2, BAR and Unity were not inspected (other analysts).
Root/fdev algorithm survey (prior art): additional algorithms for ALGO-01.1 (#5223, Outcome #5222). Analysis only; nothing modified or filed.
Method. I read #5222, #5223 and the three inventories: C (coordination and formal), N (games and netcode) and E (engine and product). Primary references and the licences of reference implementations were checked on 2026-11-01, using the GitHub licence API or the LICENSE file. Every row is to be summarised and cited, never copied.
Legend.
Use: G = game workspace, F = framework.
Has?: "—" means no inventory found it. GC/ is FS.GG.Game src/Game.Core/.
Fable:
ok = pure integer F#.
heap = needs a library-owned priority queue (BCL PriorityQueue under Fable is unverified, N).
i64 = fable-library-js maps int64 to JS bigint (slow in hot loops).
flt = float output is deterministic only per compiler and ISA (E), so grade it Port, not LockstepExact.
Shorthand references: RBG = redblobgames.com; GAP = Game AI Pro (free chapters at gameaipro.com); AIMA = Russell & Norvig, 4th ed.; CLRS = 4th ed.; B&V = Boyd & Vandenberghe; S&B = Sutton & Barto, 2nd ed.; RTCD = Ericson, Real-Time Collision Detection.
Licence: "paper" means implement from the paper. A named licence applies only if we port that reference code, and its notice must be carried (owner rule above).
Already covered, so harvest rather than reimplement (E, C):
A*, BFS, JPS, ALT, flow and Dijkstra fields, smooth, Regions, hex and edges;
Bresenham, supercover, shadowcasting and the visibility polygon;
spatial hash, SAT and manifolds;
cellular automata, BSP, maze, Poisson-disk and value noise;
influence maps, SplitMix64, fixed-step alpha and easing;
articulation points, Tarjan SCC, union-find and patience/LIS diff;
FourD's budgeted Dijkstra.
1. Pathfinding and navigation
Algorithm: what
Use
Complexity
Has?
Pri
Fable
Reference
Licence
Heap / indexed heap: library priority queue
G,F: every search
O(log n)
No generic one. Game uses a Set frontier, FourD re-sorts a list, RuneScape uses the BCL heap (E, N)
P1
ok
CLRS ch. 6
paper
HPA*: cluster/entrance abstraction, then refine
G: large maps, RTS
Queries about 10× faster than A*, within 1% of optimal
Library namespace FS.GG.Algorithms.<Family> equals the pack family tag. Each entry also carries:
an audience (G, F or B);
a determinism grade, reusing Game.Core's LockstepExact, Port, Unc and .NET;
a status: harvested, new, entry-only or pointer. pointer indexes an existing skill or package (grids, collision, line-drawing, visibility, FS.GG.Net), per E's "index, do not fold in".
Root/fdev acceptance: ADR-0098 is accepted and merged (#5227, 8ca8f936) after independent review and a delta approve.
Decisions:
a new public FS-GG/FS.GG.Algorithms (FSharp.Core-only), now created by Root;
Game.Core keeps its algorithms, with pointer entries, and exact-pins Algorithms for the heap under a frozen LockstepExact order (ADR-0022 and ADR-0069 amended);
foundations F1 heap, F2 Q16.16, F3 best-first search, F4 xoshiro128**;
the knowledge pack is an unmodified Atlas archive in the fs-gg-algorithms product skill via the owner-package and SDD route;
a licence allowlist, plus Root's private-repo ruling;
the admission bar (property and oracle tests, Fable proof, BenchmarkDotNet plus Node timing, quiet-host gating, owed benchmarks allowed);
Activity
EHotwagner commentedon Nov 1, 2026
Root/fdev: the ADR owner is dispatched. Three analysts are inventorying the FS-GG repos for seed content (engine and product, games and netcode, coordination and formal), and their findings will be posted here.
EHotwagner commentedon Nov 1, 2026
Root/fdev analyst (coordination & formal repos): inventory of algorithm and optimization techniques for ALGO-01.1 (analysis only; nothing modified; Outcome #5222).
Method. Read local checkouts (.github
936283c0, Governance3b8543e8, SDD2a2770be, FsQuint69fa62a, Authoritye5ebd077, Coordinationc0e7afc; see Unknowns for the last). Sources read directly; SHAs below are the last commit touching the cited path.Tested?andBenched?come from reading the test tree. I ran no tests or benchmarks.Cross-cutting findings
Stopwatchhits are timeouts and server code). Every row isBenched? No, so all need bench numbers from the FS.GG.Game the corpus case41-residue-and-full-queueis FLAKY in CI — it exits 5 at random, and a gate that fails randomly teaches people to re-run it #761/fix(engine): next/take name the observed reason, not a guessed list of causes (#440) (case 41) #792 harness before the ALGO-01 — Shared algorithms & optimization capability: F# library + product skill knowledge pack, available in product workspaces #5222 admission bar is met..github/tests/FS.GG.Coord.Core.Tests/TouchSetTests.fs(5d7e2328) and in some Governance JSON/budget tests. The graph, diff and scheduling code has example-based xUnit only.docs/roadmaps/2026-09-12-095059-...-statistical-learning.md@02e6839a) specifies block randomization, cluster-resampling intervals, sequential error budgets, IPS/effective-sample-size checks and logged-bandit caveats. I found no executable randomizer, bandit, estimator or power calculation in scope.LearningAssignmentAdapter.fs@513acdbonly persists and replays an immutable assignment (SHA-256 bound), not a draw. The pod design (docs/coordination/2026-10-30-learn-finite-executor-pod-design.md@18d2fb7a) is container/infra, with no algorithm content.scripts/release-successor-publish.py@eb41faf3ADMISSION_READ_BACKOFF_SECONDS=(0.5,1.5);MainHostComposition.fs@5d525adconstant 15s).Errors.fs@5d7e2328only advises "honour Retry-After, else back off with increasing delay". These are gaps a library entry could fill, not harvestable code.FS.GG.Coordination.Authority) holds state and evidence JSON only; no algorithms.1. Table
Audience: G = game product, F = framework only, B = both. Rec: H = harvest into library plus entry, E = entry only, L = leave.
cycles@5d7e2328strongconnect(stack depth risk on long chains). Tech trees, quest prerequisites, deadlock detection.cycleDiagnostics@b56aeb32partition@5d7e2328gluefinds tokens whose removal splits a lane (cut analysis). Islands, flood-fill groups, spatial clustering.scheduleWith@5d7e2328StarvationDays=21. Counts come from the whole-board graph, not the scoped candidate list (#1628 pitfall). Utility/priority queues in game AI.waveOccupancy@5d7e2328conflicts,covers@5d7e2328*,?,**, backtracking) with precedence*(read, not measured). Asset-path routing. A DP or linear matcher would be a better harvest target.flockon a pair of files, released in reverse orderFOR UPDATE, SERIALIZABLE, SHA-256 per event, idempotent inbox by (command id, body hash), 40001/23505 maps to retryappend expectedVersion eventsreference is.allocate@2556144cunionNanoseconds@5d7e2328; ProcessEfficiency.fstimeSummary@2556144cnearestRank,recompute@c4c188a5hash@513acdb; .github:src/FS.GG.Coord.Cli/KitDigest.fs@5d7e232; Governance:FreshnessKey/FreshnessKey.fs@c4c188a5; SDD WorkModel source digests@b56aeb32SHA256.HashData; value is the canonicalization discipline (sorted sets, lowercase hex, schema-version prefix). Asset hashing and save integrity.bm25()ranking, deterministic tiebreak by id and digestORDER BY bm25(search),r.id,r.digest@2efc10c0 (also SDD Knowledge/Store.fs@47c11251)uniqueCommon,longestIncreasing@5d7e2328fs-gg-fable-game/models/svg-arena). Good fit for a "model-based testing of game rules" entry.2. Top 10 seed candidates (ranked by reuse value for game workspaces, existing tested code, harvest effort)
Blockers.cycles): tested, pure, universally useful; also fixes the framing for the SDD naive-DFS pitfall. Pair with a new Kahn topological sort and longest-path/critical-path entry (absent today).Performance.fs): small, game-native, and the library needs it to publish its own bench numbers.Lanes.partition): generalise over a conflict predicate; add a property test against BFS components.TelemetryBudget.unionNanoseconds): tiny, exact, tested.SemanticDiff.fs): harvest the generic LIS and anchor diff, leave rename inventory.Batch.scheduleWith+Rank): entry first (greedy independent set, aging, fail-closed on unknown); library only after a generic signature is designed.PostgreSqlObserverStore.fs): entry plus a pure in-memory reference; save/replay and rollback netcode.svg-arenamodels): entry; game rule engines already use this.atlas.py): entry; documents the exact search configuration the product-local archive depends on.Next in line: exact-rational apportionment (
ProcessEfficiency.allocate), content-addressing canonicalization discipline, LEARN-01 randomized-block and sequential-test entries (blocked on implementation).3. Unknowns
FS.GG.Coordinationlocal checkout isc0e7afcwith 3 modified files; origin/main was27d3c66after a fetch (read-only fetch only). Coordination rows cite my local SHA and may be stale..githubcheckout is detached at936283c0.41-residue-and-full-queueis FLAKY in CI — it exits 5 at random, and a gate that fails randomly teaches people to re-run it #761/fix(engine): next/take name the observed reason, not a guessed list of causes (#440) (case 41) #792 harness is outside my scope.Blockers.cycles, but did not run or mutate tests; I do not know coverage or deep-graph behavior (Tarjan recursion depth, SDD DFS blow-up, glob worst case are read-only inferences).board-drift-observer.py,board-currency-rules.py, GovernanceCalibration,EvidenceReuse/VerdictReuse, CoordinationCore/Orchestration.fs,Execution.Processes, and the Quint models underdocs/quintand Coordinationeng/. Calibration and verdict-reuse may hold additional threshold or invalidation logic.System.Collections.Generic.Dictionary,Stack,bigint; thebigintandCheckedarithmetic uses may need review).fs-gg-fable-game) is outside this scope.EHotwagner commentedon Nov 1, 2026
Root/fdev analyst (games & netcode repos): inventory for ALGO-01.1 (#5223) under Outcome #5222. Analysis only; nothing modified, nothing filed, no packet.
Scope and method. Shallow clones of default branches taken 2026-11-01 into
~/.fsgg-scratch/algo-inv-2/. Commits read: RuneScape494e32f(main), SC2.Clientc1e67cd, FSBarV2f59c886, FourD4d4909a, Unity.Clientaf04307, Net3b24190. The RuneScape controller-arbitration code is NOT on main: it lives on open PR #14 (branchroutine/rs-01-3-control, head5905ac9), so rows citing it are tagged@5905ac9 (PR #14, unmerged).Private-repo constraint. RuneScape, SC2.Client, FourD and Unity.Client are PRIVATE; FSBarV2 and Net are public. This comment carries paths and descriptions only, no source. A nuget.org library or a product-workspace knowledge pack is public, so harvesting from a private repo needs an explicit owner decision on re-publishing that code. I treat every "harvest" below as conditional on it. "External, not harvestable": RecoilEngine and HighBarV3 (third-party C++ forks), excluded.
Test-style note (applies to the Tested column). None of these repos uses FsCheck or Hedgehog. RuneScape, FourD and SC2 use hand-rolled harnesses or fixtures. RuneScape's one "property" is a seeded
System.Randominvariant run. Net and Unity use Expecto or xUnit-style example cases. No repo has BenchmarkDotNet or any algorithm benchmark (the only "bench" files are a RuneScape browser render spec and FourD browser/startup measurement scripts), so Benched is "no" throughout. All of it would need the #761/#792 harness before admission.1. Inventory
src/FS.GG.RuneScape.Bots/Pathfinding.fs@494e32ftests/FS.GG.RuneScape.Bots.Tests/PathTests.fs). No property test; no BFS-optimality comparisonPriorityQueue,Dictionaryand struct tuples; heap needs a Fable-friendly replacementsrc/FS.GG.RuneScape.Bots/Collision.fs@494e32fPathTests.fs)Dictionary, locks)docs/THIRD-PARTY-NOTICES.mdcarries the notice. Real collision data is never committed (eng/check-no-assets.pyenforces it), so only synthetic-tile tests are harvestablesrc/FS.GG.RuneScape.Bots/Arbitration.fs@5905ac9 (PR #14, unmerged); decisiondocs/decisions/0002-controller-arbitration.mdtests/.../ControlTests.fs, plus example cases. Hand-rolled, not FsCheckbot { }computation expression: every bind checks cancellation, pre-emption and deadline; tick-budgeted waits; failure ADT with retryable vs final classificationsrc/FS.GG.RuneScape.Bots/Bot.fs@494e32ftests/.../SimTests.fs, 617 lines)IBotIodocs/decisions/0001-bot-behaviour-model.mdanddocs/BOTS.md. Not a classic behaviour tree: it is a monadic goal runnersrc/FS.GG.RuneScape.Bots/Behaviour.fs@494e32ftests/.../DecisionTests.fs,fixtures/woodcutting-decisions.jsonl)src/FS.GG.RuneScape.Bots/Act.fs,Bot.fs(Uncertainty, Proof types),Actions.fs@494e32f; fault-injecting simulatorSimulation.fsSimTests.fs(lost ack, delayed effect, link drop, pre-emption, stale snapshot, no-phase failure)SimIofault-injection idea is also worth a separate testing-technique entrysrc/FS.GG.RuneScape.Bots/Trace.fs@494e32fTraceTests.fs)src/FS.GG.RuneScape.Knowledge/KnowledgeDb.fs@494e32f (NearestBanks,NearestLocs,NearestPlace)tests/FS.GG.RuneScape.Knowledge.Tests/Program.fs: nearest bank, ordered top-3, other-plane)src/FS.GG.RuneScape.Knowledge/KnowledgeDb.fsandKnowledge.Model/Types.fs@494e32fKnowledge.Tests/Program.fs)bm25ranksrc/FS.GG.RuneScape.Frontend/Pathing.fs,Collision.fs@494e32fsrc/FS.GG.FourD.Core/Kernel.fs@4d4909a (Movement module)tests/FS.GG.FourD.Kernel.Tests/*Fixtures.fs, docsdocs/FOURD-01.1.md)docs/evidence/FOURD-01.5a-measurement.json)docs/FABLE-ADOPT-01.5.md, Fable.Core referenced by the kernel tests); I did not confirm this module compilessrc/FS.GG.FourD.Core/Geometry.fs@4d4909aGeometryFixtures.fs)fs-gg-collisionfor the 2D/3D case; entry should cover the exact-arithmetic variantGeometry.fs(Visibility,TargetSamples)@4d4909aGeometryFixtures.fs,EvaluationFixtures.fs)fs-gg-visibilitysrc/FS.GG.FourD.Core/TacticalAi.fs@4d4909a;SkirmishAi.fs(a commitment/pressure rule policy)OpponentFixtures.fs,SkirmishAiFixtures.fs)Commitment.fs,Pressure.fs,SkirmishResolution.fs,Replay.fs,SkirmishReplay.fs@4d4909atests/retained-saves)src/FS.GG.Net.Core/Delivery.fs@3b24190tests/FS.GG.Net.Core.Tests/DeliveryTests.fs). No property tests.fsipresent; the Core project also holds Task transports, so split needed)src/FS.GG.Net.Core/Core.fs;src/FS.GG.Net.WebSocket/WebSocket.fs@3b24190ChannelTests.fs477 lines,tests/FS.GG.Net.Integration.Tests)managed/BrowserContract.FSharp/BrowserState.fs@af04307ContractVectors.fs,tests/browser-contract-fable/)native/Core/BoundedDispatchQueue.cs,EntityReference.cs@af04307tests/native/*Tests.cs)tests/unity-api-stubskeep Unity code out of the tests. Generation-checked handles are the notable techniquenative/ReferenceGame/TacticalMap.cs,ReferenceServer.cs@af04307fs-gg-line-drawingandfs-gg-visibilitydocs/admission/nebulous/2026-09-30-nebulous-admission.md)src/Broker.Core/CommandPipeline.fs,src/Broker.Protocol/BackpressureGate.fs@f59c886tests/Broker.Core.Tests/CommandPipelineTests.fs)System.Threading.Channelssrc/Broker.Browser.Render/BarObservationJson.fs,BarScene.fs@f59c886tests/Broker.Browser.Render.Tests)src/SC2.Client.Contracts/RealtimeContract.fs,src/SC2.Client.Browser/InputSequence.fs,MetadataBudget.fs@c1e67cdtests/SC2.Client.Gateway.Tests/Program.fs, Contracts and Native tests)tests/SC2.Client.Contracts.Tests/Fable)src/SC2.Client.Browser/Tactical.fs,ProductionRouting.fs,ProductionState.fs;src/SC2.Client.Contracts/TacticalContract.fs,ProductionContract.fs@c1e67cd2. Top 10 seed candidates (value and readiness, in order)
Bots/Pathfinding.fs,Collision.fs@494e32f). Named in the Outcome; clean typed failures. Gap: BFS-optimality property and a Fable-friendly heap.Core/Kernel.fs@4d4909a). Only pathfinder with an independent oracle; Fable plausible. Gap: list-sorted frontier.Bots/Arbitration.fs@5905ac9, PR [registry] Flip governance-overlay-populated → coherent (P3 gate set + P4 overlay delivered) #14). Pure, invariant-tested; blocked on merge of PR [registry] Flip governance-overlay-populated → coherent (P3 gate set + P4 overlay delivered) #14.Net.Core/Delivery.fs@3b24190). Public, pure, tested. Ownership decision: library vs index entry pointing at FS.GG.Net.Core/Geometry.fs@4d4909a). Oracle-tested and generic.BrowserState.fs@af04307). Fable-proven; completes the netcode story with item 4.Behaviour.fs@494e32f): Observe/Decide/Execute with livelock-safe retry accounting; fixture-replay tested.TacticalAi.fs@4d4909a): bounded search with an explicit Complete/BudgetLimited result.Act.fs,Simulation.fs@494e32f): pattern entry, strong test matrix.CommandPipeline.fs, UnityBoundedDispatchQueue.cs, NetWebSocket.fs, SC2MetadataBudget.fs): one cross-repo entry; plus RuneScape nearest/Exact-Ambiguous-Fuzzy resolution as the first runner-up.Counts toward the Outcome's 15-entry floor: these ten, plus visibility-by-sampling (FourD), nearest query baseline and tagged name resolution (RuneScape Knowledge), stale-frame admission (SC2) and door-overlay collision (RuneScape) give about 14 from this slice alone; the remainder is expected from the grids, collision, line-drawing and visibility skills and FS.GG.Game.
3. Unknowns
BrowserStateand SC2 contract vectors. I did not run any Fable build.PriorityQueuesupport in Fable is unverified for the RuneScape A*.FS.GG.Game/tests/Game.Core.Tests/AiTests.fsandHexTests.fsshow it already has some AI and grid code, and its four algorithm skills were not read by me. Entries here should be reconciled against it before the ADR fixes the seed list.docs/THIRD-PARTY-NOTICES.md); FourD, SC2.Client and Unity.Client licence terms were not found in the paths I read.41-residue-and-full-queueis FLAKY in CI — it exits 5 at random, and a gate that fails randomly teaches people to re-run it #761/fix(engine): next/take name the observed reason, not a guessed list of causes (#440) (case 41) #792 harness.EHotwagner commentedon Nov 1, 2026
Root/fdev decision on the analysts' open question (private-repo content in a public package or pack). FS-GG owns the code in its private repositories.
EHotwagner commentedon Nov 1, 2026
Root/fdev analyst (engine & product repos): inventory of FS.GG.Game, FS.GG.Rendering, FS.GG.Audio and FS.GG.Templates for ALGO-01.1 (analysis only; nothing modified).
Evidence base:
origin/mainread withgit show/git grepaftergit fetch(refs only). The local Game checkout (detached d602c2d) and Templates checkout (detached d867ea9) are behind origin, so I did not use their working trees. Atlas consulted first:game/core-host-and-portable-profile(Core publishes a curated Fable subset),contract/game-sim-core,contract/game-physics-box2d; both confirmed against source. Test counts are grep approximations (FsCheck =testCase ... (FsCheck)/Check.hits).Legend. G = FS-GG/FS.GG.Game@eb48a19 (
GC/=src/Game.Core/,GH/=src/Game.Harness/). R = FS-GG/FS.GG.Rendering@2d35dc9. A = FS-GG/FS.GG.Audio@8ce4f33. T = FS-GG/FS.GG.Templates@858b624. Fable column is the grade inGC/Fable/compatibility-profile.v1.json: LE LockstepExact, Port compiles in the curated Fable view with no byte promise, Unc in the Fable view but Unclassified, .NET DotNetOnly. Tests live inG:tests/Game.Core.Tests/unless stated.1. Technique inventory
maxVisited)fs-gg-game-corePathfinding section)astaronly)distanceFieldcost and thejps/ALT/astarStraightdifferentials.bfsjpsLandmarksastarStraight, integer cross product)smoothLos.distanceField,flowField)reachable+pathTo,reachableWithin,budgetFor)baseStep).Regions)fs-gg-grids)edgeBetween); rest UncEdge/Vertexmodels (Grids.Edge,Edges.Edge).lineOfSightBy)fs-gg-collision,fs-gg-game-core)fs-gg-physics)alphainterpolationfs-gg-physics,fs-gg-game-core)fs-gg-replay,fs-gg-game-fable)Physics.fsisays cross-platform lockstep "needs fixed-point, which is a later, ADR'd decision". Integer-only searches/FOV/LOS substitute for it.splitsub-streamsnextIntmodulo bias documented. Integer-only, so a good Fable-portable candidate.fs-gg-effects)fs-gg-mapcraft)fs-gg-mapcraft)fs-gg-ai)influenceMapfs-gg-effects)Explore.findScript), seeded property check with counterexample shrinking, bot combinatorsfs-gg-playtest)selftest/validatein driverfs-gg-svg-performanceguidance)'value)SpatialGrid(two spatial indexes) needs an ADR line.checksumLoop.alpha.fs-gg-audio,fs-gg-browser-audio)FS.GG.Audio.Hostredistributes OpenAL Soft (LGPL-2.0-or-later) per A:THIRD-PARTY-NOTICES.md, so nothing from Host/Engine should enter a shared MIT library.template/skill-manifest/skill-manifest.jsonships only Fable/Go/Node/Rust language skills; it carries no algorithm skill.Provenance and licence summary: every algorithm in G/R/A/T that I read is original F# with literature cited only as references (Red Blob Games for grids, line drawing, visibility and hex; Ford/Milazzo; Steele/Lea/Flood; Bridson; Goldberg-Harrelson ALT; Tarjan). Third-party code is only consumed as packages: Box2D.NET 3.1.654 (MIT), OpenAL Soft (LGPL, via Audio.Host), Noto Sans (OFL, T:SvgFoundation/THIRD-PARTY-NOTICES.md). I ran no text-similarity scan against external sources, so "original" is from header comments and history, not a clean-room check. The Red Blob skills carry links, not copied text.
2. Existing algorithm product skills
Two producers currently ship the four ids. The registry (
.github:registry/skills.ymlrows 202-205, @936283c0) names FS.GG.Rendering the owner, with Rendering's shas. FS.GG.Game'stemplate/skill-manifest/skill-manifest.json@eb48a19 also carries all four with different bytes and (for collision) a different predicate.fs-gg-gridsGrids.fs(R:template/fragments/grids/src/Product/Grids.fs, 237 lines).Grids,Hex,Edgesand AoE templates in Game.Core.profile in [game, sample-pack](both)fs-gg-collisionCollision.fs(372 lines); includes pierce+prune combat resolution andslideCircle.profile in [game, sample-pack]; G: sameor template == fable-gamefs-gg-line-drawingLineDrawing.fs(114 lines)Losprofile in [game, sample-pack]fs-gg-visibilityVisibility.fs(308 lines)Fovshadowcastingprofile in [game, sample-pack]Neighbouring algorithm-bearing skills, all in G:template/product-skills/ (single
SKILL.mdeach; owner fs-gg-game in the registry):fs-gg-game-core(888 lines: fixed step, RNG, collision, culling, pathfinding choice guide, spatial queries, dice, ballistics, AI pointers; the de facto umbrella today),fs-gg-ai(322),fs-gg-physics(309),fs-gg-ballistics(242),fs-gg-effects(475),fs-gg-mapcraft(362),fs-gg-replay(55),fs-gg-rules(52),fs-gg-game-fable(91, the lockstep profile),fs-gg-playtest(512), plus Rfs-gg-svg-performance(27 lines, culling/retained-scene guidance) and Afs-gg-browser-audio(34).Recommendation: index, do not fold in.
[[fs-gg-game:...]]references. Folding them moves ownership and forces new shas, re-seeds and registry migration for no knowledge gain. The umbrellafs-gg-algorithmsentries should cite them by id and path and carry only the cross-cutting facts (taxonomy, complexity, bench numbers, when-not-to-use).Grids.fswhile Core has shippedGrids/Hex/Edges), the code lives in Game.Core, and Rendering already retired its second copies of the four Game-migrated skills at P6 (.github#1862, FS.GG.Rendering#1147). The precedent points to retiring the Rendering copies and migrating the four rows to owner fs-gg-game. That is a proposal for the ADR owner to confirm with the Rendering owner; I made no change.materializes-whenshould saytemplate == fable-gameexplicitly: G's grids, line-drawing and visibility rows areprofile in [game, sample-pack]only (see Unknowns).3. Top 10 seed candidates (value and readiness)
Readiness = tested implementation exists in reviewed code, Fable grade, and API stability.
astar/bfs. LockstepExact, ~40 FsCheck, already used by the fable-game template. Ready now.distanceField/flowField, plusreachable/pathToas the tactics variant). Property-tested; many-agent use.Geometrynarrow phase, swept AABB/SAT): G:GC/SpatialGrid.fs, GC/Geometry.fs. 28 + 6 FsCheck; Portable.Next tier (also ready): ALT landmarks,
Regionsearly-out,astarStraight,smooth; Tarjan articulation and map analysis (MapAnalysis.fs); R:src/Scene/SpatialWorkingSet.fs (culling); R:src/Scene/Animation.fs easing/tween; visibility polygon (Core version); deterministic replay/lockstep (entry; Core code); Dice. That is 20+ candidates from my scope, so the "at least 15 entries" bar is reachable from G alone without Rendering, Audio or Templates code.4. Unknowns
BenchGamerunner. Both measure frame cost through SVG/Pixi/Babylon. Nothing in G measures an algorithm kernel (A*, FOV, spatial hash) in time; the existing evidence is deterministic node/work counts (PathfindingTests.fs,Workload.fs). The ADR must either define a micro-bench route (and where numbers are recorded) or state that library admission uses work-count evidence until one exists.fs-gg-collisionsha (8bd79af6) differs from the registry row (cf22a55d) and its predicate addstemplate == fable-game. I did not runfsgg-sdd scaffold; whether a freshfs-gg-fable-gameworkspace (noprofile) receivesfs-gg-grids,-line-drawingor-visibilityis unverified. The template repo's own manifest (T) contributes none.Pathfinding.astar,Los.lineOfSightBy,Edges.edgeBetween,Kinematics.advance(one path) and the session/replay/planning/network/save surfaces are LockstepExact.jps, fields, ALT,Regions,Fov,Rng,Hex,MapGenandFixedStepare Unc/.NET even where they use only integers. Promoting them is an unscheduled Game.Core decision.GridsvsEdges), spatial indexes (SpatialGridvsSpatialWorkingSet).astarStraight, Hex,smooth, Edges, visibility polygon and Dice are now implemented; all-pairs tables and a bucketed priority queue were left unbuilt, the latter by a "Set frontier is adequate" gate test). The ADR taxonomy should cite it rather than re-derive it. Sibling Deliveries ALGO-01.2 — Library seed tranche: tested F# implementations harvested from reviewed code #5224/ALGO-01.3 — fs-gg-algorithms product skill + knowledge pack, materialized into fs-gg-fable-game workspaces #5225/ALGO-01.4 — Growth loop: capture rule + product-workspace contribution route #5226 already carry seed, skill and growth-loop scope, so no new issue is proposed from this analysis.EHotwagner commentedon Nov 1, 2026
Root/fdev algorithm survey (prior art): additional algorithms for ALGO-01.1 (#5223, Outcome #5222). Analysis only; nothing modified or filed.
Method. I read #5222, #5223 and the three inventories: C (coordination and formal), N (games and netcode) and E (engine and product). Primary references and the licences of reference implementations were checked on 2026-11-01, using the GitHub licence API or the LICENSE file. Every row is to be summarised and cited, never copied.
Legend.
GC/is FS.GG.Gamesrc/Game.Core/.PriorityQueueunder Fable is unverified, N).int64to JSbigint(slow in hot loops).Port, notLockstepExact.Already covered, so harvest rather than reimplement (E, C):
smooth, Regions, hex and edges;alphaand easing;1. Pathfinding and navigation
smooth(E)LosflowField(E)2. Steering and crowds
SpatialGrid3. Decision-making
4. Adversarial and stochastic
Dice.fs)split)5. Learning-lite
6. Procedural generation
7. Spatial and geometry
8. Optimization
Batchis greedy MIS); G: build orders9. Graph
10. Numerical and simulation
LockstepExact11. Networking
LockstepExactstep12. Systems
13. Recommended taxonomy
Library namespace
FS.GG.Algorithms.<Family>equals the packfamilytag. Each entry also carries:LockstepExact,Port,Uncand.NET;harvested,new,entry-onlyorpointer.pointerindexes an existing skill or package (grids, collision, line-drawing, visibility, FS.GG.Net), per E's "index, do not fold in".The families:
nearestRank).Two layering rules apply:
Collections.HeapandNumerics.Fixedare layer 0, which everything else may use.NetandSystemsmay touch Tasks or IO, which keeps the rest Fable-viewable.14. Ranked first tranche: 24 new implementations (beyond harvest)
Each needs the #5222 bar: an FsCheck property plus bench numbers. The oracle is in brackets.
smooth; LOS-valid]Next in line: D* Lite, ORCA, Delaunay and Voronoi, simplex LP, flows, WHCA*, GJK/EPA, CMA-ES, LRU.
Unknowns
int64asbigintand Fable support for BCLPriorityQueueare unverified.41-residue-and-full-queueis FLAKY in CI — it exits 5 at random, and a gate that fails randomly teaches people to re-run it #761/fix(engine): next/take name the observed reason, not a guessed list of causes (#440) (case 41) #792 measure rendering).EHotwagner commentedon Nov 1, 2026
Root/fdev acceptance: ADR-0098 is accepted and merged (#5227,
8ca8f936) after independent review and a delta approve.LockstepExactorder (ADR-0022 and ADR-0069 amended);fs-gg-algorithmsproduct skill via the owner-package and SDD route;check-projectionmust guard a non-string version literal #1155 (upgrade replacement).platform/algorithms-capability.