PERP-1: foundation module for the PreSales ERP demo (perp/) - #10
Open
coderflow-demo-server[bot] wants to merge 14 commits into
Open
coderflow-demo-server[bot] wants to merge 14 commits into
coderflow-demo-server[bot] wants to merge 14 commits into
Conversation
Adds a new ibmi-agentic/perp/ module alongside cfdemo/, establishing the
build and DDL patterns every subsequent PERP epic will follow.
* perp/AGENTS.md, perp/Rules.mk, perp/.codermake/config.json — module
scaffold; .codermake adds a runsqlstm entry for the .table.sql /
.index.sql / .view.sql / .proc.sql recipes.
* perp/DDL_STYLE_GUIDE.md — 12-section codebase-side conventions doc:
file naming, FOR SYSTEM NAME / FOR COLUMN, multi-tenancy on
company_code, standard audit block, referential integrity, composite
PKs, journaling, effective-dated pricing, document numbering,
generic code_master lookup, standard file header, build ordering.
* perp/qddlsrc/example_reference.table.sql — worked example exercising
every convention; builds to PERPDEMO/EXMPREF, journaled to PERPJRN
with IMAGES(*BOTH).
* perp/qclsrc/perpjrn.clle — bootstrap CL, creates PERPJRN + PERPRCV001
in PERPDEMO (JRNCACHE, MAXOPT2, sysmgr-rolled receivers). Idempotent.
* perp/qclsrc/perpsjpf.clle — STRJRNPF wrapper for attaching each new
SQL table to PERPJRN with IMAGES(*BOTH) OMTJRNE(*OPNCLO).
Closes PERP-10, PERP-11, PERP-12, PERP-13 (all under Epic PERP-1).
Corrections folded in from what was learned building the reference table
against DB2 for i V7R5: FOR COLUMN goes between column name and data type
(not after — SQL0199); _by columns need VARCHAR(18) not VARCHAR(10) so
DEFAULT USER fits (SQL0574); GENERATED ALWAYS AS ('literal') is invalid,
use DEFAULT + named table-level CHECK instead; journal receiver name is
PERPRCV001 (10-char IBM i object-name cap, not PERPRCV0001).
Also — outside the code diff — set the remaining 8 epics (PERP-2..9) and 37
stories (PERP-14..50) up to be self-executable: created a new "PERP
Delivery Playbook" Confluence page under the project hub that codifies
build target, code home, Jira lifecycle, DDL conventions, DB2 gotchas,
journaling routine, per-page docs duties, and a shared DoD template; then
prepended a "read this first" info panel and appended a category-specific
Definition-of-Done checklist to every one of those 45 ticket
descriptions.
Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…ocseq service
Ships the multi-tenant / generic-lookup foundation that every downstream PERP
epic depends on. Adds 5 tables in PERPDEMO (company, code_master,
document_sequence, company_config, perp_user), a 28-row code_master seed, a
docseq service program with atomic per-(company, doc_type) sequencing, and
three DSPF/RPG maintenance programs (perpselr, wrkcmr, wrkusrr) tied together
by a PERP menu (perpmnu.menu).
Sources under ibmi-agentic/perp/:
- qddlsrc/*.table.sql — 5 tables + seed script
- qrpglesrc/docseq.sqlrpgle etc. — docseq service + smoke test
- qrpglesrc/perpselr, wrkcmr, wrkusrr — DSPF-driven CRUD programs
- qddssrc/*.dspf — matching 5250 subfile screens + PERPMNU
- qsrvsrc/docseq.bnd — docseq export list
- perp.bnddir, perpmnu.msgf — binding directory and menu message file
- Rules.mk — full build graph
- DDL_STYLE_GUIDE.md — expanded with RPG (§13), DSPF (§14),
and codermake (§15) conventions and the
DB2 for i / SQLRPGLE gotchas surfaced
Every table journaled via CALL PERPSJPF. All objects build clean into
PERPDEMO with severity <30. docseq end-to-end verified via ssh CALL.
Post-review fixes:
- perpmnu.dspf record format renamed R MENU → R PERPMNU so GO PERPMNU
works (CRTMNU TYPE(*DSPF) requires format name to match menu name).
- QDDLSRC source PF created in PERPDEMO — was missing at library setup;
needed for the .table.sql / .index.sql / .view.sql / .proc.sql
sources to sync back to IBM i on commit. Bootstrap set documented in
DDL_STYLE_GUIDE.md §16.
Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Adds the PERP-3 epic (PERP-20..24): uom/item_class/item/item_uom_conversion/
item_lot DDL, and DSPF+RPGLE maintenance programs (WRKUOMR, WRKCNVR, WRKICLR,
WRKITMR, WRKLOTR) scoped by the *LDA-selected company. Item master
maintenance cross-calls the UOM-conversion and lot screens pre-scoped to the
selected item. Extends Rules.mk and the PERP main menu accordingly, and
folds three newly-discovered DB2-for-i/DDS/RPG gotchas into DDL_STYLE_GUIDE.md.
Also fixes an empty-subfile runtime crash ("Session or device error") present
in all 8 PERP work-with programs, including the PERP-2 precedent programs
(PERPSELR, WRKCMR, WRKUSRR): the subfile-options READC loop ran unconditionally
even when nothing was loaded, which raises a CPF5006-class error instead of
*EOF. Guarded with `if numRows > 0`, and reset the row counter explicitly in
the two programs that skip loading when their scope key is blank.
Adds EDTCDE(3) to every numeric DDS field across WRKITMR/WRKCNVR/WRKLOTR (16
fields) and retrofits it onto WRKCMR's sort_order, which was using EDTCDE(Z)
and silently blanked its default-zero value. Zero-suppresses while still
showing a literal 0 for a true zero balance/quantity, per a new standing
convention documented in DDL_STYLE_GUIDE.md.
Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…, coordinate query service Implements all 3 stories under epic PERP-4: - PERP-25: warehouse_layout DDL (one row per company: grid + bin dims) - PERP-26: WLMR single-record maintenance screen (wlmd.dspf/wlmr.sqlrpgle) - PERP-27: WHCOORD coordinate query service (whcoord.sqlrpgle/_pr.rpgle, whcoord.bnd, whcoordsmk smoke test) — parses item location codes (e.g. 'A1'/'B2'/'S3') for their numeric ordinal in RPG rather than CASTing to INTEGER in SQL, since real seed data mixes a letter prefix with the digit and CAST(...AS INTEGER) rejects that outright. Wires WLMR/WHCOORDSMK into PERPMNU (options 10/11) and documents the alphanumeric-location-code gotcha in DDL_STYLE_GUIDE.md sec 14a. Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
…ory service Implements all 5 stories of the Vendor & Pricing epic in ibmi-agentic/perp/: - PERP-28: vendor, item_vendor, item_vendor_price tables + partial unique index enforcing one preferred vendor per item; seeds code_master PAYTERMS. - PERP-29: WRKVNDR/WRKVNDD — vendor master maintenance (filters by active/buyer). - PERP-30: WRKIVNR/WRKIVND — item-vendor profile maintenance, scoped by item or vendor; preferred-vendor conflicts rejected by the DB (SQLCODE -803) with a friendly message. - PERP-31: WRKIVPR/WRKIVPD — effective-dated price entry; adding a price closes the current row and inserts a new one dated today. - PERP-32: item_vendor_price_history view + ITMVPRCQ service program (itmvprcq_history) + IVPRCQSMK smoke tester, for the pricing-over-time graph demo. Extends PERPMNU with options 10-13. Updates DDL_STYLE_GUIDE.md with three new DB2-for-i/RPG gotchas discovered along the way (sequential short-name abbreviation on multi-object name collisions, partial/filtered unique index support, the 10-char RPG object-name cap). Confluence Data Model, Design Decisions, Delivery Plan, PERP Delivery Playbook, and the PERP hub page are updated to match. Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
…I polish
Splits the flat 13-option PERPMNU into a slim top-level menu (Select
company, System Maintenance, Inventory Master Data, Vendor & Pricing,
Diagnostics/Smoke Tests, Sign off) with 4 new child menus (PERPSYSM,
PERPINVM, PERPVNDM, PERPDIAG) grouping the actual maintenance/diagnostic
programs, so the menu scales cleanly as PERP-6/7/8 land instead of
growing one line per story. Also fixes UI issues found during review:
- WRKVNDR's 5=Display no longer shows an editable panel (fields
protected via a display-mode indicator).
- The unlabeled EMODE mode indicator ('A'/'C'/'D') gets a 'Mode:' label
across all 9 affected work-with screens.
- All 5 PERPMNU/child menus get an F3=Exit legend at line 23, matching
every work-with screen's existing F-key footer.
…r-pricing-tables-maintenance-programs # Conflicts: # perp/Rules.mk # perp/perp.bnddir # perp/perpmnu.msgf # perp/qddssrc/perpmnu.dspf
…uto-approval hook
Implements the full Requisitioning epic (PERP-33 through PERP-36):
- requisition_header / requisition_line DDL (REQUI00001/REQUI00002), with
confidence_pct and a full approval audit block (approved_by/approved_at/
approval_source_code+type/approval_notes, all-or-nothing via CHECK),
journaled to PERPJRN
- REQENTR: requisition entry (header + line subfile), doc-numbered via
docseq_next('REQ'), UOM/cost defaulted from item master + preferred
vendor pricing
- REQAPRR: requisition approval (SUBMITTED list -> detail w/ lines +
confidence badge -> approve/reject, human-stamped)
- REQAUTO: CoderFlow auto-approval hook (skeleton scorer + threshold-gated
auto-approve against company_config), smoke-tested via REQAUTOSMK
- New PERPREQM child menu under PERPMNU; REQAUTOSMK added to PERPDIAG
- perp/qddlsrc/seed/025_approval_thresholds.sql: seeds company_config
auto-approval thresholds for both demo companies (numbered 025, not
030, to avoid colliding with PERP-9's planned 030_items.sql)
- perp/DDL_STYLE_GUIDE.md: documents that GENERATED ALWAYS AS (expression)
computed columns don't build on this target, and the FOR COLUMN
duplicate-name gotcha on short SQL names
Also updates Confluence (Design Decisions & Conventions, Data Model —
Transactional & Audit, Delivery Plan — Epics & Roadmap, PERP hub, ACME
Seed Dataset Spec) to reflect the shipped schema and epic status.
Post-close fixes (found via live user testing after the epic closed):
- reqentr.sqlrpgle / reqaprr.sqlrpgle: writeMsg passed a private msgkey
variable to QMHSNDPM instead of the DDS SFLMSGKEY field (smsgkey),
crashing every message the programs tried to show ("The call to
WRITEMSG ended in error"). Fixed to pass smsgkey; removed the dead
msgkey variable.
- reqentd.dspf: RHEAD (header-entry format) was missing OVERLAY, which
would have hidden the "no company selected" message even after the
crash was fixed.
- perp/qddlsrc/seed/025_approval_thresholds.sql (renamed from 030 to
avoid colliding with PERP-9's planned 030_items.sql).
- reqentr.sqlrpgle: deferred the "2=Change" line option's EXFMT RLEDIT
until after its driving READC loop drains (defensive, matches
perpselr.sqlrpgle's pattern), reading from the RPG array snapshot
instead of the live subfile buffer once deferred.
- reqaprr/reqaprd: reqaprr crashed live with CPF5006 "Session or
device error" / unmonitored RNX1255 at EXFMT ALCTL when it held two
subfiles (ASFL/ASCTL list + ALSFL/ALCTL review-detail) in one device
file. Took four rounds to actually resolve:
1. Deferring the format switch past the driving READC loop -- did
not fix it.
2. Splitting the detail screen into a separately-called program
(REQAPDTL) with its own device file -- also crashed, cascading
across both files. REQAPDTL later removed entirely (orphaned
PERPDEMO objects/source deleted, removed from Rules.mk).
3. Diagnosed (via community references on this exact error) that
SFLDSP-on with 0 device-visible rows -- caused by RDFOOT (a
footer written every loop iteration right before EXFMT ALCTL)
missing OVERLAY -- was the root cause. Rebuilt with two real
subfiles (ASFL/ASCTL + ALSFL/ALCTL, header fields combined onto
ALCTL per reqentd.dspf's RLCTL pattern), separate SFLCLR/SFLDSP
indicators, RDFOOT with OVERLAY. Compiled clean, reported fixed.
4. Disproven by the user's own fresh-session retest: identical
crash, identical statement. Reverted reqaprr/reqaprd.dspf to
the only design ever confirmed to actually render: one real
subfile (ASFL/ASCTL) for the list, and a plain non-subfile
RDETAIL record for the review/approve screen, with up to 6
line-item fields conditioned on indicators (*in60-*in65) so
unused rows are blank instead of showing 0.0000. This is a
scoped, deliberate deviation from this module's usual
two-subfile pattern, kept only for reqaprr; the true root cause
of why a second subfile fails here remains unconfirmed.
Also fixed a related DDS compile-time bug hit along the way
(SFLDSPCTL + an input field below a subfile's anchor row raises
CPD7812) and a free-form RPG syntax issue (no multiple
semicolon-separated statements per source line on this compiler).
DDL_STYLE_GUIDE.md Sec.14, the Design Decisions & Conventions
Confluence page, and persistent memory were each corrected multiple
times as understanding evolved -- final state documents all four
attempts and outcomes plainly rather than presenting another
unconfirmed theory as settled.
Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…et, browse programs
Delivers the full Purchasing epic (PERP-37..41) in one pass.
DDL (PERP-37):
- po_header, po_line, po_line_schedule tables, all journaled to PERPJRN
(*BOTH/*OPNCLO). FK order preserved: po_header FKs company, vendor,
perp_user (buyer), code_master; po_line FKs po_header, item, uom,
code_master, and composite-FKs requisition_line for the optional
source_requisition line-level linkage (MATCH SIMPLE, both null on
manual PO).
- po_line_open view exposes the demo-friendly derived columns
(open_qty = ordered_qty - received_qty, extended_price = ordered_qty
* unit_price). This is the reference workaround for the GENERATED
ALWAYS AS (expression) gap documented in DDL_STYLE_GUIDE.md Sec.9 --
computed columns still don't build on this target, but a companion
view does.
Programs (PERP-38..41):
- poentr / poentd: manual PO entry, reqentr shape. Buyer snapshot from
vendor.buyer_code; docseq_next('PO'); unit_price default from
item_vendor_price current row; F8=Submit flips DRAFT to OPEN.
Currency hard-coded to USD per user request (removed the field from
the DSPF, INSERT relies on the DDL default).
- poreqr / poreqd: PO from requisition (consolidate/split). Selects
APPROVED reqs whose lines aren't yet linked to any po_line; groups
by preferred vendor; F6=Confirm creates POs with source_requisition
line-level linkage. Requisition Converted status is derived from
the linkage, not stored.
- poschr / poschd: blanket schedule maintenance. Soft warning when
total scheduled_qty > po_line.ordered_qty. OPTIONS(*NOPASS) parms
so pobrwr drills in scoped.
- pobrwr / pobrwd: PO browse & inquiry. Filterable subfile + plain-
record BDETAIL drawn from po_line_open. Opt 9 calls poschr scoped
to line 1 for blanket-schedule editing.
Menu wiring: new PERPPOM child menu with 4 options; PERPMNU adds
option 7 -> GO PERPDEMO/PERPPOM.
Style guide + playbook updated with three runtime-only gotchas
learned live during PERP-7 (all compile clean severity 00, then
crash on first exercise):
- Date/DATFMT triangle: ctl-opt datfmt(*iso) + explicit %date(...:
*ISO) + sentinel dates within 1940-2039 (the SQL precompiler
generates its intermediate host vars with the job DATFMT and
ignores ctl-opt datfmt(*iso), so the SQL side stays capped at *MDY
even after the ctl-opt fix). RNQ0114 otherwise.
- %subst(varchar : 1 : N) is strict about current data length, not
declared max -- 'OPEN' (4 chars) can't answer %subst(...,1,10)
even in a VARCHAR(20) column. RNQ0100 otherwise. Fix: direct
assign; RPG right-pads or truncates automatically.
- %editc(int : 'X') returns hex, not decimal. Use %char() for plain
doc-number display. Silent-wrong-output otherwise (every PO # in
the first browse rendered as 0000000000).
Now captured in perp/AGENTS.md "Runtime-only gotchas" section
(loads at the top of the playbook for future PERP work) and
perp/DDL_STYLE_GUIDE.md Sec.13.
Verification: state-based via SQL (DDL + view + CHECK constraints +
consolidation flow all exercised against live PERPDEMO with test rows,
cleaned up after). Interactive UI verification of the 4 programs done
live by the user, three RPG runtime bugs surfaced and fixed in the
process (see above).
Jira: PERP-7 epic + PERP-37..41 stories all transitioned Done. Confluence
Data Model, Delivery Plan, PERP hub, and Design Decisions pages updated.
…_log, receipt entry (UOM conversion + lot capture), lot reconciliation service, reconciliation log browse Closes the requisition -> PO -> receiving transaction loop (PERP-42..45): - PERP-42: po_receipt, po_receipt_line, reconciliation_log tables, journaled to PERPJRN. - PERP-43: rcventr/rcventd PO receipt entry — validates PO status, converts vendor UOM to inventory UOM via item_uom_conversion, upserts item_lot for lot-controlled items, rolls up po_line/po_header status on every receipt (the PO-status-transition-from-receipts item PERP-7 deferred to this epic). Fixes a message-subfile display bug found live (missing WRITE before EXFMT). - PERP-44: lotrecon module/srvpgm + lotrcnsmk smoke test — detects and repairs drift between item.qty_on_hand and SUM(item_lot.qty_on_hand), logging every repair to reconciliation_log. - PERP-45: rcnbrwr/rcnbrwd — filterable reconciliation_log browse + detail. - New PERPRCVM child menu under PERPMNU option 8; lotrcnsmk added to PERPDIAG option 5. DDL_STYLE_GUIDE.md gains Sec.16a (message-subfile WRITE-before-EXFMT gotcha) and Sec.17 (CHECK constraints cannot cross tables). Confluence Data Model, Design Decisions, Delivery Plan, and PERP hub pages updated to reflect the shipped schema and epic status. Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
## What I did Created a new Epic in the **PERP** Jira project (plogic.atlassian.net) to track Phase Two work: - **Epic:** [PERP-51 — Phase Two: Prompt Programs and Aesthetic Improvements](https://plogic.atlassian.net/browse/PERP-51) - **Description:** Tracks Phase Two work covering prompt program enhancements and aesthetic/UI improvements identified through hands-on system testing. This was a pure ticketing exercise — no code was changed and no repository was touched. ## Why The user is going to manually walk through the PERP system, testing functionality and identifying areas for improvement. Each issue they find will be filed as a Story under this epic in a series of follow-up requests/tasks, rather than being implemented immediately. ## Next steps - Waiting for the user to report specific issues found during testing. - For each issue reported, I will create a Story in Jira under project PERP with the Epic link set to **PERP-51**. No code changes will be made as part of this ticketing workflow unless the user explicitly asks for implementation work separately. - I saved a memory note (`project-perp-phase-two-epic.md`) recording that PERP-51 is the active Phase Two epic, so future tasks/sessions know where to file new stories. ## Issues encountered None. The epic was created successfully on the first attempt. ## IBM i task library `IBMI_BUILD_LIBRARY` = `AITSK00071` (not used in this task, since no build or code work was performed). ## Exploratory Verification Not applicable — this task did not involve any interactive IBM i display file screens or code changes; it was limited to creating a Jira epic. Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
…ion for companies perpseld.dspf/perpselr.sqlrpgle: added CHECK(LC) to Company name/Address/City so they accept lowercase (DDS input fields default to uppercase-only without it); coded fields (company code, state, country, currency) stay uppercase. Added 2=Change company info alongside 1=Select, reusing the existing Add panel (now "Edit Company" with a Mode: A/C indicator); company code is protected (DSPATR(PR)) during Change since it's an FK'd primary key. Also fixed a missing-holdMsg bug found live: the "Company X selected"/Add confirmation messages were being silently wiped before ever displaying. Also, per a follow-up request, 1=Select now exits straight back to the calling menu after committing the LDA update (F3-style) instead of redisplaying the list -- the confirmation message on that path was removed since it's no longer shown to anyone. PERP-51: implement remaining Phase Two tickets (PERP-72..98) and fix 3 systemic RPG bugs found via live testing Second batch of the PERP-51 epic (PERP-72 through PERP-98): MM/DD/YY date display across Requisition Entry/Approval, PO Entry/Browse/Schedule, Item Lots, and Receipt Entry; new reusable numeric PO-number prompt program (poprmt, F4=Prompt convention); item/vendor prompts on remaining screens; column realignment and F12-navigation fixes on PO Entry and PO Browse; outer-loop restart pattern on Requisition/PO Entry after submit. Live exploratory testing (not just code review) surfaced and fixed three bug classes affecting most programs in the module, well beyond their originating tickets: - `return;` inside a `begsr` subroutine ends the whole RPG program, not just that subroutine -- fixed by switching to `leavesr;` in 19 programs (itmprmt, vndprmt, poprmt, perpselr, wrkcnvr, wrklotr, wrkitmr, wrkivnr, wrkivpr, wrkiclr, reqentr, poentr, pobrwr, rcventr, poschr, wlmr, wrkusrr, reqaprr, poreqr). - Message-subfile control record not re-written before the next EXFMT (poentr, poschr header loops), and missing/incomplete holdMsg one-shot-skip coverage (wrkcnvr, wrkitmr, wrkivnr, wrkiclr, wrkusrr, wlmr, reqaprr) -- both silently dropped validation/confirmation messages that were otherwise queued correctly. - Sentinel date value (0001-01-01) crashed with RNQ0114 on a DATFMT(*MDY)-bound screen field despite the program's own datfmt(*iso) ctl-opt -- fixed by using an in-range sentinel (1940-01-01) in poentr; corrected a stale comment in pobrwr describing the same trap it had already fixed correctly. All 47 PERP-51 child tickets and the epic itself remain "In Progress" (not "Done") per explicit instruction -- final sign-off is the user's own testing pass. Also: adopted local codermake build/ stamps for pre-existing PERPDEMO data tables after a container-restart wiped the stamp cache, avoiding an accidental CRTPF/ RUNSQLSTM re-create attempt against populated tables (none were harmed). Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
…tribute-byte gap cascade) The From heading sat one column right of its own SFROM data field because every named DDS field reserves a hidden attribute-byte column immediately before its start, and the Opt heading's trailing character occupied the slot From's own attribute byte needed. Fixed by shifting the whole downstream chain by one column in both records: SFROM/STO/SFACT in the subfile data record, and To/Factor in the heading record. Compiles clean with zero warnings (previous single-field attempts each threw CPD7866 field-overlap warnings). Live-verified: From/CS and To/EA now land on exactly the same columns. Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
Following the wrkitmr fix, an audit found the same "blank required/FK field surfaces as a raw SQLCODE/SQLSTATE message" trait in 12 other programs. Fixed all of them: wrkvndr, wrkusrr, wrkcnvr, wrkcmr, wrkiclr, wrkuomr, wrkivnr, wrklotr (each gets a validateXxx subroutine checking required fields before the SQL, with plain per-field messages), plus one-line UOM checks in poentr/reqentr's changeLine, and unit_price/currency_code + company_code/ company_name/base_currency checks in wrkivpr/perpselr. While there, fixed the SAME message-display bugs already documented for wrkitmr in three of these files (wrkvndr, wrkcmr, wrkuomr had no holdMsg mechanism at all, so every add/change/delete result was silently lost) and the same return;-ends-whole-program bug in those same three files' error paths (should be leavesr;). A module-wide sweep afterward found the identical return; bug in one more file, rcnbrwr.sqlrpgle, NOT fixed here since it's outside this fix's scope -- flagged for a follow-up decision. All 12 programs rebuilt clean (severity 00) and live-verified: each shows the correct field-specific message, and a full valid save still works. Also includes a one-time shadow-build of cfdemo's menu.menu into this task's AITSK00019 build library, needed to restore command-line navigation for interactive testing (this task started in a fresh container without the shadow-menu from earlier in this session). This produced cfdemo/build/* artifacts that are specific to this ephemeral task library and have no value in a future container -- worth discarding rather than keeping tracked. Co-Authored-By: CoderFlow <ai@coderflow.ai> Learn more: https://coderflow.ai
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a new ibmi-agentic/perp/ module alongside cfdemo/, establishing the
build and DDL patterns every subsequent PERP epic will follow.
perp/AGENTS.md, perp/Rules.mk, perp/.codermake/config.json — module
scaffold; .codermake adds a runsqlstm entry for the .table.sql /
.index.sql / .view.sql / .proc.sql recipes.
perp/DDL_STYLE_GUIDE.md — 12-section codebase-side conventions doc:
file naming, FOR SYSTEM NAME / FOR COLUMN, multi-tenancy on
company_code, standard audit block, referential integrity, composite
PKs, journaling, effective-dated pricing, document numbering,
generic code_master lookup, standard file header, build ordering.
perp/qddlsrc/example_reference.table.sql — worked example exercising
every convention; builds to PERPDEMO/EXMPREF, journaled to PERPJRN
with IMAGES(*BOTH).
perp/qclsrc/perpjrn.clle — bootstrap CL, creates PERPJRN + PERPRCV001
in PERPDEMO (JRNCACHE, MAXOPT2, sysmgr-rolled receivers). Idempotent.
perp/qclsrc/perpsjpf.clle — STRJRNPF wrapper for attaching each new
SQL table to PERPJRN with IMAGES(*BOTH) OMTJRNE(*OPNCLO).
Closes PERP-10, PERP-11, PERP-12, PERP-13 (all under Epic PERP-1).
Corrections folded in from what was learned building the reference table
against DB2 for i V7R5: FOR COLUMN goes between column name and data type
(not after — SQL0199); _by columns need VARCHAR(18) not VARCHAR(10) so
DEFAULT USER fits (SQL0574); GENERATED ALWAYS AS ('literal') is invalid,
use DEFAULT + named table-level CHECK instead; journal receiver name is
PERPRCV001 (10-char IBM i object-name cap, not PERPRCV0001).
Also — outside the code diff — set the remaining 8 epics (PERP-2..9) and 37
stories (PERP-14..50) up to be self-executable: created a new "PERP
Delivery Playbook" Confluence page under the project hub that codifies
build target, code home, Jira lifecycle, DDL conventions, DB2 gotchas,
journaling routine, per-page docs duties, and a shared DoD template; then
prepended a "read this first" info panel and appended a category-specific
Definition-of-Done checklist to every one of those 45 ticket
descriptions.
Co-Authored-By: CoderFlow ai@coderflow.ai
Learn more: https://coderflow.ai