<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Articles on psLens</title><link>https://pslens.com/blog/</link><description>Recent content in Articles on psLens</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 21 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://pslens.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Solving Duplicate Student Records: How an AI Agent Used psLens MCP to Reverse-Engineer PeopleSoft Name Search Normalization in 3 Minutes</title><link>https://pslens.com/blog/debugging-peoplesoft-search-match-name-normalization-with-pslens-mcp/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/debugging-peoplesoft-search-match-name-normalization-with-pslens-mcp/</guid><description>&lt;p&gt;Duplicate person records (&lt;code&gt;EMPLID&lt;/code&gt;s) are one of the most expensive data-integrity problems in PeopleSoft Campus Solutions and HCM. Once a student or employee is assigned two &lt;code&gt;EMPLID&lt;/code&gt;s, financial aid disbursements, enrollment history, transcripts, and residency records split across two identities.&lt;/p&gt;
&lt;p&gt;Recently, a college running PeopleSoft Campus Solutions 9.2 on Microsoft SQL Server reported that their real-time Continuing Education integration was generating duplicate &lt;code&gt;EMPLID&lt;/code&gt;s—specifically for students with apostrophes or punctuation in their names, such as &lt;strong&gt;Denise O&amp;rsquo;Rourke&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Tracing Every Place a PeopleSoft Field Is Updated Using an AI Agent and the psLens MCP Server</title><link>https://pslens.com/blog/tracing-peoplesoft-field-updates-with-pslens-mcp/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/tracing-peoplesoft-field-updates-with-pslens-mcp/</guid><description>&lt;p&gt;Every PeopleSoft developer and functional analyst has been asked a version of this question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Where in the system does &lt;code&gt;STDNT_CAR_TERM.TUITION_CALC_REQ&lt;/code&gt; get set to &lt;code&gt;'Y'&lt;/code&gt;?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On a traditional codebase stored in Git, &lt;code&gt;ripgrep&lt;/code&gt; answers that question in two seconds. In PeopleSoft, a single flag can be flipped across seven different architectural layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Record Field Defaults&lt;/strong&gt; stored in &lt;code&gt;PSRECFIELD&lt;/code&gt; (&lt;code&gt;DEFFIELDNAME&lt;/code&gt; / &lt;code&gt;DEFRECNAME&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record Field PeopleCode&lt;/strong&gt; (&lt;code&gt;RowInit&lt;/code&gt;, &lt;code&gt;FieldChange&lt;/code&gt;, &lt;code&gt;SavePreChange&lt;/code&gt;, &lt;code&gt;SavePostChange&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scroll Buffer Functions&lt;/strong&gt; (&lt;code&gt;UpdateValue()&lt;/code&gt; targeting the record or a view over the record)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database Views&lt;/strong&gt; (&lt;code&gt;STDNT_CAR_TE_VW&lt;/code&gt;) that write through to the underlying table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline &lt;code&gt;SQLExec&lt;/code&gt; Statements&lt;/strong&gt; with hardcoded &lt;code&gt;UPDATE PS_STDNT_CAR_TERM&lt;/code&gt; strings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application Packages &amp;amp; Application Engine Programs&lt;/strong&gt; (both PeopleCode and SQL actions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;COBOL Stored SQL Statements&lt;/strong&gt; in &lt;code&gt;PS_SQLSTMT_TBL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online Pages and Component Interfaces&lt;/strong&gt; where users or integrations toggle the field directly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Worse, raw text searches in Application Designer or against &lt;code&gt;PSPCMTXT&lt;/code&gt; routinely return false positives from commented-out code (&lt;code&gt;/* ... */&lt;/code&gt; or &lt;code&gt;REM&lt;/code&gt;), miss updates that happen through &lt;code&gt;SQLExec(&amp;quot;UPDATE PS_STDNT_CAR_TERM ...&amp;quot;)&lt;/code&gt;, and ignore COBOL stored SQL entirely.&lt;/p&gt;</description></item><item><title>Connecting AI Coding Agents to PeopleSoft with Model Context Protocol (MCP)</title><link>https://pslens.com/blog/connecting-ai-agents-to-peoplesoft-with-mcp/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/connecting-ai-agents-to-peoplesoft-with-mcp/</guid><description>&lt;p&gt;PeopleSoft has always been a black box to modern AI coding assistants.&lt;/p&gt;
&lt;p&gt;Tools like &lt;a href="https://claude.ai/code"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://www.cursor.com"&gt;Cursor&lt;/a&gt;, and &lt;a href="https://claude.ai/download"&gt;Claude Desktop&lt;/a&gt; work by reading files on disk, navigating Git repositories, and parsing project trees. PeopleSoft does not work like that. Its object definitions, record structures, SQL objects, and PeopleCode live inside relational database tables (&lt;code&gt;PSRECDEFN&lt;/code&gt;, &lt;code&gt;PSRECFIELD&lt;/code&gt;, &lt;code&gt;PSPROGMETA&lt;/code&gt;, &lt;code&gt;PSAEAPPLDEFN&lt;/code&gt;), not on the filesystem.&lt;/p&gt;
&lt;p&gt;Until now, getting that context to an LLM required writing ad-hoc SQL queries, taking screenshots of Application Designer, or manually copying and pasting code blocks into a chat window. That workflow is slow, breaks context across object hierarchies, and makes autonomous coding assistants impossible to use with PeopleSoft.&lt;/p&gt;</description></item><item><title>Why psLens Runs on Go, a Hypermedia UI Stack, and SWS Instead of Living Inside PeopleSoft</title><link>https://pslens.com/blog/why-pslens-runs-on-go-hypermedia-and-sws/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/why-pslens-runs-on-go-hypermedia-and-sws/</guid><description>&lt;p&gt;When I started building psLens, I was not trying to create another PeopleSoft bolt-on. I wanted a tool that could sit beside PeopleSoft, search metadata fast, run audits, monitor Process Scheduler and Integration Broker, and stay easy to deploy and maintain.&lt;/p&gt;
&lt;p&gt;That requirement set ruled out a lot of obvious choices.&lt;/p&gt;
&lt;p&gt;psLens now runs as a standalone &lt;a href="https://github.com/golang/go"&gt;Go&lt;/a&gt; application with server-rendered UI components built in &lt;a href="https://github.com/a-h/templ"&gt;templ&lt;/a&gt;, live updates handled by &lt;a href="https://data-star.dev"&gt;Datastar&lt;/a&gt; (&lt;a href="https://github.com/starfederation/datastar"&gt;GitHub&lt;/a&gt;), and a PeopleSoft-side access layer provided by &lt;a href="https://sws.books.cedarhillsgroup.com/docs/"&gt;SWS&lt;/a&gt;. That combination is not accidental. Each part solves a specific problem that PeopleSoft teams run into when they try to build admin and security tooling the old way.&lt;/p&gt;</description></item><item><title>Which Service Operations Can Half Your Users Call?</title><link>https://pslens.com/blog/service-operations-exposed-to-most-users/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/service-operations-exposed-to-most-users/</guid><description>&lt;p&gt;Ask a PeopleSoft security administrator &amp;ldquo;who can call this web service?&amp;rdquo; and you will usually get a pause. There is no delivered screen that ranks service operations by how many users can reach them. The grant is buried one level below where anyone looks: a service operation is authorized to a &lt;em&gt;permission list&lt;/em&gt;, and permission lists ride &lt;em&gt;roles&lt;/em&gt; out to users. A single broadly-held role can quietly put a data-moving web service in reach of hundreds of accounts that have no business calling it.&lt;/p&gt;</description></item><item><title>Your PeopleSoft Nodes Probably Don't Have Passwords</title><link>https://pslens.com/blog/peoplesoft-nodes-without-passwords/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/peoplesoft-nodes-without-passwords/</guid><description>&lt;p&gt;Here is a finding from a delivered Campus Solutions 9.2 development image: &lt;strong&gt;62 active message nodes, 58 of them with no authentication configured.&lt;/strong&gt; That is not an unusual environment. It is what delivered images look like, and refreshed non-prod environments inherit it.&lt;/p&gt;
&lt;h2 id="why-it-matters"&gt;Why It Matters&lt;/h2&gt;
&lt;p&gt;A message node with &lt;code&gt;AUTHOPTN = 'N'&lt;/code&gt; accepts messages without authenticating the sender. Any system that can reach your Integration Broker gateway can send messages to or through that node. Whether that is exploitable depends on what routings and service operations the node participates in — but &amp;ldquo;unauthenticated by default and nobody has looked&amp;rdquo; is not a posture you want to explain to an auditor.&lt;/p&gt;</description></item><item><title>Who Can Access This PeopleSoft Component? The SQL, and the Gotchas</title><link>https://pslens.com/blog/who-can-access-this-peoplesoft-component/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://pslens.com/blog/who-can-access-this-peoplesoft-component/</guid><description>&lt;p&gt;&amp;ldquo;Who can get to this component?&amp;rdquo; is one of the most common questions a PeopleSoft security administrator gets, and PeopleSoft has no delivered screen that answers it in one place. The data lives in three tables, and the joins are easy to get subtly wrong.&lt;/p&gt;
&lt;h2 id="the-security-chain"&gt;The Security Chain&lt;/h2&gt;
&lt;p&gt;PeopleSoft component access flows through a fixed chain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PSOPRDEFN&lt;/code&gt;&lt;/strong&gt; — user accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PSROLEUSER&lt;/code&gt;&lt;/strong&gt; — which roles each user holds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PSROLECLASS&lt;/code&gt;&lt;/strong&gt; — which permission lists each role carries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PSAUTHITEM&lt;/code&gt;&lt;/strong&gt; — what each permission list grants: menu, component, and page entries with their authorized actions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A user can reach a component if &lt;em&gt;any&lt;/em&gt; permission list on &lt;em&gt;any&lt;/em&gt; of their roles has a &lt;code&gt;PSAUTHITEM&lt;/code&gt; row for it.&lt;/p&gt;</description></item></channel></rss>