Skip to content

Roadmap

The delivered milestones and the open lines. This chapter is the SRS-level summary and is updated when milestones close; the reference private session records carry the day-to-day detail.

Delivered

Milestone Content Closed
M0 Repository skeleton, CI, guards 2026-07-21
M1 Version registry, command database schema and loader, core steady commands with citations 2026-07-21
M2 Script builder, helpers, workspace, executor, campaign loop, manifest, parsers, run-matrix reader 2026-07-21
M3 Probe harness, first compat report, status promotion 2026-07-21
M4 Physics cases, version-comparison (drift) suite, local research-case class 2026-07-21
M5 Docs site generated from the database, steady polar example 2026-07-21
v0.1.0 First tag (private phase) 2026-07-21
M6 FSI subpackage: structural branch, coupled driver, near-rigid pilot; two-way rotor coupling solver-blocked with the finding reported upstream 2026-07-21
M7 Far-field extraction: probe lattices, planar grids with geometry gating, conservation ledgers, licensed round trip started 2026-07-21, core delivered
v0.2.0 First public release: PyPI, Zenodo DOI, citation metadata 2026-07-22
Usage-feedback line FR-30 to FR-36: labels, provenance, tables, workspace input library, pre-flight and resume, matrix first-class, two-level help 2026-07-22
v0.3.0 Second public release: PyPI, Zenodo DOI, the usage-feedback line plus the options/exceptions/testing modules, the ProperDocs migration with a published docs site, role-based review, ITACA co-development (AD-07), and the licensed 26.1x evidence session 2026-07-23
v0.4.0 Third public release: the independent-review remediation line (FR-48 broken-command refusal, FR-49 derived support levels, FR-02c ambiguous vendor-name refusal), the FR-39 package base exception with its residual named site by site, manifest reconstruction, run-matrix output collection and HIDDEN derivation, inherited evidence marked as inherited in the compatibility matrix, the 26.121 onboarding with licensed evidence, Windows CI, and a publication path coupled to the exact wheel the gates passed 2026-08-04
v0.5.0 Fourth public release: the command database completed (388 entries, every command any of the four registered manual editions documents, a version row per documenting edition, all four builds operational), the saved simulation file adopted as a probe instrument, the argument-citation name-map fallback deleted in favour of the single cites declaration, and pyfs-manual with the per-edition sweep that makes the coverage measurement reproducible 2026-08-09
v0.6.0 Fifth public release: three more FlightStream builds registered (25.000, 25.100, 26.000) and every registered build carrying the vendor build number its solver prints, read from a committed report; the version-dependent solver command line corrected after it had made those three look broken (RPT-023); the canonical scheme generalised from 26.XXX to YY.XXX; a generated build-correspondence page keyed on what a solver PRINTS rather than on the name the vendor sells it under; and pyfs-manual surface, which reports what each build documents and what changed between builds (RPT-024) 2026-08-09
v0.7.0 Sixth public release: an eighth build registered (26.122) the day after the vendor issued it; every command any of the eight registered editions documents given an entry, 414 in all, with the ten layout readings deliberately withheld named rather than counted as coverage; the coverage sweep given the row-level second measure the entry-level one cannot make, after it reported zero absent while three builds could not emit a documented command; a citations subcommand re-reading each cited page against the edition it names, since a citation was written once and nothing looked at it again; the per-version args override becoming a statement of difference rather than a replacement; and atmosphere serving the three pre-26.100 builds again 2026-08-11
v0.8.0 Seventh public release: a ninth build registered (26.123), the first that INHERITS NOTHING, so every row it holds was read on its own edition; a run matrix that can send different rows to different solver builds, each point recorded against the executable its own row asked for and emitted under that build's declared version; six export parsers written against files captured on a licensed solver and committed as fixtures, taking the default set from four readable exports to ten of eleven; a trailing-edge extraction that reads a blade mesh and writes the node list both marking routes consume, with trimesh promoted to a runtime dependency because that extraction is on the default path of a rotor campaign; a sweep that leaves its table beside its runs without being asked; three further colliding-output requirements published, and the fourth refusal of that class published as a known gap rather than closed quietly; and the geometric sweep refused at load time where it would multiply into runs no case names and no run id can tell apart 2026-08-20
v0.8.1 First patch release, and it exists because the workflow capability v0.8.0 introduced, a run type the package builds itself off the matrix WORKFLOW column, could not be used: a run matrix had no way to name a geometry at all, so a workflow rendered a script with no OPEN and the solver solved whatever it already had open, with the numbers wrong and nothing said; a row names its geometry now, both builders open the staged copy first, and a row declares the symmetry a periodic sector needs, symmetry having been fixed at NONE so a sector ran as a one-bladed rotor and converged; the shipped default invocation repaired, --workspace . having spelled every path from the caller's directory while the solver resolved them from the run's, which killed every campaign on a script that was sitting right there; and, separately, the two entry points that take a directory from their caller rather than from a workspace, where a relative one made check_solver_identity write its log where nothing read it and downgrade an identity refusal to a warning blaming the solver, so a run could proceed against the wrong build; and the byte-identity promise given the evidence it never had, 28 renders pinned as goldens, measured against the released v0.8.0 and the receipt committed beside them 2026-08-22
v0.9.0 The first release to break the run-matrix FILE FORMAT, which is why it is a minor and not a patch: the RE and MACH columns are removed and a row states its whole flow condition in one mandatory FLIGHT_CONDITION cell (PFS-2027.01), a set of CONSTRAINTS on one flow state where the keys given decide which quantity is solved for, so MACH:0.20, REmi:5.5 solves for density at sea level while TASmps:68.08, ALTFT:10000, dISA:5 is an atmosphere point whose Reynolds number is an outcome; a standard atmosphere the package computes itself on a floor module below every layer, ISO 2533:1975 with a Sutherland viscosity law, its sea-level density derived rather than stored; the reference length coupled to the resolution, because on the solved branch density is inversely proportional to it and two lengths give densities differing by their ratio; the resolved state reaching both script builders and riding on the case; the run record carrying the condition AS WRITTEN, every resolved quantity, the reference length and WHICH BRANCH produced the density, so the resolution in the artifact that outlives the session can be recomputed rather than trusted; and a file written under either older layout RECOGNISED and refused naming its converter rather than misread, with the warning on every page a user lands on and in the command itself that the conversion is lossless as a FILE and not neutral as a RESULT 2026-08-25
v0.10.0 A rotor row states the study's DECISIONS and the package derives their arithmetic: ADVANCE_RATIO resolves the rotor speed as n = V / (J D) against the row's own velocity and a rotor_diameter_m that sits with the other reference lengths rather than in the propeller block, RPM_SIGN carries the hand a magnitude cannot, and DELTA_THETA with REVOLUTIONS resolve the physical clock, with the hand-stated forms RPM, DELTA_TIME and TIME_ITERATIONS kept for the matrices already written in them and revolutions that do not work out to whole steps refused naming both numbers; a solver preset REACHES THE SCRIPT, twelve settings that each have an emitter joining the case model and eleven solver spellings read as aliases, so a preset asking for one flow model no longer runs another in silence, and a key that names no field at all is refused rather than dropped with a warning, while a key declared recorded-only still reaches no script and still warns, which is a design and not a gap; and LOG_OUTPUT names which declared output is the solver log, so an unsteady run whose time loop always reaches its prescribed end is judged on its residuals instead of being recorded COMPLETED_MAX_ITER whatever the solver did, WHERE THE ROW DECLARES ONE: a campaign that exports no log is judged exactly as it was, so an existing record is not superseded by this release 2026-09-01
v0.10.1 The release that makes a user stop counting: a run matrix row names its moving surfaces, or the FAMILY they belong to, and the package resolves the name to the solver's own boundary index by reading the saved simulation the row opens. A position in one file's boundary order was right for the file it was written against and named a different surface in any file that ordered them differently, and nothing said so: the run completed, exported and reported loads for a rotor whose moving set was wrong, and no instrument this package owns can read a moving set back. One cell, Blade,S, reproduces all ten positional cells of the reference campaign exactly across five geometries with every emitted script byte for byte unchanged, and on a geometry that orders the same names differently it moves where the positional cell does not. A position still works and now warns, naming the surfaces it actually selected, because sixteen committed goldens carry that line and a patch may not change an input a correct matrix already uses. A named boundary group may finally be written in names, where the one function that consumed one used to refuse a label and instruct the user to rewrite their artifact in positions. FR-30b came off implemented and went back on inside this release with evidence at the surface it claims, its wording untouched. AND BY THE REFERENCE EXPLICIT EXCEPTION this patch also carries a THIRD RUN TYPE, an unsteady run with nothing turning, without which two cases of the reference exercise could not be expressed at all; a sweep of the shipped pointers to a working-method file this repository stopped publishing at 0.9.0, 70 of 116 retargeted with the 46 in committed evidence and history kept deliberately, including one paragraph that was false inside the published package metadata; and the seat-free half of the rotor command evidence table 2026-09-02
v0.11.0 The workspace interface, built against the reference campaign and reproducing it script by script (3 of 3 within the allow-list) and product by product (32 of 32 equal): the run-matrix layout drops FS_SCRIPT and turns ENTRY into PPROC, the post-processing artifact that states exports, sections, plots, probes and products once; the products are CSV tables the run writes and pyfs-matrix post rewrites; the GEOMETRY cell names its file; the campaign is named after its directory; the reference point-naming convention is the default; the reference artifact loses the four rotor facts and the second propeller length; the boundary order of a geometry is read from the file by pyfs-matrix inventory and never stated in a preset; a row may state several rotors as MOTIONS records on rotor points; base regions are an optional input naming mesh families; a point opens its geometry through a link; and every refusal about an undeclared boundary inventory names the file rather than the row. The reference five seat runs on 26.120 ran on the reference licensed machine on 2026-09-03 and closed the last three arms of GOAL-011 2026-09-03
v0.12.0 Two additions the reproduction workspace needs, and no change to the run-matrix layout or to any cell already written: a setup artifact may carry a [flight_condition] table holding the fluid pins every row naming it inherits for the keys it does not state itself, with the row winning key by key and the resolved state proved identical by rendering one workspace twice and comparing the script byte for byte; and an unsteady run that meshes nothing turning may state its clock as DELTA_THETA and REVOLUTIONS against the speed whose azimuth the step measures. With them: the derived time step is emitted as derived and never rounded, a derived rotor speed carries the reference four decimals, and the default loads assessor judges a point's own declared outputs rather than every file beside them. TWO DERIVED NUMBERS MOVE with those last two, so a row already written feels them and a reader re-baselines rather than comparing against v0.11.0's tables 2026-09-04
v0.13.0 The workspace scope the owning seat approved on 2026-09-08, built in one night: exports that begin after a threshold the row states, registered as two solver actions and measured on 26.123; the products stage writes PROV-JSON provenance, every reduction of an unsteady row and the reference plot format; one folder per geometry beside the flat layout with pyfs-workspace migrate-geometries and archive; plan-time refusals for word-named groups, free keys and positions; the physics cases as rows of a campaign workspace under pyfs-qa physics --workspace, the hand-built runner removed; the support window follows SPEC 0 and Python 3.11 leaves it; the deprecation ledger names a removal version for every live promise; the test suite organized by tier with the licensed tier a seven-matrix workspace rendered offline on every commit; and twenty-six of the release review's thirty-three findings folded in before the tag, two registered for 0.14.0 and five standing as questions to the owning seat 2026-09-09
v0.13.1 The same-day patch the reference cases asked for: pyfs-matrix run pre-flights a row on a second build under that build's grammar, as plan already did, and a nonzero sideslip under SYMMETRY: MIRROR is refused at plan time, the solver having been measured running a mirrored half model at zero sideslip whatever the script states 2026-09-09
v0.15.0 THE USE CASE BECOMES THE RELEASE (GOAL-014, the design of 2026-09-10). A study's vocabulary lives in the REFERENCE artifact: an [aliases] table whose members may be other aliases, a [[frames]] table moved out of the setup preset, and one block per rotor whose name is an alias over everything that rotor owns, carrying its hub, axis, sign, diameter and blade families. A row names its rotor by alias and states nothing else about it; one advance ratio written once in the flight condition gives a 1.20 m lifter and a 1.80 m pusher two different speeds; each rotor's frames take its alias as their radical, so nine rotors instantiate nine sets. THE FRAME DECIDES how a post-processing entry expands, so six lines of a [plots] table become twenty-seven emissions on a nine-rotor aircraft, and there is no expand key. CLOCK_MOTION is required on a row that states a MOTIONS list. A rotation cites an alias, carries that alias's frames, and keeps <ALIAS>_SMRP_ORIGINAL, the frame it turned FROM, which an entry naming the turned frame is written in too. The matrix loses its SWEEP_TYPE column: a sweep is applied to a variable that DEFINES the flight condition, and the cell says which by carrying the word sweep. A row may state raw solver commands of its own. --ignore-missing-families false turns a family the mesh does not carry from a skip into a refusal. The three reference cases ran against the wheel before the tag and MOVED NO NUMBER: 0.15.0 reproduces 0.14.0 coefficient for coefficient, and the rotor case's emitted script is byte for byte 0.14.0's 2026-09-10
v0.14.0 The incidence study from a row (GOAL-013, the design of 2026-09-09): a setup preset defines custom coordinate systems and states raw solver commands before a named phase through the emitter's own checks; a row turns the mesh with ROTATE, a list of records in the order written, the families by name and the rotor's axis frame turned with them; the products stage tables the stamped per-step exports as a series; the blade count of a sector comes from PERIODIC_COPIES; the run record carries the raw lines and the export window's clock; a zero-probe export reads as an empty table; a setup names groups of mesh families under [aliases], read wherever a boundary is cited; an empty pproc group is every family the geometry carries; and the polar format's five public names are spelled custom where they were spelled the reference, the old spellings warning until 0.16.0; the reference cases ran against the wheel before the tag (pfs0140) 2026-09-09

