throughline-ms-copilot
Work on a throughline requirements
graph with Microsoft 365 Copilot, in an environment where Copilot is the only
assistant you have: it reads at most fifty files, runs no command and answers
only in text. tl-ms-copilot writes the graph as a folder Copilot reads whole,
and carries the changes Copilot sends back into the graph as proposals, through
tl apply, all or nothing.
pipx install throughline-ms-copilot
tl-ms-copilot export -C idd ~/OneDrive/graph-exchange # the folder Copilot reads
# … give Copilot every file in graph-exchange/export/, ask for changes,
# save each answer into graph-exchange/inbox/ …
tl-ms-copilot ingest -C idd ~/OneDrive/graph-exchange --dry-run
tl-ms-copilot ingest -C idd ~/OneDrive/graph-exchange # carried out by tl apply
tl -C idd check
The graph's content moves only between your computer and GitHub. The package
runs tl in-process and starts no process, so it runs unchanged under Pyodide
in a browser tab beside the folder you chose — which is how
sync.iddn.uk offers it on a laptop where nothing can be
installed.
The exchange folder
graph-exchange/
├── export/ written by `export`, replaced whole each time
│ ├── manifest.json what the export was true of, and how to answer
│ ├── INT.json REQ.json TEST.json … one file per register
│ └── source-<ns>.json the clauses an adopted source lends
└── inbox/ Copilot's answers, saved by you
├── new/REQ.md new items for one register
├── updates/REQ.md amend, link, unlink, delete on one register's items
├── anything.md a whole change set, any registers
└── applied/<when>/ where `ingest` moves what it carried out
Why one file per register. Copilot's cap counts files, not items. A graph
holds hundreds of item files but fewer than fifty registers, so one file per
register is the smallest layout Copilot can read whole. --wrap md writes each
file as Markdown holding one fenced JSON block, for a Copilot that will not read
.json files. --only UID,… narrows the export to the items named.
Why changes come back as a change set, not as files. Copilot's answer is
length-capped: a rewritten register file cut off half-way would read as the
deletion of everything after the cut. A change set names only what changes, and
tl apply refuses the whole set if any item it touches changed since the export.
The manifest carries the form, as tl apply --describe states it, and tells
Copilot to answer in one fenced json block.
Why answers are saved by register. For long work, ask Copilot for one
register at a time — the new items for REQ, then the changes to REQ's items —
and save each answer as inbox/new/REQ.md or inbox/updates/REQ.md. Paste the
whole answer; the change set is found inside it. ingest gathers every file into
one change set: new items first, each after any new item it links to, then the
updates, then whole sets. It checks each file holds what its place says, and
moves what it applied into inbox/applied/ so nothing is applied twice.
Why there are no ID conflicts. Copilot never chooses a UID. A new item is
named by a label, and another item in any answer links to it as $label;
tl allocates the real UID when the set is carried out, against the graph as it
then stands.
Everything Copilot drafts arrives with origin ai and waits as proposed: a
person decides. Decisions — ratifying, withdrawing — are never in a change set.
Commands
| Command | What it does |
|---|---|
export [-C DIR] EXCHANGE [--wrap json|md] [--only UID,…] |
Writes EXCHANGE/export/ and creates EXCHANGE/inbox/new and inbox/updates. |
ingest [-C DIR] EXCHANGE [--dry-run] |
Gathers EXCHANGE/inbox/ into one change set and has tl apply carry it out. |
apply [-C DIR] [REPLY|-] [--dry-run] [--extract] |
The same for one saved reply. --extract prints the change set found and stops. |
export reads the repository, ref, commit and working-tree state from git;
--repository, --ref, --commit and --tree state them instead, as a host
with no git — the browser — does.
Working on it
Its requirements live in idd/; see AGENTS.md.
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
pytest -q
tl -C idd check
Apache-2.0. Microsoft 365 Copilot is a product of Microsoft Corporation; this project is not affiliated with or endorsed by Microsoft.
Metadata
Release files for throughline-ms-copilot 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| throughline_ms_copilot-0.1.0.tar.gz | 31.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| throughline_ms_copilot-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 56.2 kB
Release files / throughline_ms_copilot-0.1.0.tar.gz
| Download URL | throughline_ms_copilot-0.1.0.tar.gz |
|---|---|
| Size | 31.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0f7d6f2fbb74133d4a8868618aa6e286da085d8989ebd50b00c709d366dffd83
|
|
BLAKE2b-256 checksum How to use checksums |
f233c395bda190d3cc887b3f2e22b4b49ac6e4a9ee42be2b0c54fb597dcd0179
|
| 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 18, 2026.
Transparency logRelease files / throughline_ms_copilot-0.1.0-py3-none-any.whl
| Download URL | throughline_ms_copilot-0.1.0-py3-none-any.whl |
|---|---|
| Size | 24.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
40a743738287a1b1d40821c8fe92a7a0255b9893edd246146f42ee9870fa80e3
|
|
BLAKE2b-256 checksum How to use checksums |
1f093b21382d4babc489bc35525a6f4945accf2518392ae39d6fa4b242944da3
|
| 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 18, 2026.
Transparency logSecurity for throughline-ms-copilot 0.1.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for throughline_ms_copilot-0.1.0.tar.gz
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 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.