Upgrade assessment — Kestrel Energy

Technical findings

Demonstration package. Kestrel Energy is fictional: the dictionary export, the Java, the automation script and the screen assessed here are synthetic customer inputs. The 7.6.1.3 and 9.2 dictionaries, the Oil & Gas add-on columns, IBM's upgrade scripts and the psdi API index they are assessed against are real.

Move7.6.1.3 → 9.2
Export taken2026-09-10
Assessed2026-11-08 00:00:36 UTC
Produced bymxh 0.13.0 · metadata pack 2026.09
Run id5a249250012e4f6bb012088dac6d3e394b1332cdd787bfcc2357e571c9582efe
Scope4 object(s), 3 source file(s)
Supplieddictionary, code, presentation
Declared not suppliedobject-structures, launch-points, java-inventory
Not assessed14 item(s) — see the last section

7.6.1.3 → 9.2, across 4 object(s) and 3 source file(s). Each finding states what was observed and where it was read from, then the grade — mxh's reading of it — and the recommended action and closure test, which are advice.

Coverage

Objects in your dictionary4
Objects compared against the target4
Objects with at least one finding4
Objects your code, screens, rows or grants reach2
Attribute references tied to an object10 by object hint; 14 untied

Every finding says how far it reaches: cited when a line, screen, row or grant names it; referenced when something supplied works on the object; inventory when the dictionary changed and nothing supplied goes near it. The comparison is the whole dictionary; the reach is the priority.

Blocking — 1

BLOCKING class-removed

psdi.iface.jms.ErrorQueueNotfCronTask no longer exists in 9.1 and your code references it

Read from
A2 · IBM's API at 9.1
In your code
examples/customer-upgrade/src/java/com/kestrel/maximo/PermitGate.java:8
Owner
Customisation developer
Recommended action
Replace the reference. The type does not exist at the target, so the customisation will not compile; find the supported equivalent or remove the dependency.
Closed when
The customisation compiles against the target's businessobjects.jar with no unresolved import.
Proposed
Replace — The type or member is gone at the target (A2). What references it has to point at what the target ships for the same purpose.

Review required — 13

11 on objects your code, screens, rows or grants reach, in full below; 2 on the rest of the dictionary, in the table after them.

REVIEW screen-field-local-extension

ASSET.KEINSPECTIONCLASS is bound on a screen through WORKORDER.ASSET → ASSET, and it is your own column: in your export, not in IBM's shipped dictionary at either release. The stock 9.2 dictionary not carrying it is expected — an in-place upgrade carries your own columns forward — so this is not a release removal and the screen is not known to be broken. Confirm the column is present on the upgraded system before cutover; if it is, the binding is unaffected. At least one hop was read from the 9.2 relationship graph mxh ships rather than from your own MAXRELATIONSHIP rows, so which object the field lands on is our assumption about your install — confirm the relationship too.

Read from
B2 · not present in IBM's shipped dictionary at either release; bound by the screen, followed through the 9.2 relationship graph mxh ships
In your code
examples/customer-upgrade/src/screens/wotrack.xml
Owner
Application Designer / configuration
Recommended action
Confirm the column on the upgraded system, then leave the screen alone. The field is your own column, which an in-place upgrade carries forward; the stock target dictionary not listing it is expected, not a broken binding. If the column is not there after the upgrade, re-apply it — a database change — before the screen is opened.
Closed when
select 1 from maxattribute where objectname = <object> and attributename = <attribute> on the upgraded system returns a row, and the screen renders with the field populated.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

REVIEW attribute-removed

ASSET.PLUSSGEOJSON is removed on the path to 9.2 (no reference found in the code supplied)

Read from
A1 · IBM upgrade script, 9.0
Owner
Customisation developer
Recommended action
Change every cited site before cutover. The column is gone at the target: a read throws and a write fails.
Closed when
select 1 from maxattribute where objectname = <object> and attributename = <attribute> on the target returns no row, and no cited site references it.
Proposed
Investigate — The removal is stated by IBM's own evidence (A1) but no supplied line was seen to depend on it. Confirm nothing outside the supplied surfaces does.

REVIEW attribute-removed

WORKORDER.PLUSSGEOJSON is removed on the path to 9.2 (no reference found in the code supplied)

