Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
e406a00
T071: 13.2 and 13.3 — load_settings refuses a non-PostgreSQL DSN and …
brettheap Sep 28, 2026
91f7973
Fix round: _refuse_non_postgresql_dsn never raises a bare ValueError …
brettheap Sep 28, 2026
b5296f9
Rework #60 to Brett's ruling: OPENDOX_MIGRATION_DATABASE_URL required…
brettheap Sep 28, 2026
f097fd8
Fix round: load_migration_settings gets the same dialect gate load_se…
brettheap Sep 28, 2026
b50e3b1
T070: 13.4, 13.5 and 13.6 — OPENDOX_INSTALL_MODE and generate-and-ope…
brettheap Sep 30, 2026
2c96dfb
T072: 13.1 — the bundled PostgreSQL server, the local install's own c…
brettheap Sep 30, 2026
c3a70a2
T072: extend the dependency lock for the `local` extra and the test e…
brettheap Sep 30, 2026
32683e8
Fix round: the install-mode fixture's repository ignores the user's g…
brettheap Sep 30, 2026
95fe16f
Merge T070's fix round (32683e8) into T072
brettheap Sep 30, 2026
525f61c
Fix round: runtime migrate and reset refuse what a local install cann…
brettheap Sep 30, 2026
32db5d8
Merge T070's second fix round (525f61c) into T072
brettheap Sep 30, 2026
02dadc5
Fix round: status reports a local install's broker on its early retur…
brettheap Sep 30, 2026
ac61596
Merge T070's third fix round (02dadc5) into T072
brettheap Sep 30, 2026
859b37b
Fix round: a healthy local status is proven to exit 0, and RuntimeSet…
brettheap Sep 30, 2026
5e52872
Fix round: the local install's migrations, pid, initdb, start and int…
brettheap Sep 30, 2026
28bdccd
Merge T070's fourth fix round (859b37b6) into T072
brettheap Sep 30, 2026
96b2699
Fix round: an unprovable pid is not believed, and the state dir refus…
brettheap Sep 30, 2026
026f00e
Fix round: the install-mode module says which of its cases is DB-back…
brettheap Sep 30, 2026
4aed627
Merge T070's fifth fix round (026f00ea) into T072
brettheap Sep 30, 2026
a0fb7c8
Fix round: pyproject's packaging note names the resolver that exists …
brettheap Sep 30, 2026
0f77d5c
Fix round: libpq's environment, the socket's path and a relative HOME…
brettheap Sep 30, 2026
379fbb1
Fix round: the socket's path trusts no group and no link it cannot vo…
brettheap Sep 30, 2026
84a6c04
T072: pixeltable-pgserver carries the server, and it authenticates by…
brettheap Sep 30, 2026
f8e6e9e
Fix round: the data path, fresh directories and readiness belong to t…
brettheap Sep 30, 2026
adeb6fe
Merge main (047bb4fa) into T071: phase 2 has landed
brettheap Oct 2, 2026
3185e7d
Merge T071's merge-from-main head (adeb6fed) into T070
brettheap Oct 2, 2026
c8fac05
T070, owed at the merge round: the standalone generate-and-open runs …
brettheap Oct 2, 2026
2210739
T084: the rejection report prints every broken rule once, with its count
brettheap Oct 2, 2026
fe232fe
Merge T070's merge round (c8fac05e) into T072: phase 2 is on the base
brettheap Oct 2, 2026
19e32f0
T072, owed at the merge round: the real entry point, and every --loca…
brettheap Oct 2, 2026
e7324d4
T084: gate and refresh are true only where a contributed route answer…
brettheap Oct 2, 2026
c39d960
Fix round: a PostgreSQL scheme libpq would not read as a URI is refus…
brettheap Oct 2, 2026
9ae5e72
Merge T071's fix round (c39d960e) into T070
brettheap Oct 2, 2026
379ff1f
T073: 13.4a, /capabilities gains an install block, from the serving p…
brettheap Oct 2, 2026
cdf7382
Fix round: the --local callers inherit none of the runner's runtime s…
brettheap Oct 2, 2026
c664775
Merge T073 (openDox-code#72, 379ff1f4) into T084: serve.py's single-w…
brettheap Oct 2, 2026
94254b1
Merge #67's fix rounds (cdf7382b) into T072
brettheap Oct 2, 2026
6eb0bbd
T072: the env probe expects the child's own state directory, never th…
brettheap Oct 2, 2026
d1de1fd
Fix round: the healthy-local status case sets its schema with make_co…
brettheap Oct 2, 2026
7714751
T084: the consumer columns' seams, with openDox's defaults registered…
brettheap Oct 2, 2026
47a6574
Merge T072's merge-round fixes (openDox-code#69, 6eb0bbdb) into T073
brettheap Oct 2, 2026
0488f5b
Fix round: nothing is made through a path the tree check would refuse…
brettheap Oct 2, 2026
20032d0
T073: the hosted case hands its child a hosted install's settings on …
brettheap Oct 2, 2026
a39e020
Merge T073 (openDox-code#72, 20032d02) into T084
brettheap Oct 2, 2026
fedfa75
Merge #67's fix round d1de1fd9 into T072
brettheap Oct 2, 2026
105f2f1
Fix round: no runtime setting the runner exports reaches a tests_runt…
brettheap Oct 2, 2026
1b0c3a6
Merge T072's fix rounds (openDox-code#69, fedfa75d) into T073
brettheap Oct 2, 2026
3426c75
Fix round 12: the auth files are exactly 0600, and the cluster runs o…
brettheap Oct 2, 2026
f66e5f8
Merge #67's fix round 105f2f12 into T072
brettheap Oct 2, 2026
5d4e433
T084: route the last deferred reaches through the column seams (4.3, …
brettheap Oct 2, 2026
a5ace91
Merge T073 (openDox-code#72, 1b0c3a63) into T084
brettheap Oct 2, 2026
65551e6
T084: a tile's own documents are editable in openDox's default scope
brettheap Oct 2, 2026
1fab55f
T084: pin the static bundle's content types ahead of the platform's t…
brettheap Oct 2, 2026
a985407
T072: the in-process local cases give themselves a short state directory
brettheap Oct 2, 2026
55f6e8a
T084: retire consumer_reach; the gate and projection columns are a ho…
brettheap Oct 2, 2026
0b0c37d
T084: the rail's thread read and a standalone own-document turn, held
brettheap Oct 2, 2026
bb05e3d
Merge T072's fix rounds (openDox-code#69, f66e5f82) into T073
brettheap Oct 2, 2026
e214477
Adversarial review M1: a comma in the state directory is refused
brettheap Oct 2, 2026
897029d
Merge T073 (openDox-code#72, bb05e3d7) into T084
brettheap Oct 2, 2026
c4f5df3
Adversarial review L1: the carrier is pinned below 0.7, and another m…
brettheap Oct 2, 2026
b2d80e9
Adversarial review L3: the directory creation starts from is judged b…
brettheap Oct 2, 2026
9e2f303
Adversarial review L2: the local verbs judge their socket before conn…
brettheap Oct 2, 2026
21bde1a
Adversarial review note: no replication connection, logical or physical
brettheap Oct 2, 2026
b1db196
T084 fix round 1: a seam registration with the names but not their sh…
brettheap Oct 2, 2026
bb71ee2
Merge T072's adversarial-review rounds (openDox-code#69, 21bde1af) in…
brettheap Oct 2, 2026
28e195b
Fix round 13: the server is found as the installed distribution's own…
brettheap Oct 2, 2026
94dc15e
Merge T073 (openDox-code#72, bb71ee25) into T084
brettheap Oct 2, 2026
dd015d1
T084: `opendox --help` names the installed command and openDox only
brettheap Oct 2, 2026
539a358
Merge T072's fix round 13 (openDox-code#69, 28e195b9) into T073
brettheap Oct 2, 2026
3da9353
Merge main (8a98e317) into T073
brettheap Oct 2, 2026
bf9bcb0
Fix round 14: a named platform gate, resolution failures as reasons, …
brettheap Oct 3, 2026
57b7ed8
Merge main 66ff7257 into T072: #67 (T070) and #61 (T078) landed
brettheap Oct 3, 2026
3387293
Merge T073 (openDox-code#72, 3da93530) into T084, and main through it
brettheap Oct 3, 2026
058d96e
Fix round 15: on Linux the parent-death signal is armed, or the serve…
brettheap Oct 3, 2026
085ba0b
Merge main 2fc714d2 into T072: #62 (T079) landed
brettheap Oct 3, 2026
ff70ac1
T084 fix round 2: a gate verb on the default gate is refused, not a t…
brettheap Oct 3, 2026
b4e5485
Merge T072 (openDox-code#69, 058d96ef) into T073: stack A carries mai…
brettheap Oct 3, 2026
3ebccb3
Fix round 16: a local install's served role and database are the bund…
brettheap Oct 3, 2026
7cd2370
Merge T073 (openDox-code#72, b4e54857) into T084: stack A's main 66ff…
brettheap Oct 3, 2026
52a2b8d
Merge main 9a490405 into T072: #74 (T081) landed
brettheap Oct 3, 2026
00ff3e8
Merge T072 (openDox-code#69, 085ba0b0) into T073: stack A carries mai…
brettheap Oct 3, 2026
1d6a4f1
Merge T073 (openDox-code#72, 00ff3e83) into T084: stack A's main 2fc7…
brettheap Oct 3, 2026
5a3b51e
T084: openDox's own settings documents are never a tile's editable ma…
brettheap Oct 3, 2026
278855d
T084: an unknown tile kind is a malformed request, never a dropped co…
brettheap Oct 3, 2026
5a9cb0d
T084: generate-and-open removes the run directory it minted, named op…
brettheap Oct 3, 2026
6519660
T084: `python -m opendox.serve --help` names openDox only, as `opendo…
brettheap Oct 3, 2026
4a9dbe9
Fix round 17: the /proc falsifier is gated, and a backslash in the ma…
brettheap Oct 3, 2026
620bee2
Merge T072 (openDox-code#69, 52a2b8dc) into T073: stack A carries mai…
brettheap Oct 3, 2026
b333bf1
Merge T073 (openDox-code#72, 620bee27) into T084: T081 arrives throug…
brettheap Oct 3, 2026
8986158
Fix round 18a: both bundle DSNs name their schema, public (Copilot re…
brettheap Oct 3, 2026
c04690f
Fix round 18b: a live pid /proc will not describe fails closed (Copil…
brettheap Oct 3, 2026
ebe0a35
T084 fix round 3: a group's edges name documents by id, and the scope…
brettheap Oct 3, 2026
bc85f21
Merge T072 (openDox-code#69, c04690f8) into T073: stack A's final pre…
brettheap Oct 3, 2026
6894268
Merge main (5e7ab003) into T073: T072 (#69) landed as a squash
brettheap Oct 3, 2026
93f77dc
T073: the install report reads the bundled server's process once; the…
brettheap Oct 3, 2026
7536bfe
Merge T073 (openDox-code#72, 93f77dc1) into T084: #72's head with its…
brettheap Oct 3, 2026
d556c3f
Merge main (90ac7033) into T084: T073 (#72) landed as a squash
brettheap Oct 3, 2026
1fb81cb
T084 fix round 4: a selection's files are paths and a group's edges a…
brettheap Oct 3, 2026
213344a
T084 fix round 5: an in-root alias of a settings document is the sett…
brettheap Oct 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions src/opendox/branch_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,17 @@
import yaml

from . import doxbench_hash
# THE GATE COLUMN, NAMED LATE (BUILD slice 2b, `split-opendox-two-layer-product`
# § 3.5/3.6). `gate_console` is openXdox's — the layer that PINS this one — so an
# import statement here made `import opendox.branch_session` require openXdox to
# be installed, which `design.md`:243 refuses: *"what must not survive is the
# direction, not the calls."* The stand-in resolves on first attribute access and
# refuses naming the layering; every `gate_console.X` below is unchanged.
from .consumer_reach import gate_console
# THE GATE COLUMN, THROUGH ITS SEAM (plan 034 T084; #1144 4.3, R1Q10 (a)).
# `gate_console` is openXdox's, the layer that PINS this one, so an import
# statement here would make `import opendox.branch_session` require openXdox,
# which `design.md`:243 refuses. BUILD slice 2b named it late through
# `consumer_reach`'s stand-in, which still raised where openXdox was absent.
# It is now a proxy over `column_seams.gate`: each `gate_console.X` below reads
# the registration current when it runs, a host's or openDox's own default
# (`default_columns.GATE`, whose governed record functions refuse by name).
# Every `gate_console.X` below is unchanged. Stdlib-only, so no edge.
from . import column_seams
gate_console = column_seams.gate.proxy

# ...EXCEPT the nine `records_dir` DEFAULTS at :1740, :1859, :1878, :4179, :4217,
# :4254, :4287, :4504 and :4991, which no stand-in can defer: a default argument
Expand Down Expand Up @@ -1588,8 +1592,13 @@

A change picked from two staging ids is ambiguous and is refused instead of
selecting whichever register row happened to be encountered first.

The register is the one registered at `column_seams.register` (plan 034
T084): a host's, or openDox's own default, whose register holds no row,
so a lone openDox proves no fallback.
"""
from openxdox.register import CrossReferenceIndexAdapter
CrossReferenceIndexAdapter = (

Check warning on line 1600 in src/opendox/branch_session.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this local variable "CrossReferenceIndexAdapter" to match the regular expression ^[_a-z][a-z0-9_]*$.

See more on https://sonarcloud.io/project/issues?id=opensoft_openDox-code&issues=AaD-5MMQ-iX_pqOFukkI&open=AaD-5MMQ-iX_pqOFukkI&pullRequest=77
column_seams.register.current().CrossReferenceIndexAdapter)

rows = rows if rows is not None else _change_rows(checkout_root)
active_without_origin = {
Expand Down Expand Up @@ -2007,7 +2016,9 @@

Only a STAGED-TOPIC tile can carry a proposal: both signals are keyed on a
staging id, and a cluster or possible tile has none."""
from openxdox import kickoff as kickoff_mod # lazy: mirrors gate_console's cycle note
# Kickoff through its seam (plan 034 T084): a host's commission reader, or
# openDox's own default, which reads no dispatched commission.
kickoff_mod = column_seams.kickoff.current()

staged = tile.scope_kind == STAGED_TOPIC
landed = None
Expand Down
132 changes: 120 additions & 12 deletions src/opendox/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import argparse
import json
import os
import re
import shutil
import signal
import sys
import tempfile
Expand Down Expand Up @@ -71,8 +73,14 @@
from opendox import branch_session as branch_session_mod # noqa: E402
from opendox import doxbench_install as install_mod # noqa: E402
from opendox import doxbench_knowledge as knowledge_mod # noqa: E402
from opendox import consumer_reach # noqa: E402
gate_mod = consumer_reach.gate_console # noqa: E402
# THE GATE PRIMITIVES, THROUGH THEIR SEAM (plan 034 T084; #1144 4.3, R1Q10
# (a)). This was `consumer_reach.gate_console`, a late stand-in over openXdox's
# `gate_console` that still raised where openXdox was absent. `gate_mod.X` now
# reads the registration current at `column_seams.gate` when it runs, a host's
# or openDox's own default, which `build_parser()` and `main()` register.
# Stdlib-only, so this adds no reach.
from opendox import column_seams # noqa: E402
gate_mod = column_seams.gate.proxy # noqa: E402
from opendox import serve as serve_mod # noqa: E402
from opendox import workbench as workbench_mod # noqa: E402
# THE HOME-CORPUS SEAM'S DEFAULT (4.1a; plan 034 T022) -- see
Expand Down Expand Up @@ -494,16 +502,65 @@ def _warn_validator_could_not_run(result, validator) -> None:
print(f" {sys.executable} -m {remedy}", file=sys.stderr)


#: One broken rule, as a validator's report names it: `[<rule>] <where>:
#: <detail>`, the line `opendox.validator.Violation.line()` prints.
_RULE_LINE = re.compile(r"^\[(?P<rule>[^\[\]\s]+)\] (?P<rest>.+)$")

#: How many of a report's other lines (its summary, or a validator's own
#: words where it names no rule) are printed.
_REPORT_TAIL = 20

#: How many places each broken rule is shown at: the first on the rule's own
#: line, and the next ones beneath it. A rule broken at more places than this
#: says how many more, so its count stays exact and the report stays short.
_PLACES_SHOWN = 5


def _report_non_conformance(written: Path, result) -> None:
"""NOT CONFORMANT — the validator ran, reached a verdict, and rejected the
snapshot. The one thing this message must never be mistaken for is the
warning above it, so it says whose fault it is out loud and prints the
findings themselves; "1 error(s)" alone told a human nothing he could act
on."""
on.

EVERY BROKEN RULE, ONCE, WITH ITS COUNT (plan 034 T084; RULED
openxFactory#656 `5920216845`, item 3, *"Show every rule, grouped
(Recommended)"*). This printed the validator's LAST 20 LINES, so a
snapshot that broke one rule a hundred times and a second rule once
showed twenty copies of the first and never named the second. Now each
rule id the report names is printed ONCE, on a line of its own,
`<count> × [<rule>] <where>: <detail>`, in the order the validator found
them, with where it is first broken. The next places it is broken follow
beneath it, without the id, up to `_PLACES_SHOWN` in all, because one rule
can be broken in different ways (a missing key, then another), and a
count beside the first place alone would read as that place repeated.
The report's other lines (the validator's summary) follow. A validator
whose output names no rule id has nothing to group, so its own last lines
are printed, as before."""
print(f" validation FAILED — the pinned validator REJECTED {written}. This "
f"is the SNAPSHOT, not the environment: the validator ran fine and "
f"found the data non-conformant.", file=sys.stderr)
for line in (result.stdout or result.stderr).strip().splitlines()[-20:]:
lines = (result.stdout or result.stderr).strip().splitlines()
places: dict[str, list[str]] = {}
others: list[str] = []
for line in lines:
named = _RULE_LINE.match(line.strip())
if named is None:
others.append(line)
continue
places.setdefault(named["rule"], []).append(named["rest"])
if places:
total = sum(len(where) for where in places.values())
print(f" {total} violation(s) of {len(places)} rule(s), each rule "
f"once, with its count and where it is broken:", file=sys.stderr)
for rule, where in places.items():
print(f" {len(where)} × [{rule}] {where[0]}", file=sys.stderr)
for place in where[1:_PLACES_SHOWN]:
print(f" {place}", file=sys.stderr)
if len(where) > _PLACES_SHOWN:
print(f" … and {len(where) - _PLACES_SHOWN} more of "
"this rule", file=sys.stderr)
for line in others[-_REPORT_TAIL:]:
print(f" {line}", file=sys.stderr)


Expand Down Expand Up @@ -731,16 +788,39 @@ def report() -> dict:
return report


#: The prefix of the temporary run directory `generate-and-open` mints when
#: no `--run-dir` is given: the installed command's own name (plan 034 T084,
#: adversarial review 2, G7), not openxFactory's pre-carve one.
RUN_DIR_PREFIX = "opendox-"


def _generate_and_open(args: argparse.Namespace, *, opener) -> int:
"""`generate-and-open`'s generate-then-serve half, once the install is known."""
"""`generate-and-open`'s generate-then-serve half, once the install is known.

A RUN DIRECTORY THIS PROCESS MINTED IS REMOVED WHEN IT IS DONE WITH IT
(plan 034 T084, adversarial review 2, G7): when the server stops, on a
`--no-serve` run, on a refusal and on a failure. It used to be left under
the system's temporary directory on every run. A `--run-dir` the caller
names is the caller's, and is left exactly as this run wrote it."""
# Ahead of minting the run dir, so a refused root leaves not even an empty
# temp directory behind. `_generate_and_write` is still the guard that MATTERS
# (it is the one no caller can skip); these are the same checks, earlier.
_refuse_non_corpus_repo_root(args)
_refuse_malformed_generated_at(args)
_refuse_empty_source_options(args)
run_dir = Path(args.run_dir).resolve() if args.run_dir else Path(
tempfile.mkdtemp(prefix="ideation-dashboard-"))
if args.run_dir:
return _generate_and_serve(args, Path(args.run_dir).resolve(),
opener=opener)
minted = Path(tempfile.mkdtemp(prefix=RUN_DIR_PREFIX))
try:
return _generate_and_serve(args, minted, opener=opener)
finally:
shutil.rmtree(minted, ignore_errors=True)


def _generate_and_serve(args: argparse.Namespace, run_dir: Path, *,
opener) -> int:
"""Generate into `run_dir`, serve it, and stop, for `_generate_and_open`."""
run_dir.mkdir(parents=True, exist_ok=True)
output = run_dir / "snapshot.json"

Expand Down Expand Up @@ -901,9 +981,14 @@ def _commission_cli(verb: str, args: argparse.Namespace, target: str,
engine, same guards. The CLI adds nothing of its own except the printing —
which is exactly what makes the two surfaces equivalent."""
repo_root = Path(args.repo_root).resolve()
console = gate_mod.GateConsole(_human_gate(repo_root, args),
records_dir=args.records_dir)
human = _human_gate(repo_root, args)
try:
# INSIDE the refusal boundary (plan 034 T084): openDox's own gate
# default refuses the governed `GateConsole` at construction
# (`GateRecordsNotRegistered`, a `GateRefused`), so a contributed gate
# verb that reaches it with no host's gate registered answers
# "<verb> refused: ..." rather than a traceback.
console = gate_mod.GateConsole(human, records_dir=args.records_dir)
res = getattr(console, verb.replace("-", "_"))(
target, outline=args.outline, workflow=args.workflow,
note=args.note, provenance=cli_provenance(), **engine_kwargs)
Expand Down Expand Up @@ -1239,6 +1324,21 @@ def _default_home_factory(root):
corpus_adapter.CorpusRef(name="home", location=str(root)))


#: THE INSTALLED COMMAND'S OWN NAME AND WORDS (plan 034 T084; found by T099's
#: PyPI writer). `opendox --help` is what a published install prints, so the
#: usage line names the console script `pyproject.toml` installs, `opendox`,
#: and the description and epilog name openDox only. They used to print
#: `usage: ideation-dashboard` and this module's docstring, which is
#: openxFactory's pre-carve history, not a user's help.
PROG = "opendox"
PARSER_DESCRIPTION = (
"openDox, a document workbench over a corpus of documents: regenerate "
"the corpus's deterministic snapshot, serve it locally and open it in a "
"browser, create and edit its documents, declare the model providers a "
"chat may use, and run the identity and coordination runtime.")
PARSER_EPILOG = "Run `opendox <command> --help` for a command's own options."


def build_parser(*, subcommand_extensions: tuple = ()) -> argparse.ArgumentParser:
"""The command line, plus whatever this invocation was ASSEMBLED with.

Expand Down Expand Up @@ -1302,8 +1402,12 @@ def build_parser(*, subcommand_extensions: tuple = ()) -> argparse.ArgumentParse
# T085; R1Q10 (a) and R1Q12 (a), the same pattern), each only where no
# host has registered its own, and replaceable by a host until read.
doxbench_defaults.register_defaults()
parser = argparse.ArgumentParser(prog="ideation-dashboard", description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
# AND the consumer columns' defaults (plan 034 T084; #1144 4.3,
# R1Q10 (a)): the gate primitives, the doxBench scope, kickoff and
# the cross-reference register, the same way.
column_seams.register_defaults()
parser = argparse.ArgumentParser(prog=PROG, description=PARSER_DESCRIPTION,
epilog=PARSER_EPILOG)
sub = parser.add_subparsers(dest="command", required=True)

gen = sub.add_parser("generate", help="regenerate the deterministic snapshot")
Expand Down Expand Up @@ -1349,7 +1453,7 @@ def build_parser(*, subcommand_extensions: tuple = ()) -> argparse.ArgumentParse
gao.set_defaults(func=cmd_generate_and_open)

create = sub.add_parser(
"create", help="scaffold a new header-compliant ideation doc and open it for editing")
"create", help="scaffold a new header-compliant document and open it for editing")
create.add_argument("--repo-root", required=True, help="repository to scaffold into")
create.add_argument("--area", default=authoring_mod.DEFAULT_AREA,
help=f"target ideation area (default: {authoring_mod.DEFAULT_AREA})")
Expand Down Expand Up @@ -1422,6 +1526,10 @@ def main(argv: list[str] | None = None, *,
projection_seams.register_defaults()
# AND openDox's own doxBench defaults (4.3, T085), the same way.
doxbench_defaults.register_defaults()
# AND the consumer columns' defaults (plan 034 T084; #1144 4.3,
# R1Q10 (a)): the gate primitives, the doxBench scope, kickoff and
# the cross-reference register, the same way.
column_seams.register_defaults()
args = build_parser(
subcommand_extensions=subcommand_extensions).parse_args(argv)
try:
Expand Down
Loading
Loading