7 Commits
Author SHA1 Message Date
portal release b86a12e5df Match portal v0.5.9
Test / test (push) Successful in 1m27s
Publish release / publish (push) Successful in 26s
2026-09-30 14:09:37 +02:00
portal release 2f04c82c89 Match portal v0.5.8
Test / test (push) Successful in 31s
Publish release / publish (push) Successful in 26s
2026-09-30 13:44:15 +02:00
portal release 00449916a3 Match portal v0.5.7
Test / test (push) Successful in 2m13s
Publish release / publish (push) Successful in 26s
2026-09-30 13:36:50 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 41db6093e5 The effort budget counts what a person fills in, not carrier fields
Test / test (push) Successful in 2m38s
A type: record field carries the case an answer is about on the link,
and a hidden preset carries a value; neither is asked. An objection
form that carried the application's id counted one field over.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 08:57:03 +02:00
portal release 572dfc200c Match portal v0.5.6
Test / test (push) Successful in 30s
Publish release / publish (push) Successful in 26s
2026-09-30 08:22:10 +02:00
portal release 955a33609a Match portal v0.5.5
Test / test (push) Successful in 30s
Publish release / publish (push) Successful in 25s
2026-09-30 07:54:29 +02:00
portal release 9b96111916 Match portal v0.5.4
Test / test (push) Successful in 30s
Publish release / publish (push) Successful in 25s
2026-09-29 21:14:02 +02:00
4 changed files with 50 additions and 6 deletions
+28
View File
@@ -3,6 +3,34 @@
One line per change, grouped by the release that shipped it. Newest
first. Each release names the portal tag it is built against.
## 0.5.9 (2026-09-30) - portal v0.5.9
- Matches portal v0.5.9 (released by portal's publish job).
## 0.5.8 (2026-09-30) - portal v0.5.8
- Matches portal v0.5.8 (released by portal's publish job).
## 0.5.7 (2026-09-30) - portal v0.5.7
- Matches portal v0.5.7 (released by portal's publish job).
## Unreleased
- The effort budget counts what a person fills in: a `type: record` field (the case an answer is about, carried on the link) and a `hidden` preset are not asked and no longer count. An objection page whose form carried the application's id used to be one field over.
## 0.5.6 (2026-09-30) - portal v0.5.6
- Matches portal v0.5.6 (released by portal's publish job).
## 0.5.5 (2026-09-30) - portal v0.5.5
- Matches portal v0.5.5 (released by portal's publish job).
## 0.5.4 (2026-09-29) - portal v0.5.4
- Matches portal v0.5.4 (released by portal's publish job).
## 0.5.3 (2026-09-29) - portal v0.5.3
- Matches portal v0.5.3 (released by portal's publish job).
Generated
+3 -3
View File
@@ -2287,7 +2287,7 @@ checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0"
[[package]]
name = "iris"
version = "0.5.3"
version = "0.5.9"
dependencies = [
"anyhow",
"async-nats",
@@ -3406,8 +3406,8 @@ dependencies = [
[[package]]
name = "portal"
version = "0.5.3"
source = "git+https://project.uhhm.no/uhhm/portal.git?tag=v0.5.3#46d19e6d9d8eb90f603395850db4320a2db935bd"
version = "0.5.9"
source = "git+https://project.uhhm.no/uhhm/portal.git?tag=v0.5.9#89d419ff7ba62cfb76f2b27c28df516e3b9a11ca"
dependencies = [
"anyhow",
"arc-swap",
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "iris"
version = "0.5.3"
version = "0.5.9"
edition = "2021"
description = "The iris over a portal site: nothing from a content repo comes through until it checks out"
license = "MIT"
@@ -10,7 +10,7 @@ repository = "https://project.uhhm.no/uhhm/iris"
# The site's own content types and loaders, so iris reads a repo exactly
# the way the running site does. Pinned to the portal release it
# matches; bumping this tag is what a new iris release is.
portal = { git = "https://project.uhhm.no/uhhm/portal.git", tag = "v0.5.3", features = ["ssr"] }
portal = { git = "https://project.uhhm.no/uhhm/portal.git", tag = "v0.5.9", features = ["ssr"] }
anyhow = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
+17 -1
View File
@@ -157,11 +157,14 @@ fn visible(q: &Question, as_group: Option<&str>) -> bool {
}
}
/// What a person has to fill in: required fields, less the ones that
/// carry rather than ask - a `record` naming the case an answer is
/// about, a `hidden` preset - which cost nobody anything.
fn required_fields(alt: &Alternative) -> usize {
alt.features
.iter()
.flat_map(|f| &f.requirements)
.filter(|r| !r.optional)
.filter(|r| !r.optional && r.kind != "record" && r.kind != "hidden")
.count()
}
@@ -860,6 +863,19 @@ mod tests {
let (questions, aggregates) = site(FULL_DESK);
let findings = check(&needs(" max_fields: 1\n"), &questions, &aggregates);
assert_eq!(fails(&findings), vec!["the path asks for 2 required field(s), over the budget of 1"]);
// A field that carries rather than asks is not effort: the
// record an answer is about arrives on the link.
let (mut questions, aggregates) = site(FULL_DESK);
let front = questions.get_mut("/").unwrap();
let brief = &mut front.alternatives[0].features[0].requirements;
let mut carrier = brief[0].clone();
carrier.name = "case".into();
carrier.kind = "record".into();
carrier.of = Some("projects".into());
carrier.optional = false;
brief.push(carrier);
let findings = check(&needs(" max_fields: 2\n"), &questions, &aggregates);
assert!(fails(&findings).is_empty(), "{findings:?}");
}
#[test]