A submitter's own moves say where they may be made from

portal compiles one access rule per state a self_transition names, and
without them assumed the day the case arrived. The builder already
knew the answer - `moves_of(need, SUBMITTER)` carries the from-state
of every move - and now writes it down, so the applicant answering a
request for papers from `incomplete` gets a rule for it, and withdrawal
is offered from wherever the case has got to.

Measured on the building authority: the submitter had two rules, both
out of `open`. It now has ten, across applications and appeals.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Bendik Aagaard Lynghaug
2026-09-25 21:35:32 +02:00
co-authored by Claude Opus 5
parent 3e1c299490
commit 040a95ee07
8 changed files with 48 additions and 1 deletions
@@ -6,4 +6,8 @@ alternatives:
self_transition: self_transition:
bucket: appeals bucket: appeals
to: withdrawn to: withdrawn
from:
- before_the_board
- open
- reconsidered
label: Withdrawn label: Withdrawn
@@ -6,4 +6,9 @@ alternatives:
self_transition: self_transition:
bucket: exemptions bucket: exemptions
to: withdrawn to: withdrawn
from:
- county_answered
- county_asked
- open
- recommended
label: Withdrawn label: Withdrawn
@@ -6,4 +6,7 @@ alternatives:
self_transition: self_transition:
bucket: firms bucket: firms
to: checked to: checked
from:
- open
- papers_missing
label: Checked label: Checked
@@ -6,4 +6,8 @@ alternatives:
self_transition: self_transition:
bucket: objections bucket: objections
to: withdrawn to: withdrawn
from:
- answered_by_applicant
- open
- registered
label: Withdrawn label: Withdrawn
@@ -6,10 +6,19 @@ alternatives:
self_transition: self_transition:
bucket: applications bucket: applications
to: complete to: complete
from:
- incomplete
- open
label: Complete label: Complete
- name: Withdrawn - name: Withdrawn
description: '' description: ''
self_transition: self_transition:
bucket: applications bucket: applications
to: withdrawn to: withdrawn
from:
- complete
- incomplete
- on_hearing
- open
- recommended
label: Withdrawn label: Withdrawn
@@ -6,4 +6,8 @@ alternatives:
self_transition: self_transition:
bucket: meetings bucket: meetings
to: cancelled to: cancelled
from:
- met
- open
- scheduled
label: Cancelled label: Cancelled
@@ -6,10 +6,19 @@ alternatives:
self_transition: self_transition:
bucket: applications bucket: applications
to: complete to: complete
from:
- incomplete
- open
label: Complete label: Complete
- name: Withdrawn - name: Withdrawn
description: '' description: ''
self_transition: self_transition:
bucket: applications bucket: applications
to: withdrawn to: withdrawn
from:
- complete
- incomplete
- on_hearing
- open
- recommended
label: Withdrawn label: Withdrawn
+10 -1
View File
@@ -1595,6 +1595,15 @@ pub fn render(plan: &Plan, words: &BTreeMap<String, Value>) -> anyhow::Result<BT
let path = decide_path(need); let path = decide_path(need);
let w = &words[&path]; let w = &words[&path];
let targets: BTreeSet<&String> = theirs.iter().map(|(_, to)| to).collect(); let targets: BTreeSet<&String> = theirs.iter().map(|(_, to)| to).collect();
// Where each of their moves may be made from. A person is in
// dialogue with their case for as long as it runs: the
// applicant answers a request for papers from `incomplete`,
// and withdraws from wherever the case has got to by then.
// Portal compiles one policy rule per state named here, and
// without them it assumes the day the case arrived.
let from_for = |to: &String| -> Vec<&String> {
theirs.iter().filter(|(_, t)| t == to).map(|(from, _)| from).collect()
};
files.insert( files.insert(
path, path,
json!({ json!({
@@ -1603,7 +1612,7 @@ pub fn render(plan: &Plan, words: &BTreeMap<String, Value>) -> anyhow::Result<BT
"alternatives": targets.iter().map(|to| json!({ "alternatives": targets.iter().map(|to| json!({
"name": s(&w["moves"][to.as_str()]["heading"]), "name": s(&w["moves"][to.as_str()]["heading"]),
"description": s(&w["moves"][to.as_str()]["description"]), "description": s(&w["moves"][to.as_str()]["description"]),
"self_transition": { "bucket": need.lands_in, "to": to, "label": s(&w["moves"][to.as_str()]["button"]) }, "self_transition": { "bucket": need.lands_in, "to": to, "from": from_for(to), "label": s(&w["moves"][to.as_str()]["button"]) },
})).collect::<Vec<_>>(), })).collect::<Vec<_>>(),
}), }),
); );