Skip to content

feat: Digest mail notifications - eXIP7.3.0.22 - integration into feature/mips - #6093

Merged
azayati merged 10 commits into
feature/mipsfrom
exip-7.3.0.22-mips
Sep 11, 2026
Merged

feat: Digest mail notifications - eXIP7.3.0.22 - integration into feature/mips#6093
azayati merged 10 commits into
feature/mipsfrom
exip-7.3.0.22-mips

Conversation

@azayati

@azayati azayati commented Sep 10, 2026

Copy link
Copy Markdown
Member

eXIP 7.3.0.22 — Digest mail notifications · integration into feature/mips

The administration switch, the user-settings entry and drawer, the Spring REST controller of the digest, the timezone synchronization moved from agenda into the platform (new endpoint + service), the spaces and feed categories with their email lines, and the cleanup of the legacy digest leftovers.

Rebase note. The Post Reporting eXIP (0dcc6e0ab6) landed on feature/mips with a new postReport template builder carrying its own makeDigest override. The cleanup commit removes that override too, like the six others of MailTemplateProvider — otherwise the file would reference java.io.Writer without importing it once the legacy import is gone. Git merged both sides silently; the check that caught it is git grep "makeDigest\|buildDigest\|java.io.Writer" -- '*.java' returning nothing.

The 7 commit(s) replayed from feature/experience

148 files changed, 2238 insertions(+), 4932 deletions(-)

How this branch was built

exip-7.3.0.22-mips starts from origin/feature/mips and replays only the commits tagged eXIP7.3.0.22 (git cherry-pick -x, the original reference is in every message). The FB version-bump commit (Task-87990) and the commits of the other eXIPs present on feature/experience are deliberately left out — no pom.xml is touched.

Merge order

makeDigest is still an abstract method of commons-api on feature/mips; the other 18 PRs remove their overrides, so they only compile once commons is merged: commons#786 first (wait for the Nexus snapshot), then social#6093, then the 17 addons in any order.

Classification

N1 for the whole eXIP (Liquibase schema and JPA entities, the commons notification dispatcher, new REST endpoints, mass email sending). Approver ≠ author: this PR must be approved by an Architect / Senior Developer who knows it is N1, not on the AI review alone.

Already validated on feature/experience

Every US of the board (project 8372) is "Tested & Validated" by the PO, the legacy engine cleanup (EXO-90072, 19 repositories) included. Full functional test plan: capture, daily and weekly contents, timezones, catch-up at startup, safety cleanup, and non-regression of the instant notifications.

Knowledge: TODO — eng-standards PR to open (/domain-doc commons + social) before leaving draft

🤖 Generated with Claude Code

@azayati
azayati marked this pull request as ready for review September 10, 2026 09:53
@azayati
azayati requested a review from boubaker September 10, 2026 09:53

@azayati azayati left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — Round #1 — eXIP 7.3.0.22 Digest mail notifications (social)

Reviewed as one delivery with the 18 sibling PRs (exip-7.3.0.22-mips), against Tech Spec note 50469 and board 8372, at head f380965b. Every finding below was verified in the source at that commit. The engine findings (claim atomicity, makeDigest removal, Liquibase rollback) are reported on commons#786.


🟢 Nit — a few small ones

  • DigestRest.java:42,65: the controller autowires io.meeds.commons.digest.service.DigestLabelResolver, an implementation-package component of another module, to translate category labels. Expose the labelled categories through the DigestService API (e.g. getCategories(Locale)) and keep REST on the API package.
  • DigestRestTest.java:98-133: five tests, GET and the admin PATCH only. The user PATCH settings has no REST-level pin: owner happy path, 400 on a frequency with no category, 403 when the admin switch is OFF (backend-spring §5 exception → status contract).
  • NotificationChannels.vue:47-49: created() calls getDigestSettings().then(...) without .catch — a failing GET is an unhandled rejection while the switch silently stays OFF (UserSettingNotifications.vue:146 does catch it).
  • NotificationAdministration_en.properties:9: "Allow to use digest mail notification" vs the board US01 / spec wording "Allow users to set digest mail notification". US01 is Tested & Validated on the FB, so just confirm this is the intended label.
  • Profile.java:65: @Deprecated(since = "7.3.0") on TIME_ZONE — backend-spring §6 also asks the comment to say whether it is for removal.
  • UserSettingDigestDrawer.vue is 219 lines (norm ≤ 200 per component, header included — borderline). UserSettingNotifications.vue:144 and NotificationChannels.vue:47 both fetch the full GET /digest/settings (categories + labels + choices) only to read digestAllowed; cheap, a lighter read would do.