Read from
A1 · IBM upgrade script, 9.0
Owner
Customisation developer
Recommended action
Change every cited site before cutover. The column is gone at the target: a read throws and a write fails.
Closed when
select 1 from maxattribute where objectname = <object> and attributename = <attribute> on the target returns no row, and no cited site references it.
Proposed
Investigate — The removal is stated by IBM's own evidence (A1) but no supplied line was seen to depend on it. Confirm nothing outside the supplied surfaces does.

REVIEW method-removed

psdi.app.person.Person.getAvailableHours(Ljava/util/Date;Lpsdi/app/person/PersonCalRemote;Lpsdi/app/common/AvailCalc;)D is gone in 8.7; you reference the class — check the call

Read from
A2 · IBM's API at 8.7
In your code
examples/customer-upgrade/src/java/com/kestrel/maximo/PermitGate.java:9
Owner
Customisation developer
Recommended action
Check each cited site. The class survives but this member does not, so a call compiles today and fails at the target.
Closed when
The customisation compiles against the target's businessobjects.jar, and the cited lines either no longer call the member or call its replacement.
Proposed
Replace — The type or member is gone at the target (A2). What references it has to point at what the target ships for the same purpose.

REVIEW method-removed

psdi.app.person.Person.getAvailableMbo(Ljava/util/Date;Lpsdi/app/person/PersonCalRemote;Lpsdi/app/common/AvailCalc;)Lpsdi/mbo/MboRemote; is gone in 8.7; you reference the class — check the call

Read from
A2 · IBM's API at 8.7
In your code
examples/customer-upgrade/src/java/com/kestrel/maximo/PermitGate.java:9
Owner
Customisation developer
Recommended action
Check each cited site. The class survives but this member does not, so a call compiles today and fails at the target.
Closed when
The customisation compiles against the target's businessobjects.jar, and the cited lines either no longer call the member or call its replacement.
Proposed
Replace — The type or member is gone at the target (A2). What references it has to point at what the target ships for the same purpose.

REVIEW method-removed

psdi.app.person.Person.getAvailableMboList(Ljava/util/Date;Lpsdi/app/person/PersonCalRemote;Lpsdi/app/common/AvailCalc;)Ljava/util/List; is gone in 8.7; you reference the class — check the call

Read from
A2 · IBM's API at 8.7
In your code
examples/customer-upgrade/src/java/com/kestrel/maximo/PermitGate.java:9
Owner
Customisation developer
Recommended action
Check each cited site. The class survives but this member does not, so a call compiles today and fails at the target.
Closed when
The customisation compiles against the target's businessobjects.jar, and the cited lines either no longer call the member or call its replacement.
Proposed
Replace — The type or member is gone at the target (A2). What references it has to point at what the target ships for the same purpose.

REVIEW type-changed

ASSET.ASSETHEALTH type INTEGER → DECIMAL. Check stored values and consumers for case, rounding and conversion effects. A type difference alone does not establish a failure. No line of the supplied code reads or writes it, so nothing you own is known to break; anything outside the supplied code that carries it — an integration, a report — is what to check. The same column carries this change on 2 tables: ASSET, LOCATIONS.

Read from
B2 · dictionary 7.6.1.3 vs 9.2
Owner
Customisation developer
Recommended action
Validate existing values and every cited consumer against the new type, including case, rounding, range and truth semantics. A metadata difference alone does not establish a failing operation.
Closed when
Each cited site has been read against the new type and either changed or recorded as unaffected, with the reason.
Proposed
Investigate — The column still exists with a different definition. Whether a cited site cares is a judgement about the code, not a fact in the dictionary.

REVIEW scale-changed

ASSET.ASSETHEALTH scale 0 → 2 The same column carries this change on 2 tables: ASSET, LOCATIONS.

Read from
B2 · dictionary 7.6.1.3 vs 9.2
Owner
Customisation developer
Recommended action
Check arithmetic and rounding at every cited site, and any total that has to reconcile.
Closed when
A worked example at the new scale reconciles against the same example at the old one, or the difference is accepted and recorded.
Proposed
Investigate — The column still exists with a different definition. Whether a cited site cares is a judgement about the code, not a fact in the dictionary.

REVIEW type-changed

