<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Definitions on psLens</title><link>https://pslens.com/docs/objects/definitions/</link><description>Recent content in Definitions on psLens</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://pslens.com/docs/objects/definitions/index.xml" rel="self" type="application/rss+xml"/><item><title>Fields</title><link>https://pslens.com/docs/objects/fields/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/fields/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Fields (&lt;code&gt;PSDBFIELD&lt;/code&gt;) are the fundamental, individual data elements in PeopleSoft—like an employee ID, first name, date of birth, or monetary amount. Think of a field as an individual column in a spreadsheet or a single entry box on a form. Every database table column and page control across PeopleSoft is built on top of a field definition. psLens reads field definitions from &lt;code&gt;PSDBFIELD&lt;/code&gt; (and field labels from &lt;code&gt;PSDBFLDLABL&lt;/code&gt;) and stitches them together with the rest of the metadata so you can see, in one place, everywhere a given field is used.&lt;/p&gt;</description></item><item><title>Records</title><link>https://pslens.com/docs/objects/records/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/records/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Records are PeopleSoft&amp;rsquo;s table/view definitions — every database table, SQL view, derived/work record, and dynamic view is registered in &lt;code&gt;PSRECDEFN&lt;/code&gt;. psLens reads the record definition plus its field list from &lt;code&gt;PSRECFIELD&lt;/code&gt; and stitches it together with everywhere the record is referenced in pages, components, PeopleCode, queries, projects, and trees. The Records page has 12 related-data panels covering pages, components, PeopleCode, queries, trees, prompt-table back-references, AE statements, COBOL SQL statements, project membership, and a live row sample.&lt;/p&gt;</description></item><item><title>SQL Objects</title><link>https://pslens.com/docs/objects/sql-objects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/sql-objects/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;SQL Objects are the PeopleSoft application&amp;rsquo;s standalone SQL artifacts — view definitions and other named SQL fragments stored in &lt;code&gt;PSSQLDEFN&lt;/code&gt; / &lt;code&gt;PSSQLTEXTDEFN&lt;/code&gt;. Unlike a record&amp;rsquo;s automatically-generated DDL, these are SQL bodies the developer hand-wrote and PeopleSoft keeps versioned with the rest of the metadata. psLens pulls the source SQL plus the related record (when the SQL object is a view tied to a record definition) so you don&amp;rsquo;t switch into App Designer to read the SQL.&lt;/p&gt;</description></item><item><title>File Layouts</title><link>https://pslens.com/docs/objects/file-layouts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/file-layouts/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;File Layout definitions (&lt;code&gt;PSFLDDEFN&lt;/code&gt;) map structured flat files, CSVs, fixed-position files, and XML documents to PeopleSoft rowsets and record structures. PeopleTools Object Type 31 definitions store file format specifications in &lt;code&gt;PSFLDDEFN&lt;/code&gt;, segment hierarchies in &lt;code&gt;PSFLDSEGDEFN&lt;/code&gt;, and field attributes in &lt;code&gt;PSFLDFIELDDEFN&lt;/code&gt;. Batch processes and PeopleCode programs query these definitions at runtime to parse inbound files or render outbound data extracts.&lt;/p&gt;</description></item><item><title>Pages</title><link>https://pslens.com/docs/objects/pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/pages/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Pages are the visual screens users interact with in PeopleSoft: the panel definitions from &lt;code&gt;PSPNLDEFN&lt;/code&gt; and the per-control bindings from &lt;code&gt;PSPNLFIELD&lt;/code&gt;. psLens shows the full control list (every field, label, group box, and subpage on the page), the underlying records each control reads from, and the rest of the metadata graph hanging off the page: which components include it, which PeopleCode is attached, which projects contain it.&lt;/p&gt;</description></item><item><title>Components</title><link>https://pslens.com/docs/objects/components/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/components/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Components (called panel groups in older PeopleTools versions) are the user-facing transactions of a PeopleSoft application: a search page plus an ordered set of detail pages that share a single save action. psLens reads &lt;code&gt;PSPNLGROUP&lt;/code&gt; / &lt;code&gt;PSPNLGRPDEFN&lt;/code&gt; and links the component up to its menus, portal navigation paths, exposing component interfaces, the underlying record hierarchy, and the full PeopleCode event tree.&lt;/p&gt;</description></item><item><title>Component Interfaces</title><link>https://pslens.com/docs/objects/component-interfaces/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/component-interfaces/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Component Interfaces (CIs) are PeopleSoft&amp;rsquo;s programmatic façade over a component. They expose component properties as get/set properties and component events as callable methods, so integration code can drive the same business logic the UI uses. psLens reads &lt;code&gt;PSBCDEFN&lt;/code&gt; for the CI header, &lt;code&gt;PSBCITEM&lt;/code&gt; for the property/key list, and &lt;code&gt;PSBCMETHODS&lt;/code&gt; for the methods. It also runs two consistency checks against the underlying component to catch the most common breakage: properties that no longer map to a valid record field, and required fields the CI doesn&amp;rsquo;t expose.&lt;/p&gt;</description></item><item><title>Menus</title><link>https://pslens.com/docs/objects/menus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/menus/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Menus are PeopleSoft&amp;rsquo;s classic navigation containers. Each menu (&lt;code&gt;PSMENUDEFN&lt;/code&gt;) holds a set of bars, each bar a set of items (&lt;code&gt;PSMENUITEM&lt;/code&gt;), and each item points to a component the user can launch. Even in a Fluid-dominant world, classic menus matter for security: Permission List authorizations are granted on menu/component pairs, so understanding which menu owns a component is fundamental to access analysis.&lt;/p&gt;</description></item><item><title>Content References</title><link>https://pslens.com/docs/objects/content-refs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/content-refs/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Content References (CREFs) are entries in the PeopleSoft Portal Registry — the data structure that drives the menu tree, breadcrumbs, and navigation collections users see in PIA. Each CREF is identified by a portal/object name pair stored in &lt;code&gt;PSPRSMDEFN&lt;/code&gt; and can be either a folder (a navigation container) or a content reference (a launchable target, usually a component, but also iScripts, external URLs, and homepage pagelets). psLens shows the CREF&amp;rsquo;s URI target, the full ancestor walk back to the portal root, every system and custom attribute, and the permission lists that have been granted access.&lt;/p&gt;</description></item><item><title>Message Catalogs</title><link>https://pslens.com/docs/objects/message-catalogs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/message-catalogs/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;The Message Catalog is PeopleSoft&amp;rsquo;s centralized store of user-facing text. Every &lt;code&gt;MsgGet()&lt;/code&gt; call, error dialog, warning, and translated label resolves to a message set + message number pair stored in &lt;code&gt;PSMSGCATDEFN&lt;/code&gt;. psLens lets you browse messages by set number, jump directly to a specific set/number, or search by message text. Each message gets a dedicated detail page with its severity, text, explanation, and a usage analysis that finds where it is referenced in PeopleCode and SQL.&lt;/p&gt;</description></item><item><title>Application Packages</title><link>https://pslens.com/docs/objects/app-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/app-packages/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Application Packages are PeopleSoft&amp;rsquo;s object-oriented PeopleCode container — packages hold sub-packages and classes, classes hold methods and properties. They are the standard way to write reusable PeopleCode in PeopleSoft applications. psLens walks the package tree (&lt;code&gt;PSPACKAGEDEFN&lt;/code&gt;, &lt;code&gt;PSPACKAGEITEM&lt;/code&gt;, &lt;code&gt;PSPCMPROG&lt;/code&gt;) and shows the full class hierarchy plus a reverse index of where the package is used: by service operation handlers, by other PeopleCode, and in which projects.&lt;/p&gt;</description></item><item><title>URL Definitions</title><link>https://pslens.com/docs/objects/urls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/urls/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;URL definitions are PeopleSoft&amp;rsquo;s centralized store of named URL strings. Instead of hard-coding &lt;code&gt;https://example.com/...&lt;/code&gt; inside PeopleCode, developers define a URL object (&lt;code&gt;PSURLDEFN&lt;/code&gt;) and reference it by name with &lt;code&gt;GetURL(&amp;quot;MY_URL&amp;quot;)&lt;/code&gt;. This keeps environment-specific endpoints (file servers, integration partners, image hosts) out of the code. psLens lets you browse the catalog so you can see every URL the application uses in one place.&lt;/p&gt;</description></item><item><title>HTML Definitions</title><link>https://pslens.com/docs/objects/html-defs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/html-defs/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;HTML definitions are PeopleSoft&amp;rsquo;s catalog of HTML fragments, JavaScript snippets, and template bodies stored in &lt;code&gt;PSCONTDEFN&lt;/code&gt;. Anything a page or report needs to embed — a JavaScript helper, an email body template, a custom Fluid grid layout — is normally stored as a named HTML object and pulled into PeopleCode with &lt;code&gt;GetHTMLText()&lt;/code&gt;. psLens shows the full content of the definition so you can read what the application is actually injecting at runtime.&lt;/p&gt;</description></item><item><title>Style Sheets</title><link>https://pslens.com/docs/objects/style-sheets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/style-sheets/</guid><description>&lt;div id="pslens-context-panel" class="card border-info mb-4 d-none"&gt;
 &lt;div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle"&gt;
 &lt;i class="bi bi-info-circle-fill me-2"&gt;&lt;/i&gt;
 &lt;span&gt;Tailored Operational Context&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="card-body p-0"&gt;
 &lt;ul class="list-group list-group-flush"&gt;
 &lt;li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Target Database:&lt;/strong&gt;
 &lt;span id="ctx-db" class="badge bg-secondary font-monospace"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Context Type:&lt;/strong&gt;
 &lt;span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Alert Severity:&lt;/strong&gt;
 &lt;span id="ctx-severity" class="badge"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none"&gt;
 &lt;strong&gt;Triggered Time:&lt;/strong&gt;
 &lt;span id="ctx-time" class="text-muted small"&gt;&amp;mdash;&lt;/span&gt;
 &lt;/li&gt;
 &lt;li id="row-details" class="list-group-item py-2 d-none"&gt;
 &lt;strong id="label-details" class="d-block mb-1"&gt;Firing Context:&lt;/strong&gt;
 &lt;code id="ctx-details" class="d-block p-2 bg-light border rounded small"
 style="white-space: pre-wrap; word-break: break-all;"&gt;&amp;mdash;&lt;/code&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
 (function () {
 const params = new URLSearchParams(window.location.search);
 const metadata = params.get('metadata');
 if (!metadata) return;

 try {
 
 const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
 const jsonStr = decodeURIComponent(escape(window.atob(base64)));
 const data = JSON.parse(jsonStr);

 if (data) {
 let hasData = false;

 if (data.db) {
 document.getElementById('ctx-db').textContent = data.db;
 document.getElementById('row-db').classList.remove('d-none');
 hasData = true;
 }

 if (data.type) {
 document.getElementById('ctx-type').textContent = data.type;
 document.getElementById('row-type').classList.remove('d-none');
 hasData = true;
 }

 if (data.severity) {
 const severityBadge = document.getElementById('ctx-severity');
 const severity = data.severity.toLowerCase();
 severityBadge.textContent = severity.toUpperCase();
 if (severity === 'critical') {
 severityBadge.className = 'badge bg-danger';
 } else if (severity === 'warning') {
 severityBadge.className = 'badge bg-warning text-dark';
 } else {
 severityBadge.className = 'badge bg-info';
 }
 document.getElementById('row-severity').classList.remove('d-none');
 hasData = true;
 }

 if (data.t) {
 const date = new Date(data.t * 1000);
 document.getElementById('ctx-time').textContent = date.toLocaleString();
 document.getElementById('row-time').classList.remove('d-none');
 hasData = true;
 }

 if (data.details) {
 document.getElementById('ctx-details').textContent = data.details;

 
 const labelDetails = document.getElementById('label-details');
 if (data.type === 'object') {
 labelDetails.textContent = 'Object Metadata Details:';
 } else if (data.type === 'report') {
 labelDetails.textContent = 'Report Description:';
 } else {
 labelDetails.textContent = 'Firing Context:';
 }

 document.getElementById('row-details').classList.remove('d-none');
 hasData = true;
 }

 if (hasData) {
 document.getElementById('pslens-context-panel').classList.remove('d-none');
 }
 }
 } catch (e) {
 console.error('Failed to parse operational context metadata:', e);
 }
 })();
