docs: keep project status and links current

This commit is contained in:
Codex 2026-10-21 09:57:05 +02:00
parent a10d04d75d
commit ffbff9805c
7 changed files with 55 additions and 16 deletions

View file

@ -65,7 +65,8 @@ We do not need to begin with a blank-sheet LightBurn clone:
The leading route is therefore either to use and improve MeerK40t directly or The leading route is therefore either to use and improve MeerK40t directly or
to build a Rayforge JCZ/Balor addon using the narrowest practical layer from to build a Rayforge JCZ/Balor addon using the narrowest practical layer from
BalorMK. This remains a proposed decision until the offline proofs in BalorMK. This remains a proposed decision until the packaged interaction and
real-project gates in
[ADR 0002](docs/adr/0002-reuse-rayforge-and-balormk.md) have passed. [ADR 0002](docs/adr/0002-reuse-rayforge-and-balormk.md) have passed.
## Next steps ## Next steps

View file

@ -7,8 +7,8 @@
## Verified checkpoint ## Verified checkpoint
The public repository currently passes 83 unit tests and the public-repository The complete public unit-test suite and public-repository guard pass at this
guard. The offline Rayforge/MeerK40t evidence covers addon lifecycle, MOPA checkpoint. The offline Rayforge/MeerK40t evidence covers addon lifecycle, MOPA
settings and units, layer and recipe semantics, JCZ record/list encoding, settings and units, layer and recipe semantics, JCZ record/list encoding,
negative cases, cancellation/recovery and synthetic LightBurn imports. negative cases, cancellation/recovery and synthetic LightBurn imports.

View file

@ -59,6 +59,8 @@ production adapter must not infer the unit from a driver-specific comment.
Spike C passes at the semantic boundary. The result supports a Rayforge JCZ Spike C passes at the semantic boundary. The result supports a Rayforge JCZ
addon architecture. A follow-up spike now covers transport-free 12-byte addon architecture. A follow-up spike now covers transport-free 12-byte
command records, but ADR 0002 remains proposed until complete list behavior, command records. At this checkpoint, list behavior, full Windows packaging and
addon packaging in a complete Windows build, and the remaining stock the remaining stock MeerK40t workflow assessment were still open. Later
MeerK40t workflow assessment are addressed. offline progress is summarized by the
[M1 no-device acceptance checkpoint](m1-no-device-acceptance.md); ADR 0002
remains proposed because its external gates are still open.

View file

@ -49,6 +49,8 @@ operations continue to fail closed.
The result advances the Rayforge addon route beyond semantic JSON traces: the The result advances the Rayforge addon route beyond semantic JSON traces: the
same operation model can produce deterministic controller-shaped records at a same operation model can produce deterministic controller-shaped records at a
narrow encoder boundary. ADR 0002 remains proposed because stock application narrow encoder boundary. At this checkpoint, stock application workflow
workflow coverage, complete packet/list behavior, packaging in a full Windows coverage, complete list behavior and full Windows packaging were still open.
build and the remaining safety proof obligations are still open. Later offline progress is summarized by the
[M1 no-device acceptance checkpoint](m1-no-device-acceptance.md); ADR 0002
remains proposed because its external gates are still open.

View file

@ -1,6 +1,6 @@
# Product and research roadmap # Product and research roadmap
Last updated: 2026-10-19 Last updated: 2026-10-21
## Destination ## Destination
@ -164,9 +164,10 @@ unknown, so the job still deliberately fails the JCZ encoding gate. A private
known-working `.lbrn2` fixture is required before implementing the missing known-working `.lbrn2` fixture is required before implementing the missing
MOPA mapping. MOPA mapping.
The architecture decision remains proposed until these spikes produce The architecture decision remains proposed until the packaged Windows
evidence. An independent app requires a documented gap analysis showing why interaction and known-working private-project gates produce evidence. An
neither existing platform can be extended responsibly. independent app requires a documented gap analysis showing why neither
existing platform can be extended responsibly.
Exit criteria: a representative JPT job survives import/planning, MOPA Exit criteria: a representative JPT job survives import/planning, MOPA
parameters and units, validation and deterministic mock encoding; the chosen parameters and units, validation and deterministic mock encoding; the chosen

View file

@ -1,6 +1,6 @@
# Phase 0 status # Phase 0 status
Last updated: 2026-10-20 Last updated: 2026-10-21
## Completed ## Completed
@ -75,8 +75,8 @@ evidence for:
- independent layer visibility/output state and ordered serialization; - independent layer visibility/output state and ordered serialization;
- material-recipe matching plus a fail-closed PirateRay provenance and exact - material-recipe matching plus a fail-closed PirateRay provenance and exact
machine/source/lens/correction compatibility gate; machine/source/lens/correction compatibility gate;
- one consolidated no-device acceptance report that reruns all 83 public - one consolidated no-device acceptance report that reruns the complete
tests and the leak guard, then hashes the regression evidence; public test suite and leak guard, then hashes the regression evidence;
- a non-executing Windows artifact verifier that checks portable paths, - a non-executing Windows artifact verifier that checks portable paths,
archive safety, sizes, hashes, the pinned Rayforge revision and every archive safety, sizes, hashes, the pinned Rayforge revision and every
packaged addon source while retaining the manual GUI gate; packaged addon source while retaining the manual GUI gate;

View file

@ -0,0 +1,33 @@
import re
import unittest
from pathlib import Path
from urllib.parse import unquote
ROOT = Path(__file__).resolve().parents[1]
MARKDOWN_LINK = re.compile(r"!?\[[^\]]*\]\(([^)]+)\)")
class DocumentLinkTests(unittest.TestCase):
def test_relative_markdown_links_resolve_inside_repository(self):
documents = [ROOT / "README.md", *sorted((ROOT / "docs").rglob("*.md"))]
failures = []
for document in documents:
text = document.read_text(encoding="utf-8")
for match in MARKDOWN_LINK.finditer(text):
target = match.group(1).strip().strip("<>").split("#", 1)[0]
if not target or "://" in target or target.startswith(("mailto:", "#")):
continue
path = (document.parent / unquote(target)).resolve()
try:
path.relative_to(ROOT)
except ValueError:
failures.append(f"{document.relative_to(ROOT)} -> outside repository: {target}")
continue
if not path.exists():
failures.append(f"{document.relative_to(ROOT)} -> missing: {target}")
self.assertEqual(failures, [], "\n".join(failures))
if __name__ == "__main__":
unittest.main()