Skip to content

fix(model): despin duration/propellant, passivation deadline term and typed disposal quantities - #43

Merged
HuiJun merged 11 commits into
developfrom
fix/review-capture-disposal
Oct 29, 2026
Merged

HuiJun merged 11 commits into
developfrom
fix/review-capture-disposal

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Closes three confirmed model defects from the review triage of PR #1 (WP-C) and PR #2 (WP-I), gated on the pinned OpenSysML 5cd37f288 (runs/tool-version.txt, unchanged). Base is develop; the maintainer decisions 1-1, 1-2, 1-4, 2-1 and 2-2 are untouched (no change to model/41-capture-system.sysml or model/95-as-built.sysml).

1-5 — the despin step had no duration or propellant (model/42-proximity-ops.sysml)

CaptureSequence.despin : Despin bound only torque; TethysCaptureSystem::DespinDuration/DespinPropellant were never invoked.

Probe: sysml -e TethysProximityOps::captureOperation.capture.despin.{angularMomentum,duration,propellant} model/*

before after
despin.angularMomentum — (no such attribute) 41735.51 kg·m²·s⁻¹
despin.duration <undetermined> 347.80 s
despin.propellant <undetermined> 5.9109 kg (= TethysBudgets::hydrazineBudget.despinNominal)

Fix: Despin takes in characterisation : TargetCharacterisation, in momentArm : LengthValue, in specificImpulse : DurationValue and derives angularMomentum (SphereMomentOfInertia, AngularMomentum), duration (DespinDuration) and propellant (DespinPropellant) through the existing WP-C calcs, dividing the units out inside the def as model/32-budgets.sysml does. The sequence binds characterise.characterisation, hydrazineBudget.momentArm (3.2 m) and hydrazineBudget.isp (225 s), so the values follow the characterised target case rather than a literal. torque stays the explicit 120 N·m: binding it to system.maximumDespinTorque through the sequence's in system evaluates to no value on the pin (same nested-parameter gap as F-C05), and the sequence itself still stops at ContactLoad for the pre-existing F-C05 commit.go error, so the step's values are shown by the new runs/wpc-despin-step.txt rather than by runs/wpc-capture-sequence.txt (unchanged). Not covered by the closed #37.

2-3 — late passivation passed the deadline check (model/97-disposal.sysml, TS-292)

passivation declared deadline = 30 d but its constraint had no time term, so any delay satisfied it.

Probe: sysml -e "TethysDisposal::closeout.passivationCompleteTime - TethysDisposal::closeout.disposalBurnTime" -e TethysDisposal::passivation.deadline -requirement TethysDisposal::passivation model/*

before after
delay / deadline 23.0 d / 30.0 d (not compared) passivationDelay 23.0 d ≤ 30.0 d
TS-292 verdict satisfied (vacuously on time) satisfied (23 d ≤ 30 d)

Fix, as in the closed #31: attribute passivationDelay : DurationValue = closeout.passivationCompleteTime - closeout.disposalBurnTime; and … and passivationDelay >= 0.0 [d] and passivationDelay <= deadline in the constraint. The lower bound follows a review finding: with the passivation recorded before the burn (delay −11 d) the upper bound alone still reported satisfied; it now fails on that case.

2-4 — disposal calculations discarded units and bypassed targetCases (model/97-disposal.sysml, TS-293)

SeparationDeltaV and separationSafety used bare Reals, and the body masses were literals 150/362/620/438.8 t while TethysTarget::targetCases defines small/nominal/large as 213 327 / 362 000 / 505 664 kg.

Probe: sysml -e TethysDisposal::separationSafety.{small,nominal,large,asCharacterised}BodyDeltaV -requirement TethysDisposal::separationSafety model/*

before after
smallBodyDeltaV 1.6667e-4 (unitless, 150 t) 1.1719e-4 m/s (targetCases.small.mass)
nominalBodyDeltaV 6.9061e-5 1/14480 m/s (targetCases.nominal.mass)
largeBodyDeltaV 4.0323e-5 (620 t) 4.9440e-5 m/s (targetCases.large.mass)
asCharacterisedDeltaV 5.6974e-5 1/17552 m/s (amaranthFM.postCapture.mass, 438.8 t)
TS-293 verdict satisfied satisfied (both terms ≤ 1.0e-3 m/s)

Fix: SeparationDeltaV takes in impulse : ImpulseValue, in bodyMass : MassValue and returns SpeedValue = (impulse / (1 ['N⋅s'])) / (bodyMass / (1 [kg])) * (1 ['m/s']) (units divided out only inside the calc, as model/32-budgets.sysml); separationImpulse : ImpulseValue = 25.0 ['N⋅s']; the four Δv attributes are SpeedValues read from targetCases.{small,nominal,large}.mass and TethysAsBuilt::amaranthFM.postCapture.mass; the constraint compares against 1.0e-3 ['m/s']. The ISQ typing is as in the closed #31; the targetCases/amaranthFM reads replace the literals it kept. Answer to the triage's open question: the real masses move the small-body Δv from 1.67e-4 to 1.17e-4 m/s and the large-body Δv from 4.03e-5 to 4.94e-5 m/s — TS-293 does not flip; both verdicts remain satisfied.

Model files

  • model/42-proximity-ops.sysml — Despin def and despin usage, TethysBudgets::hydrazineBudget import.
  • model/97-disposal.sysml — passivation (TS-292), SeparationDeltaV, separationSafety (TS-293), TethysTarget::targetCases import.
  • docs/coverage/WP-C.md, docs/coverage/WP-I.md — coverage lines updated to the derived values.

Runs moved

  • New: runs/wpc-despin-step.txt, runs/disposal-quantities.txt (probes above, added to scripts/runs.sh).
  • runs/house-rules.txt: self-model check 80 537 → 80 550 elements, 703 451 → 703 578 checks, 0 violations, 0 unevaluated.
  • runs/as-built-satisfy.txt, runs/requirements-satisfy.txt, runs/wpb-budgets-satisfy.txt: one ID shift (separationSafety by argentFM.captureSystem ID 4677 → 4678), same verdicts.
  • All other runs reproduce byte-identical at the pin.

Behaviour changes

  • No verdict flips. TS-292 now genuinely tests the 23 d delay against 0 d … 30 d; TS-293 now evaluates the model's target-case masses; both stay satisfied.
  • separationSafety.*DeltaV and separationImpulse are quantities (SpeedValue, ImpulseValue) instead of unitless Reals; the small/large Δv values change as listed above.
  • Despin gains angularMomentum and three in parameters; despin.duration/despin.propellant evaluate (347.8 s, 5.91 kg) where they were undetermined.

Gate (pinned 5cd37f288, Go 1.25.11, JDK 21)

  • make check (validate → pilot → house-rules → runs-check): green, 30 min 32 s. sysml -validate -strict -warnings-as-errors over the 64 model files: no errors. make house-rules: 80 550 elements, 703 578 checks, 0 violations, 0 unevaluated. make pilot-mission + make pilot-all: green, 128 pilot warnings, none in the files this PR touches (the set is develop's). make runs-check: 0 differences across the 270 recorded runs.
  • Re-gated after the review fix (1dc9644): strict validate clean, house-rules 80 550 / 703 578 / 0 unchanged, scripts/runs.sh reproduces all 270 runs byte-identical (the extra constraint term moves no recorded run), pilot-mission + pilot-all green, software-check green.
  • After merging develop d49d64b (fix(model): station downlinks, light-time envelopes and the operations-day endpoint #46) as 74109ba: runs/house-rules.txt re-recorded from the combined tree (80 555 elements, 703 630 checks, 0 violations — the only conflict); make check + make software-check green again (35 min 47 s), 0 run differences.
  • make software-check: green — selftest ok (344 commands, 961 telemetry points, 181 events, 51 packets, 48 parameters, 16 mode rows, 12 state machines), generated tables do not drift, 11 Python tests passed.
  • git ls-remote --heads origin before pushing: the only other branches touching models 41/42/95/97 are wp/c-review-fixes and wp/as-built-review-fixes (the closed WP-C: envelope bounds angular momentum, commit uses upper-bound mass, link rates fit the transceiver #37 / fix(as-built): bind disposal requirements to gauged data and type the quantities #31).

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

devin-ai-integration Bot and others added 5 commits October 29, 2026 01:38
…racterised 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>
…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>
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>
…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>
@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

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>
@devin-ai-integration
devin-ai-integration Bot marked this pull request as ready for review October 29, 2026 03:22
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration Bot and others added 5 commits October 29, 2026 03:25
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>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…documents

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

# Conflicts:
#	runs/house-rules.txt
…sposal

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

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

@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 new potential issue.

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

Devin Review

Comment thread model/86-risk.sysml Resolved
@HuiJun
HuiJun merged commit 548a6d9 into develop Oct 29, 2026
5 checks passed
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