Canyonland Technologies Inc.

Portfolio

What this looks like in production.

Two kinds of work. Client engagements, described at the level our agreements permit, and the tools we build ourselves, which are open source — you can read the code, run it, and judge the engineering directly. Each engagement is tagged with the lifecycle stages it covers.

Client engagements

Selected work

Four engagements, tagged with the lifecycle stages each covers. Select one to read the full write-up.

01

Production payroll for a statewide workforce

Prime systems integrator · large public-sector agency

Parallel payroll streams on a mainframe platform where a single missed cycle means people are not paid on time.

Extract · Enable

Challenge

Parallel payroll streams — regular, overtime, and separately funded grant payrolls — on a mainframe platform where a single missed cycle means people are not paid on time.

Approach

Own setup and execution of every payroll type, maintain the reporting programs behind them, and carry the platform through fiscal-year transitions where dataset, calendar, and holiday-table changes must land together and in order.

Outcome

Payroll lands on schedule through every cycle and fiscal-year boundary, with weekly written status reporting to agency and vendor stakeholders.

z/OS · COBOL · JCL · Roscoe RPF · CA-Scheduler · Panvalet · Datacom/IDMS

02

Root-cause recovery on a failed payroll cycle

Prime systems integrator · large public-sector agency

Two faults presenting as one outage, against a deadline that does not move.

Extract · Enable

Challenge

A production program abended mid-cycle while a concurrent tape-management failure left output datasets uncataloged — two faults presenting as one outage, against a deadline that does not move.

Approach

Isolated the abend to its failing step, separated it from the underlying tape library and retention-key expiry issues, and rebuilt the affected datasets. Wrote up the recovery analysis and a resolution plan.

Outcome

The cycle was recovered and completed on schedule. That failure class is now documented and handled by the operations team without escalation.

z/OS · COBOL · JCL · CA-1 tape management · virtual tape

03

Statutory workforce reporting, moved onto SQL

Prime systems integrator · large public-sector agency

Legacy report-writer jobs few people could read, and nobody could query ad hoc.

Extract · Land · Model · Build

Challenge

Compliance and workforce reports — headcount, affirmative-action, personnel breakdowns — were produced by legacy report-writer jobs few people could read and nobody could query ad hoc.

Approach

Converted the report-writer logic to SQL with output parity line for line, then opened the underlying employee data to direct analysis and pivot-based summaries.

Outcome

Reporting logic became reviewable, testable, and reusable. Questions that once required a new report request are now answered directly against the data.

EZTrieve · SQL · Datacom · Excel modeling

04

Automated documentation for undocumented COBOL estates

Selected for a cloud provider's innovation program

Documentation that either doesn't exist or describes a system from three decades ago.

Enable

Challenge

Documentation for a decades-old estate either doesn't exist or describes a system from three decades ago, and the people who could fill the gap from memory are retiring.

Approach

Building a generator that reads COBOL source, JCL, and data dictionary definitions and produces maintainer-grade documentation — what a program does, what it reads and writes, where it sits in the batch flow — grounded in the source rather than invented by the model.

Outcome

In active development, working from a corpus of production COBOL programs, JCL skeletons, and Datacom dictionary definitions.

Cloud infrastructure · LLM tooling · COBOL · JCL

Client names and agency identities are withheld under contract. Engagements are described at the level our agreements permit.

Open source · Python · MIT

estatemap

A documentation generator for COBOL and JCL estates. It reads the source that is actually running and writes down what it says — with a file and line reference for every fact.

Tool

Documentation that outlives the people who remember

Built and maintained by us · Separate from engagement 04 above

Problem

Documentation for a decades-old estate either doesn't exist or describes a system from three decades ago. The people who could fill the gap from memory are retiring, and every year the gap widens.

Approach

A deterministic parser — no model in the extraction path. It handles real fixed-format source: sequence numbers, the indicator column, Area A and B, comment cards, continuation lines. Then it cross-references COBOL against the JCL that runs it.

Why it matters

A generated document that is 95% right is worse than none, because a maintainer cannot tell which 5% to distrust. Anything unresolvable is reported as a gap rather than filled in with a plausible guess.

EnablePython · COBOL · JCL · zero dependencies · 57 tests

The hard part

Resolving what a name actually points at

Parsing one program tells you it opens a file called EMPMAST. That is not yet useful. EMPMAST is a DD name — an alias local to that program. The dataset behind it lives in the JCL, and it differs per job.

Joining the two is what turns a pile of parsed files into a map, and it is the step hand-written documentation gets wrong or lets go stale. Once the join exists, the batch data flow falls out of it: one program writes a dataset, the next step reads the same one. That relationship is nowhere in either source file on its own.

The same join surfaces the things nobody wrote down — programs called but missing from the corpus, paragraphs nothing ever performs, DD names no job supplies. On an inherited estate, that list of gaps is usually the most valuable page the tool produces.

Output

Written for the order maintainers ask questions in

Where does this run, what does it touch, what does it call, how is it structured. A program page answers them in that sequence.

index.md
Inventory, batch flow, and the gaps
programs/<NAME>.md
One page per program
estate.json
The full model for the next tool
estatemap check
Fails a build when gaps appear

Alpha, and in active development. Everything described above is what it does today, not what it is planned to do — and the source is public, so you can check that for yourself rather than taking our word for it.

Try it

Run it on your own source.

Paste a COBOL program — and its JCL, if you have it — and the same extraction rules run here, in your browser. Nothing is uploaded and nothing is stored; the source never leaves your machine.

About 34KB, fetched only when you ask for it, so the page itself stays light.

This is a JavaScript port of the extraction rules, checked against the same fixtures as the Python tool: it agrees with it on every extracted fact — files, access modes, record layouts, the PERFORM graph, calls, SQL, and every cross-reference. A demo that quietly disagreed would undermine the determinism the tool is built on, so the comparison is part of the test suite.

Next

Tell us what's stuck.

If any of the above resembles the problem in front of you — a mainframe nobody wants to open, a report whose logic exists only in code, a dashboard nobody trusts — describe it and we'll tell you honestly whether we're the right people. The first consultation is free.