Open lines

Line Content Gate
Licensed evidence queue OBJ export group-name probe (FR-30 inspector), undocumented solver defaults (FR-31), physics reference re-validation under the new minimum-Cp default, mesh-refinement and solver-flag physics cases, FSI family sweep, broken-command re-probes, PROBE coverage on 26.100 (its version-row backfill closed at v0.5.0; what is thin there is measured evidence, 13 verified against 331 documented), the commands still unprobed on 26.122 after its first run of 2026-08-11 measured 84, which is two debts and not one: 267 for want of a probe specification and 24 for want of an instrument that can observe the effect, the seven commands its edition stops printing, of which three are emitted today on the strength of a reading alone (PLN-20260810-1600), and the three-build altitude-unit run that would say whether AIR_ALTITUDE honours its units token before 26.121 (PLN-20260810-2000). AND 26.123's own debts, from its registration and first probe run of 2026-08-17: 284 commands unprobed on it, which is the same two debts as 26.122 and not one, 261 for want of a probe specification and 23 for want of an instrument that can observe the effect; the 43 commands carrying no row at all on that build, enumerated in tests/tier1_offline/goldens/absent_on_26123.txt, because it inherits nothing (the golden is generated by scripts/gen_absent_commands.py and its own header carries the count; this sentence said 45 until 2026-08-20, when a licensed-run survey read the two against each other); SET_SCENE_CONTOUR, which the new edition documents differently and which owes a reading before any row is written; SET_OUTLET_TRAILING_EDGES, which SRC-751 documents and the database does not carry, owing an entry; the repeatability rerun of 26.122 against 26.123 on the SMI cases, owed by the CDo triage of 2026-08-18 (reports/physics/TRI-26123-CDo_2026-08-18.md), which disposed of two warns on desk evidence and reproduced the 26.123 side but not the 26.122 one; and TRAILING_EDGES_IMPORT and SET_OUTFLOW_TRAILING_EDGES, which SRC-751 stops documenting and which each owe a judgement of their own on 26.123 (26.124 answers TRAILING_EDGES_IMPORT as an unrecognized command, RPT-061, and its row is removed) Licensed machine sessions
Post-processing completion FR-20 (labeled result arrays, interpolation, trim extraction) and FR-21 (established plot-file writers) Design session
Process adoption backlog VCS-derived versioning, executable doc examples, mechanical repo review, supply-chain posture (see standards) The reference per-item decisions
Integrations The RPT-008 decision list: pyvista viz extra, documented external-tool bridges The reference review
ITACA migration AD-06 and AD-07: pandas and xarray leave the runtime set, ITACA becomes a core dependency, and the manifest, solver-setup snapshot and result tables become ITACA structures with provenance (supersedes both the RPT-008 on-hold entry and the [itaca] optional extra this row used to describe) The far-field halves land in ITACA's pproc/ and aerospace/ first; the removal release number is unset since v0.5.0 shipped without it (NFR-06)
HPC executor FR-15 Research-group cluster path
Docs toolchain The generator's upstream governance question The design decision

Requirement-to-work traceability

Every functional requirement above carries its status and evidence inline. The working queue and session records live in the reference private planning files (stable PLN and HND ids); committed reports under reports/ are the public evidence terminal. This SRS points at those records rather than duplicating them, per the single-home rule of NFR-11.