Skip to content

Remove the group page's push-to-all controls (ADR 0038 decision 10, last step) - #1651

Merged
fog-workflows[bot] merged 2 commits into
working-1.6from
claude/remove-group-imperatives
Sep 2, 2026
Merged

fog-workflows[bot] merged 2 commits into
working-1.6from
claude/remove-group-imperatives

Conversation

@mastacontrola

Copy link
Copy Markdown
Member

#1647 marked these deprecated and said they would go in a later release. FOGProject/fog-plugins#36 is what made that release this one — location and ou each shipped a group tab doing the same push, so removing only the core cards would have left two plugin tabs doing the exact thing the ADR removes. With both converted to HOST_MASSEDIT_*, nothing is left depending on a group-page push.

Seven controls, not the six that carried a notice

The group Active Directory card pushes five hosts columns through Group::setAD() and was missed when the notices were added in #1647. This found it by looking for what writes to members rather than for what was marked.

Removed:

Control Where it lives now
Image tab + post handler mass edit image
Active Directory tab + post handler useAD, ADDomain, ADOU, ADUser, ADPass
Printer Configuration card + printerLevel push printerLevel
Display Manager card resolution (row-backed)
Auto Logout card autologout (row-backed)
Enforce Hostname card enforce
General tab: kernel, args, init, primary disk, product key, both exit types the matching mass edit fields

Nothing is lost, and that was checked rather than assumed — mass edit already carries every one of those.

The General tab keeps the group's own fields: name, description, order. Those are not pushed anywhere. Its no-clobber alert goes with the pushes, because there is no longer anything on the form that could clobber.

Power Management stays. It creates tasks rather than copying a value, which is the distinction the whole decision turns on.

One thing worth knowing

groups.groupKernel, groupInit, groupPrimaryDisk and groupBuilding are now written by nothing and read by nothing — a grep finds only the field map itself. They were always write-only: the push went to hosts, never to the group. I've left the columns and their API surface alone here rather than dropping them in the same change.

Proof

The deprecation gates from #1647 are inverted rather than deleted — "the notice is present" and "the control is absent" are statements about the same migration, and the second is the one worth keeping.

Two of the new checks pin over-deletion: groupPowermanagement surviving, and the grant tabs still rendering. A sweep that took too much would otherwise pass as success.

Proven by mutation, each turning it red:

Mutation
Restore the deprecation notice red
Restore groupImage() red
Leave a dispatch arm without its handler red
Let setDisp creep back into groupModulePost() red
Delete groupPowermanagement (over-deletion) red
Gut a grant tab (over-deletion) red
Leave a JS handler bound to an id nothing renders red

Full suite 300/300, phpstan clean on both configs, phpstan-baseline.neon unchanged — the two dead private methods it flagged were removed rather than baselined.

The group page loses ~1000 lines and its JS ~265.

Depends on FOGProject/fog-plugins#36 (merged).

🤖 Generated with Claude Code

https://claude.ai/code/session_0166dqQEjAs9fhqUw5zCjvxM

… 10, last step)

#1647 marked these deprecated and said they would go in a later release.
fog-plugins #36 is what made that release this one: `location` and `ou`
each shipped a group tab doing the same push, so removing only the core
cards would have left two plugin tabs doing the exact thing the ADR
removes. With both converted to HOST_MASSEDIT_*, nothing is left
depending on a group-page push.

SEVEN controls go, not the six that carried a notice. The group Active
Directory card pushes five `hosts` columns through Group::setAD() and was
missed when the notices were added in #1647 -- an omission this found by
looking for what WRITES to members rather than for what was marked.

Removed: the Image tab and its post handler, the Active Directory tab and
its post handler, the Printer Configuration card and the printerLevel
push, the Display Manager / Auto Logout / Enforce Hostname cards and
their pushes, and the General tab's kernel, kernel arguments, init,
primary disk, product key and both exit-type fields.

Nothing is lost, and that was checked rather than assumed: mass edit
already carries image, kernel, kernelArgs, kernelDevice, init, biosexit,
efiexit, productKey, printerLevel, useAD, ADDomain, ADOU, ADUser, ADPass,
enforce, and the row-backed resolution and autologout.

The General tab keeps the group's OWN fields -- name, description and
order. Those are not pushed anywhere. Its no-clobber alert goes with the
pushes, because there is no longer anything on the form that could
clobber.

Note that `groups`.`groupKernel`, `groupInit`, `groupPrimaryDisk` and
`groupBuilding` are now written by nothing and read by nothing -- a grep
finds only the field map itself. They were always write-only; the push
went to `hosts`, never to the group. The columns and their API surface
are left alone here rather than dropped in the same change.

Power Management stays. It creates tasks rather than copying a value,
which is the distinction the whole decision turns on.

The deprecation gates from #1647 are INVERTED rather than deleted: "the
notice is present" and "the control is absent" are statements about the
same migration, and the second is the one worth keeping. Two of the new
checks pin OVER-deletion -- groupPowermanagement surviving, and the grant
tabs still rendering -- because a sweep that took too much would
otherwise pass as success.

Proven by mutation, each turning it red: restoring the notice, restoring
groupImage(), leaving a dispatch arm without its handler, letting setDisp
creep back into groupModulePost(), deleting groupPowermanagement, gutting
a grant tab, and leaving a JS handler bound to an id nothing renders.

Full suite 300/300, phpstan clean on both configs, baseline unchanged and
two dead private methods it flagged removed rather than baselined. The
group page loses ~700 lines and its JS ~265.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0166dqQEjAs9fhqUw5zCjvxM
@fog-workflows
fog-workflows Bot enabled auto-merge September 1, 2026 23:56
@fog-workflows
fog-workflows Bot added this pull request to the merge queue Sep 2, 2026
Merged via the queue into working-1.6 with commit 392a68c Sep 2, 2026
10 checks passed
@mastacontrola
mastacontrola deleted the claude/remove-group-imperatives branch September 2, 2026 00:15
osiktech pushed a commit to osiktech/fogproject that referenced this pull request Sep 9, 2026
The units table went in with #PENDING because unit F's own commit could
not know its PR number. It is FOGProject#1651.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0166dqQEjAs9fhqUw5zCjvxM
osiktech pushed a commit to osiktech/fogproject that referenced this pull request Sep 9, 2026
The webroot has carried the mass edit plugin seam since FOGProject#1628, and the
Group page's push-to-all controls have been gone since FOGProject#1651 -- but the
plugins laid beside it came from v1.6.23, cut before fog-plugins FOGProject#35, FOGProject#36
and FOGProject#37 landed. So a deployed server had location and ou still registering
their group tabs, no plugin filling the mass edit's Plugins tab (which hides
itself when empty, so it looked like the feature did not exist), and the
retired persistentgroups still on disk. v1.6.24 is those three merged
changes, and this is the pin that lets an install lay them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0166dqQEjAs9fhqUw5zCjvxM
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