<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Query Filter</title>
    <description>The latest articles on DEV Community by Query Filter (@query_filter_591122b53770).</description>
    <link>https://dev.to/query_filter_591122b53770</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3537837%2F9949c594-a967-47f3-93fa-058b6e1bece1.jpg</url>
      <title>DEV Community: Query Filter</title>
      <link>https://dev.to/query_filter_591122b53770</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/query_filter_591122b53770"/>
    <language>en</language>
    <item>
      <title>gradle-108</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Thu, 03 Sep 2026 20:16:33 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-108-2glj</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-108-2glj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fer1nu0bg391qyu37ao2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fer1nu0bg391qyu37ao2n.png" alt=" " width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-107</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Thu, 03 Sep 2026 17:21:09 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-107-5ccc</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-107-5ccc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo9sy7q9jgdl5aemrypun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo9sy7q9jgdl5aemrypun.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-106</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Thu, 03 Sep 2026 17:18:31 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-106-468p</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-106-468p</guid>
      <description>&lt;p&gt;ubject: Citi Desktop Migration Inquiry: Group Aggregation / Collapsible Menus for comet-nam&lt;/p&gt;

&lt;p&gt;Hi Team,&lt;/p&gt;

&lt;p&gt;To align with our business and customer operating models, the NAM team needs to configure comet-nam across 14 distinct functional groups (e.g., Cash, Converts, Delta One, Pilot Group 1, Support, etc.).&lt;/p&gt;

&lt;p&gt;However, under the current 1-application-per-group setup, provisioning each group as an independent entry creates significant visual clutter on the Citi Desktop Launcher panel (spanning 14+ standalone cards for a single platform):&lt;/p&gt;

&lt;p&gt;(See generated layout preview below for visual impact)&lt;/p&gt;

&lt;p&gt;Key Questions:&lt;/p&gt;

&lt;p&gt;Launcher Aggregation Pattern: We noticed OneTouch successfully reduced Launcher clutter by consolidating multiple entries. How was this configured within the AppD portal / launcher manifests?&lt;/p&gt;

&lt;p&gt;Hierarchical Expansion: Ideally, we want comet-nam to appear as a single root entry on the Launcher with an expandable chevron/arrow that unfolds into the 14 targeted group entries (comet-nam [Pilot Group 1], comet-nam [Cash], etc.) upon user interaction.&lt;/p&gt;

&lt;p&gt;Is this hierarchical grouping supported natively in the portal, and what is the recommended pattern to achieve this? I suspect it might be a GUI configuration setting in the application manifest.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Leonid&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-105</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Thu, 03 Sep 2026 16:12:12 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-105-243a</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-105-243a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhq69vv654x2kk1wo7pdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhq69vv654x2kk1wo7pdi.png" alt=" " width="799" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-104</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Tue, 01 Sep 2026 18:57:57 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-104-17bd</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-104-17bd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl87d7nioyhz8307myn29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl87d7nioyhz8307myn29.png" alt=" " width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-103</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:27:52 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-103-3m32</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-103-3m32</guid>
      <description>&lt;h1&gt;
  
  
  MEMORANDUM
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;TO:&lt;/strong&gt; Management&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FROM:&lt;/strong&gt; Leonid Spektor&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DATE:&lt;/strong&gt; September 1, 2026&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SUBJECT:&lt;/strong&gt; Architectural Assessment &amp;amp; Trade-off Analysis: Citi Desktop Onboarding &amp;amp; Atom Group Provisioning&lt;/p&gt;




&lt;h2&gt;
  
  
  Executive Summary
&lt;/h2&gt;

&lt;p&gt;Onboarding our application suite to &lt;strong&gt;Citi Desktop&lt;/strong&gt; introduces a structural constraint: the platform supports &lt;strong&gt;only one Atom Group per registered application&lt;/strong&gt; in AppDirectory.&lt;/p&gt;

&lt;p&gt;To map our existing &lt;strong&gt;14 production user groups&lt;/strong&gt; (~767 users across North America) into this paradigm, we have identified two viable onboarding strategies. Both options introduce operational trade-offs between application metadata management and ongoing access governance. Management decision is required to select the path forward.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Technical Constraint
&lt;/h2&gt;

&lt;p&gt;Citi Desktop limits each AppDirectory application entry to a single bound Atom Group. Because our current access model relies on 14 distinct functional production groups (e.g., Group A, Group B, Group C), a direct 1:1 mapping within a single AppDirectory application entry is not natively supported by the platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evaluation of Onboarding Options
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Application-Level Segmentation (14 AppDirectory Applications)
&lt;/h3&gt;

