Skip to content

WP-E: review fixes to modes and mission sequence (model/60–61) - #35

Closed
devin-ai-integration[bot] wants to merge 1 commit into
developfrom
wp/e-review-fixes
Closed

devin-ai-integration[bot] wants to merge 1 commit into
developfrom
wp/e-review-fixes

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Summary

Follow-up to #4 for the eight review findings on it; model files model/60-modes.sysml and model/61-sequence.sysml only, runs re-recorded, docs/coverage/WP-E.md adjusted. make check green locally on the source build v0.10.1-2054-g0a5fa2d94 (the pin develop's runs/ carry); the only shared-run change is the element/check count line of runs/house-rules.txt.

  • TethysSequence::ThrustArc now waits its arcDuration (attribute arcDuration default 120.0 [d], redefined to 250 d for return arcs; then action thrusting accept after arcDuration) so the mission clock is real: the lunar assist follows the return arcs instead of day ~135.
  • MissionSequence keeps the xenon-reserve warning in outcome ((if xenonRemaining < xenonReserve ? "xenon reserve breached; " else "") + "disposed after …").
  • TugModes::flightMode: despin is its own state between freeFlight and stacked (DespinComplete do assign despun := true); stacked enters at stackCoast; SafeModeExit recovery is guarded on arraysDeployed / captured / despun (launch ← not deployed, freeFlight, despin, stacked); a launch that has not deployed its arrays within arraysDeploymentTimeout (6 h) goes to safe instead of free flight.
  • captureMechanism deploys only on a CaptureGo inside the capture envelope (same guard as the mode commit).
  • sepString: approach thrust stops only on the RangeUpdate that reaches rendezvousRange; DisposalGo → disposalBurn → off after disposalBurnDuration (full flight ends done | off).
  • InspectorModes: the imaging pass lasts the commanded InspectorImagingGo.passDuration.

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

…as its own mode with guarded safe-mode recovery, capture bag deploys only on an accepted commit, inspector pass length, SEP off after disposal and approach, array-deployment timeout to safe, xenon-reserve outcome kept

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

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Closing: this branch was cut from the pre-integration wp/ head and recorded on an unpinned OpenSysML build, and it now conflicts with develop, where the integrated model and its runs are recorded at the pinned tool. The findings it addresses were re-adjudicated against the integrated model; the generally applicable fixes from here are being carried into develop on follow-up branches off develop, credited to this PR. The remaining items are design decisions being taken separately.

HuiJun added a commit that referenced this pull request Oct 29, 2026
* fix(model): thrust arcs wait their arcDuration so the sequence clock advances

ThrustArc now has a timed body (first start; then action burn accept after
arcDuration; then done), so each outbound and return arc takes its planned
duration and lunarAssistAt in sequence-nominal moves from 135.5 d to 1495.5 d,
in line with baselineSchedule.lunarGravityAssist (1480 d). The recorded
-advance 190080000 horizon still reaches disposal; sequence-* runs re-recorded.

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

* fix(model): capture bag deploys only when CaptureGo is within the commit envelope

The captureMechanism region accepted every CaptureGo, so a refused capture
(flight region to retreat) still left the bag deployed. The stowed->deployed
transition now carries the same envelope guard as the flight region's
proximityOperations->capture transition; modes-tug-dense-target re-recorded
(ends ... | stowed).

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

* fix(model): bind the despin step's duration and propellant to the characterised body

Despin takes the characterisation and the thrusters' arm and Isp as inputs and derives its angular momentum, duration and propellant through TethysCaptureSystem::DespinDuration and DespinPropellant, so the capture sequence carries 348 s and 5.91 kg for the nominal body instead of leaving both unbound. New run wpc-despin-step records the three values.

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

* fix(model): approach thrust stops only on the RangeUpdate that reaches rendezvousRange

The sepString region dropped to standby on any RangeUpdate, so a far-field
range report (500 km) stopped the approach thrust while the flight region
stayed in approach. The transition now carries the flight region's own guard
(u.range <= rendezvousRange), so only the rendezvous update ends the burn.

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

* fix(model): inspector imaging pass lasts the requested passDuration