&lt;/script&gt;
&lt;p&gt;Style sheet definitions are PeopleSoft&amp;rsquo;s stored CSS objects (&lt;code&gt;PSSTYLEDEFN&lt;/code&gt;) — the cascading style sheets that drive Classic and Fluid UI rendering. Tools, themes, branding overrides, and per-page substyle sheets all live here. psLens shows the full CSS body so you can read what rules a specific style sheet contributes without extracting it through App Designer or scraping rendered HTML.&lt;/p&gt;</description></item><item><title>Change Control &amp; Object Locks</title><link>https://pslens.com/docs/objects/change-control/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pslens.com/docs/objects/change-control/</guid><description>&lt;h2 id="peopletools-change-control--object-locks"&gt;PeopleTools Change Control &amp;amp; Object Locks&lt;/h2&gt;
&lt;p&gt;In PeopleSoft development environments, &lt;strong&gt;PeopleTools Change Control&lt;/strong&gt; prevents simultaneous modifications to application metadata objects by allowing developers to check out and lock definitions (e.g. Records, Pages, Components, PeopleCode, App Engines, Component Interfaces).&lt;/p&gt;
&lt;p&gt;psLens automatically inspects system-wide Change Control configuration (&lt;code&gt;PSCHGCTLDEF&lt;/code&gt;) and active checkout locks (&lt;code&gt;PSCHGCTLLOCK&lt;/code&gt;) whenever you view definition metadata or related project associations.&lt;/p&gt;
&lt;h3 id="how-pslens-displays-object-lock-status"&gt;How psLens Displays Object Lock Status&lt;/h3&gt;
&lt;p&gt;When inspecting any PeopleSoft definition in psLens (such as a Record, Page, Component, or Field), the &lt;strong&gt;Included in Projects&lt;/strong&gt; panel surfaces Change Control state in real-time:&lt;/p&gt;</description></item></channel></rss>