&lt;p&gt;Create 14 separate AppDirectory application entries, where each entry differs solely by its associated Atom Group binding.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Preserves all 14 existing functional Atom groups as-is without re-provisioning users.&lt;/li&gt;
&lt;li&gt;Eliminates manual user re-keying and bulk entitlement migration risks.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoids ongoing dual-maintenance of user group memberships.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High application clutter within the AppDirectory catalog.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Violates Atom team platform recommendations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Increases administrative overhead during global configuration updates or application releases across 14 entries.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Option 2: Group Consolidation (2 AppDirectory Applications: Pilot &amp;amp; Prod)
&lt;/h3&gt;

&lt;p&gt;Consolidate the existing 14 groups into 2 newly provisioned Atom Groups (&lt;code&gt;[PILOT]&lt;/code&gt; and &lt;code&gt;[PROD]&lt;/code&gt;), mapping to 2 corresponding AppDirectory application entries. This mirrors the approach currently being trialed by the EMEA team.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Aligns with the Atom architecture team’s recommended deployment pattern.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keeps the AppDirectory catalog clean and manageable (2 entries instead of 14).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Initial Migration Risk:&lt;/strong&gt; Requires mapping ~767 users into the new consolidated groups. Manual entry carries a high error rate and will require a dedicated QA validation cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Long-Term Operational Overhead:&lt;/strong&gt; Future user lifecycle events (onboarding, offboarding, role changes) will require updates across both legacy functional groups and the new Desktop groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redundancy:&lt;/strong&gt; Legacy functional groups must still be maintained if relied upon outside of Citi Desktop.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparative Trade-off Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Option 1: 14 AppDirectory Apps&lt;/th&gt;
&lt;th&gt;Option 2: Consolidated Pilot/Prod Groups&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Catalog Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (14 app records to maintain)&lt;/td&gt;
&lt;td&gt;Low (2 app records to maintain)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initial Implementation Effort&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (configuration-only in AppD)&lt;/td&gt;
&lt;td&gt;High (user mapping, entitlement migration, QA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Entry / Error Risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (no user migration)&lt;/td&gt;
&lt;td&gt;High (~767 users to map without automated tooling)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ongoing User Lifecycle Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (uses existing user entitlements)&lt;/td&gt;
&lt;td&gt;High (dual-group maintenance upon joins/moves/leaves)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Atom Architectural Alignment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Non-Standard&lt;/td&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Recommendation &amp;amp; Next Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Short-Term Priority:&lt;/strong&gt; If Option 2 is selected, we strongly advise &lt;strong&gt;against manual user entry&lt;/strong&gt;. We should engage the Atom support team immediately to request programmatic API or bulk CSV/scripting mechanisms to migrate the 767 users cleanly and reduce QA verification time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision Required:&lt;/strong&gt; Management selection between accepting &lt;strong&gt;Application Catalog Maintenance (Option 1)&lt;/strong&gt; versus &lt;strong&gt;Ongoing Access Maintenance &amp;amp; Migration QA (Option 2)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>gradle-102</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Mon, 31 Aug 2026 20:58:51 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-102-e0f</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-102-e0f</guid>
      <description>&lt;h1&gt;
  
  
  Guidance Request: Provisioning New Atom Groups for Citi Desktop (PROD)
&lt;/h1&gt;

&lt;p&gt;Hi &lt;strong&gt;[Recipient Name/Team]&lt;/strong&gt;,&lt;/p&gt;

&lt;p&gt;The Citi Desktop NAM team requires your guidance on creating and configuring new Atom groups for the PROD environment. &lt;/p&gt;

&lt;p&gt;We would like to replicate the existing naming conventions and grouping structure currently used for Atom Launcher. For context, our current 14 PROD groups consist of 767 users structured as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group Name&lt;/th&gt;
&lt;th&gt;User Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cash&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Converts&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delta One&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Derivative&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEV&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Market Data Backup group&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Misc Desks&lt;/td&gt;
&lt;td&gt;191&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot Group 1&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot Group 2&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilot Group 3&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA&lt;/td&gt;
&lt;td&gt;168&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retail&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;767&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once our NAM team has Admin access, then we will add the new Atom groups and map the 767 users (we have the complete user list ready) to their appropriate groups out of the 14. &lt;/p&gt;

&lt;p&gt;Could you please elaborate on the recommended process and any required approvals to proceed with this setup? Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there a script, API, or bulk import mechanism available, or will each user need to be hand-mapped individually?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks,&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Leonid and the NAM Team&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-101</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Mon, 31 Aug 2026 20:57:54 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-101-1hn</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-101-1hn</guid>
      <description>&lt;p&gt;Subject: Guidance Request: Provisioning New Atom Groups for Citi Desktop (PROD)Hi [Recipient Name/Team],The Citi Desktop NAM team requires your guidance on creating and configuring new Atom groups for the PROD environment.We would like to replicate the existing naming conventions and grouping structure currently used for Atom Launcher. For context, our current 14 PROD groups consist of 767 users structured as follows:Group NameUser CountCash113Converts10Default61Delta One31Derivative86DEV8Market Data Backup group2Misc Desks191Pilot Group 125Pilot Group 27Pilot Group 36QA168Retail5Support54Total767Once our NAM team has Admin access, then we will add the new Atom groups and map the 767 users (we have the complete user list ready) to their appropriate groups out of the 14.Could you please elaborate on the recommended process and any required approvals to proceed with this setup?Thanks,Leonid and the NAM Team&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-87</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Wed, 26 Aug 2026 15:56:28 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-87-510b</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-87-510b</guid>
      <description>&lt;p&gt;Conclusions &amp;amp; Recommendations&lt;/p&gt;

&lt;p&gt;EMEA Alignment Monitoring: The Comet NAM team must closely track the EMEA Atom group creation process to determine if a parallel strategy should be adopted for the NAM region.&lt;/p&gt;

&lt;p&gt;User Segmentation: Identify and categorize users into three distinct groups: Support, Pilot, and Production.&lt;/p&gt;

&lt;p&gt;Phased Rollout Strategy:&lt;/p&gt;

&lt;p&gt;Grant early access to Citi Desktop PROD to the Support group (or a designated subset of initial "champions").&lt;/p&gt;

&lt;p&gt;Allow this initial cohort to navigate the learning curve and establish operational best practices before cascading knowledge to the Pilot and Production groups.&lt;/p&gt;

&lt;p&gt;Open Action Item for NAM&lt;/p&gt;

&lt;p&gt;Group Assessment: Confirm whether NAM currently maintains corresponding user groups, or if action is required to build new groups and/or consolidate existing ones into the target 3-group structure.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gradle-86</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Wed, 26 Aug 2026 15:12:45 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-86-38j4</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-86-38j4</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is the updated and consolidated summary, incorporating the details from the Zoom AI email recap:

Group Restructuring &amp;amp; Migration Strategy

Group Split: Restructuring existing ATOM groups into three distinct categories: Production, Pilot, and Support.

Pilot Group: Merging 3 pilot groups into 1 single group containing 23 users.

Support Group: Remaining unchanged at 62 users (includes RMC team members, onshore/offshore, and NAM support). All existing prod users will be imported as-is to prevent access loss.

Migration Sequence: Leonid recommended a phased rollout starting with Support users first, who can act as "champions" to test the installation and assist Pilot and Production users later.

Access Rules: Clarified that users without explicit prod needs (e.g., Guramrit) should not be added to prod access groups.

Technical &amp;amp; Active Directory (AD) Challenges

Cross-Domain Issue: Creating single AD groups faces hurdles due to members residing in different domains (NAM vs. non-NAM). An incident needs to be raised to resolve cross-domain user management.

Change Task: A change task is required to create the new ATOM groups (prod and pilot).

Teams Discussion Clarifications

Atom Group vs. Visibility in Launch Info:

Atom Group (NGD Agent): Controls which machines download/install a given version (e.g., releasing to Group A downloads only for Group A).

Visibility (Citi Desktop Menu): Controls icon visibility in the menu. If an app is visible but not downloaded by NGD, it displays as greyed out with a "not installed" tooltip.

Group Cleanup: Groups not mapped to AppDynamics configurations must be handled separately with the ATOM Support team once migration completes.

Next Steps &amp;amp; Action Items

Guramrit: Create new AD groups for prod and pilot, and add all 23 pilot users to the pilot group.

Guramrit: Raise an incident for cross-domain AD group creation.

Guramrit: Raise a change task for new ATOM groups, considering whether to set them up for UAT first before production.

Guramrit / Team: Consult Vijaya regarding the support group migration approach (champions vs. full group install) and resend Guramrit's clarification email to Anuj/Sumit.

Meeting Follow-up: Reschedule the check-in call once Vijaya is available to address outstanding implementation questions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>gradle-85</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Tue, 25 Aug 2026 16:50:57 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-85-14el</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-85-14el</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;To&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Immersive&lt;/span&gt; &lt;span class="nc"&gt;Labs&lt;/span&gt; &lt;span class="nc"&gt;Java&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="nc"&gt;Traversal&lt;/span&gt; &lt;span class="n"&gt;exercise&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;follow&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Walk&lt;/span&gt; &lt;span class="nc"&gt;Through&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="nc"&gt;ExploitSwitch&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Preview&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="n"&gt;click&lt;/span&gt; &lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="nc"&gt;Exploit&lt;/span&gt; &lt;span class="nc"&gt;Vulnerability&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;preview&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt; &lt;span class="no"&gt;UI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Observe&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt; &lt;span class="n"&gt;providing&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="o"&gt;../../../../&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="n"&gt;allows&lt;/span&gt; &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;outside&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;designated&lt;/span&gt; &lt;span class="n"&gt;avatar&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Understand&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Vulnerability&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nc"&gt;AvatarServlet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;javaIn&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nc"&gt;JavaString&lt;/span&gt; &lt;span class="n"&gt;basePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getServletContext&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getRealPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"avatar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;resolves&lt;/span&gt; &lt;span class="n"&gt;relative&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;sequences&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="o"&gt;../.&lt;/span&gt; &lt;span class="nc"&gt;Without&lt;/span&gt; &lt;span class="n"&gt;canonicalization&lt;/span&gt; &lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;attacker&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;traverse&lt;/span&gt; &lt;span class="n"&gt;outside&lt;/span&gt; &lt;span class="n"&gt;basePath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Remediate&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;VulnerabilityTo&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;traversal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;normalized&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;canonical&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;still&lt;/span&gt; &lt;span class="n"&gt;starts&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;serving&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Open&lt;/span&gt; &lt;span class="nc"&gt;Code&lt;/span&gt; &lt;span class="nc"&gt;Editor&lt;/span&gt; &lt;span class="err"&gt;$\&lt;/span&gt;&lt;span class="n"&gt;rightarrow&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;immersivelabs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fitness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;servlet&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;AvatarServlet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Locate&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;doGet&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="n"&gt;around&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Replace&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;secure&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;validation&lt;/span&gt; &lt;span class="nl"&gt;logic:&lt;/span&gt;&lt;span class="nc"&gt;Java&lt;/span&gt;&lt;span class="c1"&gt;// Get the base path where all avatars live&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;basePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getServletContext&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getRealPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"avatar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;baseDirPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Join with the provided filename and normalize path traversal sequences&lt;/span&gt;
&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;targetPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Verify target path remains inside baseDirPath&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;targetPath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseDirPath&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStatus&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_FORBIDDEN&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;targetPath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isDirectory&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStatus&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>gradle-84</title>
      <dc:creator>Query Filter</dc:creator>
      <pubDate>Tue, 25 Aug 2026 16:50:35 +0000</pubDate>
      <link>https://dev.to/query_filter_591122b53770/gradle-84-2p1o</link>
      <guid>https://dev.to/query_filter_591122b53770/gradle-84-2p1o</guid>
      <description>&lt;p&gt;To complete the Immersive Labs Java Path Traversal exercise, follow these step-by-step instructions.Step 1: Walk Through the Demo ExploitSwitch to the Preview tab or click Demo Exploit Vulnerability on the preview/testing UI.Observe how providing a path like ../../../../etc/passwd allows reading files outside the designated avatar directory.Step 2: Understand the Vulnerability in AvatarServlet.javaIn lines 33–38:JavaString basePath = req.getServletContext().getRealPath("avatar");&lt;br&gt;
Path path = Paths.get(basePath, filename);&lt;br&gt;
File file = path.toAbsolutePath().toFile();&lt;br&gt;
Paths.get(basePath, filename) resolves relative path sequences like ../. Without canonicalization checks, an attacker can traverse outside basePath.Step 3: Remediate the VulnerabilityTo fix path traversal, verify that the normalized/canonical target path still starts with the base path prefix before serving the file.Open Code Editor $\rightarrow$ src/main/java/com/immersivelabs/fitness/servlet/AvatarServlet.java.Locate the doGet method around line 33.Replace lines 33–45 with the following secure path validation logic:Java// Get the base path where all avatars live&lt;br&gt;
String basePath = req.getServletContext().getRealPath("avatar");&lt;br&gt;
Path baseDirPath = Paths.get(basePath).toAbsolutePath().normalize();&lt;/p&gt;

&lt;p&gt;// Join with the provided filename and normalize path traversal sequences&lt;br&gt;
Path targetPath = Paths.get(basePath, filename).toAbsolutePath().normalize();&lt;/p&gt;

&lt;p&gt;// Verify target path remains inside baseDirPath&lt;br&gt;
if (!targetPath.startsWith(baseDirPath)) {&lt;br&gt;
    resp.setStatus(HttpServletResponse.SC_FORBIDDEN);&lt;br&gt;
    return;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;File file = targetPath.toFile();&lt;/p&gt;

&lt;p&gt;if (!file.exists() || file.isDirectory()) {&lt;br&gt;
    resp.setStatus(HttpServletResponse.SC_NOT_FOUND);&lt;br&gt;
    return;&lt;br&gt;
}&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