ASSET.GEOMETRY type BLOB → CLOB. Check stored values and consumers for case, rounding and conversion effects. A type difference alone does not establish a failure. No line of the supplied code reads or writes it, so nothing you own is known to break; anything outside the supplied code that carries it — an integration, a report — is what to check. The same column carries this change on 3 tables: ASSET, LOCATIONS, WORKORDER.

Read from
B1 · dictionary 7.6.1.3 vs 9.2, corroborated by IBM's upgrade script, 9.0
Owner
Customisation developer
Recommended action
Validate existing values and every cited consumer against the new type, including case, rounding, range and truth semantics. A metadata difference alone does not establish a failing operation.
Closed when
Each cited site has been read against the new type and either changed or recorded as unaffected, with the reason.
Proposed
Investigate — The column still exists with a different definition. Whether a cited site cares is a judgement about the code, not a fact in the dictionary.

REVIEW persistence-changed

ASSET.GEOMETRY persistent true → false The same column carries this change on 3 tables: ASSET, LOCATIONS, WORKORDER.

Read from
B1 · dictionary 7.6.1.3 vs 9.2, corroborated by IBM's upgrade script, 9.0
Owner
Customisation developer
Recommended action
A non-persistent attribute is not in the table. Anything that queries, indexes, reports on or joins to it stops working, even though reading it through the MBO still does.
Closed when
No SQL, report or integration references the attribute as a column on the target.
Proposed
Investigate — The column still exists with a different definition. Whether a cited site cares is a judgement about the code, not a fact in the dictionary.

REVIEW persistence-changed

ASSET.METHODNAME persistent false → true The same column carries this change on 2 tables: ASSET, LOCATIONS.

Read from
B2 · dictionary 7.6.1.3 vs 9.2
Owner
Customisation developer
Recommended action
A non-persistent attribute is not in the table. Anything that queries, indexes, reports on or joins to it stops working, even though reading it through the MBO still does.
Closed when
No SQL, report or integration references the attribute as a column on the target.
Proposed
Investigate — The column still exists with a different definition. Whether a cited site cares is a judgement about the code, not a fact in the dictionary.

The rest of the dictionary — 2 review required finding(s) on objects nothing supplied references

The same comparison and the same evidence, listed compactly because no line, screen, row or grant of yours names them.

KindObject.attributeObservedEvidenceProposed
type-changedLOCATIONS.HEALTHLOCATIONS.HEALTH type INTEGER → DECIMAL. Check stored values and consumers for case, rounding and conversion effects. A type difference alone does not establish a failure. No line of the supplied code reads or writes it, so nothing you own is known to break; anything outside the supplied code that carries it — an integration, a report — is what to check.B2 · dictionary 7.6.1.3 vs 9.2Investigate
scale-changedLOCATIONS.HEALTHLOCATIONS.HEALTH scale 0 → 2B2 · dictionary 7.6.1.3 vs 9.2Investigate

Environment-dependent — 8

6 on objects your code, screens, rows or grants reach, in full below; 2 on the rest of the dictionary, in the table after them.

ENVIRONMENT local-extension

ASSET.KECORROSIONLOOP is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2. Your code reads or writes it.

Read from
B2 · not present in IBM's shipped 7.6.1.3 dictionary
In your code
examples/customer-upgrade/src/screens/wotrack.xml:24
Owner
Database / migration
Recommended action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Closed when
Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

ENVIRONMENT local-extension

ASSET.KEINSPECTIONCLASS is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2. Your code reads or writes it.

Read from
B2 · not present in IBM's shipped 7.6.1.3 dictionary
In your code
examples/customer-upgrade/src/screens/wotrack.xml:25
Owner
Database / migration
Recommended action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Closed when
Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

ENVIRONMENT local-extension

WORKORDER.KEFLARINGHOURS is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2. Your code reads or writes it.

Read from
B2 · not present in IBM's shipped 7.6.1.3 dictionary
In your code
examples/customer-upgrade/src/screens/wotrack.xml:15
Owner
Database / migration
Recommended action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Closed when
Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

ENVIRONMENT local-extension

WORKORDER.KEPERMITSTATUS is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2. Your code reads or writes it.

Read from
B2 · not present in IBM's shipped 7.6.1.3 dictionary
In your code
examples/customer-upgrade/src/screens/wotrack.xml:14
Owner
Database / migration
Recommended action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Closed when
Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

ENVIRONMENT local-extension

WORKORDER.KESHUTDOWNREF is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2. Your code reads or writes it.

