Skip to content

Flow the design-consistency pass (#12) from integration/phase-3 into develop - #39

Merged
HuiJun merged 16 commits into
developfrom
integration/phase-3
Oct 28, 2026
Merged

HuiJun merged 16 commits into
developfrom
integration/phase-3

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Summary

#12 (wp/consistency) merged into its base integration/phase-3 (cdbdcd8) after integration/phase-3 itself had already landed on develop (#11, 69b2ebb), so develop does not yet carry it. This PR is exactly git log develop..integration/phase-3: #12's 16 commits plus its merge commit, nothing else — a fast-forward of develop, no conflicts.

What it brings to develop (see #12 for the per-item description): the single Δv/thrust-time book (TethysMission::transferBook), the single target-case table (TethysTarget::targetCases) with the pinned return envelope at capture commit, one TugMode vocabulary with busLoad read from TugPowerInMode, the DRO propagated over its full period, ISQ quantity types on the analyses, the pilot-mission KerML oracle, re-adjudicated finding rows, and the review follow-ups (largest.rotationPeriod in TS-019/TS-014/ContactSpeedTest; xenonTrend derived from TethysBudgets::propellantBudget with the missed-thrust allowance applied to the flown arcs, which flips resourceMarginPositive ✗→✓ in four satisfy runs).

CI note: develop's check workflow at this point still fetches the OpenSysML nightly into build/opensysml/bin/sysml while the Makefile runs build/opensysml/sysml, so this PR's check fails at make validate with exit 127 before any model file is read — the same red as #11/#12 and develop itself. #13 (wp/tool-pin) replaces that with make tools at the pin and is green on a tree containing this one whole.

Link to Devin session: https://nasa-jpl-demo.devinenterprise.com/sessions/bd8333c05232470c8601104d484dcc58
Open in Devin Desktop: https://nasa-jpl-demo.devinenterprise.com/desktop/session/bd8333c05232470c8601104d484dcc58?variant=devin
Requested by: @HuiJun

devin-ai-integration Bot and others added 16 commits October 22, 2026 09:48
…every consumer

TethysMission::transferBook defines the arc Δv (2 800/150/160/40 m/s), the
required return Δv (200 m/s), the 10 % missed-thrust allowance and the
1 400 day thrusting allowance once, with the rocket-equation derivation in
its doc. The budgets, the low-thrust transfer analyses, the Monte Carlo
dispersions, the specific-impulse trade, the tooling Monte Carlo and the
architecture variants read it by reference instead of carrying their own
2 000/350 m/s, 300 kg reserve, 1 930/1 134 day and 1 180 kg values; the
analyses start from the mass budget's launch mass and the propellant
budget's usable xenon and aphelion thrust, so both books agree on which
target cases return.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…n envelope at capture commit

TethysTarget::targetCases is the single table of bodies (design cases small
213 t / nominal 362 t / large 506 t; knowledge bounds lightest 40 t, largest
987 t, densest 576 t; fastSpin and tumbling), each from diameter, density and
spin through SphereMass; CaptureTargetCase binds them as variants. The
budgets, the capture-system envelope cases, the mode machine's and the flight
sequence's estimates, the transfer analyses, the Monte Carlo, the trades, the
dynamics, the variants, the safety envelope, the stakeholder assumptions and
TS-001 all read the table instead of carrying 217/507 t, 181/1 010 t, 105/1 335 t,
215/644 t or 5.0/7.7 m of their own.

TethysBudgets::propellantBudget pins the return envelope by inverting the
rocket equation (returnableBodyMass 542 t with the 15 % policy margin,
651.9 t with none) and captureCommitEnvelope takes the smaller of that and
the bag's limit; the mode machine, the sequence and the proximity-operations
commit decision refuse a body above it, so the densest body is refused and
the large design case is accepted. The analyses and variants hold back the
same system margin, so both books now agree on which bodies return.

Finding F-F07 (evaluator step-limit on a chained PropellantFor inside a
heavy-load configuration) is recorded with its probe.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
TethysTugStructure::TugMode is the single mode enumeration (the mode
machine's fifteen literals plus earlyOperations) with the named sets
thrustingModes, coastingModes, proximityModes and safeModes that every
unit's operating and standby modes are built from. TethysModes drops its
own enum and TethysOperations its CommandedMode; SetMode and CommandedTug
carry TugMode. SubsystemConfiguration.busLoad defaults to
TethysBudgets::TugPowerInMode(mode), so the mode table's sixteen rows and
the power budget read the same per-unit rollup instead of fifteen
unrelated literals.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…at 13.9155 d

droRevolution, DroStabilityAnalysis::revolution and the tooling
droRevolutionRk4 stopped at 3.20 time units with a 0.01 step while the
orbit's period is 3.20467695, so the recorded closure was the arc still
to fly, not a closure error. They now take 320 steps of one 320th of the
period and stop at the period; the model's own RungeKutta4 stays in place.
TethysEnvironment::destinationDro.period is 13.9155 d, the propagated
value, with its derivation in the doc.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…m the budgets

thermalBudget.hotCaseSolarFactor is the perihelion-over-aphelion solar
flux ratio (about 1.13) in place of the bare 1.22; hydrazineBudget reads
propellantBudget.tugMassAtTarget in place of launch mass less 700 kg; the
flight sequence's xenon load and reserve come from the propellant budget.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…er book

Mission duration 2 200 days (TR-002, mission doc), TS-003 reads the
transfer book's thrust allowance, the heliocentric flux range as declared,
the return-cruise xenon trend, the TH-001 body mass, the transfer-book case
totals, the small-body domain list and the WP-F/WP-G coverage notes now
carry the budget's numbers.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
… and DRO analyses

Δv, thrust, mass flow, c and g₀ and the analysis-tier values of model/70–74 carry their ISQ quantity types (SpeedValue, ForceValue, MassFlowRateValue, AccelerationValue, PowerValue, DurationValue, LengthValue, MassValue, AngularVelocityValue, AngularMomentumValue, TorqueValue, MomentOfInertiaValue, MassDensityValue) in place of suffix-named Reals; the requirement defs the analyses check against take typed parameters, so the Monte Carlo objectives now bind the parameters the defs declare instead of adding new ones.

The eight swept or sampled parameters stay Real with a doc comment: the sweep and sample runners write bare numbers to the parameter they draw, which a quantity-typed feature rightly refuses (new finding F-F08 with its probe and pinned run). Tool variables keep the ToolExecution contract; dB stays dimensionless by design. Every value evaluates to the same number as before.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…hanges

Recorded with the pinned OpenSysML source build (0a5fa2d94). Every transfer, capture, Monte Carlo, trade and dynamics run now reads the single transfer book and target-case set; the DRO run closes over the full period; the dense-target mode and sequence runs replace the large-target mode run; the two F-F08 probe runs drop the wall-time column like the other sweeps.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…did not support

SE-275 (as-flown values contradict the budgets), SE-156/157 (must rows awaiting the matrix owner's ruling) and the SE-105/128/129 range envelope are marked partial or open with the gap named; SE-152, SE-192, SE-194, SE-195, SE-130 and SE-081 cite the re-recorded runs; SE-123/124/125/134/145 state what the F-B01-fixed build shows (energy, thermal and margin policy close, power while thrusting does not); SE-263/264 and LANG-095/170/532 stay open with the reason.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…cle in pilot-mission

The standalone pilot wrapper refuses .kerml before parsing (F-G01), so pilot-mission now also runs the batch validator over the mission-tier .kerml files against the standard library alone; the .sysml files still go through the standalone wrapper unchanged.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…sML clauses

F-D03 (pilot right: checkConnectorTypeFeaturing with deriveUsageMayTimeVary), F-F06 (OpenSysML right: SysML 7.6.3 default multiplicity applies to attribute, item and port usages, not reference usages), F-F04 (under-specified: isDistinguishableFrom lets a Function and an AttributeUsage share a name), F-B03 (pilot right in substance: the two library redefinitions of Occurrence::this collide), F-G01 (closed: tooling, pilot-mission now gates the mission-tier KerML) and F-G03 (OpenSysML right: the pilot's errors are EMF reference-pairing failures, not KerML constraints). Model notes only; the F-xxx ids and probes are unchanged.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…s not depend on how the binary was built

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…largest case's own rotation period

TS-019 despinCapacity, TS-014 proximityContactEnvironment and ContactSpeedTest read the largest knowledge-bound case's mass and diameter but divided by the design large case's 252 s period; they now use targetCases.largest.rotationPeriod (100 s). Momentum 222 238 -> 560 040 N m s, hydrazine 34.3 -> 86.5 kg against the 100 kg quarter load, surface speed 0.118 -> 0.298 m/s against 0.35 m/s: every verdict still holds, so no run moves.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
xenonTrend carried its own inventory, rate and days (5 235 kg, 5.2 kg/day, 1 000 days) and projected 35 kg against the 300 kg floor once the inventory followed the transfer book. It now reads TethysBudgets::propellantBudget: aboard = usable less the outbound and rendezvous arcs, rate = the SEP mass flow at aphelion per day, days = the thrusting days the nominal return and insertion arcs need with the missed-thrust allowance (returnArcsXenon). Margin -265 -> +2 058 kg; resourceMarginPositive by xenonTrend flips to holds in the four satisfy runs; house-rules element count +3; object ids shift in the satisfy runs.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…in the xenon trend

xenonTrend.current subtracted the nominal outbound and rendezvous xenon while returnArcsXenon carried the allowance, so the projection added the outbound allowance back (about 123 kg). Both terms now use the budget's case; projected equals propellantBudget.usable - xenonNominal (2 235 kg), margin 1 935 kg. No recorded verdict or run moves.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
* feat(model): one Δv and thrusting-time book in TethysMission read by every consumer

TethysMission::transferBook defines the arc Δv (2 800/150/160/40 m/s), the
required return Δv (200 m/s), the 10 % missed-thrust allowance and the
1 400 day thrusting allowance once, with the rocket-equation derivation in
its doc. The budgets, the low-thrust transfer analyses, the Monte Carlo
dispersions, the specific-impulse trade, the tooling Monte Carlo and the
architecture variants read it by reference instead of carrying their own
2 000/350 m/s, 300 kg reserve, 1 930/1 134 day and 1 180 kg values; the
analyses start from the mass budget's launch mass and the propellant
budget's usable xenon and aphelion thrust, so both books agree on which
target cases return.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* feat(model): one target-case table in TethysTarget and a pinned return envelope at capture commit

TethysTarget::targetCases is the single table of bodies (design cases small
213 t / nominal 362 t / large 506 t; knowledge bounds lightest 40 t, largest
987 t, densest 576 t; fastSpin and tumbling), each from diameter, density and
spin through SphereMass; CaptureTargetCase binds them as variants. The
budgets, the capture-system envelope cases, the mode machine's and the flight
sequence's estimates, the transfer analyses, the Monte Carlo, the trades, the
dynamics, the variants, the safety envelope, the stakeholder assumptions and
TS-001 all read the table instead of carrying 217/507 t, 181/1 010 t, 105/1 335 t,
215/644 t or 5.0/7.7 m of their own.

TethysBudgets::propellantBudget pins the return envelope by inverting the
rocket equation (returnableBodyMass 542 t with the 15 % policy margin,
651.9 t with none) and captureCommitEnvelope takes the smaller of that and
the bag's limit; the mode machine, the sequence and the proximity-operations
commit decision refuse a body above it, so the densest body is refused and
the large design case is accepted. The analyses and variants hold back the
same system margin, so both books now agree on which bodies return.

Finding F-F07 (evaluator step-limit on a chained PropellantFor inside a
heavy-load configuration) is recorded with its probe.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* feat(model): one TugMode vocabulary and one power-by-mode table

TethysTugStructure::TugMode is the single mode enumeration (the mode
machine's fifteen literals plus earlyOperations) with the named sets
thrustingModes, coastingModes, proximityModes and safeModes that every
unit's operating and standby modes are built from. TethysModes drops its
own enum and TethysOperations its CommandedMode; SetMode and CommandedTug
carry TugMode. SubsystemConfiguration.busLoad defaults to
TethysBudgets::TugPowerInMode(mode), so the mode table's sixteen rows and
the power budget read the same per-unit rollup instead of fifteen
unrelated literals.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(model): propagate the DRO for one full period and pin the period at 13.9155 d

droRevolution, DroStabilityAnalysis::revolution and the tooling
droRevolutionRk4 stopped at 3.20 time units with a 0.01 step while the
orbit's period is 3.20467695, so the recorded closure was the arc still
to fly, not a closure error. They now take 320 steps of one 320th of the
period and stop at the period; the model's own RungeKutta4 stays in place.
TethysEnvironment::destinationDro.period is 13.9155 d, the propagated
value, with its derivation in the doc.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(model): derive the hot-case factor and the tug mass at target from the budgets

thermalBudget.hotCaseSolarFactor is the perihelion-over-aphelion solar
flux ratio (about 1.13) in place of the bare 1.22; hydrazineBudget reads
propellantBudget.tugMassAtTarget in place of launch mass less 700 kg; the
flight sequence's xenon load and reserve come from the propellant budget.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* docs(model): align doc comments and docs pages with the single transfer book

Mission duration 2 200 days (TR-002, mission doc), TS-003 reads the
transfer book's thrust allowance, the heliocentric flux range as declared,
the return-cruise xenon trend, the TH-001 body mass, the transfer-book case
totals, the small-body domain list and the WP-F/WP-G coverage notes now
carry the budget's numbers.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* feat(model): carry ISQ quantity types on the transfer, capture, power and DRO analyses

Δv, thrust, mass flow, c and g₀ and the analysis-tier values of model/70–74 carry their ISQ quantity types (SpeedValue, ForceValue, MassFlowRateValue, AccelerationValue, PowerValue, DurationValue, LengthValue, MassValue, AngularVelocityValue, AngularMomentumValue, TorqueValue, MomentOfInertiaValue, MassDensityValue) in place of suffix-named Reals; the requirement defs the analyses check against take typed parameters, so the Monte Carlo objectives now bind the parameters the defs declare instead of adding new ones.

The eight swept or sampled parameters stay Real with a doc comment: the sweep and sample runners write bare numbers to the parameter they draw, which a quantity-typed feature rightly refuses (new finding F-F08 with its probe and pinned run). Tool variables keep the ToolExecution contract; dB stays dimensionless by design. Every value evaluates to the same number as before.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* chore(runs): re-record the pinned runs after the design-consistency changes

Recorded with the pinned OpenSysML source build (0a5fa2d94). Every transfer, capture, Monte Carlo, trade and dynamics run now reads the single transfer book and target-case set; the DRO run closes over the full period; the dense-target mode and sequence runs replace the large-target mode run; the two F-F08 probe runs drop the wall-time column like the other sweeps.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* docs(coverage): re-mark the rows whose evidence the integrated model did not support

SE-275 (as-flown values contradict the budgets), SE-156/157 (must rows awaiting the matrix owner's ruling) and the SE-105/128/129 range envelope are marked partial or open with the gap named; SE-152, SE-192, SE-194, SE-195, SE-130 and SE-081 cite the re-recorded runs; SE-123/124/125/134/145 state what the F-B01-fixed build shows (energy, thermal and margin policy close, power while thrusting does not); SE-263/264 and LANG-095/170/532 stay open with the reason.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* build(make): gate the mission-tier KerML through the pinned batch oracle in pilot-mission

The standalone pilot wrapper refuses .kerml before parsing (F-G01), so pilot-mission now also runs the batch validator over the mission-tier .kerml files against the standard library alone; the .sysml files still go through the standalone wrapper unchanged.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* docs(findings): re-adjudicate six rows against the cited KerML and SysML clauses

F-D03 (pilot right: checkConnectorTypeFeaturing with deriveUsageMayTimeVary), F-F06 (OpenSysML right: SysML 7.6.3 default multiplicity applies to attribute, item and port usages, not reference usages), F-F04 (under-specified: isDistinguishableFrom lets a Function and an AttributeUsage share a name), F-B03 (pilot right in substance: the two library redefinitions of Occurrence::this collide), F-G01 (closed: tooling, pilot-mission now gates the mission-tier KerML) and F-G03 (OpenSysML right: the pilot's errors are EMF reference-pairing failures, not KerML constraints). Model notes only; the F-xxx ids and probes are unchanged.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* runs: pin the OpenSysML commit and Go version only, so runs-check does not depend on how the binary was built

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(requirements): size the despin and contact-speed checks with the largest case's own rotation period

TS-019 despinCapacity, TS-014 proximityContactEnvironment and ContactSpeedTest read the largest knowledge-bound case's mass and diameter but divided by the design large case's 252 s period; they now use targetCases.largest.rotationPeriod (100 s). Momentum 222 238 -> 560 040 N m s, hydrazine 34.3 -> 86.5 kg against the 100 kg quarter load, surface speed 0.118 -> 0.298 m/s against 0.35 m/s: every verdict still holds, so no run moves.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(operations): derive the xenon trend from the propellant book

xenonTrend carried its own inventory, rate and days (5 235 kg, 5.2 kg/day, 1 000 days) and projected 35 kg against the 300 kg floor once the inventory followed the transfer book. It now reads TethysBudgets::propellantBudget: aboard = usable less the outbound and rendezvous arcs, rate = the SEP mass flow at aphelion per day, days = the thrusting days the nominal return and insertion arcs need with the missed-thrust allowance (returnArcsXenon). Margin -265 -> +2 058 kg; resourceMarginPositive by xenonTrend flips to holds in the four satisfy runs; house-rules element count +3; object ids shift in the satisfy runs.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(operations): spend the missed-thrust allowance on the flown arcs in the xenon trend

xenonTrend.current subtracted the nominal outbound and rendezvous xenon while returnArcsXenon carried the allowance, so the projection added the outbound allowance back (about 123 kg). Both terms now use the budget's case; projected equals propellantBudget.usable - xenonNominal (2 235 kg), margin 1 935 kg. No recorded verdict or run moves.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@HuiJun
HuiJun marked this pull request as ready for review October 28, 2026 03:09

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

1 flag not posted on this PR by your GitHub settings — view it in Devin Review. (Configure)

Devin Review

Comment thread model/60-modes.sysml Resolved
@HuiJun
HuiJun merged commit de972a8 into develop Oct 28, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant