How a finding earns its place
The record does not just store findings. It derives them. Sources make claims with a trust weight; the published method is a set of rules; the engine works out what follows, which claims defeat which, and how much each conclusion can be trusted. Every output below is real: the Spindle defeasible-reasoning engine (version 0.6.0) run over an 86-line illustrative theory of one area, one service and three findings. The same four questions can be asked of every entry on the map: why, why not, what would change it, and how far do we trust it.
| Conclusion | Trust | Rests on | Reading |
| (gap cell-10-11 recovery) | 0.95 | ABS ASGS · method | Finding stands. Clears both thresholds. |
| (gap cell-14-03 recovery) | not provable | pipeline | Blocked: area not yet collected. Unknown, not none. |
| (not (service svc-0171)) | 0.85 | co-design round 1 · method | Desk listing defeated: the service closed. |
| (finding-f07 svc-0142) | 0.14 | agency return · method | Stands, but diminished by the agency's response. Below the finding threshold, so it cannot enter the report unchallenged. |
| (may (release svc-0142 sector)) | 0.85 | agency return · co-design · method | Permitted: a response is on file. Before that, forbidden. |
| (dead-end hsb-regional) | 0.85 | co-design round 1 · method | No onward destination recorded. Finding. |
Trust is the weakest link in each derivation chain. Marks on each bar: the finding threshold (0.70) and the report threshold (0.80), both set with DCJ at inception.
Absence is a finding, unless shown otherwise. And unknown is not none.
Two areas with no recovery service in the record. One has been collected, one has not. The method presumes a gap wherever coverage cannot be shown, and a separate rule blocks that presumption, without asserting coverage, where nothing has been collected yet.
$ spindle explain '(gap cell-10-11 recovery)'
Explanation for +d (gap cell-10-11 recovery)
This was proven using defeasible rules and was not
defeated by any conflicting rule.
Derivation:
1. "(gap cell-10-11 recovery)" was derived defeasibly
Using defeasible rule: presume-gap
Prerequisites:
1. "(area cell-10-11)" was established as a fact
Using fact: f19
$ spindle why-not '(gap cell-14-03 recovery)'
(gap cell-14-03 recovery) is not provable:
Would be derived by rule: presume-gap
Blocked by:
- Rule presume-gap: defeated
(Defeated by rule unknown-is-not-none)
What a DCJ reader seesCell 10-11 is red on the map with finding F-02 attached. Cell 14-03 is hatched, with no finding, and a line in the sources page saying which door its return comes through.
A later, better source defeats an earlier one, and the earlier one is kept.
A web directory listed a recovery service in cell 10-11. The first co-design round learned it closed. The desk claim is not deleted. It is outranked, and the gap finding survives because the only thing that could have covered the area is no longer a service.
$ spindle why-not '(in-reach cell-10-11 recovery)'
(in-reach cell-10-11 recovery) is not provable:
Would be derived by rule: reach-catchment
Blocked by:
- Rule reach-catchment: missing premise
(Missing premises: (service svc-0171))
$ spindle explain '(not (service svc-0171))'
Explanation for +d (not (service svc-0171))
Derivation:
1. "(not (service svc-0171))" was derived defeasibly
Using defeasible rule: closed-wins
Prerequisites:
1. "(closed svc-0171)" was established as a fact
Using fact: f13
What a DCJ reader seesThe record for svc-0171 shows status closed, the desk listing it came from at trust 0.40, and the co-design record that superseded it at 0.85. Both hashed, both kept.
A finding with a right of response attached is kept, and its trust falls.
Wait-list 38 against 3.2 funded FTE triggers finding F-07. The agency's response (a vacancy has been filled) is a defeater that is outranked by the finding rule, so the finding stands, but the engine records the challenge as a diminishment: trust falls from 0.90 to 0.14, below the finding threshold. The report cannot carry it without the response beside it.
$ spindle reason --trust (excerpt)
(finding-f07 svc-0142) (trust: 0.14)
[source:agency-return-westvale, source:method]
(response svc-0142 vacancy-filled) (trust: 0.85)
[source:codesign-round-1]
$ spindle reason --json --trust (excerpt)
"trust_details": {
"above_threshold": { "finding": false, "report": false },
"diminished_by": [{
"defeater_label": "agency-response",
"defeater_degree": 0.85,
"target_degree": 0.9,
"diminishment": 0.765,
"full_defeat": false,
"resulting_degree": 0.135 }] }
What a DCJ reader seesF-07 on the record page with the agency's words directly under it, a trust bar below the finding mark, and a note that the finding is contested. Nothing is softened, nothing is dropped.
Release is a permission the rules grant, not an edit someone makes.
A political-tier finding is forbidden from the sector tier until a response is on file. The modal rules say so, and the permission is derived the moment the response claim arrives. For any finding, the engine can also say what single fact would close it.
$ spindle explain '(may (release svc-0142 sector))'
Explanation for +d (may (release svc-0142 sector))
Derivation:
1. "(may (release svc-0142 sector))" was derived defeasibly
Using defeasible rule: release-with-response
Prerequisites:
1. "(finding-f07 svc-0142)" was derived defeasibly
Using defeasible rule: f07
Prerequisites:
1. "(waitlist svc-0142 38)" fact f9
1. "(capacity-fte svc-0142 3.2)" fact f8
1. "(response svc-0142 vacancy-filled)" was established as a fact
Using fact: f14
$ spindle what-if '(gap cell-10-11 recovery)' \
--given '(in-reach cell-10-11 recovery)'
Not provable: (gap cell-10-11 recovery)
New conclusions: (in-reach cell-10-11 recovery),
(not (gap cell-10-11 recovery))
$ spindle requires '(not (gap cell-10-11 recovery))'
Verified requirements for (not (gap cell-10-11 recovery)):
1. Add facts: {(in-reach cell-10-11 recovery)}
What a DCJ reader seesThe audience switch at the top of this page is these rules. And an agency correcting its own entry is told exactly which fact would close the finding against it.
Rules carry the sector's judgement, in the open.
Fortnightly outreach counts as counselling in reach but not as crisis response. That is a sector judgement written as one rule, published under CC BY, and arguable in a co-design round. If the sector disagrees, the rule changes and every area re-derives.
$ spindle why-not '(in-reach cell-10-11 crisis-response)'
(in-reach cell-10-11 crisis-response) is not provable:
Would be derived by rule: reach-outreach
Blocked by:
- Rule reach-outreach: defeated
(Defeated by rule outreach-too-thin)
; the rule, as published
(normally reach-outreach
(and (service ?s) (outreach ?s ?a ?f) (stage ?s ?st))
(in-reach ?a ?st))
; Fortnightly outreach does not count as crisis
; response in reach.
(except outreach-too-thin
(outreach ?s ?a fortnightly)
(not (in-reach ?a crisis-response)))
The whole theory, as run (living-map.spl, 86 lines)
; Living map: one area, one service, three findings. Illustrative theory.
; Sources carry trust. Conclusions carry the weakest link in their chain.
(trusts source:dcj-funded-list 0.80)
(trusts source:agency-return-westvale 0.90)
(trusts source:desk-note 0.40)
(trusts source:codesign-round-1 0.85)
(trusts source:abs-asgs 0.95)
(trusts source:pipeline 0.95)
(trusts source:method 1.00)
(threshold finding 0.70)
(threshold report 0.80)
; --- What the sources say ------------------------------------------------
(claims source:dcj-funded-list :at "2026-10-30T00:00:00Z" :note "DCJ extract, sha256 4b1e…9a07"
(given (service svc-0142))
(given (position svc-0142 core))
(given (stage svc-0142 crisis-response))
(given (stage svc-0142 counselling))
(given (catchment svc-0142 cell-09-11))
(given (catchment svc-0142 cell-09-12)))
(claims source:agency-return-westvale :at "2026-11-14T00:00:00Z" :note "Agency return, sha256 9f3a…c21e"
(given (outreach svc-0142 cell-10-11 fortnightly))
(given (capacity-fte svc-0142 3.2))
(given (waitlist svc-0142 38)))
(claims source:desk-note :at "2026-11-02T00:00:00Z" :note "Web directory listing, undated"
(given (listed svc-0171))
(given (stage svc-0171 recovery))
(given (catchment svc-0171 cell-10-11)))
(claims source:codesign-round-1 :at "2026-12-02T00:00:00Z" :note "Round 1 record, sha256 c77d…10bf"
(given (closed svc-0171))
(given (response svc-0142 vacancy-filled))
(given (program hsb-metro))
(given (onward hsb-metro recovery-cyp-metro))
(given (program hsb-regional)))
(claims source:abs-asgs :at "2021-07-01T00:00:00Z" :note "ABS ASGS 2021, CC BY"
(given (area cell-09-11))
(given (area cell-10-11))
(given (area cell-14-03)))
(claims source:pipeline :at "2026-11-20T00:00:00Z" :note "Derived: no return on file for this area"
(given (not-collected cell-14-03)))
; --- Rules ------------------------------------------------------------------
(claims source:method :note "Published method, CC BY. Rules are the method; facts come from sources."
; A listed service is normally a service, unless a later source says it closed.
(normally desk-listing (listed ?s) (service ?s))
(normally closed-wins (closed ?s) (not (service ?s)))
; Reach: a service covers its catchment, and normally its outreach areas too.
(normally reach-catchment (and (service ?s) (catchment ?s ?a) (stage ?s ?st)) (in-reach ?a ?st))
(normally reach-outreach (and (service ?s) (outreach ?s ?a ?f) (stage ?s ?st)) (in-reach ?a ?st))
; Fortnightly outreach does not count as crisis response in reach.
(except outreach-too-thin (outreach ?s ?a fortnightly) (not (in-reach ?a crisis-response)))
; Gap: absence is presumed a finding, unless coverage is shown.
; An uncollected area blocks the finding without asserting coverage: unknown is not none.
(normally presume-gap (area ?a) (gap ?a recovery))
(normally covered (in-reach ?a recovery) (not (gap ?a recovery)))
(except unknown-is-not-none (not-collected ?a) (not (gap ?a recovery)))
; F-07: wait-list more than eight times funded FTE is a demand finding.
(normally f07 (and (waitlist ?s ?w) (capacity-fte ?s ?c) (bind ?ratio (/ ?w ?c)) (> ?ratio 8)) (finding-f07 ?s))
; The agency's response challenges it. The finding stands, with its trust reduced.
(except agency-response (response ?s vacancy-filled) (not (finding-f07 ?s)))
; Political tier: a finding may not go to the sector tier until a response is on file.
(normally hold-finding (finding-f07 ?s) (forbidden (release ?s sector)))
(normally release-with-response (and (finding-f07 ?s) (response ?s _)) (may (release ?s sector)))
; Pathways: a program is presumed a dead-end until an onward destination is recorded.
(normally presume-dead-end (program ?p) (dead-end ?p))
(normally has-onward (onward ?p ?q) (not (dead-end ?p))))
; Preferences are global
(prefer closed-wins desk-listing)
(prefer covered presume-gap)
(prefer f07 agency-response)
(prefer release-with-response hold-finding)
(prefer has-onward presume-dead-end)