InspectorModes left imaging after a literal 8 h whatever InspectorImagingGo
asked for: a 4 h pass was still imaging at +5 h and ended at +8 h. The machine
now keeps a passDuration attribute (default 8 h), the accept of the command
assigns it from go.passDuration and the imaging exit waits that duration, as in
the closed #35. Re-recorded modes-tug-early-ops (the attribute's initial value
now shows in the trace).

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

* fix(model): SEP string leaves the disposal burn for off when its duration elapses

DisposalGo took sepString to thrusting with no exit, so the full-flight run
ended done | thrusting | ... with the string burning forever. The disposal arc
is now its own disposalBurn state that times out to off after
disposalBurnDuration (and goes off on SafeModeRequest like thrusting), as in
the closed #35. Full flight now ends done | off | highGain | wheels | released;
modes-inspector-retired moves by the one extra timer event.

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

* fix(model): campaign outcome keeps the xenon reserve breach through disposal

The reserve-breach outcome set before the lunar assist was overwritten by the
unconditional "disposed after N thrust arcs" at the end of the campaign, so a
campaign that ran the reserve negative still reported a clean disposal. The
final outcome now carries the breach ("xenon reserve breached; disposed after
N thrust arcs"), as in the closed #35. The committed campaigns do not breach,
so no sequence run moves.

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

* chore(software): regenerate the state tables for the guarded and disposal transitions

The generated C/Go/Python state-machine tables follow model 60: the sepString
RangeUpdate transition now carries TUG_MODES_G1, stowed -> deployed carries
TUG_MODES_G2, and sepString gains the disposalBurn state with its timed and
safe-mode exits (101 states / 163 transitions; the pinned totals in
test_system.c and WP-SW-12 move with them). The conformance expectation for
vc-final-targeting records the one extra model trace event the evaluated
RangeUpdate guard adds; host and model still agree on every machine.

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

* chore(runs): re-record sequence-nominal-trace on the merged develop tree

The trace now lists the software-tier packages develop added and the extra
literal evaluations develop's recording already shows; the mission itself is
unchanged (7 arcs, lunar assist at 129211200 s, disposed).

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

* fix(model): compare the passivation delay with its deadline and type the disposal quantities

TS-292's constraint now has a time term: passivationDelay (closeout
passivationCompleteTime - disposalBurnTime, 23 d) <= deadline (30 d).
SeparationDeltaV takes an ImpulseValue and a MassValue and returns a
SpeedValue, dividing the units out only inside the calc; TS-293 reads
TethysTarget::targetCases.{small,nominal,large}.mass and
amaranthFM.postCapture.mass instead of the stale 150/362/620/438.8 t
literals, and compares against 1.0e-3 m/s.

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

* test(runs): record the despin step and disposal quantity probes

Adds the wpc-despin-step and disposal-quantities runs and re-records
the four runs the model edits move (house-rules counts, one ID shift
in the three satisfy runs).

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

* chore(runs): re-record house-rules and the mode-management design description

The new sepString state, attribute and transitions move the house-rules
element/check counts (80537/703451 -> 80552/703658, still 0 violations) and
the sepString documentation row of the ModeManagementDesignDescription
rendering (md and html, with their byte counts in the render logs).

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

* fix(model): risk gate over every item, TH-001 causes, derived safety-critical count, document inventory queries

Review triage findings 3-2, 3-3, 3-4, 3-5, 5-2, 5-3, 5-5 and the integration-review documentation nits.

- 3-2 TethysRisk::riskRegister::noUnownedRedRisk quantifies over the new items : RiskItem[*] collection every register entry subsets, instead of naming earthImpactRisk; risk-constraints instantiates the register so the gate evaluates on it.
- 3-3 TH-001's returnTrajectoryInsideCorridor and lossOfThrustOnFinalArc causes are connected to earthImpact like the other hazards.
- 3-4 safetyCriticalSoftwareFunctions = 2 is replaced by the query TethysAllocationQueries::SafetyCriticalFunctions over @safetycritical.
- 3-5 Reliability durations are DurationValues in [d] and [h].
- 5-2 TugSubsystems reads TethysTug::Tug (10 rows, was 4).
- 5-3 Segments and Items exclude InterfaceUsage / InterfaceDefinition.
- 5-5 Risks scans TethysRisk and TethysSafety (6 rows, was 0).
- docs: IcdFlightSegment::inspectorDispenser, SE-049/SE-260/SE-278 rows say what the model shows, KerML citation §8.3.2.4.5.

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