Read from
B2 · not present in IBM's shipped 7.6.1.3 dictionary
In your code
examples/customer-upgrade/src/screens/wotrack.xml:13
Owner
Database / migration
Recommended action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Closed when
Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

ENVIRONMENT local-extension

WORKORDER.KEWELLID is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2. Your code reads or writes it.

Read from
B2 · not present in IBM's shipped 7.6.1.3 dictionary
In your code
examples/customer-upgrade/src/screens/wotrack.xml:12
Owner
Database / migration
Recommended action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Closed when
Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.
Proposed
Retain — Your own column or object: in your export, not in IBM's dictionary at either release. An in-place upgrade carries it forward; confirm it on the upgraded system.

The rest of the dictionary — 2 environment-dependent finding(s) on objects nothing supplied references

The same comparison and the same evidence, listed compactly because no line, screen, row or grant of yours names them.

KindObject.attributeObservedEvidenceProposed
local-extensionFAILUREREPORT.KEROOTCAUSECODEFAILUREREPORT.KEROOTCAUSECODE is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2.B2 · not present in IBM's shipped 7.6.1.3 dictionaryRetain
local-extensionLOCATIONS.KEPLATFORMLOCATIONS.KEPLATFORM is not part of IBM's own 7.6.1.3 dictionary either — it is your own field, not something the release removes. Decide whether to carry it forward to 9.2.B2 · not present in IBM's shipped 7.6.1.3 dictionaryRetain

Decisions

What to do about each finding. mxh proposes one of five words from the kind, the grade and the evidence class, and says why on the finding; the proposal is advice. A reviewer's decision, where the package carries one, is printed beside it and never over it.

DispositionProposed by mxhDecided by the reviewer
Retain — keep it as it is; confirm it on the upgraded system90
Change — change the cited code, screen or row before cutover00
Replace — replace it with what the target ships for the same purpose40
Retire — remove it; nothing supplied needs it on the target00
Investigate — read it against the target before deciding90

0 finding(s) decided, 22 not yet decided.

Work packages

The findings grouped into related decisions and tests with a common owner, blocking first. Counts are of findings, not of days; sizing a package is the partner's, against their own delivery model. A package's acceptance test is the closure tests of the findings in it, listed under each package below.

PackageOwnerSubjectBlockingReviewEnvironmentProposedDecided
WP-ee4980ccCustomisation developerClass removed1001 replace0 of 1
WP-cf44bbb5Customisation developerValidate changed datatypes against actual usage0303 investigate0 of 3
WP-395a9c9bCustomisation developerMethod removed0303 replace0 of 3
WP-232873ddCustomisation developerAttribute removed0202 investigate0 of 2
WP-15e67888Customisation developerPersistence changed0202 investigate0 of 2
WP-1683a233Customisation developerScale changed0202 investigate0 of 2
WP-253434f3Application Designer / configurationScreen field local extension0101 retain0 of 1
WP-1af3c60dDatabase / migrationLocal extension0088 retain0 of 8

WP-ee4980cc — Customisation developer, Class removed

First action
Replace the reference. The type does not exist at the target, so the customisation will not compile; find the supported equivalent or remove the dependency.
Acceptance
  • The customisation compiles against the target's businessobjects.jar with no unresolved import.

WP-cf44bbb5 — Customisation developer, Validate changed datatypes against actual usage

First action
Validate existing values and every cited consumer against the new type, including case, rounding, range and truth semantics. A metadata difference alone does not establish a failing operation.
Acceptance
  • Each cited site has been read against the new type and either changed or recorded as unaffected, with the reason.

WP-395a9c9b — Customisation developer, Method removed

First action
Check each cited site. The class survives but this member does not, so a call compiles today and fails at the target.
Acceptance
  • The customisation compiles against the target's businessobjects.jar, and the cited lines either no longer call the member or call its replacement.

WP-232873dd — Customisation developer, Attribute removed

First action
Change every cited site before cutover. The column is gone at the target: a read throws and a write fails.
Acceptance
  • select 1 from maxattribute where objectname = <object> and attributename = <attribute> on the target returns no row, and no cited site references it.

WP-15e67888 — Customisation developer, Persistence changed

First action
A non-persistent attribute is not in the table. Anything that queries, indexes, reports on or joins to it stops working, even though reading it through the MBO still does.
Acceptance
  • No SQL, report or integration references the attribute as a column on the target.

