Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 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
d8037d3
T102: the staging workbench offers the editors and the chat rail by s…
brettheap Oct 3, 2026
6039300
Merge T084 (openDox-code#77, 1d6a4f19) into T102
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
7535cd3
Merge T084 (openDox-code#77, b333bf16) into T102
brettheap Oct 3, 2026
770156c
T102: the browser's scope mirror follows T084's M1, so a settings doc…
brettheap Oct 3, 2026
ebe0a35
T084 fix round 3: a group's edges name documents by id, and the scope…
brettheap Oct 3, 2026
0fbdba6
Merge T084 (openDox-code#77, ebe0a35f) into T102
brettheap Oct 3, 2026
3528b2f
T102: the browser's scope mirror follows T084's fix round 3, so a gro…
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
e2d106e
T102: by scope the canvas sends no outline, and a restore is held to …
brettheap Oct 3, 2026
0ddca7f
Merge T084 (openDox-code#77, d556c3fb) into T102
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
257853d
T102: either gate half makes a host governed, and the Save refusal na…
brettheap Oct 3, 2026
af4adc1
Merge T084 (openDox-code#77, 213344ad, its final head) into T102
brettheap Oct 3, 2026
ce85d57
T102: the browser's scope mirror follows T084's fix round 4, so a sel…
brettheap Oct 3, 2026
b41fbe0
Merge main (e49b17c3) into T102: T084 (#77) landed as a squash
brettheap Oct 3, 2026
02e0aa5
Merge main (390e2c28) into T102: T103 (#80) landed
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
16 changes: 11 additions & 5 deletions src/opendox/web/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ import { mountStagingWorkbench } from "./views/staging-workbench.js";
// resolved in `render()` below, off the `gate.workbench.session` binding, and
// `refusalTransport` is the fallback.
import { createModelIntakeTransports } from "./views/swb-model-intake.js";
import { CONSOLE_TOKEN_FIELD } from "./views/staging-workbench-model.js";
import { CONSOLE_TOKEN_FIELD, GATELESS_SAVE_REFUSAL } from "./views/staging-workbench-model.js";
// THE TWO MODELS THE CONTRIBUTED GATE COLUMN REACHES THROUGH `ctx` — RULED
// counterpart Q6 (opensoft/openxFactory#656 comment `5649094228`, Brett Heap,
// 2026-09-12): "what a CONTRIBUTED view module may IMPORT from openDox's
Expand Down Expand Up @@ -952,14 +952,20 @@ function ensurePageOverlayHost(doc) {
// column has no transport at all, and a Save that silently did nothing would be
// the worst answer available. This stands in for it and REFUSES in the shape
// `runSave` already understands, naming the layering rather than the symptom.
//
// SINCE T102 THIS IS EVERY STANDALONE SAVE (RULED openxFactory#656
// `5963618568`: "only creating documents and Save stay behind the gate, so Save
// is refused by name"). A standalone workbench now offers its editors by scope,
// so a human really does press Save here, and the refusal is the model's one
// sentence: what is missing and which binding would supply it. It is picked on
// the session half alone, so the sentence names only that half. It used to end
// "Run the CLI verb in your pinned checkout", a remedy a standalone install
// does not have.
function refusalTransport() {
return async () => ({
ok: false,
error: "no_gate_column",
message: "this shell was assembled without the column that contributes the "
+ "first-edit transport (`gate.workbench.session`), so a governed Save "
+ "cannot be sent. Run the CLI verb in your pinned checkout, where the "
+ "authority lives.",
message: GATELESS_SAVE_REFUSAL,
});
}

Expand Down
2 changes: 1 addition & 1 deletion src/opendox/web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
</p>
<dialog class="aboutdialog" id="aboutdialog" aria-label="About this dashboard">
<p>
A read-only projection of one repository's ideation governance state,
A projection of one repository's Markdown files and how they group,
rendered from a single generated <code>snapshot.json</code>. The funnel reads
the snapshot's link tallies and readiness verbatim — it never rescans the
repository or re-scores anything. <span id="aboutlinks"></span> Regenerate
Expand Down
21 changes: 18 additions & 3 deletions src/opendox/web/views/doc-wheel.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,13 @@
const SAVE_CONTEXT_ONLY =
"this document is read-only context in the opened tile, not the tile's own "
+ "material, so it is not offered to the governed Save";
// T102 (RULED openxFactory#656 `5963618568`): where editing is offered BY
// SCOPE, the `edit` verb is offered on exactly the documents the scope lets be
// edited, and a document outside that set states why rather than failing when
// pressed. Under the gate no entry carries `editable`, so this never shows.
const LOAD_NOT_THE_TILES_OWN =
"this document is context in the opened tile, not one of the tile's own, "
+ "so it is not offered for editing here";
const SAVE_NOT_LOADED =
"load this document for editing before saving it";
const SAVE_NOTHING_TO_DO =
Expand Down Expand Up @@ -345,7 +352,13 @@
// answer wins when one exists (design D2): a context-only document is
// LOADABLE for grounding and conversation, and its buffer carries
// `owned: false`, which the governed Save already withholds.
const owned = live && typeof live.owned === "boolean"
//
// T102: a LIVE answer is a loaded buffer's. The shell answers an unloaded
// path with a placeholder (`owned: true`, `loaded: false`), which used to
// win here, so a by-scope tile outside the scope read "load this document
// for editing before saving it" beside an `edit` verb it does not offer.
// Under the gate no entry carries `owned`, so this reads as before.
const owned = live && live.loaded && typeof live.owned === "boolean"

Check warning on line 361 in src/opendox/web/views/doc-wheel.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Prefer using an optional chain expression instead, as it's more concise and easier to read.

See more on https://sonarcloud.io/project/issues?id=opensoft_openDox-code&issues=AaECEhs6BWAt1YwquKdm&open=AaECEhs6BWAt1YwquKdm&pullRequest=81
? live.owned
: entry.owned !== false;

Expand All @@ -369,7 +382,7 @@
// route in (design D5). Labelled with Brett's own word.
const load = el("button", "swb-docload", loaded ? "loaded" : "edit");
load.type = "button";
if (onLoad && entry.resolved) {
if (onLoad && entry.resolved && entry.editable !== false) {
load.title = loaded
? entry.path + " is loaded for editing — selecting it here brings the "
+ "chat and the canvas back to it"
Expand All @@ -380,7 +393,9 @@
});
} else {
load.disabled = true;
load.title = entry.resolved ? LOAD_UNAVAILABLE : NOT_CATALOGUED;
load.title = !entry.resolved ? NOT_CATALOGUED
: (onLoad && entry.editable === false
? LOAD_NOT_THE_TILES_OWN : LOAD_UNAVAILABLE);

Check warning on line 398 in src/opendox/web/views/doc-wheel.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Extract this nested ternary operation into an independent statement.

See more on https://sonarcloud.io/project/issues?id=opensoft_openDox-code&issues=AaECEhs6BWAt1YwquKdn&open=AaECEhs6BWAt1YwquKdn&pullRequest=81
}
row.appendChild(load);

Expand Down
19 changes: 14 additions & 5 deletions src/opendox/web/views/lens.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

import {
buildLensModel, docSummaries, railStats, termMatches,
savePlan, clusterPlan, WORKBENCH_DIR,
savePlan, clusterPlan,
} from "./lens-model.js";
// The SVG bullseye renderer lives in ONE place (add-workbench-bullseye-and-create
// design D1): this view and the staging workbench's lens panel consume the same
Expand Down Expand Up @@ -267,9 +267,13 @@ function renderPlan(container, plan, opts) {
if (gateLive(o.caps) && o.mountLensGate) {
o.mountLensGate(box, { plan, caps: o.caps, fetcher: o.fetcher });
} else {
// NEUTRAL WORDS (plan 034 T102, gap G8): this note used to name the engine
// module (`lens.py`) and "the boundary", which are the build's words and
// not a reader's. What it says is the same fact: here the plan is shown,
// and nothing carries it out.
box.appendChild(el("div", "dc-note",
"The tested engine (lens.py) materialises this through the boundary; the " +
"read-only surface confirms the plan — nothing is written from the browser."));
"Shown for confirmation only: this console cannot carry the plan out "
+ "from the browser, so nothing is written."));
}
container.appendChild(box);
}
Expand Down Expand Up @@ -1533,9 +1537,14 @@ export function renderLens(root, snapshot, opts) {
});
box.appendChild(save);
box.appendChild(cluster);
// NEUTRAL WORDS (plan 034 T102, gap G8): this line named a host's
// surfaces -- the workbench folder, "the register", "any queue" -- which
// a standalone install does not have. What stays true everywhere is what
// the two buttons do: each shows its plan first, and the pane itself
// writes nothing. Where the plan lands is the plan's own `lands at` line.
box.appendChild(el("div", "lens-pending",
"Persisted through the interactivity boundary to " + WORKBENCH_DIR +
" (gitignored). Nothing enters the register or any queue from here."));
"Each button shows its plan below before anything is written; this "
+ "pane itself writes nothing."));
pane.appendChild(box);
},
setName() {
Expand Down
Loading
Loading