Verified conform: SocialApplication adds io.meeds.commons.digest to both scanBasePackages and @EnableJpaRepositories (the hosted-module ruling); DigestRest is Spring MVC under /social/rest/notifications/digest, @Secured("users") on GET/PATCH settings and @Secured("administrators") on the admin PATCH, owner = request.getRemoteUser() only, IllegalArgumentException → 400 with the message code, no endpoint added to the legacy JAX-RS service, @SpringBootTest + @MockitoBean + MockMvc test harness; the enrollment timezone snapshot comes from the profile (UserTimeZoneService.getUserTimeZone), never from the client. Timezone sync: Profile.USER_TIME_ZONE = "user.timeZone" added and TIME_ZONE deprecated not removed; UserTimeZoneService.saveUserTimeZone validates ZoneId.of, saves the org profile attribute and broadcasts social.timeZone.saved with (username, zoneId) — the exact contract commons' DigestTimeZoneListener reads; TimeZoneRest POST text/plain, 400 on an unknown zone; UserTimeZoneSync.js posts only when the browser zone differs from the printed one; the head template validates the stored value with ZoneId.of before printing it and the profile read goes through the cached UserProfileHandler; the module is required from UISocialBottomContainer.gtmpl for logged users only. SocialDigestLinePlugin: the 4 spec plugin ids, parameters are the very keys the plugins write (SPACE_ID/PROFILE/REQUEST_FROM/POSTER/ACTIVITY_ID), vanished space/activity → no line, invitation → /portal/s/{id}, join request → /portal/s/{id}/members (EXO-90021), activities via the redirect URL, titles stripped of HTML and abbreviated, services looked up lazily; 9 tests. Categories spaces (10) and feed (20) with the right plugin ids, label and line keys present in Notification_en.properties, text only, 47 locales touched consistently. SpaceNotificationImpl.discardDigestItems is glue only, called for invitation cancellation and join-request withdrawal, "spaceId" == the key both plugins store, failures never block the on-site removal. Vue: the only new drawer is UserSettingDigestDrawer.vue (+ entry + categories), fetch only in js/DigestService.js and NotificationAdministration.js, $digestService on Vue.prototype, entry and drawer under v-if="digestAllowed" from the parent, exo-drawer reused, pre-select all on first enable, unchecking all switches the frequency off, Apply disabled on an enabled frequency with no category, snackbar text == board US05. Legacy cleanup complete: EmailDigestChoice, the digest fields of UserNotificationSettings, the digest branch and DigestDailyPlugin fallback of NotificationSettingsRestService, getMessageInSpace/getMessageByIds, every makeDigest override including the Post Reporting postReport builder that landed on mips, both test gtmpl, the digestMailNotification feature reads in 4 Vue files, the Notification.digest.* and UINotification.label.{Daily,Weekly,Never,Monthly,selectBox-mail} keys — git grep on *.java *.vue *.js *.gtmpl is empty.

What this PR does well: the timezone sync moves into the platform with the old constant deprecated rather than deleted, the event contract documented at both ends, and every agenda caller removed and verified absent; the drawer follows the "fetch in services, v-if from the parent" rule throughout; the cleanup found and removed the postReport override that a silent git merge had let through.

