mesh-conditions: a home for view-unsaid, every views owner's own

mesh-sdk's views.UnsaidFinding (id <owner>.<state>) is written by the indexer and the assigner in their own findings;
the closed set finds a catalogue writer of it too. nats.status-unwritten is said to the keeper directly, not a finding:
no row.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
This commit is contained in:
2026-11-04 18:18:23 +01:00
parent da0573e124
commit 2b340d7ddb
2 changed files with 9 additions and 4 deletions
@@ -105,6 +105,9 @@ var Homes = map[string]Home{
// An owner's views event too large to say (ADR 0615 §5): written by each owner of a views family in its own findings
// (the indexer, the assigner), so the kind has no one observer.
"view-too-large": {Source: "views", Why: "every owner of a views family writes its own"},
// An owner's change not said on its views family past its bound (mesh-sdk views.UnsaidFinding, id <owner>.<state>):
// written by each owner of a views family in its own findings (the indexer, the assigner), so no one observer.
"view-unsaid": {Source: "views", Why: "every owner of a views family writes its own"},
// The builder's own (design 51): a build that ended failed, a floor whose holder said nothing past its bound, an old
// form held seven days by a counted node-engine, a tag's removal asked and not done.
"build-failed": {Source: "builder", Observer: builder},
@@ -308,7 +308,7 @@ func TestEveryControllerKindHasItsHome(t *testing.T) {
}
}
// The readers' unanswered first view and the owners' views too large to say are every reader's and owner's own.
for _, kind := range []string{"first-view-unanswered", "view-too-large", "family-not-heard"} {
for _, kind := range []string{"first-view-unanswered", "view-too-large", "view-unsaid", "family-not-heard"} {
if h := Homes[kind]; h.Observer != "" || h.Carried || h.Controller {
t.Errorf("%s's home is %+v", kind, h)
}
@@ -327,16 +327,18 @@ func TestEveryControllerKindHasItsHome(t *testing.T) {
// 19 of ADR 0564, the 63 of the table, plan-failed and stalled, mesh-config's four (design 32), the readers' unanswered
// first view, the owners' view too large, the builder's four, the indexer's four and the package seats' token refused.
// And the builder's three publishing kinds and the delivery parts' family not heard: 103.
if len(Homes) != 103 || carried != 37 {
// And the owners' changes not said, view-unsaid: 104. (The bus module's own conditions, nats.status-unwritten among
// them, are said to the keeper directly, never through findings, so they have no home here.)
if len(Homes) != 104 || carried != 37 {
t.Errorf("the table holds %d kinds, %d carried", len(Homes), carried)
}
}
// viewFindingWriters are the catalogue modules (under modules) whose non-test Go code writes a views finding into its own
// findings: views.UnansweredFinding, views.TooLargeFinding or views.OwnFindings.
// findings: views.UnansweredFinding, views.TooLargeFinding, views.UnsaidFinding or views.OwnFindings.
func viewFindingWriters(t *testing.T, modules string) []string {
t.Helper()
writes := regexp.MustCompile(`views\.(UnansweredFinding|TooLargeFinding|OwnFindings)\b`)
writes := regexp.MustCompile(`views\.(UnansweredFinding|TooLargeFinding|UnsaidFinding|OwnFindings)\b`)
var out []string
entries, err := os.ReadDir(modules)
if err != nil {