{
  "format": "zosweb-conformance/1",
  "generated": "2026-07-17",
  "principle": "Faithful at the interface, free in the implementation. Every 'verified' claim names the battle suite and the real-world corpus that proves it; every deviation is documented here, never silently approximated. Anything not listed as supported should be assumed unsupported — ask, and the demand-driven roadmap answers.",
  "verification_method": "Battle suites run REAL artifacts end to end: verbatim source, real EBCDIC data, real JCL, and — where captures exist — byte-level comparison against output captured on real systems (IMS 15.1, real z/OS runs, real ADCD RACF unloads).",
  "subsystems": [
    {
      "name": "JCL / JES2",
      "status": "verified",
      "proof": {
        "suites": [
          "smoke 25/25",
          "cd_battle 65/65",
          "zos_battle"
        ],
        "corpus": "verbatim CardDemo JCL + real IBM sample jobs"
      },
      "supported": [
        "procs + overrides + symbolics + JCLLIB ORDER",
        "COND / IF-THEN-ELSE incl. IF (ABEND)",
        "instream data, concatenation, && temps, referbacks DSN=*.step.dd",
        "DISP processing, GDG, DSNTYPE=LIBRARY|PDS",
        "dataset serialization: the initiator's SYSDSN ENQ, cross-process — every cataloged DSN a job references is enqueued at job initiation and held to job end (DISP=SHR shared, OLD/NEW/MOD exclusive); a conflicting job WAITS with SFE099I like a real initiator (temp &&/backward-ref/DUMMY/SYSOUT DDs carry no ENQ; GDG relative generations enqueue the base dsname); lock files carry the owner pid and stale dead-pid holders are reclaimed (vsamshare battle)",
        "spool: JESMSGLG/JESJCL/JESYSMSG, real IEF/HASP message surface, SDSF-style panel",
        "PARM=(...) parenthesized subparameters",
        "DD DDNAME= forward references, anonymous DDs",
        "system symbols (&SYSUID)",
        "OUTPUT statements (job+step level): DEFAULT=YES, OUTPUT=(*.name) refs, JESDS=ALL, GROUPID/PAGEDEF/FORMDEF/DEST/FORMS/COPIES; SYSOUT=(class,writer,forms); spool files carry the attributes (CBT-560 Endevor corpus, output battle 14/14)",
        "G9 tape: UNIT=TAPE/CART/3400/3480/3490/3590 + LABEL=(seq,SL|SUL|AL|AUL|NSL|NL|BLP|LTM)/VOL=SER list/VOL=REF/RETPD/EXPDT parsed onto the DD and mapped to the cataloged-disk path (first serial = disk volume); ZWS0901-0907 report lines — tape keywords never silently dropped (tape_battle 51/51)"
      ],
      "deviations": [
        "JCL errors fail the job as JCL ERROR with SFE272I (matches real); some IEFC-level message ids approximate",
        "cards past col 71 truncated (real behavior — cols 73-80 sequence)",
        "OUTPUT between steps treated as job-level; unresolved OUTPUT=*.name refs ignored (real JES2 fails the job); OUTPUT CLASS= does not re-class the DD; OUTPUT inside PROC bodies not collected",
        "tape keywords are metadata only: label processing, RETPD/EXPDT retention, multi-volume spanning and DEFER mounts not enforced (multi-volume collapses to the first serial); bare device-number UNIT= stays unclassified (no IODF)",
        "SYSDSN ENQ waits are BOUNDED (real z/OS waits indefinitely under operator control): after ZWS_ENQ_WAIT_MS (default 120s) the job fails loudly with ZWS0820E and a JCL ERROR completion — it never runs unserialized"
      ],
      "unsupported": [
        "checkpoint/restart (RD=)",
        "OUTPUT statement routing (roadmap: print management)",
        "SMS classes honored as comments"
      ]
    },
    {
      "name": "COBOL (Enterprise COBOL source)",
      "status": "verified",
      "proof": {
        "suites": [
          "cd_battle 65/65 (real AWS CardDemo)",
          "smoke"
        ],
        "corpus": "unmodified CardDemo COBOL incl. CICS/DB2 programs"
      },
      "supported": [
        "IGYWCL compile-link pipeline into PDS load modules",
        "runtime checks: S0C7 with symptom dump on invalid packed data",
        "CALL static/dynamic incl. HLASM subroutines",
        "EBCDIC-native data at rest",
        "full RETURN-CODE up to 4095 as step CC",
        "LE callable services present today — the ENTIRE current CEE* coverage: CEEDAYS (native C, real CEE feedback-code message numbers) and CEE3ABD (LE user-abend stub built by runtimebuild); every other CEE* callable service is unsupported (ask via the demand roadmap)"
      ],
      "deviations": [
        "execution via GnuCOBOL translation path — COMPUTE intermediate-precision edge cases follow GnuCOBOL, not ARITH(COMPAT); dialect gaps surface as compile RC 12 honestly (e.g. one CardDemo program needs a staging patch)"
      ],
      "unsupported": [
        "OO COBOL, XML PARSE, UDFs",
        "DBCS/SOSI (G18) is an explicit NON-GOAL for v1, not a pending gap: DBCS data items and literals (PIC G/N), SO/SI shift bytes, mixed-EBCDIC-CCSID dataset content, and DBCS 3270 fields are out of scope across every byte path (codec, VSAM, sort, BMS/3270, editor)",
        "EZASOKET / EZACIC* (z/OS Communications Server socket API): no handler module exists in the runtime — OBSERVED in-engine 2026-07-17: a COBOL CALL 'EZASOKET' compiles and link-edits clean (both steps COND CODE 0000 — the binder does not flag the missing module) and then abends S806 at the CALL itself, with \"module 'EZASOKET' not found\" in JESYSMSG; everything before the CALL runs (its DISPLAY reaches SYSOUT), nothing after it does. The failure is honest but RUN-TIME, so count the exposure up front: the assessment tier detects CALL EZASOKET/EZACIC* (assess.js) and flags it manual — socket programs need a re-design (JSON services / native TCP outside the engine), not a port; demand-gated"
      ]
    },
    {
      "name": "HLASM (assembler)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "zcpu PoC 34/34",
          "zrun 8/8",
          "smoke HLASM round",
          "asm_corpus_battle 14/14 (CBACT01C.asm vs the COBOL original, OUTFILE byte-identical)"
        ],
        "corpus": "real compiled program objects (IEFBR14-class) + assembled S/390 object code; CardDemo assembler-translation corpus (35 programs) via tools/asm_worklist.mjs — ASM-WORKLIST.md is the tracked growth loop"
      },
      "supported": [
        "ASMA90: DC/DS/EQU/USING/LTORG, RR/RX/RS/SI/SS formats, packed decimal (AP/SP/ZAP/MP/DP/ED), PACK/UNPK/CVB/CVD, SAVE/RETURN/WTO/OPEN/CLOSE/GET/PUT/DCB macros",
        "genuine S/390 object code executed by interpreter",
        "COPY members, DSECTs",
        "VSAM ACB/RPL/SHOWCB (GET-next sequential, FDBK, clean-room block layouts observable only through the macro interfaces)",
        "CALL/=V() external linkage with dynamic guest-side module load; CEE3ABD LE abend stub; WTO TEXT=/MF=(E,L) capped at the real 126-char maximum",
        "DSECT COPY members + maclib, ORG location-counter control (REDEFINES overlays), L-attribute in operands, per-segment continuation remarks, register EQUs, front-placed implicit literal pool, MVC length>256 split (translation artifact)",
        "DCB RECFM=V (RDW-driven PUT), DCBOFOPN at +48, storage blank-initialized (COBOL-WS translation convention)"
      ],
      "deviations": [
        "subset instruction coverage — unsupported instructions fail assembly honestly (conformance signal); CardDemo-in-assembler programs using VSAM ACB/RPL macro paths do not assemble yet (roadmap 2.6 zcpu growth loop)",
        "implicit literal pool placed at module FRONT (real HLASM: at END — which pushes 4KB+ single-base programs past addressability); MVC len>256 split into chunks (real: ASMA diagnostic); comment lines never continue",
        "ACB/RPL control-block offsets are clean-room, not IBM layouts; VSAM PUT RPL (update/load) not implemented; fresh storage reads as blanks (real: undefined)",
        "VSAM records convert program-charset->EBCDIC at the interp boundary (our VSAM store keeps program-charset bytes)"
      ],
      "unsupported": [
        "z/Architecture 64-bit instructions",
        "EXEC CICS in assembler"
      ]
    },
    {
      "name": "PL/I (Enterprise PL/I source)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "pli_battle 21/21"
        ],
        "corpus": "IBM PD Tools PSAM sample verbatim incl. %INCLUDE library"
      },
      "supported": [
        "IBMZPLI compile + IEWL link of multiple objects",
        "storage-mapped runtime: packed C/D nibbles, zoned pictures, big-endian FIXED BIN, DEFINED/BASED(ADDR()) overlays byte-true",
        "conditions with real ONCODEs, RECORD+STREAM I/O incl. ASA, EDIT/LIST/DATA",
        "PLITDLI (IMS)"
      ],
      "deviations": [
        "FLOAT is host double (not hex float); ADDR() is a token, not arithmetic-capable"
      ],
      "unsupported": [
        "ALLOCATE/FREE of BASED, CONTROLLED, AREA/OFFSET, structure INIT, iSUB, LIKE, GENERIC"
      ]
    },
    {
      "name": "REXX / CLIST / TSO / ISPF",
      "status": "verified",
      "proof": {
        "suites": [
          "rexx_smoke 106/106",
          "rexx_battle 47/47",
          "browser 14/14"
        ],
        "corpus": "Mark Zelden's real production execs (IPLINFO 3602 lines, JOBCHKRX, LASTIPL chain, DELDUPS edit macro) + real panels"
      },
      "supported": [
        "TSO/E REXX: EBCDIC-native, NUMERIC DIGITS/FUZZ/FORM real formatting, PARSE, stems, INTERPRET, SIGNAL/CALL ON, data stack, ~70 builtins, IRXJCL RC 20000+n",
        "TSO: ALLOC/FREE/EXECIO/LISTDS/LISTCAT/SUBMIT/OUTTRAP/STORAGE()/SYSEXEC->SYSPROC search",
        "CLIST: substitution, PROC parms, &LASTCC/&MAXCC, file I/O, ERROR handlers",
        "ISPF: variable/table/LM services, EDIT with initial MACRO, ISREDIT macros, panels ()ATTR/)BODY EXPAND/)INIT/)PROC/VER) with web display, option 6 shell",
        "fabricated MVS low core (CVT/ASVT/ASCB/RMCT...) that real STORAGE() walkers read"
      ],
      "deviations": [
        "SIGNAL into DO body reaching END is a no-op (no error 10)",
        "TSO CALL of load modules from inside REXX unsupported",
        "LISTDSI space values approximate"
      ],
      "unsupported": [
        "panel TRANS()/TRUNC()/PICT/RANGE, .ZVARS, TBDISPL, ADDPOP",
        "compiled REXX, CICS REXX"
      ]
    },
    {
      "name": "Easytrieve Plus",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "ezt_battle 17/17"
        ],
        "corpus": "CBT tape 357 utilities + Cook County Assessor production programs, unmodified"
      },
      "supported": [
        "EZTPA00: library section (A/N/P/U/B fields on EBCDIC buffers, overlays, INDEX, VALUE/MASK)",
        "JOB activities, IF with THRU/value lists, DO WHILE, PROC/PERFORM, CALL EZTPX01, GO TO JOB",
        "REPORT subset (LINESIZE/PAGESIZE/SPACE/SKIP/TITLESKIP/PRINT)"
      ],
      "deviations": [
        "SYSPRINT listing/statistics approximate (no public captures exist)"
      ],
      "unsupported": [
        "SORT activities, SEQUENCE/CONTROL/SUM totals, TABLE/SEARCH, keyed VSAM JOB INPUT, GET/POINT, %macros with parameters"
      ]
    },
    {
      "name": "SAS (batch language engine)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "sas_battle 114/114"
        ],
        "corpus": "CBT tape 374/375 (David Marsden's SMF reporting SAS) — 9 decks, SYSIN verbatim; SMF inputs synthesized to the programs' own INPUT layouts"
      },
      "supported": [
        "PGM=SASHOST/SAS + SAS cataloged proc (OPTIONS= symbolic; site-proc aliases SAS609/EDSAS609/EDMXGSAS/SAS606); SASLOG numbered source echo + documented NOTE shapes, SASLIST page composer (TITLEn, LINESIZE/PAGESIZE/NODATE/NONUMBER)",
        "DATA step: PDV, implicit loop, multi-dataset DATA with KEEP=/OBS= options and two-level names, subsetting IF, IF/THEN/ELSE, DO groups/iterative DO/DO OVER, old-style indexed arrays, RETAIN/sum statement, OUTPUT/DELETE/STOP/RETURN, GO TO + EOF= labels, SET/MERGE with BY and FIRST./LAST., DROP/KEEP/FORMAT statements",
        "INPUT over EBCDIC records: column/list/formatted, pointer control @n/@expr/+n, trailing @/@@, INFILE (JFCB= sniff incl. the SYS1.MAN len/seg-prefix path, MISSOVER, EOF=, DD concatenation, re-INFILE), DATALINES",
        "Informats PIBw.d/IBw.d/PDw.d/ZDw./SMFSTAMP8./$CHARw./$CHARZBw./$w./BZw./HEXw.; formats DATETIMEw./DATEw./TIMEw.d/HHMM./HEXw./BESTw./Zw./COMMAw.d/w.d",
        "Expressions: ¬= and word comparison ops, AND/OR, ||, **, bit-mask 'B' literals, hex numeric constants (0002X), 'ddMMMyy'D/'hh:mm'T/DT literals, missing-value propagation with the missing/divide-by-zero NOTEs; ~40 functions (SUBSTR/INDEX/DATEPART/TIMEPART/HOUR/SUM/MIN/MAX/...)",
        "PROCs: PRINT (DATA=/(OBS=)/UNIFORM/VAR/FORMAT, column-group wrapping), SORT (BY/DESCENDING/NODUP/OUT=), SUMMARY-MEANS (VAR/BY/OUTPUT OUT= with MEAN/SUM/N/MIN/MAX/STD=), CHART (HBAR, /DISCRETE SUMVAR= TYPE=SUM), PRINTTO (PRINT=dd), DELETE; %INCLUDE dd(member)",
        "Libraries: WORK + _LAST_; libref = same-named DD (two-level names), persisted as a ZSAS1 JSON container, PASSable between job steps (&&temp)",
        "RC 0/4/8; OPTIONS ERRORABEND abends U0999; unknown KEEP= names warn and are ignored (empty survivor list keeps all, the real rule)"
      ],
      "deviations": [
        "Numerics are IEEE doubles (real z/OS SAS stores hex float) — differences only at extreme magnitude/precision",
        "Startup banner is ZOSWEB's own wording (never SAS Institute's copyright text); log timing NOTEs have the documented shape with synthetic numbers; SASLOG is not paginated",
        "After an error the failing step is abandoned and later steps run (real SAS enters OBS=0 syntax-check mode)",
        "PROC output layouts are standard-shaped but approximate (no captured real listings exist for the corpus); CHART bars are text approximations, SUBGROUP= accepted-ignored",
        "SAS library on-disk format is ZSAS1 JSON, not the real bound-library format (observable only through SAS itself); RECFM=VBS INFILEs read as VB (no spanned segments)"
      ],
      "unsupported": [
        "PROC SQL/TABULATE/CORR/PLOT/FORMAT/FREQ/CONTENTS/TRANSPOSE/APPEND, ODS, %LET/%MACRO macro language (only %INCLUDE — the corpus demands no more), LIBNAME statement, WHERE, CALL SYMPUT, special missings .A-.Z, DO WHILE/UNTIL, multi-line #n INPUT, _INFILE_ (SMF72S steps 3/5 — PROC CORR OUTP=/TABULATE — are the standing demand)"
      ]
    },
    {
      "name": "DFSORT (SORT/ICEMAN) + ICETOOL",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "dfsort_battle 42/42 (JOINKEYS + ICETOOL worked examples re-derived from the documented Application Programming Guide semantics, byte-true EBCDIC assertions)",
          "sort_reshape_ext 20/20",
          "jcl_sort_adversarial 17/17",
          "sort_idcams_ext 15/15"
        ],
        "corpus": "synthetic EBCDIC decks derived from documented DFSORT APG semantics + the external-report adversarial decks (no captured real SYSOUT exists for this area)"
      },
      "supported": [
        "SORT/MERGE FIELDS (CH/ZD incl. sign overpunch/PD/BI/FI, A/D), OPTION COPY/SKIPREC/STOPAFT, SUM FIELDS incl. NONE and the real no-sum-on-overflow rule, INCLUDE/OMIT COND (AND/OR, field-to-field, C''/X''/decimal), INREC/OUTREC/OUTFIL BUILD/FIELDS/OVERLAY (col: markers, nX, C''/X'' literals, EDIT= masks), OUTFIL FNAMES/FILES/SPLIT/INCLUDE/OMIT, SYMNAMES field symbols, MERGE via SORTIN01.., VSAM SORTIN",
        "JOINKEYS: FILE=/FILES=F1|F2 with FIELDS=(p,l,A|D,...) over SORTJNF1/SORTJNF2 (instream, PS, VSAM, concatenation), SORTED with sequence check / NOSEQCK, JNF1CNTL/JNF2CNTL decks limited to INCLUDE/OMIT + INREC, JOIN UNPAIRED[,F1][,F2][,ONLY] (statement absent = inner join), REFORMAT FIELDS=(F1:p,l,...,F2:p,l,...,?) with the 'B'/'1'/'2' paired-indicator byte and FILL=C''|X'' for missing sides, duplicate keys join as the full cross product (F1-major), and the joined records then flow through the normal main-task INCLUDE/OMIT/INREC/SORT/OUTREC/OUTFIL",
        "ICETOOL (PGM=ICETOOL): TOOLIN ('-' continuation, '*' comments), TOOLMSG + DFSMSG, per-operator xxxxCNTL via USING(xxxx); operators COPY, SORT, COUNT (EMPTY/NOTEMPTY/HIGHER(x)/LOWER(x)/EQUAL(x)/NOTEQUAL(x); condition met sets rc 12, or RC4/RC8/RC16), DISPLAY (ON(p,l,f)/ON(NUM), HEADER, TITLE, PAGE, WIDTH, BLANK), SELECT (FIRST/LAST/FIRSTDUP/LASTDUP/ALLDUPS/NODUPS/HIGHER/LOWER/EQUAL/NOTEQUAL with TO + DISCARD), SPLICE (ON + WITH overlays onto the group base, KEEPNODUPS/KEEPBASE), STATS, UNIQUE, OCCUR (ON(VALCNT) + HIGHER/LOWER/EQUAL/NOTEQUAL/ALLDUPS/NODUPS filters), MODE STOP/CONTINUE/SCAN; operation return codes roll up to the step CC and MODE STOP (the default) skips remaining operations after a failure"
      ],
      "deviations": [
        "JOINKEYS/ICETOOL message ids and wording are clean-room ICE-style (ICE211A/212A/213A family for join statement errors; ICE60xA refusals and ICE60xI/62xI progress messages for ICETOOL) - no real captured message texts exist for comparison; counts pad to 15 digits",
        "REFORMAT is required for every JOINKEYS application here; whether real DFSORT defaults the joined record for some JOIN ... ONLY forms is an open question (CODING-QUESTIONS G3)",
        "F1/F2 JOINKEYS key fields must match pairwise in length and A/D order (equal-total-length keys with different segmentation are refused ICE212A; real DFSORT may accept them)",
        "DISPLAY/OCCUR report layout is deterministic but approximate: default headings '(p,l,f)', two-space gutters, dash underline, single page (no LINES pagination; PAGE prints a static page 1); numeric default shows leading zeros with '-' prefix and BLANK suppresses them",
        "an ICETOOL operation whose DFSORT call fails surfaces as operation rc 12 with the DFSORT messages in DFSMSG, like the real convention, but the ICE627I wording is ours"
      ],
      "unsupported": [
        "refused BY NAME (SORT rc 16): any JOINKEYS operand beyond FILE/FILES/FIELDS/SORTED/NOSEQCK (TASKID, TYPE, STOPAFT, SKIPREC, INCLUDE=/OMIT=, ...); JNFnCNTL statements other than INCLUDE/OMIT/INREC; JOIN forms beyond UNPAIRED[,F1][,F2][,ONLY]; REFORMAT items beyond F1:/F2:p,l and '?'",
        "refused BY NAME (ICETOOL operation rc 12): operators DATASORT, DEFAULTS, MERGE, RANGE, RESIZE, SUBSET, VERIFY; any operand outside the per-operator lists (SELECT VSAVE, SPLICE WITHALL/WITHANY/WITHEACH, DISPLAY statistics/edit keywords, ...)",
        "OUTFIL beyond FNAMES/FILES/SPLIT/INCLUDE/OMIT/BUILD/OUTREC (no STARTREC/ENDREC/report sections); INREC/OUTREC IFTHEN/PARSE/OVERLAY-with-IFTHEN"
      ]
    },
    {
      "name": "VSAM / IDCAMS",
      "status": "verified",
      "proof": {
        "suites": [
          "smoke",
          "cd_battle (real CardDemo REPRO loads + AIX)",
          "g10_verify_battle 36/36 (RRDS + IEBUPDTE + VERIFY closure; RRN semantics asserted both through the generated RELATIVE server and a real COBOL ORGANIZATION RELATIVE program compiled+run under JCL)"
        ],
        "corpus": "real CardDemo cluster definitions and EBCDIC data"
      },
      "supported": [
        "DEFINE CLUSTER/AIX/PATH, REPRO (EBCDIC<->cluster charset boundary), PRINT, DELETE, ALTER NEWNAME, LISTCAT, VERIFY (real target resolution + real OPEN check — see deviations)",
        "KSDS/ESDS: keyed + sequential + browse access from COBOL, file status surface",
        "RRDS (DEFINE CLUSTER ... NUMBERED, fixed-length): RRN-addressed READ/WRITE/REWRITE/DELETE through real COBOL ORGANIZATION RELATIVE I/O — empty-slot READ/DELETE 23, WRITE into an occupied slot 22, DELETE frees the slot for re-WRITE, READ NEXT skips empty slots and feeds the RRN back in the RELATIVE KEY; REPRO loads slots 1..n in input order; batch COBOL ORGANIZATION RELATIVE programs open the cluster DATA file natively (same rule as KSDS/INDEXED)",
        "refused BY NAME (DEFINE rc 12): KEYS() with NUMBERED (keyed parameters are KSDS-only, IDC3211I) and variable-length RRDS (NUMBERED with RECORDSIZE avg != max, IDC3019I)"
      ],
      "deviations": [
        "clusters store records in program charset internally; REPRO is the documented EBCDIC boundary (write via REPRO, not raw copy)",
        "concurrent-writer serialization (fixes the V1c silent lost update measured in WINDOWS-ES-MAC-BASELINES.md §3): every engine write path takes an EXCLUSIVE per-cluster writer lease — cross-process lock files with owner-pid + stale-holder reclaim under <root>/enq, no OS flock — so one writer at a time, the documented SHAREOPTIONS(1)/(2) posture. Native batch steps hold the lease for the step; a second concurrent writer through runOps (CICS/REPRO/services) waits briefly (ZWS_VSAM_LEASE_WAIT_MS, default 10s) then gets the DOCUMENTED VSAM open failure, file status 93 resource-not-available — never a silent clobber. Two DEVIATION halves remain: (a) readers are never excluded (SHAREOPTIONS(2)-style; real SHAREOPTIONS(1) would also fail reader opens while a writer holds — read integrity across a live writer is the user's responsibility), and (b) a native batch OPEN that hits a held cluster cannot receive FS 93 inside libcob — after ZWS_VSAM_STEP_LEASE_WAIT_MS (default 60s) the step fails loudly with ZWS0821E on the JCL-error path instead (vsamshare battle)",
        "SHAREOPTIONS(3)/(4) clusters are intentionally TIGHTENED to the same single-writer rule: their documented unserialized free-for-all cannot be honored on the BDB backend without silent data loss",
        "VERIFY is honest, never a silent no-op: every op batch here opens and closes the cluster, so the stale end-of-data state real VERIFY repairs cannot exist; instead VERIFY resolves FILE(dd)/DATASET(dsn) like the real command and performs a REAL OPEN I-O of the cluster through the generated COBOL server — an unopenable DATA file surfaces its file status (IDC3351I rc 12), a missing entry is IDC3012I rc 8, a non-VSAM target is IDC3302I/IDC3351I rc 12"
      ],
      "unsupported": [
        "IDC* subordinate members (parked on external input)",
        "SHAREOPTIONS fine grain: per-option reader admission (SO 1 vs 2) and cross-system (second-value) sharing — the engine enforces one uniform single-writer/many-readers rule regardless of the DEFINE'd values"
      ]
    },
    {
      "name": "IEBUPDTE (PDS source maintenance)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "g10_verify_battle 36/36"
        ],
        "corpus": "synthetic decks derived from the documented z/OS DFSMSdfp Utilities IEBUPDTE semantics (docs-for-semantics rule; no captured real SYSPRINT exists for this area)"
      },
      "supported": [
        "./ ADD NAME= and ./ REPL NAME= control cards with the data records between them stowed as PDS members of the SYSUT2 new master (IEB816I/IEB817I stow messages), ./ ENDUP",
        "PARM=NEW (new master built from SYSIN alone) and the PARM=MOD default (starts from the SYSUT1 old-master PDS; untouched members copy through when SYSUT1 != SYSUT2)",
        "documented function checks fail loudly rc 12: ./ ADD of a member already in the old master, ./ REPL of a member not in it, data records before any control card"
      ],
      "deviations": [
        "LIST=/LEVEL=/SOURCE=/SSI= operands are accepted as documented statement syntax, but LEVEL/SOURCE/SSI directory metadata is not stored in this catalog"
      ],
      "unsupported": [
        "refused BY NAME (rc 12 'IEBUPDTE SUBSET ERROR'): ./ CHANGE (NUMBER/DELETE update decks), UPDATE=INPLACE, sequential (PS) new masters, ./ ALIAS, ./ LABEL, continued control statements, and any other PARM or operand — nothing outside the documented ADD/REPL/ENDUP subset is silently accepted"
      ]
    },
    {
      "name": "DB2 (EXEC SQL)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "smoke DB2 rounds",
          "cd_battle",
          "db2_util_battle 21/21 (CardDemo DB2 extension verbatim)",
          "db2_sp_battle 23/23 (external COBOL stored procedures: CREATE PROCEDURE + EXEC SQL CALL, batch and CICS)"
        ],
        "corpus": "DSN8 sample schema (from public IBM documentation) + CardDemo SQL"
      },
      "supported": [
        "real precompiler: host vars incl. COMP-3/indicators, cursors, SELECT INTO, WHENEVER, SQLCA",
        "SPUFI, DSNTEP2, IKJEFT01 DSN RUN",
        "static + dynamic SQL",
        "DSNTIAUL under DSN RUN: SQL mode (SYSRECnn, CAST/CONCAT/||/REPEAT with DB2 CHAR-padding semantics) and table mode (typed unload records: CHAR, VARCHAR 2-byte prefix, packed DECIMAL, INTEGER/SMALLINT, DATE; SYSPUNCH LOAD statements)",
        "DSNUTILB: LOAD DATA (REPLACE/RESUME, INDDN, POSITION field specs or DDL-derived layout) and UNLOAD FROM TABLE (UNLDDN/PUNCHDDN), DSNUxxxI statistics",
        "DCLGEN DSN subcommand: SQL DECLARE + COBOL structure (NAMES/QUOTE/LABEL/COLSUFFIX) — matches the real capture in CardDemo byte-for-byte",
        "DSNTEP4/DSNTIAD decks: CREATE DATABASE/TABLESPACE/GRANT/SET CURRENT SQLID accepted, physical clauses stripped; SYSIBM.SYSDUMMY1; CONCAT/REPEAT/VALUE functions; GDG (+1) extract jobs run verbatim",
        "DB2 VARCHAR host variables (DCLGEN 49-level LEN/TEXT groups) in static SQL, INCLUDE expansion inside the precompiler (nested EXEC SQL DECLARE TABLE consumed), TIMESTAMP_FORMAT (identity — format picture not parsed), CURRENT DATE/TIMESTAMP in static SQL",
        "external COBOL stored procedures: CREATE [OR REPLACE] PROCEDURE ... EXTERNAL NAME ... LANGUAGE COBOL PARAMETER STYLE GENERAL (static EXEC SQL and SPUFI/DSNTEP2 decks; -601 duplicate, -204 on DROP of undefined), SYSIBM.SYSROUTINES/SYSPARMS registry queryable, EXEC SQL CALL with host-variable arguments (IN/OUT/INOUT; CHAR/VARCHAR/INTEGER/SMALLINT/DECIMAL parameters) from batch and CICS programs — the invocation is a genuine COBOL dynamic CALL of the external module; documented error floor -440 (unknown routine/incompatible arguments), -470 (null argument under GENERAL), -444 (load module not found)"
      ],
      "deviations": [
        "engine is SQLite behind a DB2-ism translator (FETCH FIRST, CURRENT DATE, schema qualifiers) — complex dialect/isolation/locking semantics differ; roadmap 2.4/4.4 (utilities, PostgreSQL dialect layer); the full tier ladder — SQLite tier (shipped, now incl. external COBOL stored procedures) vs RDBMS-dialect tier (not built) vs BIND/full-SYSIBM-catalog (not built, each fails honestly) — is published in DB2-TIER-LADDER.md",
        "stored procedures run in the caller's process (a COBOL dynamic CALL of the external module staged from STEPLIB/JOBLIB or the CICS RPL), not a WLM-managed address space; PARAMETER STYLE GENERAL only (no GENERAL WITH NULLS/DB2SQL), parameter types CHAR/VARCHAR(<=254)/INTEGER/SMALLINT/DECIMAL, no DYNAMIC RESULT SETS; an unqualified CREATE PROCEDURE registers schema SYSPROC (real DB2 uses the statement's qualifier rules)",
        "isolation/locking: SQLite serialized writers, no row/page locks, WITH UR/CS/RS/RR accepted and ignored; COMMIT/ROLLBACK are no-ops (autocommit) — no unit-of-recovery backout",
        "schemas share one namespace (qualifiers stripped via a persisted registry); referential ALTER TABLE FOREIGN KEY accepted, not enforced",
        "DSNTIAUL SYSPUNCH wording and DSNU/DSNT message text approximate (no captured outputs); a dangling line-level COMMIT in a deck is split off (CardDemo DB2LTTYP omits the ;)"
      ],
      "unsupported": [
        "DSNUTILB beyond the LOAD/UNLOAD subset (REORG/COPY/RUNSTATS/CHECK...)",
        "BIND/plan/package semantics (BIND/REBIND/FREE accepted with DSNT232I, no bind repository), SYSIBM catalog beyond SYSDUMMY1/SYSROUTINES/SYSPARMS (-204), SQL-body (native SQL) procedures and non-COBOL LANGUAGE routines (-104 with explicit message) — the DB2-TIER-LADDER.md not-yet rows",
        "DECFLOAT, XML"
      ]
    },
    {
      "name": "CICS (command level + BMS)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "cd_battle 65/65",
          "cics_chan_battle 37/37 (cicsdev corpus)",
          "cics_json_battle 16/16 (CardDemo fraud service verbatim)",
          "cics_svc_battle 28/28 (GenApp corpus)",
          "cd_screens/cd_flow/cd_mdt",
          "browser"
        ],
        "corpus": "real CardDemo CICS programs + BMS maps, 3270 in browser; cicsdev EDUCHAN + async-API redbook web-banking (SG24-8411 captured outputs); GenApp LGSETUP/LGASTAT1 (EPL-2.0)"
      },
      "supported": [
        "SEND/RECEIVE MAP, SEND TEXT, RETURN TRANSID+COMMAREA (pseudo-conversation), XCTL/LINK, READ/WRITE/REWRITE/DELETE/STARTBR/READNEXT/RESETBR, RESP()/DFHRESP, EIB, ASKTIME/FORMATTIME, RETRIEVE (trigger data), SYNCPOINT (MQ UOW)",
        "BMS macro compiler (DFHMSD/MDI/MDF) -> symbolic + physical maps, MDT semantics",
        "CSD define API, trigger-started tasks (CKTI)",
        "channels & containers: PUT/GET (CHAR/BIT, FLENGTH in/out, LENGERR truncation)/MOVE (AS, TOCHANNEL)/DELETE CONTAINER, ASSIGN CHANNEL, current-channel defaulting, LINK/XCTL/START/RETURN TRANSID CHANNEL, CHANNELERR/CONTAINERERR/INVREQ RESP2s",
        "asynchronous API: RUN TRANSID CHANNEL CHILD (channel copied at RUN), FETCH ANY / FETCH CHILD with TIMEOUT/NOSUSPEND (NOTFINISHED 113 RESP2 52/53), COMPSTATUS CVDAs (NORMAL 1016/ABEND 900), response channels",
        "temporary storage: WRITEQ/READQ (ITEM/NEXT/LENGTH/NUMITEMS, QIDERR/ITEMERR/LENGERR)/DELETEQ TS",
        "plain terminal RECEIVE INTO/LENGTH/NOTRUNCATE, DELAY FOR SECONDS/MILLISECS, DFHVALUE() translation (full documented CVDA table)",
        "named counters: DEFINE/GET (INCREMENT/WRAP/REDUCE)/UPDATE/QUERY/REWIND/DELETE COUNTER with pools, INVREQ 201/202/203, SUPPRESSED 101 counter-at-limit",
        "DOCUMENT: CREATE/INSERT (FROM verbatim, SYMBOL, TEMPLATE with &symbol; scan)/SET SYMBOL/RETRIEVE (LENGTH/MAXLENGTH/LENGERR)/DELETE, DOCTEMPLATE via CSD define",
        "JES spool: SPOOLOPEN OUTPUT (CLASS/USERID/NODE/TOKEN), SPOOLWRITE, SPOOLCLOSE -> OUTPUT-queue element under the region name",
        "JSON provider (DFHLS2JS analog): JSONSERVICE CSD resource maps a URI to a program + copybook language structure; POST JSON -> commarea bytes (packed/binary/zoned per the copybook, overpunch signs) -> real task under the URIMAP transaction -> returned commarea -> JSON; channel mode maps JSON keys to containers (CHAR=string, BIT=hex)",
        "plain RETURN ships the (possibly modified) DFHCOMMAREA back to LINK callers and the JSON provider — the same-storage semantics of the real machine"
      ],
      "deviations": [
        "translator strips sequence columns in multi-line EXEC CICS (real numbering conventions honored)",
        "FETCH response-channel names are ZWSRSP-prefixed (real CICS wording of generated channel names not captured)",
        "TS queues are region-lifetime in-memory (no aux persistence/recoverability)",
        "SYNC slack bytes never inserted (-fsynchronized-clause=ignore): pinned by SG24-8411 captured outputs of GET CONTAINER INTO a SYNC-headed group",
        "DISPLAY from CICS tasks goes to the region log (real: CEEMSG/CEEOUT of the region job)",
        "named counters are region-lifetime in-memory (real: coupling-facility server); DCOUNTER doubleword forms absent",
        "SPOOLOPEN INPUT absent; each SPOOLCLOSE lands as its own JES OUTPUT entry (real: spool file under the region job)",
        "DOCUMENT symbol substitution only in template data (per reference); no code page conversion / HOSTCODEPAGE",
        "JSON schema derives directly from the copybook at request time (no DFHLS2JS bind/wsbind artifacts); requests are unauthenticated like an open TCPIPSERVICE"
      ],
      "unsupported": [
        "GET CONTAINER SET() pointer mode, STARTBROWSE/GETNEXT CONTAINER, CCSID/DATATYPE conversion on GET",
        "START INTERVAL/AFTER delays (immediate), REQID/CANCEL",
        "SOAP web services, JSON requester mode, z/OS Connect API artifacts (demand-driven)",
        "ECI/CTG (Java/JCA COMMAREA clients): no native ECI-over-TCP listener and no CTG wire compatibility — demand-gated; the published week-1 migration answer is re-pointing clients at the JSON services surface (Service Mapper mapping + OpenAPI → one HTTP POST per LINK; see ECI-CTG-ANSWER.md)",
        "CICS sockets (EZASOKET/EZACIC* from CICS programs): the same missing runtime module as batch (observed there 2026-07-17: \"module 'EZASOKET' not found\" at the CALL) — a CICS task resolves dynamic CALLs through the identical cobcrun/libcob path, so the CALL fails the task, which abends under the default ASRA mapping with the module-not-found line in the region log (cics.js task-exit flow; code-verified, not run-probed); no listener-transaction (EZAO/CSKL) analog exists — socket-server designs re-map onto the JSON services surface (ECI-CTG-ANSWER.md pattern), demand-gated"
      ]
    },
    {
      "name": "IMS DL/I (DB) + IMS TM (MPP/BMP/MFS)",
      "status": "verified",
      "proof": {
        "suites": [
          "ims_battle 87/87 (real IMS 15.1 captures)",
          "ims_tm_battle 25/25 (TM lab corpus)"
        ],
        "corpus": "complete DFSDDLT0 lab corpus with outputs captured on REAL IMS 15.1 — line-for-line/byte-for-byte matches documented per stream"
      },
      "supported": [
        "DBDGEN/PSBGEN, DFSRRC00 (DLI/DBB), DFSDDLT0 clean-room incl. PRINTDD format",
        "GU/GHU/GN/GHN/GNP with qualified/Boolean SSAs (*,&,+,|), command codes C/D/F/L/P/U/V",
        "ISRT load+update, REPL/DLET with DA/DJ rules, key feedback AREA semantics incl. stale-byte reproduction, status codes GE/GB/GA/GK/II/LB/LD/AC/AD/AH/AK",
        "CBLTDLI socket bridge (COBOL), in-process PLITDLI (PL/I)",
        "IMS TM: message queues + MPP scheduling (IO-PCB GU/GN/ISRT until QC, ALT/EXPRESS TP PCBs with CHNG/PURG), COBOL (CBLTDLI, dlidrv TM masks) and PL/I (PLITDLI, fullword-LL convention, PCB pointer OR structure argument) MPPs",
        "MFS: MFSUTL (DFSUPAA0/DFSUNUB0) gens MSG/SEG/MFLD + FMT/DEV/DIV/DPAGE/DFLD (ATTR/EATTR colors, X-in-72 continuation in literals); /FOR renders the DOF; MID maps device fields to the message (JUST/FILL, (dfld,literal) prefills); replies map through the MOD",
        "BMP region: IMSBATCH proc, ACBLIB resolution (ACBGEN proc / DFSRRC00 UPB with BUILD PSB=), online databases attach through the region config (no DB DDs, like MYBMPRUN.jcl); PCB numbering counts TP PCBs in PSBGEN order",
        "DFSMPR proc: MSG region drains the queues and reports DFSSTAT (a real MPR waits for work — TLIM-style deviation)"
      ],
      "deviations": [
        "HDAM root physical order: clean-room hash at the DFSHDC40 interface — real translation tables are not public, full-scan root order differs (documented; will NOT be closed from IBM licensed source)",
        "control region config (transactions/databases/format lib) is a JSON API, the sysgen APPLCTN/TRANSACT + MODBLKS analog — stage-1 macro import not implemented",
        "an implicit always-ready MPR schedules on message arrival; no classes/priorities/PWFI",
        "no captured real TM outputs exist upstream — TM assertions are on the lab programs’ deterministic replies (the DB corpus keeps its 87/87 captures)",
        "MFS subset: OPT=2 single-segment paths, no paging/DSCA processing/PFK literals/SYSMSG field, FILL=PT treated as blank fill"
      ],
      "unsupported": [
        "IMS Connect / OTMA-TCP clients (IMS TM Resource Adapter, HWSSMPL0/1-style socket clients): no listener speaks the IRM/OTMA protocol — OBSERVED 2026-07-17: zero OTMA/HWS/IMS-Connect handler code anywhere in server/ (grep), the only socket the TM region opens is the internal AF_UNIX DL/I bridge (dlicall-*, imstm.js — not reachable by TCP clients), and the listener registry (listeners.js) maps only web/json-svc/tn3270e conversation types, so no port is ever bound for an IMS Connect client to reach — connects fail because nothing listens. Migration follows the ECI/CTG pattern (ECI-CTG-ANSWER.md): re-map each client transaction to a JSON service call — the transactions themselves run natively as MPPs; a native IRM/OTMA listener is demand-gated"
      ]
    },
    {
      "name": "MQ (queue manager emulation)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "mq_battle 27/27"
        ],
        "corpus": "real IBM CSQ4BV* samples + real CMQ* copybooks + CardDemo CICS trigger flow"
      },
      "supported": [
        "MQCONN/OPEN/PUT/PUT1/GET/CLOSE/DISC/CMIT/BACK at version-1 structure offsets",
        "get-wait, browse cursors, MsgId/CorrelId, truncation 2079/2080, reason codes 2033/2058/2085/...",
        "TRIGTYPE(FIRST) with real MQTM to CICS (CKTI), CSQUTIL COMMAND (MQSC DEFINE/DELETE/DISPLAY)",
        "RC>255 visible as step CC"
      ],
      "deviations": [
        "puts inside syncpoint visible immediately (real MQ defers to commit)",
        "CSQUnnnI wording approximate (no public captures)"
      ],
      "unsupported": [
        "model/alias/remote/dynamic queues, MQINQ/MQSET, expiry, priority ordering, report options, channels/DQM"
      ]
    },
    {
      "name": "SCM (Endevor-style)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "ndvr_battle 28/28"
        ],
        "corpus": "CBT tape 560 real Endevor batch jobs + Broadcom GCOB5 processor reference; CardDemo sources as elements"
      },
      "supported": [
        "NDVRC1 C1BM3000 SCL (ADD/UPDATE/GENERATE/MOVE/RETRIEVE/DELETE/LIST/PRINT HISTORY), ENBE1000 environment admin",
        "DEV->PRD map, stages, level history with CCIDs, base-library write-through, generate processors with &C1* symbols resolved up the map"
      ],
      "deviations": [
        "C1MSGS1/C1PRINT wording shaped like real reports but approximate (no captures)"
      ],
      "unsupported": [
        "packages (CAST/APPROVE/EXECUTE), footprints, ACM, TRANSFER/ARCHIVE, delta storage"
      ]
    },
    {
      "name": "Scheduler (CA-7 + Control-M import)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "sched battle 36/36"
        ],
        "corpus": "CardDemo's real CA-7 LJOB and Control-M XML definitions"
      },
      "supported": [
        "CA-7 LJOB + Control-M XML importers -> executable schedule",
        "async JES2 cycle runner, global IOA conditions, option 7 dialog"
      ],
      "deviations": [
        "calendar subset; MVSWAIT stub"
      ],
      "unsupported": [
        "full calendar algebra, forecasting, SMF-driven triggers"
      ]
    },
    {
      "name": "Security (RACF import + enforcement)",
      "status": "subset-verified",
      "proof": {
        "suites": [
          "racf battle 43/43"
        ],
        "corpus": "real RACF command decks + a real ADCD IRRDBU00 unload"
      },
      "supported": [
        "TSO command processors (ADDUSER/ALTUSER/PERMIT...), logon write-through (protected/REVOKE real)",
        "ZWSRACF: IRRDBU00 unload -> command deck conversion (verified column offsets)"
      ],
      "deviations": [
        "'+' continuation joins mid-word (documented gotcha)"
      ],
      "unsupported": [
        "dataset-profile enforcement on every access path, PassTickets, MFA, generic profile matching depth"
      ]
    },
    {
      "name": "REST admin API v1 (ESCWA-parity surface)",
      "status": "verified",
      "proof": {
        "suites": [
          "admin_api battle 97/97 (coverage gate: all 87 documented operations exercised)",
          "debug battle 32/32 (real CBACT01C breakpoint/step/inspect under a JCL step)"
        ],
        "corpus": "the OpenAPI document itself is generated from the dispatch table (web/openapi.json == GET /api/openapi.json, asserted); modernization-IDE bridge + CI suites run over these endpoints"
      },
      "supported": [
        "87 operations across datasets/records (binary-safe hex), VSAM utility, JES2 jobs/spool (incl. long-poll wait), TSO/ISPF + edit macros, SPUFI, CICS CSD/define/log, IMS TM region/queues/log, MQ read views, Endevor-style repo, ZWS scheduler (order/demand/cycles), RACF views, system info/users",
        "token scopes: session tokens (logon, scope *) + persistent API tokens stored hashed (POST /api/tokens), per-operation x-required-scope, <area>.write/.admin imply <area>.read, 403 on insufficient scope",
        "OpenAPI 3.0 spec generated from the route registry: GET /api/openapi.json (live) == web/openapi.json (committed, node tools/openapi.mjs); human-readable /api.html",
        "observability: /metrics (Prometheus text: api_requests_total{op,status}, JES/MQ/IMS queue gauges), GET /api/health (public), structured audit trail of every mutating call (JSONL at ROOT/audit.jsonl, GET /api/audit, passwords never logged)",
        "ephemeral instance provisioning: POST/GET/DELETE /api/instances (fresh seed or clone of the estate, OS-allocated ports, TTL auto-dispose, children die with the parent)",
        "backup/DR: quiesced snapshots (JES2 initiator drains first) as sha256'd tar.gz, download, restore-to-instance, offline in-place restore (tools/restore.mjs); RPO/RTO in BACKUP-DR.md",
        "print/output management: destination/writer views (GET /api/spool/dests), spool export as text or PDF (?format=pdf&cc=asa honors ANSI carriage control)",
        "debug-under-subsystem: PARM=TEST compile + /api/debug sessions - breakpoints by line/paragraph, step/continue, live variable reads (DISPLAY/COMP-3/BIN decoded) via an in-process trace shim (no ptrace)"
      ],
      "deviations": [
        "mutations keep their authentic paths: MQ definitions via CSQUTIL MQSC, RACF via TSO command processors, scheduler import via PGM=ZWSCHED - the API adds read views + lifecycle, it does not duplicate the native surfaces",
        "'content' path segment kept as an undocumented legacy alias of 'member'",
        "instance clone copies a RUNNING data root (documented); quiesced consistent snapshots are the backup/DR item (GAPS 3.4)",
        "restore does not resume in-flight work: jobs queued at snapshot time stay INPUT after restore (JES2 cold-start semantics) - resubmit them",
        "debug: trace-before-execute stop semantics; REDEFINES/LINKAGE fields not inspectable; variables read-only; PARM=TEST compiles -O0 + relaxed EC-DATA-INCOMPATIBLE (Enterprise-COBOL-TEST-like NOOPT)"
      ],
      "unsupported": [
        "fine-grained dataset-level authorization (tokens scope by area, not by HLQ)"
      ]
    },
    {
      "name": "Multi-instance scale-out, step 1 (application router)",
      "status": "verified",
      "proof": {
        "suites": [
          "router battle 19/19 (two spawned backends: partition routing, shared-nothing isolation, logon fan-out, jobid registry + cross-backend probe, merged estate views, app pinning, WS terminal proxy)",
          "CardDemo acceptance: cd battle 65/65 + cd options 17/17 run THROUGH the router against a two-backend topology (estate clone + fresh), second partition serving its own jobs concurrently"
        ],
        "corpus": "the CardDemo battle suites unchanged, pointed at the router URL (ZOSWEB_URL)"
      },
      "supported": [
        "N shared-nothing instances behind one front door (server/router.js, config-driven), partitioned BY APPLICATION: HLQ prefix rules for datasets, jobname-prefix + DSN-scan rules for submitted JCL",
        "one logon spans every partition (router session token mapped to per-backend tokens); zws_ API tokens and direct backend tokens pass through untouched",
        "merged /api/jobs and /api/datasets estate views; jobid ownership registry with cross-backend probe for jobs submitted behind the router",
        "X-ZWS-App header / ?zwsApp= query pins any request (including WebSocket terminals) to one partition",
        "aggregate /api/health, router /metrics (per-backend request counters), /api/router topology view; spawned backends die with the router"
      ],
      "deviations": [
        "this is horizontal scale-out, NOT a sysplex: no shared spool, no cross-instance ENQ/GRS, no VSAM/DB2 data sharing — an application lives wholly on one backend (shared state stores are roadmap item 4.2)",
        "jobids are per-backend sequences (JOB00001 exists on every backend); only jobs submitted through the router are unambiguous, foreign jobids resolve to the first backend that knows them",
        "users/RACF and API tokens are per-backend; the logon fan-out assumes the same credentials on every partition",
        "router /metrics exposes routing counters only — each backend keeps its full Prometheus surface on its own port"
      ],
      "unsupported": [
        "PAC-style shared state stores / failover between backends (roadmap 4.2)",
        "cross-partition JCL (a job referencing two applications' datasets runs where the first rule match sends it)"
      ]
    },
    {
      "name": "SQL views over datasets (read-only reporting/coexistence)",
      "status": "verified",
      "proof": {
        "suites": [
          "sqlview battle 14/14 (real CardDemo ACCTDATA/CARDXREF KSDS + real CVACT01Y/CVACT03Y copybooks; the CICS account-view screen and the SQL view agree on the same live record — two independent decode paths)",
          "admin_api battle 100/100 (91-operation coverage gate incl. the four sql operations)"
        ],
        "corpus": "the in-repo CardDemo estate queried by a REAL libpq client (psql) over the PostgreSQL wire listener"
      },
      "supported": [
        "view registry: a dataset (PS or VSAM) + a COBOL copybook become live typed columns (POST/GET/DELETE /api/sql/views); re-materialized from the dataset bytes on EVERY query — a BI tool always sees the estate as it is now",
        "charset-aware decode: PS datasets EBCDIC at rest (zoned sign in the zone nibble), VSAM clusters as the program image (latin1 text, GnuCOBOL overpunch glyphs); COMP-3 and big-endian COMP/BINARY; OCCURS flattened to NAME_1..N, FILLER dropped, '-' becomes '_'",
        "read-only SQL: SELECT/WITH/EXPLAIN on an in-memory SQLite (JOINs, GROUP BY, aggregates across views); POST /api/sql over HTTP with token scopes",
        "PostgreSQL wire listener (ZOSWEB_SQL_PORT): protocol v3 with cleartext-password auth against the TSO logon map (RACF revoke honored, authentic IKJ messages on failure); psql/DBeaver-class clients connect directly"
      ],
      "deviations": [
        "strictly read-only — writes stay on the authentic paths (JCL, IDCAMS, the records API); INSERT/UPDATE/DELETE are rejected on both surfaces",
        "PG wire speaks the SIMPLE query protocol only; extended (parse/bind) messages get a clean ErrorResponse — clients relying on prepared statements must use simple mode",
        "every wire result column is typed text (OID 25); numeric typing lives in the HTTP surface's decoded values",
        "REDEFINES follows the copybook parser: the first definition owns the bytes"
      ],
      "unsupported": [
        "write-through RDBMS-backed datasets (roadmap 4.3) and the DB2-dialect-on-PostgreSQL layer (4.4)",
        "SSL/GSS on the wire listener (negotiation declined per protocol)"
      ]
    },
    {
      "name": "Application deployment & estate onboarding (SteelFrame Enterprise Server)",
      "status": "verified",
      "proof": {
        "suites": [
          "apps_deploy battle 18/18 — the acceptance spine: real AWS CardDemo packaged as an immutable .sfapp, deployed to a FRESH child instance over nothing but the documented API (every step a real JES2 job on the target), then the ENTIRE cd_battle (65/65: real JCL/COBOL/CICS/VSAM behavior) green against the deployed system; v1.1 redeploy flips behavior, rollback restores it",
          "onboard battle — the rehost funnel: CardDemo zipped the way a customer would send it → classified plan (copybook resolution, VSAM geometry harvested from the estate's own IDCAMS DEFINEs incl. DD-resolved REPRO pairs) → loaded → compile-all catches the checkout's two genuinely-invalid programs (CBEXPORT/CBIMPORT: RECORD KEY names a WORKING-STORAGE item) → real IRRDBU00 + CA-7 imports → packaged + provisioned + deployed; cd_battle rounds 1-2 green on the onboarded child",
          "apps battle 23/23 (registry/bundle semantics) + sf_app battle 15/15 (CLI incl. two-system promote) + admin_api battle coverage gate over every apps.*/onboard.* operation"
        ],
        "corpus": "the official aws-mainframe-modernization-carddemo checkout (sources, copybooks, JCL, BMS, HLASM, EBCDIC data)"
      },
      "supported": [
        "applications are named, versioned, IMMUTABLE source bundles (.sfapp tar.gz: manifest + members by library + PS/VSAM record hex + filtered CSD subset), packaged from the live estate by HLQ prefixes, exported/imported byte-identical (per-entry sha256 verified)",
        "deploy to any target — this system, an ephemeral child, a remote engine — through the target's documented API: allocate, load source, seed data (same-representation record copy, charset-safe), assemble BMS (DFHBMSCP jobs), compile-link every COBOL program (IGYWCL jobs), install CSD; deployment record carries per-step status + target jobids",
        "program activation needs no NEWCOPY plumbing: modules materialize from the LOADLIB member bytes on every invocation, so a recompiled member is live on the next task by construction",
        "rollback restores the pre-deploy load library copy + the CSD entries the deploy replaced — works after FAILED deploys too (a failed compile step leaves a partially updated loadlib; that is when the backup matters)",
        "promote = the same immutable bundle imported + deployed on the next system (sf app promote)",
        "estate onboarding: zip/tar upload (zero-dep unzip) or FTP for big estates; readiness plan (language classification, program facts, missing copybooks, blocked jobs, VSAM geometry from the estate's own IDCAMS, LRECL proposals from DD-resolved REPRO pairs); load; compile-all with per-program diagnostics; RACF/CA-7/Control-M imports through the native ZWSRACF/ZWSCHED paths; finish = package + provision + deploy"
      ],
      "deviations": [
        "bundles are SOURCE bundles compiled on the target — never binary load modules (they are host-native objects here; Micro Focus deploys compiled .dll/.so artifacts)",
        "CSD install goes through the CEDA-style /api/cics/define, not a DFHCSDUP step; there is no CSD GROUP dimension",
        "rollback cannot DELETE CSD entries a deploy introduced (no CEDA DELETE surface) — they are reported, not hidden",
        "AIX PATH datasets are not auto-rebuilt by deploy: the estate's own DEFINE AIX/BLDINDEX JCL creates them (harvested and named in the onboarding plan)",
        "onboarding zip reader: no zip64 (>4GB) — the FTP path is the answer for big estates",
        "non-COBOL programs (HLASM/PLI) are loaded but not auto-compiled by deploy (corpus-driven: CardDemo's HLASM corpus is assembled by its own jobs)"
      ],
      "unsupported": [
        "XA/two-phase-commit coordination to external resource managers during deploys",
        "binary artifact repositories / load-module intake (first principle 8)"
      ]
    }
  ]
}
