Known limitations

Document versionDateSummary
v12026-07-18Initial limitation register
v22026-07-24Archive the v0.2.0 register and carry forward the open limitations
v32026-07-27Assign v0.3.0 owners to the release-scoped carried limitations
v42026-07-27Narrow LIM-012 after the first executed ESP-IDF cross-compile
v52026-07-28Record LIM-013 for the missing embedded asset storage and reader
v62026-07-28Narrow LIM-003 to probe depth after the allocation probe coverage check
v72026-07-28Close LIM-010 after the greet presentation rule
v82026-08-01Archive the v0.3.0 register and carry forward the open limitations
v92026-08-03Record LIM-015 for the absent non-volatile storage implementation
v102026-08-03Record LIM-016 for the whole-second resolution of the hosted wall clock
v112026-08-04Record LIM-017 for the absent session continuity in the desktop application

This file records unresolved limitations that affect implementation, verification, portability, or supported behaviour. Planned release exclusions belong in milestones rather than this file.

Each limitation must link to a PBI or a BUG that resolves, evaluates, or explicitly accepts it. Identifiers are permanent and are not reused.

The register as it stood at the close of each release is archived with that release, in v0.1.0, v0.2.0, and v0.3.0. LIM-004, LIM-007, and LIM-009 were resolved within v0.2.0, and LIM-005 and LIM-010 within v0.3.0, so those five remain only in their archives. The eight limitations still true after v0.3.0 are carried forward below with their original identifiers and wording. Active rows are updated when later evidence closes or narrows them.

