{"id":49592202,"url":"https://github.com/byebyebryan/powered-descent-lab","last_synced_at":"2026-05-04T01:31:09.427Z","repository":{"id":352140482,"uuid":"1213850509","full_name":"byebyebryan/powered-descent-lab","owner":"byebyebryan","description":"Native-first control and simulation lab for powered descent","archived":false,"fork":false,"pushed_at":"2026-04-27T22:41:30.000Z","size":961,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-28T00:18:39.606Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/byebyebryan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-17T20:38:17.000Z","updated_at":"2026-04-27T22:41:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/byebyebryan/powered-descent-lab","commit_stats":null,"previous_names":["byebyebryan/powered-descent-lab"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/byebyebryan/powered-descent-lab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byebyebryan%2Fpowered-descent-lab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byebyebryan%2Fpowered-descent-lab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byebyebryan%2Fpowered-descent-lab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byebyebryan%2Fpowered-descent-lab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/byebyebryan","download_url":"https://codeload.github.com/byebyebryan/powered-descent-lab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byebyebryan%2Fpowered-descent-lab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32591596,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"ssl_error","status_checked_at":"2026-05-03T22:09:10.534Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-04T01:31:08.822Z","updated_at":"2026-05-04T01:31:09.419Z","avatar_url":"https://github.com/byebyebryan.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Powered Descent Lab\n\nPowered Descent Lab (`pd-lab`) grows out of the bot and simulation work explored\nin `pylander`: a native-first lab for deterministic 2D rocket flight,\ncontroller development, scenario design, benchmarking, and replay/telemetry\nanalysis.\n\nThis project is not the eventual player-facing game. The split is intentional:\n\n- the lab optimizes for determinism, throughput, interfaces, and evaluation\n- the game can later optimize for feel, UX, content, and presentation\n\n## Direction\n\nCurrent design direction:\n\n- Rust cargo workspace, native-first\n- `clap` + `serde` + `tracing` style native tooling, with web reserved for static\n  report viewing rather than an interactive runtime\n- fixed-step deterministic simulation\n- controller updates may run at a lower fixed rate than physics, with commands\n  held between controller ticks\n- a proper bot framework, not only a thin `Observation -\u003e Command` callback\n- one primary goal per scenario\n- formal controller API with full immutable scenario context at setup time and a\n  compact per-tick observation\n- controller outputs that can include status, phase, metrics, and report/debug\n  markers in addition to vehicle commands\n- authored scenario packs, curated scenario families, and seeded regression\n  sweeps\n- 1D heightfield terrain as the canonical world model, with richer query APIs\n  layered on top\n- no LOD in v1 for controller-facing terrain data\n- landing means stable touchdown on the designated target, based on\n  touchdown/contact-frame metrics rather than only world-frame `vx`/`vy`\n- replay and trace artifacts as first-class outputs\n- project-owned artifact schemas with lightweight OSS analysis tools layered on\n  top, rather than a production observability stack\n- action and event logs as authoritative replay inputs, with sampled traces kept\n  as optional report/debug caches\n- native multithreaded batch evaluation in `pd-eval`, especially for seeded\n  scenario sweeps\n- basic static inspection/reporting as part of the near-term controller workflow,\n  not only a late polish phase\n- static web reports over captured artifacts, with optional lightweight\n  trajectory inspection later, but no browser runtime target\n\n## Why Reboot\n\n`pylander` proved the problem was interesting, but it also mixed too many\nconcerns in one place:\n\n- game runtime and presentation\n- controller logic\n- evaluation and benchmark orchestration\n- plotting and trace tooling\n- browser and Pygame delivery constraints\n\nWhat mattered from that broader experimentation was the project split:\n\n- native core\n- controller layer\n- evaluation and reporting layer\n- thin presentation over generated artifacts\n\n`pd-lab` borrows ideas, concepts, scenario lessons, and telemetry vocabulary\nfrom `pylander`, but not its implementation or module layout.\n\nIt should also reuse the scenario lessons that proved useful in `pylander`\nwithout treating the old scenario files as fixtures to transliterate directly.\n\n## Scope\n\n`pd-lab` owns:\n\n- deterministic simulation\n- controller and bot development\n- scenario packs\n- evaluation and benchmarking\n- telemetry, traces, and replay artifacts\n- controller telemetry and report/debug artifacts\n\n`pd-lab` does not own:\n\n- player progression or economy systems\n- content-heavy mission design\n- final game UX\n- browser-first runtime constraints\n\n## Docs\n\n- [Architecture](docs/architecture.md)\n- [Roadmap](docs/roadmap.md)\n- [Progress](docs/progress.md)\n- [Terminal Suite Design](docs/terminal_suite.md)\n- [Early Design Scratchpad](docs/early_design.md)\n\n## Report Serving\n\nGenerated reports live under `outputs/` and can be served locally with:\n\n```bash\n./scripts/serve-reports start\n```\n\nThe script starts a simple HTTP server inside a named detached `tmux` session\nand serves `outputs/` on `0.0.0.0:8000` by default. The root URL now lands on a\ngenerated `outputs/index.html` page, and `/reports/` remains the clean\nreport-only subtree. The printed LAN URL resolves automatically when available.\n\nUseful commands:\n\n```bash\n./scripts/serve-reports status\n./scripts/serve-reports attach\n./scripts/serve-reports stop\n```\n\nThis is intentionally explicit. Agent skills or local tooling can call the same\nscript when they need a report server, but the repo-owned script remains the\ncanonical entrypoint.\n\nGenerated single-run, replay, and batch outputs also maintain `latest` links\nunder `outputs/` when written through the project CLIs, for example:\n\n- `outputs/runs/latest/report.html`\n- `outputs/replays/latest/report.html`\n- `outputs/eval/latest/summary.json`\n- `outputs/eval/\u003cpack\u003e/runs/latest/report.html`\n\nStable HTML entrypoints also live under `outputs/reports/`, for example:\n\n- `outputs/reports/index.html`\n- `outputs/reports/runs/latest/`\n- `outputs/reports/eval/latest/`\n\nThe root landing page is:\n\n- `outputs/index.html`\n\n## Batch Eval\n\n`pd-eval` owns scenario packs, scenario-family expansion, seed sweeps, and\nnative multithreaded execution.\n\nExample:\n\n```bash\ncargo run -p pd-eval -- run-pack fixtures/packs/terminal_bot_lab_suite.json --workers 4\n```\n\n`run-pack` now writes stable review output to `outputs/eval/\u003cpack\u003e/`, but stores\nthe actual batch artifacts under:\n\n- `outputs/eval/cache/\u003cworkspace-or-commit-key\u003e/\u003cbatch-stem\u003e/`\n\nBy default it will:\n\n- reuse a complete candidate cache when the resolved pack digest matches\n- try `--compare-ref auto`\n- on a dirty workspace, compare against the clean `HEAD` cache if it exists\n- on a clean workspace, compare against the previous clean commit cache if it\n  exists\n\nAdd `--enforce-regression-policy` when a run should exit nonzero if the\nresolved compare target fails the default regression gate. That flag requires\nan explicit or cached compare baseline.\n\nAfter a dirty run becomes the new checkpoint, promote it into the clean commit\nkey:\n\n```bash\ncargo run -p pd-eval -- promote-cache fixtures/packs/terminal_bot_lab_suite.json\n```\n\nRun the same matrix with the full seed tier:\n\n```bash\ncargo run -p pd-eval -- run-pack fixtures/packs/terminal_bot_lab_full.json --workers 8\n```\n\nRun the trajectory-error matrix:\n\n```bash\ncargo run -p pd-eval -- run-pack fixtures/packs/terminal_traj_err_suite.json --workers 8\ncargo run -p pd-eval -- run-pack fixtures/packs/terminal_traj_err_full.json --workers 8\n```\n\nForce a rerun and skip cache reuse if needed:\n\n```bash\ncargo run -p pd-eval -- run-pack fixtures/packs/terminal_bot_lab_suite.json --workers 8 --no-reuse\n```\n\nUse `terminal_bot_lab_suite` as the primary controller workbench. It is the\nsmoke-tier Earth `half_arc_terminal_v1` matrix over:\n\n- `condition_set = clean`\n- `vehicle_variant = empty`\n  - `pylander`-aligned Earth baseline hardware with empty payload\n- `vehicle_variant = half`\n  - the same hardware with half payload\n- `vehicle_variant = full`\n  - the same hardware with full payload\n- `arc_point x velocity_band`\n- `baseline` and `current` controller lanes\n\nThe maintained terminal baseline now matches the core `pylander`\nvehicle/engine envelope closely enough to reason about directly:\n\n- `8m x 10m` hull\n- `7200kg` dry mass\n- `6300kg` max fuel\n- `240000N` max thrust\n- `25%` ignited minimum throttle\n- `90 deg/s` max rotation rate\n\nThe one intentional simplification is fuel use:\n\n- `pd-lab` does not yet model `pylander` overdrive or the nonlinear burn\n  penalty above nominal thrust\n- fuel burn currently scales linearly between minimum and maximum thrust\n\nAt the moment:\n\n- `baseline` means the older heuristic baseline controller\n- `current` means `terminal_pdg_v1`, the first serious terminal-only PDG-shaped\n  native Rust controller lane\n\nBatch reports now prefer cached current-lane history compare when a promoted\nclean cache exists. The internal `baseline` lane is still useful as a\nreference-controller check, but it is no longer the primary progress signal.\n\nUse `terminal_bot_lab_full` when the same matrix should run with the full\nseed tier for spread measurement. The `terminal_compare_*_fixture` packs are\nonly for smoke-testing pack-vs-pack compare output.\n\nUse `terminal_traj_err_suite` and `terminal_traj_err_full` when the same\nEarth/payload matrix should exercise projected miss conditions. These packs use\ncurrent-lane-only runs over:\n\n- `traj_undershoot_small`\n- `traj_undershoot_large`\n- `traj_overshoot_small`\n- `traj_overshoot_large`\n\nThe clean matrix keeps small seed-level radial/speed jitter. The trajectory\nerror matrix instead owns the lateral miss as a condition-set perturbation:\nundershoot stays short on the approach side, overshoot crosses to the far side,\nand the configured small/large projected miss magnitudes are recorded in each\nresolved run.\n\nThat writes:\n\n- `pack.json`\n- `resolved_runs.json`\n- `summary.json`\n- `report.html`\n- optional `compare.json`\n- per-run bundles under `outputs/eval/\u003cpack\u003e/runs/`\n\nBatch output keeps stable semantic run directories for inspection while also\nrecording stable digests for the resolved pack and resolved run set.\n\nThe batch report is intentionally compare-friendly:\n\n- a selector-aware review tree as the main drill-down surface\n- explicit report context near the top of the page:\n  - standalone\n  - lane compare\n  - external compare\n  - compare basis\n  - scope resolution\n  - compare status\n- a regression-policy panel and overview chip for compare runs\n- optional candidate-vs-baseline deltas over shared run IDs\n- stable links back to per-run detail reports and bundles\n\nAt this point the batch/single-run reporting stack and cache workflow are good\nenough for real controller iteration. The evaluator can now:\n\n- reuse and promote batch caches\n- prefer cached current-lane history compare by default\n- classify analytically impossible terminal runs separately from scored\n  failures\n- annotate low-thrust/high-energy frontier cells without removing them from\n  scoring\n- evaluate a default thresholded regression policy over compare runs, scoped to\n  the preferred current controller lane when both reports contain one\n\nCurrent checkpoint on the maintained Earth payload tiers:\n\n- `terminal_bot_lab_suite`\n  - `current`: `168 / 180` scored successes, `12` scored failures,\n    `9` impossible warnings, `12` frontier annotations\n- `terminal_bot_lab_full`\n  - `current`: `676 / 720` scored successes, `44` scored failures,\n    `36` impossible warnings, `48` frontier annotations\n  - by vehicle tier:\n    - `empty`: `252 / 252`\n    - `half`: `252 / 252`\n    - `full`: `172 / 216` scored, `44` fail, `36` impossible warnings,\n      `48` frontier annotations\n\nTrajectory-error checkpoint:\n\n- `terminal_traj_err_suite`\n  - `current`: `689 / 720` scored successes, `31` scored failures,\n    `36` impossible warnings, `48` frontier annotations\n- `terminal_traj_err_full`\n  - `current`: `2754 / 2880` scored successes, `126` scored failures,\n    `144` impossible warnings, `192` frontier annotations\n  - by condition:\n    - `traj_undershoot_small`: `693 / 720` scored, `27` fail,\n      `36` impossible warnings, `48` frontier annotations\n    - `traj_undershoot_large`: `707 / 720` scored, `13` fail,\n      `36` impossible warnings, `48` frontier annotations\n    - `traj_overshoot_small`: `683 / 720` scored, `37` fail,\n      `36` impossible warnings, `48` frontier annotations\n    - `traj_overshoot_large`: `671 / 720` scored, `49` fail,\n      `36` impossible warnings, `48` frontier annotations\n  - by vehicle tier:\n    - `empty`: `1008 / 1008`\n    - `half`: `1006 / 1008`, `2` fail\n    - `full`: `740 / 864` scored, `124` fail, `144` impossible warnings,\n      `192` frontier annotations\n\nSo the main next bottleneck is no longer basic controller viability on the\nEarth-aligned workbench. Clean `empty` and `half` are solved, clean `full`\nis still the low-thrust/high-energy frontier and its failed cells remain\nscored, trajectory-error `empty` is solved, trajectory-error `half` has sparse\nhigh-energy scored failures concentrated in `traj_overshoot_large / a60`, and\ntrajectory-error `full` is the main\nfrontier-annotated stress tier. Detailed checkpoint history lives in\n`docs/progress.md` and `docs/terminal_suite.md`.\n\nThe next useful slice is Phase 2 closure work that uses the regression-policy\ngate, refines frontier/feasibility semantics where they still affect\ninterpretation, and adds the next terminal condition space such as terrain or\nobstacles. Broad terminal-controller tuning should now be optional and\nhypothesis-gated rather than the default path.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyebyebryan%2Fpowered-descent-lab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbyebyebryan%2Fpowered-descent-lab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyebyebryan%2Fpowered-descent-lab/lists"}