throughline-compose 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/LICENSE +1 -1
  2. throughline_compose-0.3.2/MANIFEST.in +5 -0
  3. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/NOTICE +2 -2
  4. {throughline_compose-0.3.0/src/throughline_compose.egg-info → throughline_compose-0.3.2}/PKG-INFO +8 -8
  5. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/README.md +3 -3
  6. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/pyproject.toml +5 -5
  7. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/__init__.py +2 -2
  8. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/cli.py +2 -2
  9. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/git_resolver.py +1 -1
  10. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/resolve.py +1 -1
  11. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/resolver.py +1 -1
  12. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/sources.py +1 -1
  13. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/spi.py +1 -1
  14. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose/union.py +1 -1
  15. {throughline_compose-0.3.0 → throughline_compose-0.3.2/src/throughline_compose.egg-info}/PKG-INFO +8 -8
  16. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose.egg-info/SOURCES.txt +2 -0
  17. throughline_compose-0.3.2/tests/conftest.py +157 -0
  18. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/tests/test_cli.py +1 -1
  19. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/tests/test_reexport.py +1 -1
  20. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/tests/test_resolve.py +1 -1
  21. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/tests/test_spi.py +1 -1
  22. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/tests/test_union.py +1 -1
  23. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/setup.cfg +0 -0
  24. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose.egg-info/dependency_links.txt +0 -0
  25. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose.egg-info/entry_points.txt +0 -0
  26. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose.egg-info/requires.txt +0 -0
  27. {throughline_compose-0.3.0 → throughline_compose-0.3.2}/src/throughline_compose.egg-info/top_level.txt +0 -0
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2026 Time Back Solutions Limited
189
+ Copyright 2026 Henry J Grech-Cini
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -0,0 +1,5 @@
1
+ # The default sdist file set ships test modules matching test*.py but not the
2
+ # shared conftest that defines their fixtures, so the shipped suite errored at
3
+ # collection (fixture 'consumer_dir' not found). Ship it so the suite runs green
4
+ # from the sdist (SR-0021).
5
+ include tests/conftest.py
@@ -1,7 +1,7 @@
1
1
  throughline-compose
2
- Copyright 2026 Time Back Solutions Limited
2
+ Copyright 2026 Henry J Grech-Cini
3
3
 
4
- This product includes software developed by Time Back Solutions Limited.
4
+ This product includes software developed by Dr Henry J Grech-Cini.
5
5
 
6
6
  Licensed under the Apache License, Version 2.0. See the LICENSE file for the
7
7
  full terms.
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: throughline-compose
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Compose one requirements graph from many reusable throughline sources: importer-assigned namespaces, source-native UIDs, and a union checked by throughline's own validator. Ships the tl-compose CLI, a strict superset of tl.
5
- Author: Time Back Solutions Limited
5
+ Author-email: Henry J Grech-Cini <henry.grechcini@gmail.com>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/timebacksolutions/throughline-compose
8
- Project-URL: Repository, https://github.com/timebacksolutions/throughline-compose
9
- Project-URL: Issues, https://github.com/timebacksolutions/throughline-compose/issues
7
+ Project-URL: Homepage, https://github.com/rhodium-org/throughline-compose
8
+ Project-URL: Repository, https://github.com/rhodium-org/throughline-compose
9
+ Project-URL: Issues, https://github.com/rhodium-org/throughline-compose/issues
10
10
  Keywords: requirements,requirements-management,traceability,composition,git-native,idd,intent-driven-development,throughline
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
@@ -29,12 +29,12 @@ Dynamic: license-file
29
29
  # throughline-compose
30
30
 
31
31
  **Compose one requirements graph from many reusable