Classification: N1 (part of the eXIP: new REST endpoints, the hosted commons engine, mass email). This PR must be approved by an Architect / Senior Developer who knows it is N1 and is not its author — never on this AI review alone. Merge after commons#786 (Nexus snapshot published). The Knowledge: line of the body is still TODO.

🤖 Generated with Claude Code

Comment thread component/service/src/main/java/io/meeds/social/digest/rest/DigestRest.java Outdated
@azayati

azayati commented Sep 10, 2026

Copy link
Copy Markdown
Member Author

Round #1 — author's answers to the nits (commit 1d31824f13)

  • DigestLabelResolver autowired in REST → ✅ replaced by DigestService.getCategories(Locale) (commons 56258d791).
  • REST tests for the user PATCH → ✅ four cases added to DigestRestTest.
  • Unhandled promise in NotificationChannels.vue → ✅ .catch(() => this.digestAllowed = false).
  • Admin label wording → ✅ aligned on the board: "Allow users to set digest mail notification".
  • Profile.TIME_ZONE deprecation → ✅ javadoc says since 7.3.0, not for removal, and why.
  • Drawer length / double GET → ➖ declined: 19 of the 219 lines are the license header; the GET is one cached read per page load.

🤖 Generated with Claude Code

@azayati

azayati commented Sep 10, 2026

Copy link
Copy Markdown
Member Author

AI review — Round #2 (follow-up)

Fresh reviewer over the delta since round 1 (f380965bae1d31824f13), together with the commons delta it depends on (56258d791, dee81c34a); every round-1 finding re-verified in the source at the new head, never from the replies.

Round-1 findings