IDAreaLimitationImpactTrackingStatus
LIM-001WindowsThe MSVC and Windows Clang configurations have not been executed on WindowsWindows remains portable by design rather than build testedPBI-013, PBI-030Open
LIM-002VerificationThe symbol scan does not parse MSVC dumpbin output and Valgrind does not run on Windows, so neither the Core boundary nor the runtime allocation check can execute there. The header check is toolchain neutral but has not been run on WindowsThe three automated boundary checks produce evidence for Linux only. They are recorded as unavailable rather than passing, and do not block v0.1.0 because Windows is not a required environmentPBI-030, PBI-031, PBI-032Open
LIM-003Verificationtools/verify/probe.py fails when a public Core operation is not called by tools/verify/alloc_probe.c, so the surface can no longer narrow silently. The check compares names, not depth, so it proves that every operation runs at least once and not that each one is driven over its interesting arguments and statesThe runtime allocation evidence covers every public operation. How thoroughly one operation is exercised inside the probe remains a maintainer judgement rather than an enforced propertyPBI-032, E21, PBI-080Narrowed
LIM-006DependenciesThe optional SDL X11 extensions are pinned off, because SDL treats a missing one as a configure error rather than a lost feature, which made a clean configure depend on which X11 development packages a machine happened to carry. E15 keeps them off, because the base SDL window, keyboard, pointer, and event APIs cover the semantic input scopeCustom cursors, XRandR display mode switching, screensaver inhibition, and shaped or synchronised windows are unavailable to the SDL frontend until a PBI re-enables the extension it needs and records the system package that comes with itPBI-054, PBI-058Open
LIM-008Hosted data locationThe default pet asset root is resolved relative to the process working directory. Development tests run from the build directory where pet_runtime_assets copies assets/pet, but an installed or packaged desktop app has no project-owned rule yet for discovering assets relative to the executable, bundle, install prefix, or user override. The v0.4.0 save location shares the same gap and avoids it the same way, by requiring an explicit path rather than choosing one, so this is one policy question with two clients rather than two problemsA packaged app launched from another working directory may fall back even when its assets are installed beside it, and would have the same trouble finding a save file if it ever chose one for the user. This blocks nothing today because production packaging and installers are out of scope, and because no supported deployment resolves either location on the user’s behalf. An embedded deployment never meets this, because a firmware image decides where its data lives at build and flash time through a linked symbol or a partition entry, rather than searching for it at run time. Choosing that layout is a separate decision and does not resolve this entryPBI-063, PBI-099, a desktop packaging release if one is plannedOpen
LIM-011VerificationThe automated desktop scenario runs under the SDL dummy video driver. Real-driver visible rendering and synthesised keyboard or pointer interaction are not automated verificationThe automated suite proves the process lifecycle, the asset load, the update and render path, and the failure exit statuses, and nothing about what is drawn or what an input device produces. Visible rendering and interaction remain manual release evidence, to be accepted or carried forward as a release limitation rather than counted as an automated check. PBI-062 acknowledged it as a release limitation and carried it to PBI-063. The manual evidence recorded for v0.2.0 is bounded pet_desktop runs against the real Wayland and X11 drivers that exit zero after loading the canonical set, plus the maintainer’s observation on both drivers of the window with the pet drawn in it, a visible greet response to the space key and the left mouse button, and a clean exit through the window close button and Ctrl-C. Visible rendering and interaction are therefore evidenced for v0.2.0 and remain manual, so they have to be repeated by hand for every release. The v0.3.0 review repeated the observation on both drivers and added a greet settling from the happy expression into the attentive activity, which is the first on-screen evidence for the ADR-011 dwell orderingPBI-063, future rendering automation PBIOpen
LIM-012EmbeddedESP-IDF v6.0.2 now configures, compiles, and links the reusable firmware foundation for esp32, but the selected classic LILYGO T-Display has not been flashed or runEmbedded support is cross-compile tested only. Display output, buttons, persistence, sensors, wireless facilities, and all other hardware runtime behaviour remain unverified until the candidate v0.5.0 T-Display runtime work records device evidencePBI-062, E20, PBI-076, PBI-085, candidate v0.5.0 runtime releaseNarrowed
LIM-013Embedded assetsThe embedded build compiles components/assets without any reader, because pet_assets_stdio_reader is a desktop selection and no embedded storage path exists. There is no flash, packed binary, or generated array source for the canonical pet assets, and no reader implementation over oneFirmware can link the asset loading policy but cannot load an asset set on a device. Presenting the pet on hardware requires the build-time converter direction in architecture section 8.3 first, so the embedded asset path is deliberately absent rather than partially implementedE21, PBI-078, future embedded asset converter and reader PBIOpen
LIM-014Time semanticsFormat version 1 carries a host-supplied save stamp and a load adds a bounded absence to elapsed_time_ms, which ADR-012 decided. What that absence changes is limited to the world clock and to the presentation that follows from it, because the world holds no state that decays and no reunion behaviour exists. An absence is also zero whenever either side had no absolute time, which is every host that has not been given a clockThe mechanism required by SPEC-FR-015 and by general architecture section 6.4 is in place, and the product meaning of a long absence is not. A pet that returns after a week finds its dwell stamps stale and settles, and nothing else about it acknowledges that the user was away. This is a deliberate boundary rather than an unfinished feature, because what an absence should feel like is a product decision that belongs with the behaviour work that has state to act on. A classic T-Display with neither a battery-backed clock nor a network still supplies the unknown value and loses only the absence, and it needs no Core, format, or storage change when it gains a clockPBI-102, PBI-090, PBI-099, a later behaviour release that decides what a return should feel likeOpen
LIM-015Embedded storageThe embedded build compiles components/storage with no implementation, because pet_storage_stdio is a desktop selection and no non-volatile implementation of the contract exists. ESP-IDF v6.0.2 for esp32 compiles the contract and the firmware links no storage dependencyFirmware can carry the storage boundary but cannot keep a pet across a power cycle. A device that should remember its pet needs an implementation over a flash partition or NVS, together with the wear and layout decisions that come with it, and that work belongs to a later hardware runtime release with device evidence behind itPBI-095, PBI-099, candidate v0.5.0 runtime releaseOpen
LIM-016Time resolutionThe desktop application reads its wall clock through the standard C time facility, which promises whole seconds, so a stamp and an absence are both rounded down to a second. The headless application reads no clock at all and takes the value from --nowAn absence is accurate to a second rather than to a millisecond, and a save and a load inside the same second report no absence even though time passed. Nothing in the format limits this, so a host with a finer source may supply one without a format revisionPBI-097, candidate later host releaseOpen
LIM-017Session continuityThe desktop application persists a world only when an operator supplies --load or --save, so a launch without options starts a new pet and a quit keeps nothing. It saves on no timer, on no quit, and on no other implicit event. Choosing a location for the operator is the hosted location policy question that LIM-008 already describes, and this entry links to that description rather than repeating itA pet does not survive a launch by itself, which is what a product user would expect of it, and every existing pet reaches its next run through an operator who names a file. This is a deliberate boundary rather than an unfinished feature, because deciding when a real product saves, what it does on a quit, and where it puts the file is a product frontend decision that the reference application must not make on that frontend’s behalfPBI-097, LIM-008, the future product frontend as its ownerOpen

Add a limitation when work deliberately leaves a relevant constraint unresolved. Close it only when the linked evidence or decision exists.

The v0.4.0 backlog owns none of the carried entries above. Windows verification, the SDL extension set, rendering automation, and the embedded runtime and asset gaps are outside a persistence release, so they stay open by decision rather than by omission. LIM-008 is the one entry the release touches, and it touches its wording rather than its status, because v0.4.0 shares the location question and answers it by requiring an explicit path. LIM-017 is the other client of that question and links to it here rather than describing it again.

Whether LIM-008 is ever solved depends on a product question rather than an engineering one. It is solved by code only if the desktop application becomes a distributed package. If the product surface stays on hardware, the entry should be accepted rather than resolved, because no supported deployment meets it. The roadmap carries that question.

v0.4.0 opens its new entries when the work that creates them lands rather than in advance. PBI-087 opened LIM-014 for the absent handling of time spent closed, and PBI-102 then narrowed it to what an absence does not yet mean, by bringing the stamp and the bounded transition into the release rather than deferring them behind a format revision. PBI-095 opened LIM-015 for the absent non-volatile storage implementation once the embedded build compiled the contract without one. PBI-097 opened LIM-016 for the whole-second resolution of the hosted wall clock when the desktop application began reading one. PBI-099 then opened LIM-017 for the desktop application not preserving a pet across launches, and left the location half of that gap where it already lives, in LIM-008.