32
- [throughline](https://github.com/timebacksolutions/throughline) sources** — a house style
32
+ [throughline](https://github.com/rhodium-org/throughline) sources** — a house style
33
33
  guide, a platform standard, a regulatory baseline — alongside the requirements you
34
34
  write yourself, and work the combined graph as one.
35
35
 
36
36
  This repository is itself a throughline project: its own design is captured as a
37
- grounded IDD spine of <!-- tl:count.inline type == 'user_requirement' -->6<!-- tl:end --> user requirements and <!-- tl:count.inline type == 'system_requirement' -->19<!-- tl:end --> system requirements
37
+ grounded IDD spine of <!-- tl:count.inline type == 'user_requirement' -->7<!-- tl:end --> user requirements and <!-- tl:count.inline type == 'system_requirement' -->20<!-- tl:end --> system requirements
38
38
  under [`vision/`](vision), [`goals/`](goals),
39
39
  [`user-requirements/`](user-requirements),
40
40
  [`system-requirements/`](system-requirements), and [`non-goals/`](non-goals), and
@@ -77,7 +77,7 @@ by a pinned git `url` or by a local `path` ([SR-0006](system-requirements/SR-000
77
77
  # Adopt a published standard by reference, pinned to an edition.
78
78
  [[sources]]
79
79
  namespace = "asvs"
80
- url = "https://github.com/timebacksolutions/throughline-asvs"
80
+ url = "https://github.com/rhodium-org/throughline-asvs"
81
81
  ref = "v4.0.3" # a git tag (normal form), branch, or commit SHA
82
82
 
83
83
  # Develop a source and its consumer side by side.
@@ -1,12 +1,12 @@
1
1
  # throughline-compose
2
2
 
3
3
  **Compose one requirements graph from many reusable
4
- [throughline](https://github.com/timebacksolutions/throughline) sources** — a house style
4
+ [throughline](https://github.com/rhodium-org/throughline) sources** — a house style
5
5
  guide, a platform standard, a regulatory baseline — alongside the requirements you
6
6
  write yourself, and work the combined graph as one.
7
7
 
8
8
  This repository is itself a throughline project: its own design is captured as a
9
- grounded IDD spine of <!-- tl:count.inline type == 'user_requirement' -->6<!-- tl:end --> user requirements and <!-- tl:count.inline type == 'system_requirement' -->19<!-- tl:end --> system requirements
9
+ grounded IDD spine of <!-- tl:count.inline type == 'user_requirement' -->7<!-- tl:end --> user requirements and <!-- tl:count.inline type == 'system_requirement' -->20<!-- tl:end --> system requirements
10
10
  under [`vision/`](vision), [`goals/`](goals),
11
11
  [`user-requirements/`](user-requirements),
12
12
  [`system-requirements/`](system-requirements), and [`non-goals/`](non-goals), and
@@ -49,7 +49,7 @@ by a pinned git `url` or by a local `path` ([SR-0006](system-requirements/SR-000
49
49
  # Adopt a published standard by reference, pinned to an edition.
50
50
  [[sources]]
51
51
  namespace = "asvs"
52
- url = "https://github.com/timebacksolutions/throughline-asvs"
52
+ url = "https://github.com/rhodium-org/throughline-asvs"
53
53
  ref = "v4.0.3" # a git tag (normal form), branch, or commit SHA
54
54
 
55
55
  # Develop a source and its consumer side by side.
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "throughline-compose"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  description = "Compose one requirements graph from many reusable throughline sources: importer-assigned namespaces, source-native UIDs, and a union checked by throughline's own validator. Ships the tl-compose CLI, a strict superset of tl."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  license = "Apache-2.0"
12
12
  license-files = ["LICENSE", "NOTICE"]
13
- authors = [{ name = "Time Back Solutions Limited" }]
13
+ authors = [{ name = "Henry J Grech-Cini", email = "henry.grechcini@gmail.com" }]
14
14
  keywords = [
15
15
  "requirements",
16
16
  "requirements-management",
@@ -38,9 +38,9 @@ dependencies = ["throughline>=1.2.2"] # is_external / is_namespace_qualified pu
38
38
  dev = ["pytest>=8.0"]
39
39
 
40
40
  [project.urls]
41
- Homepage = "https://github.com/timebacksolutions/throughline-compose"
42
- Repository = "https://github.com/timebacksolutions/throughline-compose"
43
- Issues = "https://github.com/timebacksolutions/throughline-compose/issues"
41
+ Homepage = "https://github.com/rhodium-org/throughline-compose"
42
+ Repository = "https://github.com/rhodium-org/throughline-compose"
43
+ Issues = "https://github.com/rhodium-org/throughline-compose/issues"
44
44
 
45
45
  [project.scripts]
46
46
  tl-compose = "throughline_compose.cli:main"
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """throughline-compose — compose one requirements graph from many reusable sources.
4
4
 
@@ -10,6 +10,6 @@ overrides only the union-aware ones.
10
10
  """
11
11
  from __future__ import annotations
12
12
 
13
- __version__ = "0.3.0"
13
+ __version__ = "0.3.2"
14
14
 
15
15
  __all__ = ["__version__"]
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """The ``tl-compose`` entry point.
4
4
 
@@ -540,7 +540,7 @@ binds a namespace to one external graph:
540
540
  ```toml
541
541
  [[sources]]
542
542
  namespace = "asvs" # the label you reference it by
543
- url = "https://github.com/timebacksolutions/throughline-asvs"
543
+ url = "https://github.com/rhodium-org/throughline-asvs"
544
544
  ref = "v5.0.0" # REQUIRED for a url — pins the edition
545
545
  ```
546
546
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """The git reference resolver — the reference implementation of the source-resolver
4
4
  interface (SR-0011).
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Resolve a declared source to a local directory (SR-0006).
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """A target resolver backed by a consumer's declared sources (SR-0110 seam).
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Declared external sources (SR-0001, SR-0002, SR-0006).
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """The source-resolver interface — the single seam every authority is reached
4
4
  through (SR-0011).
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Build one throughline graph from a consumer plus its declared sources (SR-0004).
4
4
 
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: throughline-compose
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Compose one requirements graph from many reusable throughline sources: importer-assigned namespaces, source-native UIDs, and a union checked by throughline's own validator. Ships the tl-compose CLI, a strict superset of tl.
5
- Author: Time Back Solutions Limited
5
+ Author-email: Henry J Grech-Cini <henry.grechcini@gmail.com>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/timebacksolutions/throughline-compose
8
- Project-URL: Repository, https://github.com/timebacksolutions/throughline-compose
9
- Project-URL: Issues, https://github.com/timebacksolutions/throughline-compose/issues
7
+ Project-URL: Homepage, https://github.com/rhodium-org/throughline-compose
8
+ Project-URL: Repository, https://github.com/rhodium-org/throughline-compose
9
+ Project-URL: Issues, https://github.com/rhodium-org/throughline-compose/issues
10
10
  Keywords: requirements,requirements-management,traceability,composition,git-native,idd,intent-driven-development,throughline
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
@@ -29,12 +29,12 @@ Dynamic: license-file
29
29
  # throughline-compose
30
30
 
31
31
  **Compose one requirements graph from many reusable
32
- [throughline](https://github.com/timebacksolutions/throughline) sources** — a house style
32
+ [throughline](https://github.com/rhodium-org/throughline) sources** — a house style
33
33
  guide, a platform standard, a regulatory baseline — alongside the requirements you
34
34
  write yourself, and work the combined graph as one.
35
35
 
36
36
  This repository is itself a throughline project: its own design is captured as a
37
- grounded IDD spine of <!-- tl:count.inline type == 'user_requirement' -->6<!-- tl:end --> user requirements and <!-- tl:count.inline type == 'system_requirement' -->19<!-- tl:end --> system requirements
37
+ grounded IDD spine of <!-- tl:count.inline type == 'user_requirement' -->7<!-- tl:end --> user requirements and <!-- tl:count.inline type == 'system_requirement' -->20<!-- tl:end --> system requirements
38
38
  under [`vision/`](vision), [`goals/`](goals),
39
39
  [`user-requirements/`](user-requirements),
40
40
  [`system-requirements/`](system-requirements), and [`non-goals/`](non-goals), and
@@ -77,7 +77,7 @@ by a pinned git `url` or by a local `path` ([SR-0006](system-requirements/SR-000
77
77
  # Adopt a published standard by reference, pinned to an edition.
78
78
  [[sources]]
79
79
  namespace = "asvs"
80
- url = "https://github.com/timebacksolutions/throughline-asvs"
80
+ url = "https://github.com/rhodium-org/throughline-asvs"
81
81
  ref = "v4.0.3" # a git tag (normal form), branch, or commit SHA
82
82
 
83
83
  # Develop a source and its consumer side by side.
@@ -1,4 +1,5 @@
1
1
  LICENSE
2
+ MANIFEST.in
2
3
  NOTICE
3
4
  README.md
4
5
  pyproject.toml
@@ -16,6 +17,7 @@ src/throughline_compose.egg-info/dependency_links.txt
16
17
  src/throughline_compose.egg-info/entry_points.txt
17
18
  src/throughline_compose.egg-info/requires.txt
18
19
  src/throughline_compose.egg-info/top_level.txt
20
+ tests/conftest.py
19
21
  tests/test_cli.py
20
22
  tests/test_reexport.py
21
23
  tests/test_resolve.py
@@ -0,0 +1,157 @@
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Materialise the CLI fixtures into a tmp dir.
4
+
5
+ The fixtures are *loadable throughline projects*. They must not live inside the
6
+ throughline-compose repo tree: the loader discovers registers by walking for
7
+ ``.register.yml`` files, so an on-disk fixture project would collide with this
8
+ repo's own IDD spine when ``tl-compose check`` runs at the root. Writing them into
9
+ ``tmp_path`` keeps the repo tree a single, clean project.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ from pathlib import Path
14
+
15
+ import pytest
16
+
17
+ # path (relative to a project root) -> file body.
18
+ _SOURCE: dict[str, str] = {
19
+ "throughline.toml": """\
20
+ [project]
21
+ name = "toy"
22
+ format_version = 3
23
+
24
+ [grounding]
25
+ root_types = ["intent"]
26
+ delivery_roots = ["intent"]
27
+ ground_link_types = ["derives_from", "implements"]
28
+
29
+ [status]
30
+ values = ["proposed", "draft", "approved", "ratified", "rejected", "suspect", "deleted"]
31
+
32
+ [status.roles]
33
+ initial = "draft"
34
+ ratified = "ratified"
35
+ invalidated = "rejected"
36
+ suspect = "suspect"
37
+ tombstone = "deleted"
38
+ """,
39
+ "intents/.register.yml": "prefix: INT\ndigits: 4\n",
40
+ "user-requirements/.register.yml": "prefix: UR\ndigits: 4\n",
41
+ "system-requirements/.register.yml": "prefix: SR\ndigits: 4\n",
42
+ "intents/INT-0001.yml": """\
43
+ uid: INT-0001
44
+ type: intent
45
+ status: approved
46
+ title: Toy source purpose
47
+ text: The toy source exists to exercise composition end to end.
48
+ normative: false
49
+ """,
50
+ "user-requirements/UR-0001.yml": """\
51
+ uid: UR-0001
52
+ type: user_requirement
53
+ status: approved
54
+ title: A grouping the source offers
55
+ text: The source shall expose a grouping that consumers can build on.
56
+ links:
57
+ - target: INT-0001
58
+ type: derives_from
59
+ attrs:
60
+ priority: must
61
+ origin: human
62
+ """,
63
+ "system-requirements/SR-0001.yml": """\
64
+ uid: SR-0001
65
+ type: system_requirement
66
+ status: approved
67
+ title: A normative clause the source offers
68
+ text: The source shall provide one concrete, testable clause.
69
+ links:
70
+ - target: UR-0001
71
+ type: implements
72
+ attrs:
73
+ priority: must
74
+ source_ref: V1.1.1
75
+ origin: human
76
+ """,
77
+ }
78
+
79
+ _CONSUMER: dict[str, str] = {
80
+ "throughline.toml": """\
81
+ [project]
82
+ name = "consumer"
83
+ format_version = 3
84
+
85
+ [[sources]]
86
+ namespace = "toy"
87
+ path = "../toy-source"
88
+
89
+ [grounding]
90
+ root_types = ["intent"]
91
+ delivery_roots = ["intent"]
92
+ ground_link_types = ["derives_from", "implements"]
93
+
94
+ [links]
95
+ types = ["derives_from", "implements", "relates"]
96
+
97
+ # The consumer's schema governs the whole union, so its link rules must be a
98
+ # superset covering the shapes its sources use internally (here the toy source's
99
+ # `UR derives_from INT`) as well as the consumer's own (`SR derives_from INT`).
100
+ [link_rules]
101
+ implements = { from = ["system_requirement"], to = ["user_requirement"] }
102
+ derives_from = { from = ["system_requirement", "user_requirement"], to = ["intent"] }
103
+
104
+ [status]
105
+ values = ["proposed", "draft", "approved", "ratified", "rejected", "suspect", "deleted"]
106
+
107
+ [status.roles]
108
+ initial = "draft"
109
+ ratified = "ratified"
110
+ invalidated = "rejected"
111
+ suspect = "suspect"
112
+ tombstone = "deleted"
113
+ """,
114
+ "intents/.register.yml": "prefix: INT\ndigits: 4\n",
115
+ "system-requirements/.register.yml": "prefix: SR\ndigits: 4\n",
116
+ "intents/INT-0001.yml": """\
117
+ uid: INT-0001
118
+ type: intent
119
+ status: approved
120
+ title: Consumer purpose
121
+ text: The consumer builds on a composed source.
122
+ normative: false
123
+ """,
124
+ "system-requirements/SR-0001.yml": """\
125
+ uid: SR-0001
126
+ type: system_requirement
127
+ status: approved
128
+ title: Consumer clause building on the source
129
+ text: The consumer shall ground itself while relating to a source clause.
130
+ links:
131
+ - target: INT-0001
132
+ type: derives_from
133
+ - target: toy:SR-0001
134
+ type: relates
135
+ attrs:
136
+ priority: must
137
+ origin: human
138
+ """,
139
+ }
140
+
141
+
142
+ def _write(root: Path, files: dict[str, str]) -> Path:
143
+ for rel, body in files.items():
144
+ dst = root / rel
145
+ dst.parent.mkdir(parents=True, exist_ok=True)
146
+ dst.write_text(body, encoding="utf-8")
147
+ return root
148
+
149
+
150
+ @pytest.fixture
151
+ def source_dir(tmp_path: Path) -> Path:
152
+ return _write(tmp_path / "toy-source", _SOURCE)
153
+
154
+
155
+ @pytest.fixture
156
+ def consumer_dir(tmp_path: Path, source_dir: Path) -> Path:
157
+ return _write(tmp_path / "consumer", _CONSUMER)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """End-to-end CLI tests over materialised fixtures: the two-tool contract
4
4
  (SR-0003, SR-0005) — bare `tl` fails fast, `tl-compose` resolves and passes."""
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Transitive re-export and alias (UR-0005, SR-0014, SR-0015).
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Resolver tests (SR-0006): local paths, and url sources fetched by pinned ref
4
4
  into a cache outside the project tree. A throwaway local git repo stands in for a
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Source-resolver SPI tests (SR-0011).
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2026 Time Back Solutions Limited
1
+ # Copyright (c) 2026 Henry J Grech-Cini
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  """Unit tests for the composition engine (union.py, sources.py)."""
4
4
  from __future__ import annotations