# Finding Status
🟡 The "admin switch OFF" refusal was a business rule in the controller ✅ Fixed — DigestServiceImpl.saveUserSettings throws IllegalAccessException("digest.notAllowed") for every caller; DigestRest maps it to 403 next to the existing 400; DigestServiceTest.testSaveIsRefusedWhileTheAdministratorKeepsTheDigestOff
🟢 DigestRest autowired the commons implementation class DigestLabelResolver ✅ Fixed — DigestService.getCategories(Locale) returns labelled DigestCategory DTOs (commons-api); the controller and its test no longer reference the resolver
🟢 No REST test for the user PATCH settings ✅ Fixed — anonymous → 403, owner enrolls with his profile timezone (never the request's), service IllegalAccessException → 403, service IllegalArgumentException → 400; 9 tests green
🟢 Unhandled promise in NotificationChannels.vue ✅ Fixed — .catch(() => this.digestAllowed = false)
🟢 Admin label wording ✅ Fixed — board wording "Allow users to set digest mail notification"
🟢 Profile.TIME_ZONE deprecation comment ✅ Fixed — javadoc states since 7.3.0, not for removal, and why (readers still exist: getTimeZone(), the CSV import, task)
🟢 Drawer length / double GET of the digest settings ➖ Declined — 19 of the 219 lines are the license header; the GET is one cached read per page load

New findings of round 2

None.

Verified conform this round: DigestRest stays on the io.meeds.commons.digest API package only; @Secured("users") / @Secured("administrators") unchanged; owner = request.getRemoteUser(); the enrollment timezone comes from UserTimeZoneService.getUserTimeZone (profile), never from the client; DigestRestTest keeps @SpringBootTest + @MockitoBean + MockMvc and compares the DigestUserSettings argument by value; no Vue file fetches directly; no copyright year moved on a modified file. Cross-PR: the commons API this PR calls (getCategories(Locale), the declared IllegalAccessException) is in commons 56258d791; the makeDigest overrides removed by this PR stay removed since the hooks are gone from commons-api for good (Architect decision, see commons#786).

Classification: N1 (part of the eXIP: new REST endpoints, the hosted commons engine, mass email). Approver an Architect / Senior Developer other than the author, never on this AI review alone. Merge after commons#786 (Nexus snapshot published). Knowledge: line still TODO. Next: closing round with a fresh reviewer.

🤖 Generated with Claude Code

@azayati

azayati commented Sep 10, 2026

Copy link
Copy Markdown
Member Author

AI review — Round #3 (final) — close-out

The closing reviewer (fresh, round 3) re-verified every finding of this PR in the source at 1d31824f13, together with the commons engine it depends on, and returned clean: nothing to fix at any severity on the social side. All findings from the previous rounds are resolved; nothing outstanding from the AI review side.

Round Finding Status
1 🟡 "Admin switch OFF" refusal implemented in the controller ✅ rule in DigestServiceImpl.saveUserSettings (IllegalAccessException), mapped to 403 in DigestRest, pinned in the service test and the REST test
1 🟢 REST autowired the commons implementation class DigestLabelResolver DigestService.getCategories(Locale) on the API package
1 🟢 No REST test for the user PATCH settings ✅ anonymous, owner with profile timezone, 403, 400
1 🟢 Unhandled promise in NotificationChannels.vue
1 🟢 Admin label wording ✅ board wording
1 🟢 Profile.TIME_ZONE deprecation comment ✅ since 7.3.0, not for removal, with the reason
1 🟢 Drawer length / double GET ➖ declined (license header; one cached read per page load)
2, 3 no finding on social; the commons items are answered on commons#786

Verified conform: hosted-module bootstrap (io.meeds.commons.digest in scanBasePackages and @EnableJpaRepositories); Spring MVC controller under /social/rest/notifications/digest with @Secured roles, owner from getRemoteUser(), exception → status contract; timezone sync moved into the platform (UserTimeZoneService, TimeZoneRest, page script, Profile.USER_TIME_ZONE, event social.timeZone.saved matching commons' listener); SocialDigestLinePlugin ids, parameter keys and /portal/s/{id} links; the spaces/feed categories; discard glue on invitation cancel and join-request withdrawal; Vue rules (fetch in services only, v-if from the parent, shared exo-drawer); legacy digest leftovers gone, 47 locales consistent; no copyright year moved on a modified file; no CRLF.

What remains is not code: the Knowledge: line (eng-standards PR refreshing the social and commons domain docs, required check before the mips merge).

Classification: N1 (part of the eXIP: new REST endpoints, the hosted commons engine, mass email). This PR must be approved by an Architect / Senior Developer who knows it is N1 and is not its author, never on this AI review alone. Merge after commons#786 (Nexus snapshot published).

🤖 Generated with Claude Code

@boubaker

Copy link
Copy Markdown
Member

AI review — Round #4 (independent review, Architects Lead's reviewer)

Independent pass at b83081a4, as part of the 19-PR delivery reviewed against Tech Spec note 50469 and board 8372. The engine findings and the delivery-level summary are on commons#786.

Author's rounds 1–3 — status re-verified in the source at head

Round Finding Status
1 🟡 Admin-OFF rule in the controller ✅ rule in DigestServiceImpl.saveUserSettings (commons); IllegalAccessException → 403 at DigestRest.java:105-106, IllegalArgumentException → 400 kept
1 🟢 REST autowired the commons DigestLabelResolver DigestService.getCategories(Locale)
1 🟢 User PATCH settings untested ✅ four MockMvc cases in DigestRestTest
1 🟢 Unhandled promise, admin label, Profile.TIME_ZONE javadoc
1 🟢 Drawer length / double GET ➖ declined, not re-litigated

New findings — nothing 🟡 or above on this PR

🟢 Nit — a few small ones

  • notification-plugins-configuration.xml:96 and 11 more <string>daily</string> / <string>weekly</string> values in this file's defaultConfig blocks (plus 10 in the test resource exo.social.component.notification-configuration.xml and 3 in exo.social.component.service-local-configuration.xml). UserSetting.FREQUENCY now keeps INSTANTLY only and getFrequecy returns null for them; JPAUserSettingServiceImpl and NotificationPluginContainer skip null — dead and harmless, but they describe a behaviour the legacy engine took with it. Fix: drop the values.
  • Knowledge: is still TODO while the PR is not a draft (see commons#786).

Verified conform — spec rulings and sensitive points checked in the code

SocialApplication:33,44 hosts io.meeds.commons.digest in scanBasePackages and @EnableJpaRepositories (spec §4 Implementation shape, Architects Lead ruling). DigestRest is Spring MVC under /social/rest/notifications/digest with @Secured("users") on the user endpoints and @Secured("administrators") on the admin switch; the owner is request.getRemoteUser() only; the enrollment timezone comes from UserTimeZoneService.getUserTimeZone (profile), never from the client; no endpoint was added to the legacy JAX-RS NotificationSettingsRestService, whose digest branch is removed. TimeZoneRest validates through ZoneId.of and maps the IllegalArgumentException to 400; UserTimeZoneService writes Profile.USER_TIME_ZONE and broadcasts social.timeZone.saved, the exact name commons registers DigestTimeZoneListener on. UserTimeZoneSync.js (baseGRP, required for logged-in users only) POSTs only when the browser zone differs from eXo.env.portal.userTimezone, which UISocialPortalApplicationHead.gtmpl:73 prints from a ZoneId-validated attribute read through the cached CacheableUserProfileHandlerImpl — no uncached lookup per page render. The spaces (order 10) and feed (order 20) categories cover exactly the four plugin ids of spec §1; SocialDigestLinePlugin reads SPACE_ID/PROFILE/REQUEST_FROM/POSTER/ACTIVITY_ID through the same ArgumentLiteral constants the four plugins write, and its four wordings equal board US06/US07; SpaceNotificationImpl.removeNotifications calls digestService.discard(userId, pluginId, "spaceId", spaceId) exactly where the on-site notification is removed (spec §4 Data, "forgotten at once when undone"). MailTemplateProvider keeps its 17 makeMessage builders and no makeDigest/java.io.Writer reference remains. The drawer follows frontend-vue.md (fetches in DigestService.js on Vue.prototype, exo-drawer and Vuetify controls, no catalogued component duplicated, the 10 i18n keys present); @Deprecated sits on TIME_ZONE, not on the new constant; no copyright year moved on a pre-existing file.

What the PR does well

The timezone synchronisation becomes a platform service with a validated input, an event contract documented at both ends and every agenda caller removed and verified absent; the drawer keeps the "fetch in services, v-if from the parent" rule throughout; the cleanup caught the postReport override a silent git merge had let through and says how it was found.

Classification: N1 (Liquibase schema and drops, JPA entities, the notification dispatcher, new REST endpoints, mass email). This PR must be approved by an Architect / Senior Developer who knows it is N1 and is not its author — never on this AI review alone. The Knowledge: line (Meeds-io/eng-standards#NN or none — <reason>) is a required field of the feature/mips integration PR (dev-lifecycle §3b step 5) and is still TODO.

🤖 Generated with Claude Code

@boubaker boubaker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — Round #4 (independent review) — addendum

One more finding on the timezone synchronisation wiring, anchored inline on the module declaration. The rest of Round #4 stands as posted above.

Classification: N1 (unchanged). This PR must be approved by an Architect / Senior Developer who knows it is N1 and is not its author — never on this AI review alone.

🤖 Generated with Claude Code

Comment thread webapp/src/main/webapp/WEB-INF/gatein-resources.xml Outdated
azayati and others added 8 commits September 11, 2026 14:21
…-89482 - eXIP7.3.0.22 (#6017)

(cherry picked from commit 398179b)
(cherry picked from commit 5212566)
…P7.3.0.22 (#6024)

(cherry picked from commit d81d9db)
(cherry picked from commit 3b28158)
….0.22 (#6027)

(cherry picked from commit b78ef06)
(cherry picked from commit bc5a61b)
…n cancellation - EXO-89485 - eXIP7.3.0.22 (#6056)

(cherry picked from commit cce7e54)
(cherry picked from commit d1ff2bf)
…eXIP7.3.0.22 (#6072)

(cherry picked from commit 274b5d4)
(cherry picked from commit 7c9a929)
…P7.3.0.22 (#6076)

eXIP 7.3.0.22 Digest Mail Notifications — feedback task EXO-90021 from
the functional tests.

The space lines of the digest linked to the legacy space redirections
(`/rest/social/notifications/redirectUrl/space/<id>` and
`space_members`), which build `/portal/g/:spaces:…` URLs and land on a
not found page. They now link to the space pages of the platform:

- "{actor} invited you to join {space}" → `<domain>/portal/s/<spaceId>`,
the space page, which lets the user accept the invitation while it is
pending and opens the space once accepted;
- "{actor} requested to join {space}" →
`<domain>/portal/s/<spaceId>/members`, where the manager handles the
request.

Tests: `SocialDigestLinePluginTest` (9 green). Classification: **N2**.
Knowledge: none.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit dc5ba3a)
(cherry picked from commit cc9d4e3)
….3.0.22 (#6083)

(cherry picked from commit 2307d28)
(cherry picked from commit f380965)
…ed categories API, REST tests - EXO-89484_EXO-89482 - eXIP7.3.0.22

- The "digest not allowed by the administrator" rule is enforced by
  DigestService.saveUserSettings; DigestRest only maps IllegalAccessException
  to 403 next to IllegalArgumentException to 400.
- DigestRest reads the labelled categories from DigestService.getCategories(Locale)
  instead of the commons DigestLabelResolver implementation class.
- Four DigestRestTest cases for the user PATCH (anonymous, owner with his profile
  timezone, 403, 400).
- The admin switch label follows the board wording; the digestAllowed loader of
  the administration app catches a failing GET; Profile.TIME_ZONE deprecation
  says it is not for removal.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 1d31824)
azayati and others added 2 commits September 11, 2026 16:39
…XO-90072 - eXIP7.3.0.22

Prior this change, the social notification plugins declared "daily" or
"weekly" values in their defaultConfig collections: twelve in the webapp
configuration, ten in the notification test resource and three in the service
test resource. Both readers of that collection —
NotificationPluginContainer.getDefaultActivePlugins and
JPAUserSettingServiceImpl.getDefaultSettings — compare each value to
UserSetting.FREQUENCY.INSTANTLY, and FREQUENCY holds INSTANTLY alone since the
legacy digest engine was removed, so getFrequecy("daily") returns null and the
value is silently ignored: configuration left dead by that removal.

After this commit, those 25 values are gone and only "Instantly" remains where
it was declared. The defaultConfig field of NewUserPlugin, and of LikePlugin in
the notification test resource, held a dead value alone and is dropped whole
rather than left as an empty collection. The default activation of every plugin
is unchanged: an ignored value, an empty list and an absent field give the same
result in both readers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…XO-89484 - eXIP7.3.0.22

Prior this change, the timezone synchronization shipped as a baseGRP module
named userTimeZoneSync and was wired by an explicit require in
UISocialBottomContainer.gtmpl. The portal filters the defined modules on the
"BaseExtension" suffix (Utils.includeExtensions, called once per page by
UIPortalApplicationChildren.gtmpl), so a module without that suffix is never
picked up by the hook and needs the page-template coupling the hook exists to
avoid; agenda's agendaBaseExtension, which this module replaces, was loaded
that way and required nowhere.

After this commit, the module is named userTimeZoneBaseExtension, stays in
baseGRP and is loaded by the hook: require.js registers every defined module
name in window.requireJsModules, the whole baseGRP script is served on every
page, and includeExtensions('BaseExtension') requires the module and calls its
init() when it exposes one. The require block of UISocialBottomContainer.gtmpl
is removed, leaving that template as it is on the merge target, and the head
template comment now names the module and how it is loaded. The script itself
is unchanged and still guards on eXo.env.portal.userName.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@azayati

azayati commented Sep 11, 2026

Copy link
Copy Markdown
Member Author

Reply to Round #4 (#6093 (comment)). Fixed at head d53404a0.

🟢 Dead daily / weekly defaultConfig values — fixed

b09b8bd2 removes the 25 values: 12 in notification-plugins-configuration.xml, 10 in the exo.social.component.notification-configuration.xml test resource and 3 in exo.social.component.service-local-configuration.xml.

The removal changes no default activation. Both readers of that collection — NotificationPluginContainer.getDefaultActivePlugins and JPAUserSettingServiceImpl.getDefaultSettings — compare each value to UserSetting.FREQUENCY.INSTANTLY, and FREQUENCY holds INSTANTLY alone since the legacy digest engine was removed, so getFrequecy("daily") returns null and the value was already ignored.

Three defaultConfig fields held a dead value alone — NewUserPlugin in the webapp configuration, NewUserPlugin and LikePlugin in the notification test resource — and are dropped whole rather than left as an empty collection: an ignored value, an empty list and an absent field give the same result in both readers, PluginConfig.defaultConfig initialising to an empty ArrayList.

Every collection that carried Instantly keeps it. The three files were re-parsed with a DOM parser after the edit, and DigestRestTest (9/9) and SocialDigestLinePluginTest (9/9) stay green on the two modules whose test resources changed.

The Knowledge: line stays TODO until the eng-standards PR refreshing the commons and social domain docs is open.

@azayati
azayati requested a review from boubaker September 11, 2026 14:57
@boubaker

Copy link
Copy Markdown
Member

AI review — Round #5 (final)

Independent review, Architects Lead's reviewer, at head d53404a0 (digest hunks since b83081a4: b09b8bd2 dead defaults, d53404a0 BaseExtension wiring; the other commits in the range are the rebased feature/mips). Every ✅ below was verified in the source.

Status of Round #4 and its addendum

Finding Status
🟡 Timezone sync module outside the BaseExtension hook, wired by a page-template require ✅ module renamed userTimeZoneBaseExtension, still in baseGRP; the require block is gone and UISocialBottomContainer.gtmpl is byte-identical to the merge target; the head template's comment names the hook; the script is unchanged and runs at require time as agenda's did
🟢 Dead daily / weekly defaultConfig values ✅ 25 values removed across the three files (11 + 3 as single-line values, 5 + 6 as multi-line ones), the three fields left empty dropped whole; every Instantly value kept (18 / 13 / 3 before and after); the three files parse
🟢 Knowledge: line TODO ❌ still open — delivery-level, tracked on commons#786

Status of the author's rounds 1–3

Unchanged from Round #4: ✅ re-verified then, the drawer length / double GET decline accepted.

New findings

None. The two fix commits were reviewed as new code: the rename keeps the module in the group the hook scans, and the removal touches no Instantly default.

All findings from every round are resolved or accepted on this PR; nothing outstanding from the AI review side. The Knowledge: body line remains a delivery-level prerequisite before the feature/mips merge. Merge after commons#786 (Nexus snapshot published).

Classification: N1 (part of the eXIP: new REST endpoints, the hosted commons engine, mass email). The approval below is the human reviewer's own, recorded after his manual review; author ≠ approver holds.

🤖 Generated with Claude Code

@boubaker boubaker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved after manual review (Architects Lead, N1 approver ≠ author). The independent AI review rounds #4#5 are closed with every finding resolved or accepted; merge after commons#786, and the Knowledge: body line stays a prerequisite before the feature/mips merge.

@azayati
azayati enabled auto-merge (squash) September 11, 2026 16:13
@azayati
azayati merged commit 7d8ddd8 into feature/mips Sep 11, 2026
10 of 12 checks passed
@azayati
azayati deleted the exip-7.3.0.22-mips branch September 11, 2026 16:13
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.

2 participants