Skip to main content

throughline-transform

A throughline requirements graph on disk — committed or not — in the forms its readers open. One command, one file:

pipx install throughline-transform      # pulls tl along too

tl-transform md      -C idd             # Markdown, written by the tool itself
tl-transform notes   -C idd             # a folder of notes for Obsidian (zip)
tl-transform notes   -C idd --folder    # …or the folder itself, ready to open as a vault
tl-transform csv     -C idd             # one row per item, a links file, a file per cited source (zip)
tl-transform xlsx    -C idd             # the same as a read-only workbook that still sorts and filters
tl-transform docx    -C idd             # a Word document: title page, contents, a heading per item
tl-transform html    -C idd             # a print-ready page — print it to PDF from any browser
tl-transform assistant -C idd           # a folder an assistant that cannot run tl reads whole: one file per register, and how to answer

It is the command-line half of the throughline editor's export: the same six forms, laid out the same way, from the graph as it stands on your disk. The editor needs the graph on GitHub. This does not — it reads the working tree, and the output says whether that tree was clean, carried uncommitted changes, or was not under version control at all.

What it does not do

It never renders an item's words. The Markdown is asked of tl docs over a document of directives; the structure is read from tl dump. What this package adds is the containers — a workbook, a Word document, a folder of notes, a print-ready page — and the front matter and link syntax a note tool reads. If a requirement here rendered prose, it would drift from what tl docs --check gates, and a document that quietly differs from the published specification is worse than none. That is NG-0001.

It ships no PDF writer (NG-0002). Every browser prints to PDF with a renderer that is already on the machine.

It depends on nothing but the family. throughline alone (composition is the Tool's own since 3.11.1), and the standard library's zipfile for the two Office formats, which are written from their own specifications.

Which tool answers

Every graph is read through tl, which composes a graph that declares [[sources]] itself, so a borrowed clause is written with the reference number a conformance document exists to carry. The tool is found beside this package's interpreter first and on the path second, and is run as a command — its command line is the surface it publishes.

The outputs

Format What you get
md The tool's own document: a summary, a catalogue of every item in full, the mirrored clauses of adopted sources. --body table or both for a one-line-per-item table, --matrix for one traceability matrix per grounding link type, --markers to keep the region markers so tl docs can refill the file later.
notes One Markdown note per item in a folder per register: YAML front matter as properties (type, status, attributes, the title as an alias, a tag each for type and status), a heading of the identifier and title, the item's words, rationale and links, then what links to it — Implements this, Derives from this — every identifier a [[wikilink]]. Cited clauses under sources/<namespace>/, the colon in their name replaced by a space. Open the folder as an Obsidian vault: the graph view is the intent graph, and a note's backlinks are what rests on it.
csv A zip of one file of items (or one per register with --split per-register), links.csv with one row per link naming the sheet at each end, one file per cited source, and the provenance.
xlsx The same as sheets, read-only by recommendation with the structure locked and no password. Sorting and filtering stay allowed; a spreadsheet nobody can sort is one nobody can review.
docx A title page with the provenance, a contents field Word fills in, a section per register, a heading per item with its type and status beneath, its words as a quotation, its rationale, its attributes in small print, and one appendix per cited source.
html The same document as one self-contained page with print typography, A4 page rules and a contents list of links. Print it to PDF; the browser numbers the pages.
assistant A folder for an assistant that reads only a few files and cannot run tl — Microsoft 365 Copilot in a controlled environment reads at most fifty: one file per register carrying its items exactly as tl dump gives them, each with its fingerprint, and a manifest naming the repository, ref, commit and tree state, the file of each register, the tl that wrote it, and the change-set form tl apply accepts, taken from tl apply --describe, with the instruction to answer with a change set quoting each fingerprint and never with rewritten files. --wrap md writes each file as Markdown holding one fenced JSON block, for an assistant that will not read a .json file. Always a folder, never an archive.
blocks The document's structure as JSON — the same list of headings, quotations, paragraphs, attribute lines, tables and appendices the Word and HTML outputs are built from — for a front end that lays out its own pages. The editor's PDF is laid out from it.

Every output carries the repository, ref, commit, working-tree state and tool version it was taken from, because an output outlives the tree that made it and the first question anyone asks of one is what it was true of. A caller that knows them without git — the editor holds them from its clone — states them with --repository, --ref, --commit and --tree clean|dirty|untracked, and git is then not consulted.

--only UID[,UID…], given once or more, narrows any format to the items it names: the catalogue, table and matrices hold only those, the tables only their rows and the links between them, the notes only their notes, and the clauses mirrored are only the ones they cite. The output then says Items: n of N, because a partial document read as a whole one misleads. An identifier the graph does not hold is a usage error (exit 2), and nothing is written.

A quick run is silent. When a step — reading the graph, asking the tool to write the document, writing the file — has run for a second, one line on stderr says which, because a composed graph fetching its sources for the first time otherwise reads as a hang.

One implementation, two surfaces

The throughline editor runs this package as a wheel under Pyodide beside tl, so an export from a browser tab and an export from a terminal are the same bytes for the same graph at the same commit. Pyodide has no processes, so there the tool calls the console entry point tl declares in its package metadata — the same function the command runs — instead of spawning it.

Self-hosting

This repository's own requirements live under idd/ and compose throughline's graph as a pinned source, so a requirement here can cite the clause of the tool it reads (satisfies: tl:SR-0111) and have the citation resolved rather than asserted.

tl -C idd check --strict             # the grounding gate
tl -C idd docs --check               # idd/docs/spec.md must match the graph
tl-transform html -C idd             # and the tool over its own graph

Apache-2.0. Created by Dr Henry J Grech-Cini; see PROVENANCE.md.

Metadata

Release files for throughline-transform 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for throughline-transform 0.6.0
File Size Uploaded
throughline_transform-0.6.0.tar.gz 53.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for throughline-transform 0.6.0
File Interpreter ABI Platform
throughline_transform-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 98.4 kB

Release files / throughline_transform-0.6.0.tar.gz

Download URL throughline_transform-0.6.0.tar.gz
Size 53.2 kB
Tags Source
SHA-256 checksum
How to use checksums
02827e7ddc1dc828ef5d68988002cf026afe1e409e0f6bb89297524c9d6952a4
BLAKE2b-256 checksum
How to use checksums
3b9ba741964807958268024e47b4b835b7b0d17bc55be4d04762338118750c76
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / throughline_transform-0.6.0-py3-none-any.whl

Download URL throughline_transform-0.6.0-py3-none-any.whl
Size 45.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fc568e5fc560f2e1caa697e27d8c50670ea0efabd8643fb005b771ac854c65d3
BLAKE2b-256 checksum
How to use checksums
b76438cba0ec2d2d1b1f1d4ad169d0144b5197214e0b5540ee1c91fc2db3532e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page