WP-1683a233 — Customisation developer, Scale changed

First action
Check arithmetic and rounding at every cited site, and any total that has to reconcile.
Acceptance
  • A worked example at the new scale reconciles against the same example at the old one, or the difference is accepted and recorded.

WP-253434f3 — Application Designer / configuration, Screen field local extension

First action
Confirm the column on the upgraded system, then leave the screen alone. The field is your own column, which an in-place upgrade carries forward; the stock target dictionary not listing it is expected, not a broken binding. If the column is not there after the upgrade, re-apply it — a database change — before the screen is opened.
Acceptance
  • select 1 from maxattribute where objectname = <object> and attributename = <attribute> on the upgraded system returns a row, and the screen renders with the field populated.

WP-1af3c60d — Database / migration, Local extension

First action
Decide whether to carry it forward. It is your own field, not part of IBM's dictionary at either release, so its absence at the target is not release evidence — re-applying it is a database change, not a code change.
Acceptance
  • Either the attribute exists on the target with the type, length and required flag your code expects, or every cited site has been changed to stop using it. One or the other, recorded.

Suggested order, which is advice and not a finding: packages with blocking findings first; within them, dictionary and migration work before code, code before configuration and screens, because a screen or an escalation is tested against the column and class it will find on the target.

What depends on each object

Every cited site of every finding, arranged by the object it depends on. Change the object's columns and these are the places that notice. The count is of findings on the object; a site appears once however many findings cite it.

ObjectFindingsDepends on it
ASSET9screens (1): examples/customer-upgrade/src/screens/wotrack.xml
FAILUREREPORT1no supplied site cites it — the finding is dictionary-only
LOCATIONS3no supplied site cites it — the finding is dictionary-only
WORKORDER5screens (1): examples/customer-upgrade/src/screens/wotrack.xml

The route and its prerequisites

Source7.6.1.3 — your export at examples/customer-upgrade/export (4 objects); IBM's own at this release: mxh's shipped evidence at 7.6.1.3
Target9.2 — mxh's shipped 9.2 dictionary (1866 objects), metadata pack 2026.09, signed
Evidence between them7.6.7.1 (scripts) → 7.6.7.2 (scripts) → 7.6.7.3 (scripts) → 7.6.8 (scripts) → 7.6.8.1 (scripts) → 7.6.8.2 (scripts) → 8.5 (scripts) → 8.6 (scripts) → 8.7 (scripts) → 8.9 (scripts) → 9.0 (scripts and dictionary) → 9.1 (scripts and dictionary) → 9.2 (scripts and dictionary)
Add-ons appliedoilandgas
Product scopeNo product marker was established from the supplied surfaces.

The prerequisites of the move, each with what the package established and what to do next. A row whose evidence is imported was checked from what you supplied; a row with none names the artefact that settles it.

PrerequisiteEstablishedNextEvidence
Source release 7.6.1.37.6.1.3 is one of the three classic levels the Manage upgrade accepts (7.6.0.10, 7.6.1.2, 7.6.1.3). The system's own level is not in the package.Export MAXVARS (varname, varvalue) into the configuration directory; MAXUPG is then checked against the declared release here.none supplied: configuration/maxvars.json
Integrity Checker on the source databaseRun IBM's Integrity Checker on the source database before cutover; its log is not in the package.Supply the checker's log as configuration/integrity-checker.log; its error and warning lines are then counted here.none supplied: configuration/integrity-checker.log
Customisation deploymentSupply the deployed customisation JAR (or its lib directory) as java-jars; every class the findings cite is then checked for presence in what is deployed.Take businessobjects customisations from the deployed lib directory, not from a developer's build, so the check is against what runs.none supplied: java-jars
Platform, database and licensingConfirm the target's OpenShift, database and AppPoint prerequisites with the platform team. No table a Maximo export carries states them, so the package cannot.Record the confirmation in the work package that carries cutover; nothing in this assessment moves with it.not an export: no artefact establishes it
Industry solutions at the targetoilandgas applied to both sides of the comparison; the source's installed products are not in the package. No product marker was established from the supplied surfaces.Read applications/maximo/properties/product/*.xml on the source server into configuration/products.json; the installed add-ons and their levels are then compared with what the manifest declares.none supplied: configuration/products.json