Skip to content

Unify node abstractness idiom - #78

Merged
noha merged 2 commits into
mainfrom
unify-node-abstractness-idiom
Jul 19, 2026
Merged

Unify node abstractness idiom#78
noha merged 2 commits into
mainfrom
unify-node-abstractness-idiom

Conversation

@noha

@noha noha commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

No description provided.

noha added 2 commits July 17, 2026 21:26
FBActivity had zero methods and zero references anywhere in the image
outside of being FBTask's superclass declaration. Verified via a full
source-string scan across every class/metaclass selector in the image
(not just SystemNavigation allReferencesTo:, which is unreliable for
class bindings here), plus a grep across all sibling repos.

FBTask now inherits directly from FBNode. Verified FBNode's
exposedNodeClasses set is unchanged before/after, and FBNodeTest/
FBFlowTest/FluxBase-Core-Tests pass at the same rate as before the
change (one pre-existing, unrelated FullBlockClosure>>#matches: error
in FBFlowTest predates this change).
FBTask and FBWait now declare their own abstractness the same way
FBEvent/FBGateway/FBSplitGateway/FBMergeGateway already do:
isAbstract ^ self == FBTask (respectively FBWait), so subclasses are
exposed in the product UI by default instead of needing an explicit
override.

Before this change, FBTask/FBWait had no isAbstract override at all
and thus inherited FBNode's hardcoded `^ true`, meaning every direct
subclass without its own override was hidden from
FBNode class>>exposedNodeClasses regardless of self-identity. Verified
empirically (in the live test image) that naively switching to the
self == X idiom silently exposes 8 classes that are currently hidden
by omission rather than by design: FBParallelNode, FBParallelJoinNode,
FBPluggableTask, FBErrorTestTask, FBSystemErrorTestTask, FBTestTask,
FBTestTaskWithBehavior, and FBWaitForCondition (which would have also
dragged FBPluggableWait along since it inherits from FBWaitForCondition
and has no override of its own).

To preserve their current (hidden) UI-exposure exactly, each of these
now carries an explicit `isAbstract ^ true` override:
FBParallelNode, FBParallelJoinNode, FBPluggableTask, FBErrorTestTask,
FBSystemErrorTestTask, FBTestTask, FBTestTaskWithBehavior (this repo),
and FBWaitForCondition (whose subclass FBPluggableWait inherits the
override and needs none of its own).

Note: AGAddEntityTestTask (package ApptiveBase-Core, apptive-base repo)
is also a direct FBTask subclass with no override that would be
silently exposed by this change. That fix ships as a separate,
companion commit in the apptive-base repo since it lives outside
FluxBase.

Verified FBNode class>>exposedNodeClasses returns the exact same set
of classes before and after this change. Added
FBNodeTest>>testTaskIsAbstractOnlyForTheBaseClass and
FBNodeTest>>testWaitIsAbstractOnlyForTheBaseClass to protect the
invariant going forward, mirroring the existing
FBGatewayTest>>testGatewayIsAbstractOnlyForTheBaseClass pattern.
Ran FBNodeTest (6/6 pass), FBGatewayTest and FBFlowTest (same single
pre-existing, unrelated FullBlockClosure>>#matches: error as before
this change, no new regressions).
@noha
noha merged commit 17c5dfe into main Jul 19, 2026
0 of 3 checks passed
@noha
noha deleted the unify-node-abstractness-idiom branch July 20, 2026 07:00
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