* fix(model): cap array trade at SEP power, xenon flow target, window ordering, capture function owner

- TethysTrades::PowerAvailableToSep takes the propulsion system's maximum power and returns the lesser of the aphelion-scaled array power and that limit; the array trade reads it from argent.sep.maximumPower, so the 48 kW and 70 kW options both thrust at 40 kW and the cost sweep keeps array48kW at every penalty.
- TethysPhysics::XenonTransfer flows tank.remaining to thruster.xenonIn, the target its general Feeds declares, not thruster.inputPower.
- TethysNotation windowIsOrdered requires opens < closes AND not marginal, as its documentation says.
- argentDesign performs functions.captureBody on captureSystem (ArgentCapture, which declares CaptureBody's inputs), not on structure.
- CONVENTIONS.md states the 81-physics.kerml Real/SI-base-unit contract as the one declared exception to the units rule.

Runs re-recorded: trades, trades-sweep, house-rules (element count) and the traces/ids that move with the capture perform's owner.

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

* docs(coverage): quote the corrected XenonTransfer target and windowIsOrdered literals

WP-G LANG-223/225 quote the flow as it now reads (to thruster.xenonIn); LANG-347/348 cite only ReturnWindow::marginal = false, since windowIsOrdered no longer carries a boolean literal.

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

* chore(runs): re-record sw-doc-sdd-flight-ModeManagement for the sepString documentation

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

* fix(model): project SafetyCritical::rationale in SafetyCriticalFunctions

The inventory of @safetycritical functions showed documentation = (none) for all three rows; the reason for each classification lives in SafetyCritical::rationale, so the query projects that instead. Re-recorded allocations-queries.

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

* fix(model): require a non-negative passivation delay in TS-292

A passivation recorded before the disposal burn gave a negative
passivationDelay that satisfied the 30 d upper bound alone; the
constraint now requires 0 d <= passivationDelay <= deadline.

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

* fix(model): flight software relays the requested pass, gates range updates and ends the disposal burn

Model 65's InspectorHandler relayed every imaging pass for a literal 8 h; it now
assigns the passDuration the InspectorImagingGo carries and waits for it, as the
inspector's own modes do. The mode manager's dispatcher sent SepStandby for every
RangeUpdate; it now gates on the mode machine's rendezvousRange like the SEP
region. The disposal dispatch sent an open-ended SepThrust; it now sends a
SepDisposalBurn carrying the mode machine's disposalBurnDuration and the
SepStringController burns in a disposalBurn state that times out to off (or
leaves on SepOff / restarts on a flameout).

Regenerated state tables (102 states, 167 transitions, 21 guards, 39 effects);
re-recorded the runs the new elements move (ids, house-rules counts, the
SepControl design description, the dispatch sequence's SepDisposalBurn).

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

* fix(software): host bindings for the pass, burn durations and the range gate

The duration resolver answers burnDuration / passDuration from the value the
SepDisposalBurn / InspectorImagingGo item carried (effects SEP_STRING_CONTROLLER_E1,
INSPECTOR_HANDLER_E1); the dispatcher guard MODE_MANAGEMENT_DISPATCHER_G1 and
TugModes' range guard compare in km, the unit the uplinked RangeUpdate carries;
the disposal burn drives the thrust simulation like an arc; on-board sequence 3
sends InspectorImagingGo with the campaign's 8 h pass. Three system tests pin the
far-field update, the 30 d burn and the 4 h pass.

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

* fix(model): score the Isp trade with the mission's xenon model and closure rule

SpecificImpulseTrade computed its own required xenon (argent.wetMass, one return arc, no inspector release, no missed-thrust margin) and penalised only xenon above the raw load, so no option was ever infeasible and the trade selected isp2000 against its Rationale and argent.sep.specificImpulse. TethysBudgets::XenonForMission now takes the Isp as an input (the propellant budget passes argentDesign.sep.specificImpulse; its recorded values are unchanged), the trade calls it for the nominal case at each option's Isp, and the feasibility penalty is TethysMarginPolicy::ClosesWithMargin against propellantBudget.usable with the active policy, as the budget asserts. The Rationale text carries the recomputed numbers. Re-recorded runs/trades.txt and the house-rules element count.

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

* fix(software): record XenonForMission's Isp input in the conformance inventory

The calc inventory in argent_conformance/calcs.py listed XenonForMission with only its body parameter after the Isp input was added; the entry stays skipped (body is a SmallBody part) but now carries the current signature, and its recorded expectation header follows.

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

* chore(runs): re-record house-rules on the merged develop tree

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>
HuiJun added a commit that referenced this pull request Oct 29, 2026
* fix(model): thrust arcs wait their arcDuration so the sequence clock advances

ThrustArc now has a timed body (first start; then action burn accept after
arcDuration; then done), so each outbound and return arc takes its planned
duration and lunarAssistAt in sequence-nominal moves from 135.5 d to 1495.5 d,
in line with baselineSchedule.lunarGravityAssist (1480 d). The recorded
-advance 190080000 horizon still reaches disposal; sequence-* runs re-recorded.

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

* fix(model): capture bag deploys only when CaptureGo is within the commit envelope

The captureMechanism region accepted every CaptureGo, so a refused capture
(flight region to retreat) still left the bag deployed. The stowed->deployed
transition now carries the same envelope guard as the flight region's
proximityOperations->capture transition; modes-tug-dense-target re-recorded
(ends ... | stowed).

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

* fix(model): bind the despin step's duration and propellant to the characterised body

Despin takes the characterisation and the thrusters' arm and Isp as inputs and derives its angular momentum, duration and propellant through TethysCaptureSystem::DespinDuration and DespinPropellant, so the capture sequence carries 348 s and 5.91 kg for the nominal body instead of leaving both unbound. New run wpc-despin-step records the three values.

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

* fix(model): approach thrust stops only on the RangeUpdate that reaches rendezvousRange

The sepString region dropped to standby on any RangeUpdate, so a far-field
range report (500 km) stopped the approach thrust while the flight region
stayed in approach. The transition now carries the flight region's own guard
(u.range <= rendezvousRange), so only the rendezvous update ends the burn.

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

* fix(model): inspector imaging pass lasts the requested passDuration

InspectorModes left imaging after a literal 8 h whatever InspectorImagingGo
asked for: a 4 h pass was still imaging at +5 h and ended at +8 h. The machine
now keeps a passDuration attribute (default 8 h), the accept of the command
assigns it from go.passDuration and the imaging exit waits that duration, as in
the closed #35. Re-recorded modes-tug-early-ops (the attribute's initial value
now shows in the trace).

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

* fix(model): SEP string leaves the disposal burn for off when its duration elapses

DisposalGo took sepString to thrusting with no exit, so the full-flight run
ended done | thrusting | ... with the string burning forever. The disposal arc
is now its own disposalBurn state that times out to off after
disposalBurnDuration (and goes off on SafeModeRequest like thrusting), as in
the closed #35. Full flight now ends done | off | highGain | wheels | released;
modes-inspector-retired moves by the one extra timer event.

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

* fix(model): campaign outcome keeps the xenon reserve breach through disposal

The reserve-breach outcome set before the lunar assist was overwritten by the
unconditional "disposed after N thrust arcs" at the end of the campaign, so a
campaign that ran the reserve negative still reported a clean disposal. The
final outcome now carries the breach ("xenon reserve breached; disposed after
N thrust arcs"), as in the closed #35. The committed campaigns do not breach,
so no sequence run moves.

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

* chore(software): regenerate the state tables for the guarded and disposal transitions

The generated C/Go/Python state-machine tables follow model 60: the sepString
RangeUpdate transition now carries TUG_MODES_G1, stowed -> deployed carries
TUG_MODES_G2, and sepString gains the disposalBurn state with its timed and
safe-mode exits (101 states / 163 transitions; the pinned totals in
test_system.c and WP-SW-12 move with them). The conformance expectation for
vc-final-targeting records the one extra model trace event the evaluated
RangeUpdate guard adds; host and model still agree on every machine.

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

* chore(runs): re-record sequence-nominal-trace on the merged develop tree

The trace now lists the software-tier packages develop added and the extra
literal evaluations develop's recording already shows; the mission itself is
unchanged (7 arcs, lunar assist at 129211200 s, disposed).

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

* fix(model): compare the passivation delay with its deadline and type the disposal quantities

TS-292's constraint now has a time term: passivationDelay (closeout
passivationCompleteTime - disposalBurnTime, 23 d) <= deadline (30 d).
SeparationDeltaV takes an ImpulseValue and a MassValue and returns a
SpeedValue, dividing the units out only inside the calc; TS-293 reads
TethysTarget::targetCases.{small,nominal,large}.mass and
amaranthFM.postCapture.mass instead of the stale 150/362/620/438.8 t
literals, and compares against 1.0e-3 m/s.

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

* test(runs): record the despin step and disposal quantity probes

Adds the wpc-despin-step and disposal-quantities runs and re-records
the four runs the model edits move (house-rules counts, one ID shift
in the three satisfy runs).

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

* chore(runs): re-record house-rules and the mode-management design description

The new sepString state, attribute and transitions move the house-rules
element/check counts (80537/703451 -> 80552/703658, still 0 violations) and
the sepString documentation row of the ModeManagementDesignDescription
rendering (md and html, with their byte counts in the render logs).

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

* fix(model): risk gate over every item, TH-001 causes, derived safety-critical count, document inventory queries

Review triage findings 3-2, 3-3, 3-4, 3-5, 5-2, 5-3, 5-5 and the integration-review documentation nits.

- 3-2 TethysRisk::riskRegister::noUnownedRedRisk quantifies over the new items : RiskItem[*] collection every register entry subsets, instead of naming earthImpactRisk; risk-constraints instantiates the register so the gate evaluates on it.
- 3-3 TH-001's returnTrajectoryInsideCorridor and lossOfThrustOnFinalArc causes are connected to earthImpact like the other hazards.
- 3-4 safetyCriticalSoftwareFunctions = 2 is replaced by the query TethysAllocationQueries::SafetyCriticalFunctions over @safetycritical.
- 3-5 Reliability durations are DurationValues in [d] and [h].
- 5-2 TugSubsystems reads TethysTug::Tug (10 rows, was 4).
- 5-3 Segments and Items exclude InterfaceUsage / InterfaceDefinition.
- 5-5 Risks scans TethysRisk and TethysSafety (6 rows, was 0).
- docs: IcdFlightSegment::inspectorDispenser, SE-049/SE-260/SE-278 rows say what the model shows, KerML citation §8.3.2.4.5.

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

* fix(model): cap array trade at SEP power, xenon flow target, window ordering, capture function owner

- TethysTrades::PowerAvailableToSep takes the propulsion system's maximum power and returns the lesser of the aphelion-scaled array power and that limit; the array trade reads it from argent.sep.maximumPower, so the 48 kW and 70 kW options both thrust at 40 kW and the cost sweep keeps array48kW at every penalty.
- TethysPhysics::XenonTransfer flows tank.remaining to thruster.xenonIn, the target its general Feeds declares, not thruster.inputPower.
- TethysNotation windowIsOrdered requires opens < closes AND not marginal, as its documentation says.
- argentDesign performs functions.captureBody on captureSystem (ArgentCapture, which declares CaptureBody's inputs), not on structure.
- CONVENTIONS.md states the 81-physics.kerml Real/SI-base-unit contract as the one declared exception to the units rule.

Runs re-recorded: trades, trades-sweep, house-rules (element count) and the traces/ids that move with the capture perform's owner.

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

* fix(model): verification cases check what they verify, strict impact bound, verification ids

- GroundProceduresDemo measures the screened fraction and archive latency its verify list claims
- transferDuration (TS-003) verified by MissionDurationByAnalysis, not PowerAnalysis
- ProximityNavigationTest takes the measured relative-velocity error and passes on <= 1 mm/s
- Earth-impact bound is strict (< 1e-6) in TS-008 and ReturnSafetyAnalysis, as the stakeholder text reads;
  with the estimate at exactly 1e-6 both now fail honestly
- every verification def in 23-verification.sysml carries a TV-nnn id; CONVENTIONS.md fixes the prefix
- runs re-recorded for the files above only

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

* docs(coverage): quote the corrected XenonTransfer target and windowIsOrdered literals

WP-G LANG-223/225 quote the flow as it now reads (to thruster.xenonIn); LANG-347/348 cite only ReturnWindow::marginal = false, since windowIsOrdered no longer carries a boolean literal.

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

* chore(runs): re-record sw-doc-sdd-flight-ModeManagement for the sepString documentation

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

* fix(model): project SafetyCritical::rationale in SafetyCriticalFunctions

The inventory of @safetycritical functions showed documentation = (none) for all three rows; the reason for each classification lives in SafetyCritical::rationale, so the query projects that instead. Re-recorded allocations-queries.

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

* fix(model): require a non-negative passivation delay in TS-292

A passivation recorded before the disposal burn gave a negative
passivationDelay that satisfied the 30 d upper bound alone; the
constraint now requires 0 d <= passivationDelay <= deadline.

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

* fix(model): flight software relays the requested pass, gates range updates and ends the disposal burn

Model 65's InspectorHandler relayed every imaging pass for a literal 8 h; it now
assigns the passDuration the InspectorImagingGo carries and waits for it, as the
inspector's own modes do. The mode manager's dispatcher sent SepStandby for every
RangeUpdate; it now gates on the mode machine's rendezvousRange like the SEP
region. The disposal dispatch sent an open-ended SepThrust; it now sends a
SepDisposalBurn carrying the mode machine's disposalBurnDuration and the
SepStringController burns in a disposalBurn state that times out to off (or
leaves on SepOff / restarts on a flameout).

Regenerated state tables (102 states, 167 transitions, 21 guards, 39 effects);
re-recorded the runs the new elements move (ids, house-rules counts, the
SepControl design description, the dispatch sequence's SepDisposalBurn).

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

* fix(software): host bindings for the pass, burn durations and the range gate

The duration resolver answers burnDuration / passDuration from the value the
SepDisposalBurn / InspectorImagingGo item carried (effects SEP_STRING_CONTROLLER_E1,
INSPECTOR_HANDLER_E1); the dispatcher guard MODE_MANAGEMENT_DISPATCHER_G1 and
TugModes' range guard compare in km, the unit the uplinked RangeUpdate carries;
the disposal burn drives the thrust simulation like an arc; on-board sequence 3
sends InspectorImagingGo with the campaign's 8 h pass. Three system tests pin the
far-field update, the 30 d burn and the 4 h pass.

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

* fix(model): score the Isp trade with the mission's xenon model and closure rule

SpecificImpulseTrade computed its own required xenon (argent.wetMass, one return arc, no inspector release, no missed-thrust margin) and penalised only xenon above the raw load, so no option was ever infeasible and the trade selected isp2000 against its Rationale and argent.sep.specificImpulse. TethysBudgets::XenonForMission now takes the Isp as an input (the propellant budget passes argentDesign.sep.specificImpulse; its recorded values are unchanged), the trade calls it for the nominal case at each option's Isp, and the feasibility penalty is TethysMarginPolicy::ClosesWithMargin against propellantBudget.usable with the active policy, as the budget asserts. The Rationale text carries the recomputed numbers. Re-recorded runs/trades.txt and the house-rules element count.

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

* fix(model): verify TS-003 by a transfer-timeline analysis case, not MissionDurationByAnalysis

MissionDurationByAnalysis passes on actual thrust time + 270 d (TR-002), which is not TS-003's
predicate (thrust allowance + coast + proximity + reserve <= nominal): a 1 500 d allowance fails
the requirement but passed that case. TransferTimelineByAnalysis (TV-034) checks the requirement's
own terms against the nominal duration and the transfer analysis against the allowance.

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

* fix(software): record XenonForMission's Isp input in the conformance inventory

The calc inventory in argent_conformance/calcs.py listed XenonForMission with only its body parameter after the Isp input was added; the entry stays skipped (body is a SmallBody part) but now carries the current signature, and its recorded expectation header follows.

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

* chore(runs): re-record house-rules after merging develop

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

* chore(runs): re-record house-rules on the merged develop tree

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>
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.

0 participants