One binary: the lint and the trainer are commands of portal
Test / test (pull_request) Successful in 1m7s
Test / test (pull_request) Successful in 1m7s
portal serve runs a site; portal lint is what iris was; portal plan, build, report and the rest are what portal-trainer was. One source at one version, so the three never disagree about what content means. Both histories are merged in (subtree). The release attaches the bare binary for a content repo's CI. The trainer's plans, intakes, engines and reference prompt come along; its runs stay in the old repo. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
d0d1cbf23d
commit
96b3746643
@@ -56,75 +56,12 @@ jobs:
|
||||
- name: Build
|
||||
run: SITE_NAME=${{ vars.PORTAL_SITE_NAME }} cargo leptos build --release
|
||||
|
||||
# The lint (uhhm/iris) is versioned as portal: this step re-pins
|
||||
# iris to the tag being released, builds and tests it against it,
|
||||
# and pushes the matching iris tag, which iris's own CI publishes.
|
||||
# A portal change to something the lint reads fails the release
|
||||
# right here. Needs IRIS_PUSH_USER (a variable) and IRIS_PUSH_TOKEN
|
||||
# (a secret) that may push to uhhm/iris; the workflow's own token
|
||||
# is scoped to this repo. A re-run of a tag whose iris tag already
|
||||
# exists just builds that.
|
||||
- name: Release iris to match
|
||||
env:
|
||||
# The shared cargo home is read-only for the runner, and a git
|
||||
# dependency has to be cloned into one (same as uhhm/iris's CI).
|
||||
CARGO_HOME: /var/local/cargo-target/iris-cargo-home
|
||||
RUSTC_WRAPPER: /usr/bin/sccache
|
||||
IRIS_PUSH_USER: ${{ vars.IRIS_PUSH_USER }}
|
||||
IRIS_PUSH_TOKEN: ${{ secrets.IRIS_PUSH_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
tag="${{ github.ref_name }}"
|
||||
ver="${tag#v}"
|
||||
host="${{ github.server_url }}"
|
||||
remote="https://${IRIS_PUSH_USER}:${IRIS_PUSH_TOKEN}@${host#https://}/uhhm/iris.git"
|
||||
# Re-pin, version, changelog: idempotent, so a retry on a fresh
|
||||
# clone redoes exactly the same edits.
|
||||
match() {
|
||||
sed -i -E "s|^(portal = \{ git = \"[^\"]+\", tag = \")[^\"]+(\")|\1$tag\2|" Cargo.toml
|
||||
sed -i -E "0,/^version = \"[^\"]+\"/s//version = \"$ver\"/" Cargo.toml
|
||||
cargo update -q -p portal
|
||||
awk -v h="## $ver ($(date -u +%F)) - portal $tag" -v l="- Matches portal $tag (released by portal's publish job)." \
|
||||
'done==0 && /^## /{print h; print ""; print l; print ""; done=1} {print}' CHANGELOG.md > CHANGELOG.new
|
||||
mv CHANGELOG.new CHANGELOG.md
|
||||
git config user.name "portal release"
|
||||
git config user.email "portal@uhhm.no"
|
||||
git commit -qam "Match portal $tag"
|
||||
git tag "$tag"
|
||||
}
|
||||
# Someone may push to iris main while this job builds; a push
|
||||
# then fails as non-fast-forward, and the answer is to start
|
||||
# over on a fresh clone, once.
|
||||
for attempt in 1 2; do
|
||||
cd "$GITHUB_WORKSPACE"
|
||||
rm -rf iris-src
|
||||
git clone -q "$host/uhhm/iris.git" iris-src
|
||||
cd iris-src
|
||||
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null; then
|
||||
echo "iris $tag already exists, building it"
|
||||
git checkout -q "$tag"
|
||||
cargo build --release
|
||||
cargo test
|
||||
break
|
||||
fi
|
||||
match
|
||||
cargo build --release
|
||||
cargo test
|
||||
if git push -q "$remote" main "$tag"; then
|
||||
echo "pushed iris $tag"
|
||||
break
|
||||
fi
|
||||
echo "push rejected on attempt $attempt (iris main moved), retrying on a fresh clone"
|
||||
[ "$attempt" = 2 ] && exit 1
|
||||
done
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
set -euo pipefail
|
||||
tag="${{ github.ref_name }}"
|
||||
stage=$(mktemp -d)
|
||||
cp "$CARGO_TARGET_DIR/release/portal" "$stage/portal"
|
||||
cp "$CARGO_TARGET_DIR/release/iris" "$stage/iris"
|
||||
# hash-files = true: leptos resolves hash.txt next to the running
|
||||
# binary, so it ships beside portal in the release dir.
|
||||
cp "$CARGO_TARGET_DIR/release/hash.txt" "$stage/hash.txt"
|
||||
@@ -132,7 +69,10 @@ jobs:
|
||||
# not affected by CARGO_TARGET_DIR - only the plain `cargo build`
|
||||
# outputs (release/, front/) move with that override.
|
||||
cp -r target/site "$stage/site"
|
||||
tar -C "$stage" -czf "portal-$tag.tar.gz" portal iris hash.txt site
|
||||
tar -C "$stage" -czf "portal-$tag.tar.gz" portal hash.txt site
|
||||
# The bare binary as well: a content repo's CI runs `portal lint`
|
||||
# and needs nothing else from the release.
|
||||
cp "$stage/portal" portal-bin
|
||||
rm -rf "$stage"
|
||||
|
||||
# The run's own ephemeral token has write access to this repo -
|
||||
@@ -159,4 +99,7 @@ jobs:
|
||||
curl -sf -X POST -H "$auth" \
|
||||
-F "attachment=@portal-$tag.tar.gz" \
|
||||
"$api/releases/$id/assets?name=portal-$tag.tar.gz" > /dev/null
|
||||
curl -sf -X POST -H "$auth" \
|
||||
-F "attachment=@portal-bin" \
|
||||
"$api/releases/$id/assets?name=portal" > /dev/null
|
||||
echo "published $tag"
|
||||
|
||||
@@ -4,6 +4,10 @@ One line per change, grouped by the release that shipped it. Newest
|
||||
first. A release is a Cargo.toml bump plus a `v<version>` tag; the
|
||||
content repos pin the tag they run (see the end of this file).
|
||||
|
||||
## Unreleased
|
||||
|
||||
- One binary. The lint (uhhm/iris) and the trainer (uhhm/portal-trainer) are commands of `portal`: `portal serve` (the default), `portal lint`, and `portal plan`, `build`, `answer`, `rate`, `prefer`, `score`, `simulate`, `compare`, `report`, `generate`. Same source, same version, so the site, the lint and the trainer never disagree about what content means; both histories are merged in. The release attaches the bare `portal` binary beside the tarball, so a content repo's CI downloads it and runs `portal lint`. No more iris releases; the pins that exist keep working. The trainer's `plans/`, `intakes/`, `engines/`, `sectors/` and its reference prompt live here now; its `runs/` stay in uhhm/portal-trainer. Docs gained "Training a site" and "The lint".
|
||||
|
||||
## 0.5.11 (2026-09-30)
|
||||
|
||||
- Storylines (`src/content/variants.rs`, `docs/storylines.md`): any text a person reads may be a list, one entry per storyline, every list the same length; a visitor is given one storyline for the whole site (the `portal_storyline` cookie, a year) and reads it on every page and in every mail about their case. What the machine reads - a field's `name`, `options`, states, groups, paths - never varies. The lint refuses a list of another length. Records and answer events carry `storyline`, and `GET /report` gives counts per bucket, per storyline, per state, and nothing else.
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ leptos = { version = "0.8" }
|
||||
leptos_meta = { version = "0.8" }
|
||||
leptos_router = { version = "0.8" }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
# preserve_order: a rendered page is read by the people who own it, so
|
||||
# the keys come out as written (name, then description), not sorted.
|
||||
serde_json = { version = "1", features = ["preserve_order"] }
|
||||
# Inline markdown for content descriptions (links, emphasis, code) -
|
||||
# runs on both server and client renders, so not feature-gated.
|
||||
pulldown-cmark = { version = "0.13", default-features = false, features = ["html"] }
|
||||
|
||||
+7
-4
@@ -14,12 +14,15 @@ engine does with it.
|
||||
| [Storylines](storylines.md) | The same site told several ways: lists of texts, one storyline per visitor, counted per storyline. |
|
||||
| [Memberships](memberships.md) | Groups kept by portal itself: a membership as a case, a person as a phone number first, and the provider only saying who. |
|
||||
| [Operations](operations.md) | Releasing, deploying, adding a site, environment variables. |
|
||||
| [Training a site](training.md) | `portal plan` and `portal build`: a business in plain words becomes a content repo, held to the lint. |
|
||||
| [The lint](lint.md) | `portal lint`: what a content repo's CI runs before anything reaches a site. |
|
||||
| [Filesystem routes](design/filesystem-routes.md) | Why the `questions/` tree is the router. |
|
||||
|
||||
Two repos in the same family carry their own docs:
|
||||
One repo in the same family carries its own docs:
|
||||
|
||||
- [uhhm/iris](https://project.uhhm.no/uhhm/iris) — the lint. Versioned
|
||||
as portal and released by portal's publish job; it is the thing a
|
||||
content repo's CI runs before anything reaches a site.
|
||||
- [uhhm/gdo](https://project.uhhm.no/uhhm/gdo) — the mailer. Delivers
|
||||
what content asked to be sent, and carries replies back.
|
||||
|
||||
The lint (once uhhm/iris) and the trainer (once uhhm/portal-trainer)
|
||||
are commands of the `portal` binary since 0.6; their chapters are
|
||||
above, and the trainer's runs stay in the old repo.
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
- [Memberships](memberships.md)
|
||||
- [Operations](operations.md)
|
||||
|
||||
# The trainer and the lint
|
||||
|
||||
- [Training a site](training.md)
|
||||
- [The lint](lint.md)
|
||||
|
||||
# How it is made
|
||||
|
||||
- [Architecture](architecture.md)
|
||||
@@ -20,3 +25,4 @@
|
||||
---
|
||||
|
||||
[Changelog](changelog.md)
|
||||
[The lint's changelog, to 0.5.11](lint-changelog.md)
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# The lint
|
||||
|
||||
The iris over a site. A content push is an incoming wormhole; nothing
|
||||
comes through until it checks out.
|
||||
|
||||
```
|
||||
portal lint --path questions # a local checkout
|
||||
portal lint --repo https://project.uhhm.no/uhhm/questions
|
||||
portal lint replay --path questions --nats nats://127.0.0.1:14222
|
||||
```
|
||||
|
||||
It was its own binary, iris, until portal 0.6: the same code, released
|
||||
as portal's twin. Now it is the `portal` binary's `lint` command, so a
|
||||
content repo's CI downloads the release and runs it:
|
||||
|
||||
```yaml
|
||||
- run: |
|
||||
curl -sfL "https://project.uhhm.no/uhhm/portal/releases/download/$PORTAL_RELEASE/portal" -o portal
|
||||
chmod +x portal && ./portal lint --path questions
|
||||
```
|
||||
|
||||
`check` loads a content repo exactly the way the running site does,
|
||||
validates it (every action lands on a page, every transition is one
|
||||
the state machine allows, every recorded bucket is read back
|
||||
somewhere), and then holds it to the business needs the repo declares
|
||||
in `needs.yaml`, when it has one:
|
||||
|
||||
- a path of submissions gets each kind of visitor's answer into the
|
||||
bucket it names, within a submission and required-field budget;
|
||||
- the handling group holds a desk over that bucket, and every
|
||||
finished state is reachable through the buttons it (and any
|
||||
`also_moved_by` group) offers; no record strands on the way;
|
||||
- every stage the business named is a state of the machine.
|
||||
|
||||
A need marked `planned` warns instead of failing. Exit status is the
|
||||
verdict, so a content repo's CI is one line.
|
||||
|
||||
Beyond the verdict, `check` exports what a trainer needs to grade the
|
||||
wording: `--needs-tasks` writes the personas as typed choice tasks
|
||||
(`--skim` for headings only), `--needs-score` grades an engine's
|
||||
answers, and `--needs-sim` writes a resolved model of the whole site.
|
||||
`portal lint replay` runs simulated cases through the site's real aggregate
|
||||
engine on a throwaway JetStream and reports every bucket by state;
|
||||
`--report-only` takes the same scorecard from a live site's buckets.
|
||||
See [Training a site](training.md) for what sits around those.
|
||||
|
||||
## Matching the site
|
||||
|
||||
The lint is the site: `portal lint` and `portal serve` are one binary
|
||||
built from one source, so a content shape the site reads is a shape
|
||||
the lint knows, at the same version. A content repo pins
|
||||
`PORTAL_RELEASE` to what its site runs and lints with that release's
|
||||
`portal`. The `IRIS_RELEASE` pins from before portal 0.6 keep working
|
||||
against the iris releases that exist; nothing new is published there.
|
||||
@@ -1,18 +1,23 @@
|
||||
# portal-trainer
|
||||
# Training a site
|
||||
|
||||
A business describes itself in plain words: what it does, who comes to
|
||||
it, what it keeps track of and through which stages, and who handles
|
||||
what. `portal-trainer` turns that into a working
|
||||
[portal](https://project.uhhm.no/uhhm/portal) content repo: a question
|
||||
series for every role, the state machines behind them, and a desk per
|
||||
handling role. No software is written for the business; the only thing
|
||||
produced is content, and every line of it is held to a verifier.
|
||||
what. The trainer, `portal plan` and `portal build`, turns that into a
|
||||
working content repo: a question series for every role, the state
|
||||
machines behind them, and a desk per handling role. No software is
|
||||
written for the business; the only thing produced is content, and
|
||||
every line of it is held to the lint (`portal lint`), which is the
|
||||
same code as the site, at the same version.
|
||||
|
||||
The trainer was its own repo, uhhm/portal-trainer, until portal 0.6;
|
||||
its runs (`runs/`, the lab notebook of every site trained so far)
|
||||
stay there.
|
||||
|
||||
## Build: structure from the plan, words from the model
|
||||
|
||||
```
|
||||
portal-trainer build --plan plans/contractor.yaml --out out/nordvik \
|
||||
--lint iris --llm "MODEL=sonnet engines/claude.sh"
|
||||
portal build --plan plans/contractor.yaml --out out/nordvik \
|
||||
--lint "portal lint" --llm "MODEL=sonnet engines/claude.sh"
|
||||
```
|
||||
|
||||
A `plan.yaml` is a needs spec that also says what each form collects
|
||||
@@ -200,7 +205,7 @@ the business's own words and held-out personas.
|
||||
## Plan: the intake, read by a model, checked by a person
|
||||
|
||||
```
|
||||
portal-trainer plan --intake intakes/contractor.yaml --out out/nordvik \
|
||||
portal plan --intake intakes/contractor.yaml --out out/nordvik \
|
||||
--personas sectors/construction/needs.yaml \
|
||||
--llm "MODEL=nemotron-3.5-lightning:30b-a3b engines/ollama.sh"
|
||||
```
|
||||
@@ -250,9 +255,9 @@ Model output is only ever written to `aggregates.yaml`, `site.yaml`
|
||||
and `questions/**.yaml` inside the output directory.
|
||||
|
||||
```
|
||||
portal-trainer generate --intake intakes/contractor.yaml --out out/nordvik \
|
||||
--lint iris --llm engines/ollama.sh
|
||||
portal-trainer answer --tasks tasks.jsonl --llm engines/ollama.sh > answers.jsonl
|
||||
portal generate --intake intakes/contractor.yaml --out out/nordvik \
|
||||
--lint "portal lint" --llm engines/ollama.sh
|
||||
portal answer --tasks tasks.jsonl --llm engines/ollama.sh > answers.jsonl
|
||||
```
|
||||
|
||||
`answer` puts one task per call to the visitor model, with the options
|
||||
@@ -317,7 +322,7 @@ and the scorers read all of it.
|
||||
## Scoring a built site
|
||||
|
||||
```
|
||||
portal-trainer score --site out/nordvik --out out/scored \
|
||||
portal score --site out/nordvik --out out/scored \
|
||||
--iris /var/local/cargo-target/release/iris \
|
||||
--llm "MODEL=qwen3:8b engines/ollama.sh"
|
||||
```
|
||||
@@ -333,7 +338,7 @@ one visitor model against tasks iris wrote, and:
|
||||
|
||||
```
|
||||
iris check --path out/nordvik/questions --needs-sim model.json
|
||||
portal-trainer rate --model model.json --out out/rated --repo out/nordvik \
|
||||
portal rate --model model.json --out out/rated --repo out/nordvik \
|
||||
--llm "MODEL=qwen3:8b engines/ollama.sh"
|
||||
```
|
||||
|
||||
@@ -37,6 +37,13 @@ pub mod seed;
|
||||
pub mod memberships;
|
||||
#[cfg(feature = "ssr")]
|
||||
pub mod report;
|
||||
/// The lint: `portal lint`, what a content repo's CI runs (once uhhm/iris).
|
||||
#[cfg(feature = "ssr")]
|
||||
pub mod lint;
|
||||
/// The trainer: `portal plan`, `portal build`, `portal report` and the
|
||||
/// rest (once uhhm/portal-trainer).
|
||||
#[cfg(feature = "ssr")]
|
||||
pub mod trainer;
|
||||
|
||||
pub mod maps;
|
||||
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
//! than compiled there - keeps that repo's CI coupling to "run a
|
||||
//! static binary," not "build a Rust workspace."
|
||||
|
||||
use crate::local::{load_aggregates_from_dir, load_from_dir, load_needs_from_dir, load_site_from_dir};
|
||||
use crate::needs;
|
||||
use portal::{aggregates, content};
|
||||
use crate::lint::local::{load_aggregates_from_dir, load_from_dir, load_needs_from_dir, load_site_from_dir};
|
||||
use crate::lint::needs;
|
||||
use crate::{aggregates, content};
|
||||
|
||||
pub async fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
let mut args = argv.into_iter();
|
||||
@@ -54,13 +54,15 @@ pub async fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
load_needs_from_dir(&dir)?,
|
||||
)
|
||||
} else if let Some(repo_url) = repo {
|
||||
let questions = content::load_questions_from_gitea(&repo_url, &branch, &subdir).await?;
|
||||
let aggregates_map = content::load_aggregates_from_gitea(&repo_url, &branch).await?;
|
||||
// The first storyline of each, as the checks read it; the
|
||||
// loaders have held every list of texts to the site's arity.
|
||||
let questions = content::load_questions_from_gitea(&repo_url, &branch, &subdir).await?.at(0).clone();
|
||||
let aggregates_map = content::load_aggregates_from_gitea(&repo_url, &branch).await?.at(0).clone();
|
||||
// load_site_from_gitea already validates; a missing file is
|
||||
// the default config, same as at portal boot.
|
||||
let site = content::load_site_from_gitea(&repo_url, &branch).await?;
|
||||
let site = content::load_site_from_gitea(&repo_url, &branch).await?.at(0).clone();
|
||||
// Optional: a fetch failure means the repo declares no needs.
|
||||
let needs_raw = portal::http::get_text(&format!("{}/needs.yaml?ref={branch}", content::gitea_raw_base(&repo_url)?), portal::http::GITEA_CAP).await.ok();
|
||||
let needs_raw = crate::http::get_text(&format!("{}/needs.yaml?ref={branch}", content::gitea_raw_base(&repo_url)?), crate::http::GITEA_CAP).await.ok();
|
||||
(questions, aggregates_map, site, needs_raw)
|
||||
} else {
|
||||
eprintln!(
|
||||
@@ -96,7 +98,7 @@ pub async fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
// The access policy the site will compile from this content.
|
||||
// It must type-check against portal's schema: a rule the
|
||||
// schema cannot express would grant nothing at runtime.
|
||||
let policy = portal::access::Policy::from_content(&questions, &aggregates_map);
|
||||
let policy = crate::access::Policy::from_content(&questions, &aggregates_map);
|
||||
if let Err(e) = policy.validate() {
|
||||
eprintln!("FAIL: access policy does not validate: {e}");
|
||||
std::process::exit(1);
|
||||
@@ -129,7 +131,7 @@ pub async fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
}
|
||||
}
|
||||
|
||||
/// The business-needs pass (see `crate::needs`): structure always,
|
||||
/// The business-needs pass (see `crate::lint::needs`): structure always,
|
||||
/// then the wording tasks written out and/or an engine's answers
|
||||
/// scored, when asked. A repo without `needs.yaml` skips all of it.
|
||||
fn check_needs(
|
||||
@@ -4,7 +4,7 @@
|
||||
//! needs_replay). `dir` is always the pages directory (`questions/`);
|
||||
//! `site.yaml`, `aggregates.yaml` and `needs.yaml` sit one level up.
|
||||
|
||||
use portal::{aggregates, content};
|
||||
use crate::{aggregates, content};
|
||||
|
||||
/// The offline counterpart to `content::load_site_from_gitea` -
|
||||
/// `site.yaml` lives at the repo root like `aggregates.yaml`, and is
|
||||
@@ -19,7 +19,10 @@ pub fn load_site_from_dir(dir: &str) -> anyhow::Result<content::SiteConfig> {
|
||||
}
|
||||
let raw = std::fs::read_to_string(&site_path)
|
||||
.map_err(|e| anyhow::anyhow!("reading {}: {e}", site_path.display()))?;
|
||||
serde_yaml::from_str(&raw).map_err(|e| anyhow::anyhow!("parsing {}: {e}", site_path.display()))
|
||||
// The first storyline, held to the arity (content::variants).
|
||||
let files = vec![("site.yaml".to_string(), raw)];
|
||||
content::arity(&files)?;
|
||||
serde_yaml::from_str(&content::storyline(&files, 0)[0].1).map_err(|e| anyhow::anyhow!("parsing {}: {e}", site_path.display()))
|
||||
}
|
||||
|
||||
/// The offline counterpart to `content::load_aggregates_from_gitea` -
|
||||
@@ -42,7 +45,10 @@ pub fn load_aggregates_from_dir(
|
||||
}
|
||||
let raw = std::fs::read_to_string(&aggregates_path)
|
||||
.map_err(|e| anyhow::anyhow!("reading {}: {e}", aggregates_path.display()))?;
|
||||
aggregates::parse_aggregates_yaml(&raw)
|
||||
// The first storyline, held to the arity (content::variants).
|
||||
let files = vec![("aggregates.yaml".to_string(), raw)];
|
||||
content::arity(&files)?;
|
||||
aggregates::parse_aggregates_yaml(&content::storyline(&files, 0)[0].1)
|
||||
}
|
||||
|
||||
/// The offline counterpart to `content::load_questions_from_gitea` -
|
||||
@@ -23,9 +23,8 @@ mod local;
|
||||
mod needs;
|
||||
mod replay;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
let mut argv: Vec<String> = std::env::args().skip(1).collect();
|
||||
/// The lint, as `portal lint ...`: `argv` is everything after `portal`.
|
||||
pub async fn run(mut argv: Vec<String>) -> anyhow::Result<()> {
|
||||
// `iris --path questions` reads as `iris check --path questions`,
|
||||
// so the content repos' one-line CI keeps working as it was.
|
||||
match argv.first().map(String::as_str) {
|
||||
@@ -38,7 +37,7 @@ async fn main() -> anyhow::Result<()> {
|
||||
replay::run(argv).await
|
||||
}
|
||||
Some("--version") | Some("-V") => {
|
||||
println!("iris {v} (portal v{v})", v = env!("CARGO_PKG_VERSION"));
|
||||
println!("portal lint v{}", env!("CARGO_PKG_VERSION"));
|
||||
Ok(())
|
||||
}
|
||||
Some(flag) if flag.starts_with("--") => check::run(argv).await,
|
||||
@@ -26,8 +26,8 @@ use std::collections::{BTreeMap, HashMap, HashSet, VecDeque};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use portal::aggregates::AggregateSchema;
|
||||
use portal::content::{action_target_id, Alternative, Question};
|
||||
use crate::aggregates::AggregateSchema;
|
||||
use crate::content::{action_target_id, Alternative, Question};
|
||||
|
||||
#[derive(Debug, Default, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
@@ -817,8 +817,8 @@ pub fn score(tasks: &[Task], answers: &[Answer], hesitant_below: f64) -> Score {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use portal::aggregates::parse_aggregates_yaml;
|
||||
use portal::content::build_questions;
|
||||
use crate::aggregates::parse_aggregates_yaml;
|
||||
use crate::content::build_questions;
|
||||
|
||||
fn site(desk_moves: &str) -> (Questions, HashMap<String, AggregateSchema>) {
|
||||
let files = vec![
|
||||
@@ -15,10 +15,10 @@
|
||||
use std::collections::{BTreeMap, HashMap};
|
||||
|
||||
use futures::StreamExt;
|
||||
use portal::events::store::{ensure_stream, load_events};
|
||||
use crate::local::{load_aggregates_from_dir, load_from_dir, load_needs_from_dir};
|
||||
use crate::needs;
|
||||
use portal::{aggregates, answers, content};
|
||||
use crate::events::store::{ensure_stream, load_events};
|
||||
use crate::lint::local::{load_aggregates_from_dir, load_from_dir, load_needs_from_dir};
|
||||
use crate::lint::needs;
|
||||
use crate::{aggregates, answers, content};
|
||||
|
||||
pub async fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
let value = |flag: &str| argv.iter().position(|a| a == flag).and_then(|i| argv.get(i + 1)).cloned();
|
||||
@@ -53,7 +53,7 @@ pub async fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
let (page, alternative) = step.map(|s| (s.page, s.alternative)).unwrap_or_default();
|
||||
let id = format!("sim-{}-{}-{n}", case["persona"].as_str().unwrap_or("x"), case["run"]);
|
||||
let now = chrono::Utc::now().timestamp_millis();
|
||||
answers::store_answer(&js, &schemas, &need.lands_in, id.clone(), &page, &alternative, &case["record"], now).await?;
|
||||
answers::store_answer(&js, &schemas, &need.lands_in, id.clone(), &page, &alternative, &case["record"], now, 0).await?;
|
||||
created += 1;
|
||||
for target in &states[1..] {
|
||||
match aggregates::transition(&js, schema, &id, target, serde_json::json!({"by": "simulation"}), now).await {
|
||||
+25
@@ -1,6 +1,31 @@
|
||||
/// One binary, three jobs: `portal` (or `portal serve`) runs a site;
|
||||
/// `portal lint` checks a content repo the way the site reads it;
|
||||
/// `portal plan`, `build`, `report` and the rest train one. The lint
|
||||
/// and the trainer are the same code as the server, at the same
|
||||
/// version, so they never disagree about what content means.
|
||||
#[cfg(feature = "ssr")]
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
let argv: Vec<String> = std::env::args().skip(1).collect();
|
||||
match argv.first().map(String::as_str) {
|
||||
Some("lint") => return portal::lint::run(argv[1..].to_vec()).await,
|
||||
Some("plan" | "build" | "answer" | "rate" | "prefer" | "score" | "simulate" | "compare" | "report" | "generate") => {
|
||||
// The trainer runs models through shell commands and waits
|
||||
// on them; off the runtime's threads, as a CLI should.
|
||||
return tokio::task::spawn_blocking(move || portal::trainer::run(argv)).await?;
|
||||
}
|
||||
Some("--version" | "-V") => {
|
||||
println!("portal v{}", env!("CARGO_PKG_VERSION"));
|
||||
return Ok(());
|
||||
}
|
||||
Some("serve") | None => {}
|
||||
Some(other) => anyhow::bail!("portal: unknown command {other:?}; one of serve, lint, plan, build, answer, rate, prefer, score, simulate, compare, report, generate"),
|
||||
}
|
||||
serve().await
|
||||
}
|
||||
|
||||
#[cfg(feature = "ssr")]
|
||||
async fn serve() -> anyhow::Result<()> {
|
||||
use axum::{body::Body, extract::State, http::Request, response::IntoResponse, routing::{any, get, post}, Router};
|
||||
use leptos::prelude::*;
|
||||
use leptos_axum::{generate_route_list, LeptosRoutes};
|
||||
|
||||
@@ -23,7 +23,7 @@ use anyhow::{anyhow, bail, Context};
|
||||
use serde::Deserialize;
|
||||
use serde_json::{json, Map, Value};
|
||||
|
||||
use crate::simulate::first_object;
|
||||
use crate::trainer::simulate::first_object;
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
@@ -2367,7 +2367,7 @@ pub fn run(argv: &[String]) -> anyhow::Result<()> {
|
||||
let mut told: Vec<Value> = Vec::new();
|
||||
for (t, tone) in tones.iter().enumerate() {
|
||||
let prompt = words_prompt(&plan, path, fallback, *tone);
|
||||
let reply = crate::llm_with(&cmd, &prompt, &[("FORMAT", "json"), ("TEMPERATURE", "0.4")]).unwrap_or_default();
|
||||
let reply = crate::trainer::llm_with(&cmd, &prompt, &[("FORMAT", "json"), ("TEMPERATURE", "0.4")]).unwrap_or_default();
|
||||
let suffix = if tones.len() > 1 { format!("-tone{}", t + 1) } else { String::new() };
|
||||
std::fs::write(out.join(format!("llm/{:02}-{}{suffix}.md", n + 1, path.replace('/', "_"))), format!("{prompt}\n\n=== REPLY ===\n{reply}"))?;
|
||||
match first_object(&reply) {
|
||||
@@ -22,15 +22,15 @@ use std::process::{Command, Stdio};
|
||||
|
||||
use anyhow::{anyhow, bail, Context};
|
||||
|
||||
mod build;
|
||||
pub mod build;
|
||||
mod card;
|
||||
mod plan;
|
||||
pub mod plan;
|
||||
mod rate;
|
||||
mod report;
|
||||
mod score;
|
||||
mod simulate;
|
||||
|
||||
const REFERENCE: &str = include_str!("../generator/reference.md");
|
||||
pub const REFERENCE: &str = include_str!("reference.md");
|
||||
|
||||
struct Opts {
|
||||
intake: PathBuf,
|
||||
@@ -44,11 +44,11 @@ struct Opts {
|
||||
visitor: Option<String>,
|
||||
}
|
||||
|
||||
fn main() -> anyhow::Result<()> {
|
||||
// `answer --tasks <file> [--llm <cmd>]`: the blind answerer alone,
|
||||
// for grading an existing site with any backend. Answers go to
|
||||
// stdout, ready for `question_lint --needs-score`.
|
||||
let argv: Vec<String> = std::env::args().skip(1).collect();
|
||||
/// The trainer, as `portal <command> ...`: `argv` is everything after
|
||||
/// `portal`. `answer --tasks <file> [--llm <cmd>]` is the blind
|
||||
/// answerer alone, for grading an existing site with any backend;
|
||||
/// answers go to stdout, ready for `portal lint --needs-score`.
|
||||
pub fn run(argv: Vec<String>) -> anyhow::Result<()> {
|
||||
match argv.first().map(String::as_str) {
|
||||
Some("simulate") => return simulate::run(&argv),
|
||||
Some("compare") => return simulate::compare(&argv),
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
use anyhow::{anyhow, bail, Context};
|
||||
|
||||
use crate::build::Plan;
|
||||
use crate::simulate::first_object;
|
||||
use crate::trainer::build::Plan;
|
||||
use crate::trainer::simulate::first_object;
|
||||
|
||||
const REFERENCE: &str = r#"# plan.yaml
|
||||
|
||||
@@ -262,7 +262,7 @@ pub fn run(argv: &[String]) -> anyhow::Result<()> {
|
||||
let prompt = format!(
|
||||
"{REFERENCE}\n\n# Task\n\nA business filled in this intake. Write its plan.yaml: every need the intake implies, for the public and for each role inside the business, with the stages read off how the business says things progress, the form each need collects, and how much each person will tolerate.\n\n## Intake\n\n{intake}\n{feedback}\nReply with the YAML only, no prose, no code fences."
|
||||
);
|
||||
let reply = crate::llm_with(&cmd, &prompt, &[("TEMPERATURE", "0.2")])?;
|
||||
let reply = crate::trainer::llm_with(&cmd, &prompt, &[("TEMPERATURE", "0.2")])?;
|
||||
std::fs::write(out.join(format!("llm/{round:02}-prompt.md")), &prompt)?;
|
||||
std::fs::write(out.join(format!("llm/{round:02}-reply.md")), &reply)?;
|
||||
let yaml = extract_yaml(&reply);
|
||||
@@ -391,7 +391,7 @@ fn map_personas(cmd: &str, plan: &Plan, personas: &mut serde_yaml::Value) -> any
|
||||
needs.join("\n"),
|
||||
people.join("\n")
|
||||
);
|
||||
let reply = crate::llm_with(cmd, &prompt, &[("FORMAT", "json"), ("TEMPERATURE", "0.0")])?;
|
||||
let reply = crate::trainer::llm_with(cmd, &prompt, &[("FORMAT", "json"), ("TEMPERATURE", "0.0")])?;
|
||||
let Some(mapping) = first_object(&reply) else { return Ok(0) };
|
||||
let mut mapped = 0;
|
||||
for persona in list.iter_mut() {
|
||||
@@ -30,8 +30,8 @@ use std::path::Path;
|
||||
use anyhow::{anyhow, Context};
|
||||
use serde_json::{json, Value};
|
||||
|
||||
use crate::card;
|
||||
use crate::simulate::ask;
|
||||
use crate::trainer::card;
|
||||
use crate::trainer::simulate::ask;
|
||||
|
||||
fn flag(argv: &[String], name: &str) -> Option<String> {
|
||||
argv.iter().position(|a| a == name).and_then(|i| argv.get(i + 1)).cloned()
|
||||
@@ -34,7 +34,7 @@ pub fn run(argv: &[String]) -> anyhow::Result<()> {
|
||||
let mut summary = serde_json::Map::new();
|
||||
for (mode, tasks, skim) in [("full", &tasks_full, false), ("skim", &tasks_skim, true)] {
|
||||
eprintln!("score: the visitor answers {mode}");
|
||||
let answers = crate::answer_blind(&cmd, &std::fs::read_to_string(tasks)?, Some(&site), 0)?;
|
||||
let answers = crate::trainer::answer_blind(&cmd, &std::fs::read_to_string(tasks)?, Some(&site), 0)?;
|
||||
let answers_path = out.join(format!("answers-{mode}.jsonl"));
|
||||
std::fs::write(&answers_path, &answers)?;
|
||||
let (tasks_arg, answers_arg) = (s(tasks), s(&answers_path));
|
||||
@@ -65,7 +65,7 @@ pub fn run(argv: &[String]) -> anyhow::Result<()> {
|
||||
println!("== rate");
|
||||
let rated = out.join("rated");
|
||||
let rate_argv: Vec<String> = ["rate", "--model", &s(&model), "--out", &s(&rated), "--repo", &s(&site), "--llm", &cmd].iter().map(|x| x.to_string()).collect();
|
||||
crate::rate::rate(&rate_argv)?;
|
||||
crate::trainer::rate::rate(&rate_argv)?;
|
||||
|
||||
summary.insert("site".into(), serde_json::json!(s(&site)));
|
||||
summary.insert("visitor".into(), serde_json::json!(cmd));
|
||||
@@ -31,7 +31,7 @@ use anyhow::{anyhow, Context};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{json, Value};
|
||||
|
||||
use crate::llm_with;
|
||||
use crate::trainer::llm_with;
|
||||
|
||||
const TRAITS: &[&str] = &[
|
||||
"is precise and businesslike",
|
||||
-46
@@ -1,46 +0,0 @@
|
||||
name: Publish release
|
||||
|
||||
# A `v*` tag builds the binary and attaches it to the Gitea release as
|
||||
# `iris`, with the tag's CHANGELOG.md section as the notes. Content
|
||||
# repos pin IRIS_RELEASE to one of these tags in their lint workflow.
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: ["v*"]
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: bare
|
||||
env:
|
||||
# Writable, unlike the shared /var/local/cargo - see test.yml.
|
||||
CARGO_HOME: /var/local/cargo-target/iris-cargo-home
|
||||
RUSTC_WRAPPER: /usr/bin/sccache
|
||||
RUSTUP_HOME: /var/local/rustup
|
||||
PATH: /var/local/cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/bin
|
||||
SCCACHE_DIR: /var/local/sccache
|
||||
SCCACHE_SERVER_PORT: "4228"
|
||||
CARGO_TARGET_DIR: /var/local/cargo-target
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Build
|
||||
run: cargo build --release
|
||||
|
||||
- name: Publish release
|
||||
run: |
|
||||
set -euo pipefail
|
||||
tag="${{ github.ref_name }}"
|
||||
api="${{ github.server_url }}/api/v1/repos/${{ github.repository }}"
|
||||
auth="Authorization: token ${{ secrets.GITHUB_TOKEN }}"
|
||||
notes=$(awk -v v="${tag#v}" '/^## /{p = ($2 == v)} p' CHANGELOG.md | tail -n +2)
|
||||
body=$(jq -n --arg tag "$tag" --arg notes "$notes" '{tag_name: $tag, name: $tag, body: $notes}')
|
||||
id=$(curl -sf -X POST -H "$auth" -H 'Content-Type: application/json' \
|
||||
-d "$body" "$api/releases" | jq .id) \
|
||||
|| id=$(curl -sf -H "$auth" "$api/releases/tags/$tag" | jq .id)
|
||||
for aid in $(curl -sf -H "$auth" "$api/releases/$id/assets" | jq '.[].id'); do
|
||||
curl -sf -X DELETE -H "$auth" "$api/releases/$id/assets/$aid"
|
||||
done
|
||||
curl -sf -X POST -H "$auth" \
|
||||
-F "attachment=@/var/local/cargo-target/release/iris" \
|
||||
"$api/releases/$id/assets?name=iris" > /dev/null
|
||||
echo "published $tag"
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
name: Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: bare
|
||||
env:
|
||||
# Same shared toolchain and cache as uhhm/portal's workflows.
|
||||
# Not the shared /var/local/cargo: the runner may only read it, and
|
||||
# the portal git dependency has to be cloned into CARGO_HOME. This
|
||||
# one lives under the writable target dir; the rustc wrapper the
|
||||
# shared config would have set is given here instead.
|
||||
CARGO_HOME: /var/local/cargo-target/iris-cargo-home
|
||||
RUSTC_WRAPPER: /usr/bin/sccache
|
||||
RUSTUP_HOME: /var/local/rustup
|
||||
PATH: /var/local/cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/bin
|
||||
SCCACHE_DIR: /var/local/sccache
|
||||
SCCACHE_SERVER_PORT: "4228"
|
||||
CARGO_TARGET_DIR: /var/local/cargo-target
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Test
|
||||
run: cargo test
|
||||
|
||||
# The one thing a lint must never do is reject the content it
|
||||
# is meant to serve: every live content repo has to pass.
|
||||
- name: Check the live content repos
|
||||
run: |
|
||||
cargo build --release
|
||||
for repo in uhhm/questions redoal/questions; do
|
||||
/var/local/cargo-target/release/iris check --repo "${{ github.server_url }}/$repo"
|
||||
done
|
||||
@@ -1 +0,0 @@
|
||||
target/
|
||||
-5991
File diff suppressed because it is too large
Load Diff
Vendored
-25
@@ -1,25 +0,0 @@
|
||||
[package]
|
||||
name = "iris"
|
||||
version = "0.5.10"
|
||||
edition = "2021"
|
||||
description = "The iris over a portal site: nothing from a content repo comes through until it checks out"
|
||||
license = "MIT"
|
||||
repository = "https://project.uhhm.no/uhhm/iris"
|
||||
|
||||
[dependencies]
|
||||
# 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.10", features = ["ssr"] }
|
||||
anyhow = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
serde_yaml = "0.9"
|
||||
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
|
||||
async-nats = "0.38"
|
||||
futures = "0.3"
|
||||
chrono = "0.4"
|
||||
|
||||
[profile.release]
|
||||
strip = true
|
||||
lto = "thin"
|
||||
Vendored
-57
@@ -1,57 +0,0 @@
|
||||
# iris
|
||||
|
||||
The iris over a [portal](https://project.uhhm.no/uhhm/portal) site. A
|
||||
content push is an incoming wormhole; nothing comes through until it
|
||||
checks out.
|
||||
|
||||
```
|
||||
iris check --path questions # a local checkout
|
||||
iris check --repo https://project.uhhm.no/uhhm/questions
|
||||
iris --path questions # the same, for one-line CI
|
||||
```
|
||||
|
||||
`check` loads a content repo exactly the way the running site does,
|
||||
validates it (every action lands on a page, every transition is one
|
||||
the state machine allows, every recorded bucket is read back
|
||||
somewhere), and then holds it to the business needs the repo declares
|
||||
in `needs.yaml`, when it has one:
|
||||
|
||||
- a path of submissions gets each kind of visitor's answer into the
|
||||
bucket it names, within a submission and required-field budget;
|
||||
- the handling group holds a desk over that bucket, and every
|
||||
finished state is reachable through the buttons it (and any
|
||||
`also_moved_by` group) offers; no record strands on the way;
|
||||
- every stage the business named is a state of the machine.
|
||||
|
||||
A need marked `planned` warns instead of failing. Exit status is the
|
||||
verdict, so a content repo's CI is one line.
|
||||
|
||||
Beyond the verdict, `check` exports what a trainer needs to grade the
|
||||
wording: `--needs-tasks` writes the personas as typed choice tasks
|
||||
(`--skim` for headings only), `--needs-score` grades an engine's
|
||||
answers, and `--needs-sim` writes a resolved model of the whole site.
|
||||
`iris replay` runs simulated cases through the site's real aggregate
|
||||
engine on a throwaway JetStream and reports every bucket by state;
|
||||
`--report-only` takes the same scorecard from a live site's buckets.
|
||||
See [portal-trainer](https://project.uhhm.no/uhhm/portal-trainer) for
|
||||
what sits around those.
|
||||
|
||||
## Matching the site
|
||||
|
||||
Every type iris reads is portal's own: portal is a library dependency
|
||||
pinned to a release tag in `Cargo.toml`, and iris carries the same
|
||||
version number as that tag, so `iris v0.3.39` is the lint for portal
|
||||
v0.3.39 and nothing else. A content repo pins `IRIS_RELEASE` to the
|
||||
`PORTAL_RELEASE` its site runs. Portal's own release tarball ships the
|
||||
matching `iris` binary too, at `/srv/app/<instance>/current/iris`.
|
||||
|
||||
## Release
|
||||
|
||||
Iris is released by portal's publish job, never by hand: when a
|
||||
portal tag is pushed, that job re-pins this crate to the tag, sets
|
||||
the version to match, builds and tests it, adds the changelog line,
|
||||
and pushes the commit and the tag here. This repo's own CI then
|
||||
attaches the binary to the Gitea release as `iris`. A portal change
|
||||
to something the lint reads fails the portal release at that step.
|
||||
Changes to iris itself land on `main` between releases and ship with
|
||||
the next portal tag.
|
||||
-44
@@ -1,44 +0,0 @@
|
||||
name: Test
|
||||
|
||||
# Every push: the tests, then every plan under plans/ built and linted
|
||||
# with the iris release the live sites run, and the onboarding site
|
||||
# linted too. A plan that stops building, or a builder change that
|
||||
# renders a site the lint rejects, fails here and nowhere later.
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: bare
|
||||
env:
|
||||
# The bare runner's shared toolchain and caches (see uhhm/portal).
|
||||
CARGO_HOME: /var/local/cargo
|
||||
RUSTUP_HOME: /var/local/rustup
|
||||
PATH: /var/local/cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/bin
|
||||
SCCACHE_DIR: /var/local/sccache
|
||||
SCCACHE_SERVER_PORT: "4228"
|
||||
CARGO_TARGET_DIR: /var/local/cargo-target
|
||||
# The lint, pinned to the portal release the sites run.
|
||||
IRIS_RELEASE: v0.3.47
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Test
|
||||
run: cargo test --release
|
||||
|
||||
- name: Build and lint every plan
|
||||
run: |
|
||||
set -euo pipefail
|
||||
bin="$CARGO_TARGET_DIR/iris-$IRIS_RELEASE"
|
||||
[ -x "$bin" ] || { curl -sfL "${{ github.server_url }}/uhhm/iris/releases/download/$IRIS_RELEASE/iris" -o "$bin" && chmod +x "$bin"; }
|
||||
cargo build --release
|
||||
for plan in plans/*.yaml; do
|
||||
name=$(basename "$plan" .yaml)
|
||||
echo "== $plan"
|
||||
"$CARGO_TARGET_DIR/release/portal-trainer" build --plan "$plan" --out "/tmp/ci-$name" --lint "$bin"
|
||||
done
|
||||
echo "== portal-portal"
|
||||
"$bin" check --path portal-portal/questions
|
||||
@@ -1,2 +0,0 @@
|
||||
target/
|
||||
out/
|
||||
-163
@@ -1,163 +0,0 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.104"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.14.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "portal-trainer"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_yaml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.107"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.229"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_core"
|
||||
version = "1.0.229"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.229"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.151"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"itoa",
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
"zmij",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_yaml"
|
||||
version = "0.9.34+deprecated"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
"unsafe-libyaml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "3.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
Vendored
-14
@@ -1,14 +0,0 @@
|
||||
[package]
|
||||
name = "portal-trainer"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Generates a portal content repo from a business intake, held to portal's question_lint"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
# preserve_order: a page is read by the people who own it, so the keys
|
||||
# come out in the order they were written (name, then description, then
|
||||
# the rest), not sorted with `name` at the bottom.
|
||||
serde_json = { version = "1", features = ["preserve_order"] }
|
||||
serde_yaml = "0.9"
|
||||
@@ -1,43 +0,0 @@
|
||||
aggregates:
|
||||
- bucket: enquiries
|
||||
initial: open
|
||||
states:
|
||||
open: { event: received }
|
||||
quoted: { event: quoted }
|
||||
won: { event: won }
|
||||
lost: { event: lost }
|
||||
transitions:
|
||||
open: [quoted, lost]
|
||||
quoted: [won, lost]
|
||||
|
||||
- bucket: subcontractors
|
||||
initial: open
|
||||
states:
|
||||
open: { event: applied }
|
||||
awaiting_papers: { event: papers_requested }
|
||||
approved: { event: approved }
|
||||
declined: { event: declined }
|
||||
transitions:
|
||||
open: [awaiting_papers, approved, declined]
|
||||
awaiting_papers: [approved, declined]
|
||||
|
||||
- bucket: applicants
|
||||
initial: open
|
||||
states:
|
||||
open: { event: applied }
|
||||
interviewing: { event: invited }
|
||||
hired: { event: hired }
|
||||
declined: { event: declined }
|
||||
transitions:
|
||||
open: [interviewing, declined]
|
||||
interviewing: [hired, declined]
|
||||
|
||||
- bucket: site_issues
|
||||
initial: open
|
||||
states:
|
||||
open: { event: reported }
|
||||
in_hand: { event: assessed }
|
||||
closed: { event: closed }
|
||||
transitions:
|
||||
open: [in_hand]
|
||||
in_hand: [closed]
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-cracks@/","choice":"Get someone to look at a building","confidence":0.93}
|
||||
{"id":"homeowner-leaking-roof@/","choice":"Get someone to look at a building","confidence":0.92}
|
||||
{"id":"homeowner-extension@/","choice":"Get a price for a build","confidence":0.72}
|
||||
{"id":"owner-basement-conversion@/","choice":"Get a price for a build","confidence":0.72}
|
||||
{"id":"electrician-more-work@/","choice":"Join our subcontractor list","confidence":0.9}
|
||||
{"id":"scaffolding-firm@/","choice":"Join our subcontractor list","confidence":0.9}
|
||||
{"id":"apprentice-asking@/","choice":"Ask about working with us","confidence":0.62}
|
||||
{"id":"experienced-carpenter@/","choice":"Ask about working with us","confidence":0.62}
|
||||
{"id":"crew-loose-scaffold@/","choice":"Report something from site","confidence":0.92}
|
||||
{"id":"subcontractor-wrong-delivery@/","choice":"Report something from site","confidence":0.88}
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-cracks@/","choice":"Get someone to look at a building","confidence":0.97}
|
||||
{"id":"homeowner-leaking-roof@/","choice":"Get someone to look at a building","confidence":0.96}
|
||||
{"id":"homeowner-extension@/","choice":"Get a price for a build","confidence":0.95}
|
||||
{"id":"owner-basement-conversion@/","choice":"Get a price for a build","confidence":0.95}
|
||||
{"id":"electrician-more-work@/","choice":"Join our subcontractor list","confidence":0.97}
|
||||
{"id":"scaffolding-firm@/","choice":"Join our subcontractor list","confidence":0.97}
|
||||
{"id":"apprentice-asking@/","choice":"Ask about working with us","confidence":0.96}
|
||||
{"id":"experienced-carpenter@/","choice":"Ask about working with us","confidence":0.95}
|
||||
{"id":"crew-loose-scaffold@/","choice":"Report something from site","confidence":0.95}
|
||||
{"id":"subcontractor-wrong-delivery@/","choice":"Report something from site","confidence":0.93}
|
||||
@@ -1,124 +0,0 @@
|
||||
needs:
|
||||
- id: survey-enquiry
|
||||
who: a housing board member or private owner with a problem in a building
|
||||
wants: someone from Nordvik Bygg to come and look at the building and tell them what a fix would cost
|
||||
via: Get someone to look at a building
|
||||
lands_in: enquiries
|
||||
handled_by: project_managers
|
||||
done_when: [won, lost]
|
||||
max_steps: 1
|
||||
max_fields: 4
|
||||
|
||||
- id: build-price-enquiry
|
||||
who: an owner who already knows what they want built
|
||||
wants: drawings, a permit application and a price for the work
|
||||
via: Get a price for a build
|
||||
lands_in: enquiries
|
||||
handled_by: project_managers
|
||||
done_when: [won, lost]
|
||||
max_steps: 1
|
||||
max_fields: 5
|
||||
|
||||
- id: subcontractor-application
|
||||
who: a trade firm doing electrical, plumbing or scaffolding work
|
||||
wants: to get on Nordvik Bygg's list of subcontractors they call for work
|
||||
lands_in: subcontractors
|
||||
handled_by: project_managers
|
||||
done_when: [approved, declined]
|
||||
max_steps: 1
|
||||
max_fields: 5
|
||||
|
||||
- id: job-application
|
||||
who: a carpenter or apprentice looking for work
|
||||
wants: to find out if Nordvik Bygg is hiring and put themselves forward
|
||||
lands_in: applicants
|
||||
handled_by: project_managers
|
||||
done_when: [hired, declined]
|
||||
max_steps: 1
|
||||
max_fields: 4
|
||||
|
||||
- id: report-site-issue
|
||||
who: a crew member on site, ours or a subcontractor's
|
||||
wants: to flag a hazard, a near miss or wrong materials fast, from their phone
|
||||
lands_in: site_issues
|
||||
handled_by: safety_officer
|
||||
done_when: [closed]
|
||||
max_steps: 1
|
||||
max_fields: 3
|
||||
|
||||
- id: log-phone-enquiry
|
||||
who: a project manager who just took a call, email or text about a building
|
||||
wants: to get the enquiry into the system before it gets lost
|
||||
enters: /desk/phone-enquiry
|
||||
enters_as: project_managers
|
||||
lands_in: enquiries
|
||||
handled_by: project_managers
|
||||
done_when: [won, lost]
|
||||
max_steps: 1
|
||||
max_fields: 5
|
||||
|
||||
personas:
|
||||
- id: housing-board-cracks
|
||||
need: survey-enquiry
|
||||
text: >
|
||||
There are cracks running up the outside wall of our building and none
|
||||
of us know if it's serious. We just want someone qualified to come
|
||||
look at it and tell us what we're dealing with.
|
||||
|
||||
- id: homeowner-leaking-roof
|
||||
need: survey-enquiry
|
||||
text: >
|
||||
Water's coming through the ceiling every time it rains. I don't know
|
||||
if it's the roof or something else, I just want someone to come out
|
||||
and have a look before it gets worse.
|
||||
|
||||
- id: homeowner-extension
|
||||
need: build-price-enquiry
|
||||
text: >
|
||||
We want to add a room above the garage. We know roughly what we want,
|
||||
we just need someone to draw it up, sort the paperwork with the
|
||||
municipality, and tell us what it will cost.
|
||||
|
||||
- id: owner-basement-conversion
|
||||
need: build-price-enquiry
|
||||
text: >
|
||||
I'd like to turn the basement into a flat. Need drawings, the permit
|
||||
sorted, and a proper price before I commit to anything.
|
||||
|
||||
- id: electrician-more-work
|
||||
need: subcontractor-application
|
||||
text: >
|
||||
We're a small electrical firm and we'd like to pick up more building
|
||||
work. We're registered and insured, just need to know who to talk to
|
||||
about getting on your books.
|
||||
|
||||
- id: scaffolding-firm
|
||||
need: subcontractor-application
|
||||
text: >
|
||||
We put up and take down scaffolding for building sites. We'd like to
|
||||
be one of the firms you call when a job needs it.
|
||||
|
||||
- id: apprentice-asking
|
||||
need: job-application
|
||||
text: >
|
||||
I'm in my second year as an apprentice carpenter and looking for a
|
||||
firm that'll keep me on after. Are you taking anyone on right now?
|
||||
|
||||
- id: experienced-carpenter
|
||||
need: job-application
|
||||
text: >
|
||||
I've been doing carpentry for eight years, mostly older buildings.
|
||||
Wondered if you had any openings on site.
|
||||
|
||||
- id: crew-loose-scaffold
|
||||
need: report-site-issue
|
||||
text: >
|
||||
Noticed a scaffold board that's not sitting right, feels loose when
|
||||
you step on it. Wanted to flag it straight away before someone gets
|
||||
hurt, but I've got gloves on and no time for a long form.
|
||||
|
||||
- id: subcontractor-wrong-delivery
|
||||
need: report-site-issue
|
||||
text: >
|
||||
The delivery this morning was the wrong type of insulation, not what
|
||||
was on the drawings. Someone needs to know before it gets used.
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
name: What happens with your application now?
|
||||
description: >
|
||||
A project manager reads every application. If it looks like a good fit
|
||||
we'll be in touch to arrange an interview.
|
||||
alternatives:
|
||||
- name: Back to the start
|
||||
description: Return to the front page.
|
||||
action: /
|
||||
consequence: [Back]
|
||||
-1
@@ -1 +0,0 @@
|
||||
qualifies: project_managers
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
name: What came in?
|
||||
responsible: { name: Ingrid Nordvik, contact: ingrid@nordvikbygg.example }
|
||||
alternatives:
|
||||
- name: Enquiries
|
||||
description: Move each enquiry on as you work it.
|
||||
action: /desk
|
||||
consequence: [Update]
|
||||
features:
|
||||
- name: ""
|
||||
description: ""
|
||||
resource:
|
||||
source: { kind: kv, bucket: enquiries }
|
||||
requires_group: project_managers
|
||||
transitions:
|
||||
- { to: quoted, label: Quote sent }
|
||||
- { to: lost, label: Not for us }
|
||||
- { from: quoted, to: won, label: Won }
|
||||
- { from: quoted, to: lost, label: Lost }
|
||||
|
||||
- name: Subcontractors
|
||||
description: Check papers and approve or decline each application.
|
||||
action: /desk
|
||||
consequence: [Update]
|
||||
features:
|
||||
- name: ""
|
||||
description: ""
|
||||
resource:
|
||||
source: { kind: kv, bucket: subcontractors }
|
||||
requires_group: project_managers
|
||||
transitions:
|
||||
- { to: awaiting_papers, label: Ask for missing papers }
|
||||
- { to: approved, label: Approve }
|
||||
- { to: declined, label: Decline }
|
||||
- { from: awaiting_papers, to: approved, label: Approve }
|
||||
- { from: awaiting_papers, to: declined, label: Decline }
|
||||
|
||||
- name: Applicants
|
||||
description: Move each job application through interview to a decision.
|
||||
action: /desk
|
||||
consequence: [Update]
|
||||
features:
|
||||
- name: ""
|
||||
description: ""
|
||||
resource:
|
||||
source: { kind: kv, bucket: applicants }
|
||||
requires_group: project_managers
|
||||
transitions:
|
||||
- { to: interviewing, label: Invite to interview }
|
||||
- { to: declined, label: Decline }
|
||||
- { from: interviewing, to: hired, label: Hire }
|
||||
- { from: interviewing, to: declined, label: Decline }
|
||||
|
||||
- name: Log a call, email or text
|
||||
description: >
|
||||
Get an enquiry that came in by phone, email or text into the system
|
||||
before it's lost.
|
||||
action: /desk/phone-enquiry
|
||||
consequence: [Log it]
|
||||
Vendored
-9
@@ -1,9 +0,0 @@
|
||||
name: What happens with this enquiry now?
|
||||
description: >
|
||||
It's in with the rest of the enquiries on the desk, ready to work the
|
||||
same way as one that came in through the front page.
|
||||
alternatives:
|
||||
- name: Back to the start
|
||||
description: Return to the front page.
|
||||
action: /
|
||||
consequence: [Back]
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
name: What did they tell you?
|
||||
description: >
|
||||
Get it down before it gets lost. This creates the same kind of record
|
||||
as one submitted through the front page.
|
||||
responsible: { name: Ingrid Nordvik, contact: ingrid@nordvikbygg.example }
|
||||
alternatives:
|
||||
- name: Log this enquiry
|
||||
description: ""
|
||||
action: /desk/phone-enquiry-logged
|
||||
consequence: [Save]
|
||||
record_as: enquiries
|
||||
features:
|
||||
- name: About the caller and the building
|
||||
description: ""
|
||||
requirements:
|
||||
- { name: caller_name, label: Their name, type: text }
|
||||
- { name: contact, label: Phone or email, type: text }
|
||||
- { name: address, label: Address of the building, type: text }
|
||||
- { name: problem, label: What they told you, type: textarea }
|
||||
- { name: urgency, label: How soon, type: select, options: [This week, This month, No rush] }
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
name: What happens with your enquiry now?
|
||||
description: >
|
||||
One of our two project managers reads every enquiry as it comes in.
|
||||
We'll usually be in touch within a couple of working days to arrange a
|
||||
look at the building, or to say plainly if it's not something we take
|
||||
on.
|
||||
alternatives:
|
||||
- name: Back to the start
|
||||
description: Return to the front page.
|
||||
action: /
|
||||
consequence: [Back]
|
||||
@@ -1,85 +0,0 @@
|
||||
name: What brings you here?
|
||||
description: >
|
||||
Pick what best matches why you're here today.
|
||||
responsible: { name: Ingrid Nordvik, contact: ingrid@nordvikbygg.example }
|
||||
alternatives:
|
||||
- name: Get someone to look at a building
|
||||
description: >
|
||||
For housing boards and private owners with a problem in a building
|
||||
who want us to come and take a look.
|
||||
action: /enquiries/thanks
|
||||
consequence: [Send]
|
||||
record_as: enquiries
|
||||
features:
|
||||
- name: About you and the building
|
||||
description: ""
|
||||
requirements:
|
||||
- { name: name, label: Your name, type: text }
|
||||
- { name: email, label: Email, type: email }
|
||||
- { name: address, label: Address of the building, type: text }
|
||||
- { name: problem, label: What's wrong, type: textarea }
|
||||
|
||||
- name: Get a price for a build
|
||||
description: >
|
||||
For owners who already know what they want built and need drawings,
|
||||
a permit application and a price.
|
||||
action: /enquiries/thanks
|
||||
consequence: [Send]
|
||||
record_as: enquiries
|
||||
features:
|
||||
- name: About you and the build
|
||||
description: ""
|
||||
requirements:
|
||||
- { name: name, label: Your name, type: text }
|
||||
- { name: email, label: Email, type: email }
|
||||
- { name: address, label: Address of the site, type: text }
|
||||
- { name: project, label: What you want built, type: textarea }
|
||||
- { name: timeframe, label: When you'd like to start, type: select, options: [As soon as possible, Within a year, Just exploring] }
|
||||
|
||||
- name: Join our subcontractor list
|
||||
description: >
|
||||
For electrical, plumbing and scaffolding firms who want to be one of
|
||||
the firms we call when a job needs them.
|
||||
action: /subcontractors/thanks
|
||||
consequence: [Apply]
|
||||
record_as: subcontractors
|
||||
features:
|
||||
- name: About your firm
|
||||
description: ""
|
||||
requirements:
|
||||
- { name: company_name, label: Company name, type: text }
|
||||
- { name: contact_email, label: Email, type: email }
|
||||
- { name: trade, label: Trade, type: select, options: [Electrical, Plumbing, Scaffolding] }
|
||||
- { name: registration_number, label: Company registration number, type: text }
|
||||
- { name: insurance, label: Insurance policy details, type: text }
|
||||
- { name: trade_approval, label: Trade approval reference, optional: true }
|
||||
|
||||
- name: Ask about working with us
|
||||
description: >
|
||||
For carpenters and apprentices who want to know if we're hiring.
|
||||
action: /applicants/thanks
|
||||
consequence: [Send]
|
||||
record_as: applicants
|
||||
features:
|
||||
- name: About you
|
||||
description: ""
|
||||
requirements:
|
||||
- { name: name, label: Your name, type: text }
|
||||
- { name: email, label: Email, type: email }
|
||||
- { name: role, label: What you do, type: select, options: [Carpenter, Apprentice carpenter, Other] }
|
||||
- { name: message, label: Anything else we should know, type: textarea }
|
||||
|
||||
- name: Report something from site
|
||||
description: >
|
||||
For crew on site, ours or a subcontractor's, who've spotted a hazard,
|
||||
a near miss or the wrong materials.
|
||||
action: /site-issues/thanks
|
||||
consequence: [Report it]
|
||||
record_as: site_issues
|
||||
features:
|
||||
- name: What's happened
|
||||
description: ""
|
||||
requirements:
|
||||
- { name: issue_type, label: What kind of issue, type: select, options: [Hazard, Near miss, Wrong materials delivered] }
|
||||
- { name: location, label: Where on site, type: text }
|
||||
- { name: details, label: What happened, type: textarea }
|
||||
-1
@@ -1 +0,0 @@
|
||||
qualifies: safety_officer
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
name: What's been reported from site?
|
||||
responsible: { name: Ingrid Nordvik, contact: ingrid@nordvikbygg.example }
|
||||
alternatives:
|
||||
- name: Site issues
|
||||
description: Decide what needs doing, then close it out once it's fixed.
|
||||
action: /safety
|
||||
consequence: [Update]
|
||||
features:
|
||||
- name: ""
|
||||
description: ""
|
||||
resource:
|
||||
source: { kind: kv, bucket: site_issues }
|
||||
requires_group: safety_officer
|
||||
transitions:
|
||||
- { to: in_hand, label: Look into it }
|
||||
- { from: in_hand, to: closed, label: Mark fixed }
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
name: What happens with your report now?
|
||||
description: >
|
||||
Our safety officer sees every report as it comes in and decides what
|
||||
needs to be done. You'll see it marked fixed once it's sorted.
|
||||
alternatives:
|
||||
- name: Back to the start
|
||||
description: Return to the front page.
|
||||
action: /
|
||||
consequence: [Back]
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
name: What happens with your application now?
|
||||
description: >
|
||||
A project manager checks your company registration, trade approval and
|
||||
insurance. If anything's missing we'll come back to you for it before
|
||||
we can put you on the list.
|
||||
alternatives:
|
||||
- name: Back to the start
|
||||
description: Return to the front page.
|
||||
action: /
|
||||
consequence: [Back]
|
||||
@@ -1,3 +0,0 @@
|
||||
needs: parsed in round 1
|
||||
structure round 1: ok=true fails=0
|
||||
wording round 0: headings only: wording: 10/10 routed right (100%) | headings and descriptions: wording: 10/10 routed right (100%)
|
||||
@@ -1,2 +0,0 @@
|
||||
title: Nordvik Bygg
|
||||
lang: en
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-cracks@/","persona":"housing-board-cracks","need":"survey-enquiry","page":"/","state":{"body":"There are cracks running up the outside wall of our building and none of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"homeowner-leaking-roof@/","persona":"homeowner-leaking-roof","need":"survey-enquiry","page":"/","state":{"body":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"homeowner-extension@/","persona":"homeowner-extension","need":"build-price-enquiry","page":"/","state":{"body":"We want to add a room above the garage. We know roughly what we want, we just need someone to draw it up, sort the paperwork with the municipality, and tell us what it will cost."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get a price for a build"]}
|
||||
{"id":"owner-basement-conversion@/","persona":"owner-basement-conversion","need":"build-price-enquiry","page":"/","state":{"body":"I'd like to turn the basement into a flat. Need drawings, the permit sorted, and a proper price before I commit to anything."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get a price for a build"]}
|
||||
{"id":"electrician-more-work@/","persona":"electrician-more-work","need":"subcontractor-application","page":"/","state":{"body":"We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"scaffolding-firm@/","persona":"scaffolding-firm","need":"subcontractor-application","page":"/","state":{"body":"We put up and take down scaffolding for building sites. We'd like to be one of the firms you call when a job needs it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"apprentice-asking@/","persona":"apprentice-asking","need":"job-application","page":"/","state":{"body":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after. Are you taking anyone on right now?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Ask about working with us"]}
|
||||
{"id":"experienced-carpenter@/","persona":"experienced-carpenter","need":"job-application","page":"/","state":{"body":"I've been doing carpentry for eight years, mostly older buildings. Wondered if you had any openings on site."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Ask about working with us"]}
|
||||
{"id":"crew-loose-scaffold@/","persona":"crew-loose-scaffold","need":"report-site-issue","page":"/","state":{"body":"Noticed a scaffold board that's not sitting right, feels loose when you step on it. Wanted to flag it straight away before someone gets hurt, but I've got gloves on and no time for a long form."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Report something from site"]}
|
||||
{"id":"subcontractor-wrong-delivery@/","persona":"subcontractor-wrong-delivery","need":"report-site-issue","page":"/","state":{"body":"The delivery this morning was the wrong type of insulation, not what was on the drawings. Someone needs to know before it gets used."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Report something from site"]}
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-cracks@/","persona":"housing-board-cracks","need":"survey-enquiry","page":"/","state":{"body":"There are cracks running up the outside wall of our building and none of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"homeowner-leaking-roof@/","persona":"homeowner-leaking-roof","need":"survey-enquiry","page":"/","state":{"body":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"homeowner-extension@/","persona":"homeowner-extension","need":"build-price-enquiry","page":"/","state":{"body":"We want to add a room above the garage. We know roughly what we want, we just need someone to draw it up, sort the paperwork with the municipality, and tell us what it will cost."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get a price for a build"]}
|
||||
{"id":"owner-basement-conversion@/","persona":"owner-basement-conversion","need":"build-price-enquiry","page":"/","state":{"body":"I'd like to turn the basement into a flat. Need drawings, the permit sorted, and a proper price before I commit to anything."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get a price for a build"]}
|
||||
{"id":"electrician-more-work@/","persona":"electrician-more-work","need":"subcontractor-application","page":"/","state":{"body":"We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"scaffolding-firm@/","persona":"scaffolding-firm","need":"subcontractor-application","page":"/","state":{"body":"We put up and take down scaffolding for building sites. We'd like to be one of the firms you call when a job needs it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"apprentice-asking@/","persona":"apprentice-asking","need":"job-application","page":"/","state":{"body":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after. Are you taking anyone on right now?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Ask about working with us"]}
|
||||
{"id":"experienced-carpenter@/","persona":"experienced-carpenter","need":"job-application","page":"/","state":{"body":"I've been doing carpentry for eight years, mostly older buildings. Wondered if you had any openings on site."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Ask about working with us"]}
|
||||
{"id":"crew-loose-scaffold@/","persona":"crew-loose-scaffold","need":"report-site-issue","page":"/","state":{"body":"Noticed a scaffold board that's not sitting right, feels loose when you step on it. Wanted to flag it straight away before someone gets hurt, but I've got gloves on and no time for a long form."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Report something from site"]}
|
||||
{"id":"subcontractor-wrong-delivery@/","persona":"subcontractor-wrong-delivery","need":"report-site-issue","page":"/","state":{"body":"The delivery this morning was the wrong type of insulation, not what was on the drawings. Someone needs to know before it gets used."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Report something from site"]}
|
||||
@@ -1,4 +0,0 @@
|
||||
needs round 1: needs.yaml parses, frozen
|
||||
structure round 1: green
|
||||
wording round 0: headings only: wording: 10/10 routed right (100%) | headings and descriptions: wording: 10/10 routed right (100%)
|
||||
content repo written to /tmp/claude-1000/-home-bl-repos-portal/b7802cea-728f-42d2-a751-680a973ba17d/scratchpad/gen/repo
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-damp@/","choice":"Get someone to look at a building","confidence":0.99}
|
||||
{"id":"buyer-before-purchase@/","choice":"Get someone to look at a building","confidence":0.99}
|
||||
{"id":"attic-conversion@/","choice":"Get a price for a build","confidence":0.99}
|
||||
{"id":"shop-to-flat@/","choice":"Get a price for a build","confidence":0.99}
|
||||
{"id":"electrician-firm@/","choice":"Join our subcontractor list","confidence":0.99}
|
||||
{"id":"scaffolder@/","choice":"Join our subcontractor list","confidence":0.99}
|
||||
{"id":"carpenter-jobseeker@/","choice":"Ask about working with us","confidence":0.99}
|
||||
{"id":"apprentice@/","choice":"Ask about working with us","confidence":0.99}
|
||||
{"id":"loose-railing@/","choice":"Report something from site","confidence":0.99}
|
||||
{"id":"wrong-membrane@/","choice":"Report something from site","confidence":0.99}
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-damp@/","choice":"Get someone to look at a building","confidence":0.95}
|
||||
{"id":"buyer-before-purchase@/","choice":"Get someone to look at a building","confidence":0.95}
|
||||
{"id":"attic-conversion@/","choice":"Get someone to look at a building","confidence":0.95}
|
||||
{"id":"shop-to-flat@/","choice":"Get a price for a build","confidence":0.95}
|
||||
{"id":"electrician-firm@/","choice":"Join our subcontractor list","confidence":0.95}
|
||||
{"id":"scaffolder@/","choice":"Ask about working with us","confidence":0.95}
|
||||
{"id":"carpenter-jobseeker@/","choice":"Ask about working with us","confidence":0.95}
|
||||
{"id":"apprentice@/","choice":"Ask about working with us","confidence":0.95}
|
||||
{"id":"loose-railing@/","choice":"Report something from site","confidence":0.95}
|
||||
{"id":"wrong-membrane@/","choice":"Report something from site","confidence":0.95}
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-damp@/","persona":"housing-board-damp","need":"survey-enquiry","page":"/","state":{"body":"I chair the board of a housing cooperative from the seventies. Two ground-floor flats have damp in the walls and we don't know if it's drainage or the facade. We need someone to tell us."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"buyer-before-purchase@/","persona":"buyer-before-purchase","need":"survey-enquiry","page":"/","state":{"body":"We are about to buy an old timber house. Before we sign we want a professional to go through it and tell us what is wrong with it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"attic-conversion@/","persona":"attic-conversion","need":"build-price-enquiry","page":"/","state":{"body":"We want to turn our attic into two bedrooms and a bathroom. We need drawings and someone who handles the application to the municipality."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get a price for a build"]}
|
||||
{"id":"shop-to-flat@/","persona":"shop-to-flat","need":"build-price-enquiry","page":"/","state":{"body":"I own a former shop on the ground floor and want to make it a flat. I have no idea what is allowed. Can you sort that out and give me a price?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Get a price for a build"]}
|
||||
{"id":"electrician-firm@/","persona":"electrician-firm","need":"subcontractor-application","page":"/","state":{"body":"We are a four-person electrical firm, fully certified. We would like to get on your list so you call us when you need electricians."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"scaffolder@/","persona":"scaffolder","need":"subcontractor-application","page":"/","state":{"body":"I run a scaffolding company. How do I get to do jobs for you?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"carpenter-jobseeker@/","persona":"carpenter-jobseeker","need":"job-application","page":"/","state":{"body":"I'm a certified carpenter with eight years on rehabilitation jobs. Are you hiring?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Ask about working with us"]}
|
||||
{"id":"apprentice@/","persona":"apprentice","need":"job-application","page":"/","state":{"body":"I finish vocational school this spring and need an apprenticeship as a bricklayer."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Ask about working with us"]}
|
||||
{"id":"loose-railing@/","persona":"loose-railing","need":"report-site-issue","page":"/","state":{"body":"The railing on the third level of the scaffold on the north side is loose. Nobody got hurt but someone will."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Report something from site"]}
|
||||
{"id":"wrong-membrane@/","persona":"wrong-membrane","need":"report-site-issue","page":"/","state":{"body":"The bathroom membrane delivered today is not the one in the specification. We stopped work on it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"For carpenters and apprentices who want to know if we're hiring.","Get a price for a build":"For owners who already know what they want built and need drawings, a permit application and a price.","Get someone to look at a building":"For housing boards and private owners with a problem in a building who want us to come and take a look.","Join our subcontractor list":"For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.","Report something from site":"For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials."}}},"expect":["Report something from site"]}
|
||||
@@ -1,10 +0,0 @@
|
||||
{"id":"housing-board-damp@/","persona":"housing-board-damp","need":"survey-enquiry","page":"/","state":{"body":"I chair the board of a housing cooperative from the seventies. Two ground-floor flats have damp in the walls and we don't know if it's drainage or the facade. We need someone to tell us."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"buyer-before-purchase@/","persona":"buyer-before-purchase","need":"survey-enquiry","page":"/","state":{"body":"We are about to buy an old timber house. Before we sign we want a professional to go through it and tell us what is wrong with it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get someone to look at a building"]}
|
||||
{"id":"attic-conversion@/","persona":"attic-conversion","need":"build-price-enquiry","page":"/","state":{"body":"We want to turn our attic into two bedrooms and a bathroom. We need drawings and someone who handles the application to the municipality."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get a price for a build"]}
|
||||
{"id":"shop-to-flat@/","persona":"shop-to-flat","need":"build-price-enquiry","page":"/","state":{"body":"I own a former shop on the ground floor and want to make it a flat. I have no idea what is allowed. Can you sort that out and give me a price?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Get a price for a build"]}
|
||||
{"id":"electrician-firm@/","persona":"electrician-firm","need":"subcontractor-application","page":"/","state":{"body":"We are a four-person electrical firm, fully certified. We would like to get on your list so you call us when you need electricians."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"scaffolder@/","persona":"scaffolder","need":"subcontractor-application","page":"/","state":{"body":"I run a scaffolding company. How do I get to do jobs for you?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Join our subcontractor list"]}
|
||||
{"id":"carpenter-jobseeker@/","persona":"carpenter-jobseeker","need":"job-application","page":"/","state":{"body":"I'm a certified carpenter with eight years on rehabilitation jobs. Are you hiring?"},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Ask about working with us"]}
|
||||
{"id":"apprentice@/","persona":"apprentice","need":"job-application","page":"/","state":{"body":"I finish vocational school this spring and need an apprenticeship as a bricklayer."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Ask about working with us"]}
|
||||
{"id":"loose-railing@/","persona":"loose-railing","need":"report-site-issue","page":"/","state":{"body":"The railing on the third level of the scaffold on the north side is loose. Nobody got hurt but someone will."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Report something from site"]}
|
||||
{"id":"wrong-membrane@/","persona":"wrong-membrane","need":"report-site-issue","page":"/","state":{"body":"The bathroom membrane delivered today is not the one in the specification. We stopped work on it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What brings you here?\". Which alternative do they choose?","criteria":{"Ask about working with us":"Ask about working with us","Get a price for a build":"Get a price for a build","Get someone to look at a building":"Get someone to look at a building","Join our subcontractor list":"Join our subcontractor list","Report something from site":"Report something from site"}}},"expect":["Report something from site"]}
|
||||
-720
@@ -1,720 +0,0 @@
|
||||
{
|
||||
"buckets": {
|
||||
"applicants": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Invite to interview",
|
||||
"to": "interviewing"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Hire",
|
||||
"to": "hired"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"interviewing": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"interviewing",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enquiries": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Looked at the building",
|
||||
"to": "surveyed"
|
||||
},
|
||||
{
|
||||
"from": "surveyed",
|
||||
"label": "Quote sent",
|
||||
"to": "quoted"
|
||||
},
|
||||
{
|
||||
"from": "surveyed",
|
||||
"label": "Not worth quoting",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Not for us",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Won",
|
||||
"to": "won"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Lost",
|
||||
"to": "lost"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"open": [
|
||||
"surveyed",
|
||||
"lost"
|
||||
],
|
||||
"quoted": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"surveyed": [
|
||||
"quoted",
|
||||
"lost"
|
||||
]
|
||||
}
|
||||
},
|
||||
"site_issues": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "safety_officer",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Look into it",
|
||||
"to": "in_hand"
|
||||
},
|
||||
{
|
||||
"from": "in_hand",
|
||||
"label": "Mark fixed",
|
||||
"to": "closed"
|
||||
}
|
||||
],
|
||||
"page": "/safety"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"in_hand": [
|
||||
"closed"
|
||||
],
|
||||
"open": [
|
||||
"in_hand"
|
||||
]
|
||||
}
|
||||
},
|
||||
"subcontractors": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Ask for missing papers",
|
||||
"to": "awaiting_papers"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"awaiting_papers": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"awaiting_papers",
|
||||
"approved",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"needs": [
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "survey-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get someone to look at a building",
|
||||
"expect": [
|
||||
"Get someone to look at a building"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What's wrong",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "Submission of requests pertaining to structural or condition-related evaluation of existing properties.",
|
||||
"name": "Building condition assessment request"
|
||||
},
|
||||
{
|
||||
"description": "Applicants must provide documentation of intended works for the purposes of cost estimation.",
|
||||
"name": "Construction quotation request"
|
||||
},
|
||||
{
|
||||
"description": "Registration of enterprises for prequalification subject to verification of mandatory documentation.",
|
||||
"name": "Subcontractor prequalification"
|
||||
},
|
||||
{
|
||||
"description": "Unsolicited applications are processed in accordance with applicable recruitment procedures.",
|
||||
"name": "Employment enquiries"
|
||||
},
|
||||
{
|
||||
"description": "Mandatory registration of nonconformities in accordance with internal control requirements.",
|
||||
"name": "Deviation and incident reporting"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "Please select the applicable category for your submission"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "someone from Nordvik Bygg to come and look at the building and tell them what a fix would cost",
|
||||
"who": "a housing board member or private owner with a problem in a building"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "build-price-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get a price for a build",
|
||||
"expect": [
|
||||
"Get a price for a build"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the site",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What you want built",
|
||||
"name": "project",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "When you'd like to start",
|
||||
"name": "timeframe",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"As soon as possible",
|
||||
"Within a year",
|
||||
"Just exploring"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "Submission of requests pertaining to structural or condition-related evaluation of existing properties.",
|
||||
"name": "Building condition assessment request"
|
||||
},
|
||||
{
|
||||
"description": "Applicants must provide documentation of intended works for the purposes of cost estimation.",
|
||||
"name": "Construction quotation request"
|
||||
},
|
||||
{
|
||||
"description": "Registration of enterprises for prequalification subject to verification of mandatory documentation.",
|
||||
"name": "Subcontractor prequalification"
|
||||
},
|
||||
{
|
||||
"description": "Unsolicited applications are processed in accordance with applicable recruitment procedures.",
|
||||
"name": "Employment enquiries"
|
||||
},
|
||||
{
|
||||
"description": "Mandatory registration of nonconformities in accordance with internal control requirements.",
|
||||
"name": "Deviation and incident reporting"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "Please select the applicable category for your submission"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "drawings, a permit application and a price for the work",
|
||||
"who": "an owner who already knows what they want built"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "subcontractor-application",
|
||||
"lands_in": "subcontractors",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Join our subcontractor list",
|
||||
"expect": [
|
||||
"Join our subcontractor list"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Company name",
|
||||
"name": "company_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "contact_email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Trade",
|
||||
"name": "trade",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Electrical",
|
||||
"Plumbing",
|
||||
"Scaffolding"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Company registration number",
|
||||
"name": "registration_number",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Insurance policy details",
|
||||
"name": "insurance",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Trade approval reference",
|
||||
"name": "trade_approval",
|
||||
"optional": true,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "Submission of requests pertaining to structural or condition-related evaluation of existing properties.",
|
||||
"name": "Building condition assessment request"
|
||||
},
|
||||
{
|
||||
"description": "Applicants must provide documentation of intended works for the purposes of cost estimation.",
|
||||
"name": "Construction quotation request"
|
||||
},
|
||||
{
|
||||
"description": "Registration of enterprises for prequalification subject to verification of mandatory documentation.",
|
||||
"name": "Subcontractor prequalification"
|
||||
},
|
||||
{
|
||||
"description": "Unsolicited applications are processed in accordance with applicable recruitment procedures.",
|
||||
"name": "Employment enquiries"
|
||||
},
|
||||
{
|
||||
"description": "Mandatory registration of nonconformities in accordance with internal control requirements.",
|
||||
"name": "Deviation and incident reporting"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "Please select the applicable category for your submission"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"approved"
|
||||
],
|
||||
"wants": "to get on Nordvik Bygg's list of subcontractors they call for work",
|
||||
"who": "a trade firm doing electrical, plumbing or scaffolding work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "job-application",
|
||||
"lands_in": "applicants",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Ask about working with us",
|
||||
"expect": [
|
||||
"Ask about working with us"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "What you do",
|
||||
"name": "role",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Carpenter",
|
||||
"Apprentice carpenter",
|
||||
"Other"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Anything else we should know",
|
||||
"name": "message",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "Submission of requests pertaining to structural or condition-related evaluation of existing properties.",
|
||||
"name": "Building condition assessment request"
|
||||
},
|
||||
{
|
||||
"description": "Applicants must provide documentation of intended works for the purposes of cost estimation.",
|
||||
"name": "Construction quotation request"
|
||||
},
|
||||
{
|
||||
"description": "Registration of enterprises for prequalification subject to verification of mandatory documentation.",
|
||||
"name": "Subcontractor prequalification"
|
||||
},
|
||||
{
|
||||
"description": "Unsolicited applications are processed in accordance with applicable recruitment procedures.",
|
||||
"name": "Employment enquiries"
|
||||
},
|
||||
{
|
||||
"description": "Mandatory registration of nonconformities in accordance with internal control requirements.",
|
||||
"name": "Deviation and incident reporting"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "Please select the applicable category for your submission"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"hired"
|
||||
],
|
||||
"wants": "to find out if Nordvik Bygg is hiring and put themselves forward",
|
||||
"who": "a carpenter or apprentice looking for work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"closed"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "safety_officer",
|
||||
"id": "report-site-issue",
|
||||
"lands_in": "site_issues",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Report something from site",
|
||||
"expect": [
|
||||
"Report something from site"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "What kind of issue",
|
||||
"name": "issue_type",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Hazard",
|
||||
"Near miss",
|
||||
"Wrong materials delivered"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Where on site",
|
||||
"name": "location",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What happened",
|
||||
"name": "details",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "Submission of requests pertaining to structural or condition-related evaluation of existing properties.",
|
||||
"name": "Building condition assessment request"
|
||||
},
|
||||
{
|
||||
"description": "Applicants must provide documentation of intended works for the purposes of cost estimation.",
|
||||
"name": "Construction quotation request"
|
||||
},
|
||||
{
|
||||
"description": "Registration of enterprises for prequalification subject to verification of mandatory documentation.",
|
||||
"name": "Subcontractor prequalification"
|
||||
},
|
||||
{
|
||||
"description": "Unsolicited applications are processed in accordance with applicable recruitment procedures.",
|
||||
"name": "Employment enquiries"
|
||||
},
|
||||
{
|
||||
"description": "Mandatory registration of nonconformities in accordance with internal control requirements.",
|
||||
"name": "Deviation and incident reporting"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "Please select the applicable category for your submission"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"closed"
|
||||
],
|
||||
"wants": "to flag a hazard, a near miss or wrong materials fast, from their phone",
|
||||
"who": "a crew member on site, ours or a subcontractor's"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": "project_managers",
|
||||
"handled_by": "project_managers",
|
||||
"id": "log-phone-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Log this enquiry",
|
||||
"expect": [
|
||||
"Log this enquiry"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Their name",
|
||||
"name": "caller_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Phone or email",
|
||||
"name": "contact",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What they told you",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "How soon",
|
||||
"name": "urgency",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"This week",
|
||||
"This month",
|
||||
"No rush"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "",
|
||||
"name": "Log this enquiry"
|
||||
}
|
||||
],
|
||||
"page": "/desk/phone-enquiry",
|
||||
"question": "Please select the applicable category for your submission"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "to get the enquiry into the system before it gets lost",
|
||||
"who": "a project manager who just took a call, email or text about a building"
|
||||
}
|
||||
],
|
||||
"personas": [
|
||||
{
|
||||
"id": "housing-board-cracks",
|
||||
"need": "survey-enquiry",
|
||||
"text": "There are cracks running up the outside wall of our building and none of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-leaking-roof",
|
||||
"need": "survey-enquiry",
|
||||
"text": "Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-extension",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "We want to add a room above the garage. We know roughly what we want, we just need someone to draw it up, sort the paperwork with the municipality, and tell us what it will cost."
|
||||
},
|
||||
{
|
||||
"id": "owner-basement-conversion",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "I'd like to turn the basement into a flat. Need drawings, the permit sorted, and a proper price before I commit to anything."
|
||||
},
|
||||
{
|
||||
"id": "electrician-more-work",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books."
|
||||
},
|
||||
{
|
||||
"id": "scaffolding-firm",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We put up and take down scaffolding for building sites. We'd like to be one of the firms you call when a job needs it."
|
||||
},
|
||||
{
|
||||
"id": "apprentice-asking",
|
||||
"need": "job-application",
|
||||
"text": "I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after. Are you taking anyone on right now?"
|
||||
},
|
||||
{
|
||||
"id": "experienced-carpenter",
|
||||
"need": "job-application",
|
||||
"text": "I've been doing carpentry for eight years, mostly older buildings. Wondered if you had any openings on site."
|
||||
},
|
||||
{
|
||||
"id": "crew-loose-scaffold",
|
||||
"need": "report-site-issue",
|
||||
"text": "Noticed a scaffold board that's not sitting right, feels loose when you step on it. Wanted to flag it straight away before someone gets hurt, but I've got gloves on and no time for a long form."
|
||||
},
|
||||
{
|
||||
"id": "subcontractor-wrong-delivery",
|
||||
"need": "report-site-issue",
|
||||
"text": "The delivery this morning was the wrong type of insulation, not what was on the drawings. Someone needs to know before it gets used."
|
||||
}
|
||||
]
|
||||
}
|
||||
-720
@@ -1,720 +0,0 @@
|
||||
{
|
||||
"buckets": {
|
||||
"applicants": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Invite to interview",
|
||||
"to": "interviewing"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Hire",
|
||||
"to": "hired"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"interviewing": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"interviewing",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enquiries": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Looked at the building",
|
||||
"to": "surveyed"
|
||||
},
|
||||
{
|
||||
"from": "surveyed",
|
||||
"label": "Quote sent",
|
||||
"to": "quoted"
|
||||
},
|
||||
{
|
||||
"from": "surveyed",
|
||||
"label": "Not worth quoting",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Not for us",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Won",
|
||||
"to": "won"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Lost",
|
||||
"to": "lost"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"open": [
|
||||
"surveyed",
|
||||
"lost"
|
||||
],
|
||||
"quoted": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"surveyed": [
|
||||
"quoted",
|
||||
"lost"
|
||||
]
|
||||
}
|
||||
},
|
||||
"site_issues": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "safety_officer",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Look into it",
|
||||
"to": "in_hand"
|
||||
},
|
||||
{
|
||||
"from": "in_hand",
|
||||
"label": "Mark fixed",
|
||||
"to": "closed"
|
||||
}
|
||||
],
|
||||
"page": "/safety"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"in_hand": [
|
||||
"closed"
|
||||
],
|
||||
"open": [
|
||||
"in_hand"
|
||||
]
|
||||
}
|
||||
},
|
||||
"subcontractors": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Ask for missing papers",
|
||||
"to": "awaiting_papers"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"awaiting_papers": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"awaiting_papers",
|
||||
"approved",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"needs": [
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "survey-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get someone to look at a building",
|
||||
"expect": [
|
||||
"Get someone to look at a building"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What's wrong",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look. A project manager reads it and calls you within two working days to agree a time to come.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price. A project manager reads it and replies within two working days.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them. A project manager checks your papers and answers within a week.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring. A project manager reads every one and answers within a week.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials. The safety officer sees it at once.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "someone from Nordvik Bygg to come and look at the building and tell them what a fix would cost",
|
||||
"who": "a housing board member or private owner with a problem in a building"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "build-price-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get a price for a build",
|
||||
"expect": [
|
||||
"Get a price for a build"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the site",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What you want built",
|
||||
"name": "project",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "When you'd like to start",
|
||||
"name": "timeframe",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"As soon as possible",
|
||||
"Within a year",
|
||||
"Just exploring"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look. A project manager reads it and calls you within two working days to agree a time to come.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price. A project manager reads it and replies within two working days.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them. A project manager checks your papers and answers within a week.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring. A project manager reads every one and answers within a week.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials. The safety officer sees it at once.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "drawings, a permit application and a price for the work",
|
||||
"who": "an owner who already knows what they want built"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "subcontractor-application",
|
||||
"lands_in": "subcontractors",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Join our subcontractor list",
|
||||
"expect": [
|
||||
"Join our subcontractor list"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Company name",
|
||||
"name": "company_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "contact_email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Trade",
|
||||
"name": "trade",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Electrical",
|
||||
"Plumbing",
|
||||
"Scaffolding"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Company registration number",
|
||||
"name": "registration_number",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Insurance policy details",
|
||||
"name": "insurance",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Trade approval reference",
|
||||
"name": "trade_approval",
|
||||
"optional": true,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look. A project manager reads it and calls you within two working days to agree a time to come.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price. A project manager reads it and replies within two working days.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them. A project manager checks your papers and answers within a week.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring. A project manager reads every one and answers within a week.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials. The safety officer sees it at once.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"approved"
|
||||
],
|
||||
"wants": "to get on Nordvik Bygg's list of subcontractors they call for work",
|
||||
"who": "a trade firm doing electrical, plumbing or scaffolding work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "job-application",
|
||||
"lands_in": "applicants",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Ask about working with us",
|
||||
"expect": [
|
||||
"Ask about working with us"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "What you do",
|
||||
"name": "role",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Carpenter",
|
||||
"Apprentice carpenter",
|
||||
"Other"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Anything else we should know",
|
||||
"name": "message",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look. A project manager reads it and calls you within two working days to agree a time to come.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price. A project manager reads it and replies within two working days.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them. A project manager checks your papers and answers within a week.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring. A project manager reads every one and answers within a week.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials. The safety officer sees it at once.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"hired"
|
||||
],
|
||||
"wants": "to find out if Nordvik Bygg is hiring and put themselves forward",
|
||||
"who": "a carpenter or apprentice looking for work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"closed"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "safety_officer",
|
||||
"id": "report-site-issue",
|
||||
"lands_in": "site_issues",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Report something from site",
|
||||
"expect": [
|
||||
"Report something from site"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "What kind of issue",
|
||||
"name": "issue_type",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Hazard",
|
||||
"Near miss",
|
||||
"Wrong materials delivered"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Where on site",
|
||||
"name": "location",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What happened",
|
||||
"name": "details",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look. A project manager reads it and calls you within two working days to agree a time to come.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price. A project manager reads it and replies within two working days.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them. A project manager checks your papers and answers within a week.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring. A project manager reads every one and answers within a week.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials. The safety officer sees it at once.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"closed"
|
||||
],
|
||||
"wants": "to flag a hazard, a near miss or wrong materials fast, from their phone",
|
||||
"who": "a crew member on site, ours or a subcontractor's"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": "project_managers",
|
||||
"handled_by": "project_managers",
|
||||
"id": "log-phone-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Log this enquiry",
|
||||
"expect": [
|
||||
"Log this enquiry"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Their name",
|
||||
"name": "caller_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Phone or email",
|
||||
"name": "contact",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What they told you",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "How soon",
|
||||
"name": "urgency",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"This week",
|
||||
"This month",
|
||||
"No rush"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "",
|
||||
"name": "Log this enquiry"
|
||||
}
|
||||
],
|
||||
"page": "/desk/phone-enquiry",
|
||||
"question": "What did they tell you?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "to get the enquiry into the system before it gets lost",
|
||||
"who": "a project manager who just took a call, email or text about a building"
|
||||
}
|
||||
],
|
||||
"personas": [
|
||||
{
|
||||
"id": "housing-board-cracks",
|
||||
"need": "survey-enquiry",
|
||||
"text": "There are cracks running up the outside wall of our building and none of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-leaking-roof",
|
||||
"need": "survey-enquiry",
|
||||
"text": "Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-extension",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "We want to add a room above the garage. We know roughly what we want, we just need someone to draw it up, sort the paperwork with the municipality, and tell us what it will cost."
|
||||
},
|
||||
{
|
||||
"id": "owner-basement-conversion",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "I'd like to turn the basement into a flat. Need drawings, the permit sorted, and a proper price before I commit to anything."
|
||||
},
|
||||
{
|
||||
"id": "electrician-more-work",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books."
|
||||
},
|
||||
{
|
||||
"id": "scaffolding-firm",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We put up and take down scaffolding for building sites. We'd like to be one of the firms you call when a job needs it."
|
||||
},
|
||||
{
|
||||
"id": "apprentice-asking",
|
||||
"need": "job-application",
|
||||
"text": "I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after. Are you taking anyone on right now?"
|
||||
},
|
||||
{
|
||||
"id": "experienced-carpenter",
|
||||
"need": "job-application",
|
||||
"text": "I've been doing carpentry for eight years, mostly older buildings. Wondered if you had any openings on site."
|
||||
},
|
||||
{
|
||||
"id": "crew-loose-scaffold",
|
||||
"need": "report-site-issue",
|
||||
"text": "Noticed a scaffold board that's not sitting right, feels loose when you step on it. Wanted to flag it straight away before someone gets hurt, but I've got gloves on and no time for a long form."
|
||||
},
|
||||
{
|
||||
"id": "subcontractor-wrong-delivery",
|
||||
"need": "report-site-issue",
|
||||
"text": "The delivery this morning was the wrong type of insulation, not what was on the drawings. Someone needs to know before it gets used."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
{
|
||||
"build-price-enquiry": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 25.593406593406595,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 5,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 0,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"job-application": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 26.44899072558647,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 4,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 0,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"report-site-issue": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 26.557413600891863,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 3,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 0,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"subcontractor-application": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 30.64138678223185,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 5,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 0,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"survey-enquiry": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 27.867430441898527,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 4,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 0,
|
||||
"which": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
{
|
||||
"build-price-enquiry": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 28.462059620596207,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 5,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 2,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"job-application": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 29.146007816862088,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 4,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 2,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"report-site-issue": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 29.2562358276644,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 3,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 2,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"subcontractor-application": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 32.111111111111114,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 5,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 2,
|
||||
"which": 2
|
||||
}
|
||||
},
|
||||
"survey-enquiry": {
|
||||
"control_ok": true,
|
||||
"control_which": 0,
|
||||
"lix": 30.151032942490225,
|
||||
"options": 5,
|
||||
"overloaded": false,
|
||||
"personas": 2,
|
||||
"required_fields": 4,
|
||||
"steps": 1,
|
||||
"understanding": {
|
||||
"asked": 2,
|
||||
"next": 2,
|
||||
"which": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Simulating the generated contractor site, 2026-09-21
|
||||
|
||||
Ten personas, three runs each, on ergo. Version A is the site as
|
||||
generated (`enquiries: open -> quoted`). Version B adds the stage the
|
||||
owner described and the generator dropped (`open -> surveyed -> quoted`).
|
||||
|
||||
## What held up
|
||||
|
||||
- **The simulation found a defect the verifier could not.** Reading
|
||||
the first run's records next to the intake showed the generated
|
||||
machine had skipped "we go and look at the building". That became
|
||||
the `stages` field in needs.yaml, which the lint now enforces, so
|
||||
the same omission fails deterministically from here on.
|
||||
- **Routing and form-filling are stable.** 0 misroutes and 0 abandoned
|
||||
forms in 60 cases, once choices were matched by heading (the first
|
||||
run's "100% misrouted" was the model answering "Heading: description").
|
||||
- **One recurring question is a real gap.** Handlers asked about
|
||||
arranging a site visit seven times. The enquiry forms collect an
|
||||
email address and nothing about access or when someone can come,
|
||||
for a business whose first step is a visit.
|
||||
|
||||
## What did not
|
||||
|
||||
- **Letting a model decide outcomes is worthless.** In the first
|
||||
design qwen3:8b sent every case to its success state; after one
|
||||
sentence telling it that losing is normal, every enquiry was "lost"
|
||||
in one touch (`first-design-qwen3-8b/`). Routes are now scripted and
|
||||
who wins is left to the live bucket.
|
||||
- **The ask-back rate does not discriminate yet.** With
|
||||
nemotron-3.5-lightning:30b-a3b as handler, nearly every button drew
|
||||
a question (4 of 4), including nonsense (a title deed; an email
|
||||
address the form already requires). A measure stuck at its maximum
|
||||
cannot rank version A against version B: the A -> B rise in
|
||||
ask-backs per case (1.7 -> 2.3) is just B having one more button.
|
||||
|
||||
## What it needs before its numbers mean anything
|
||||
|
||||
A control for the instrument: run the handler on a record that is
|
||||
deliberately complete and on one deliberately stripped. A usable judge
|
||||
asks on the stripped record and stays quiet on the complete one. Until
|
||||
a prompt and model pass that, read the questions, not the rates.
|
||||
|
||||
Speed: nemotron on both sides took about nine minutes per 30 cases;
|
||||
qwen3:8b about two.
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
{"persona":"housing-board-cracks","need":"survey-enquiry","run":0,"target":"won","record":{"address":"1200 Maple Avenue, Unit 4B, Springfield","email":"alex.ramirez@email.com","follow_up_1":{"answered":"This is the first time a quote is being requested.","asked":"Has Nordvik Bygg already provided a formal quote for this specific issue, or is this the first time a quote is being requested?"},"follow_up_2":{"answered":"This is the first time a quote is being requested.","asked":"Has Nordvik Bygg already provided a formal quote for this specific issue, or is this the first time a quote is being requested?"},"name":"Alex Ramirez","problem":"There are cracks running up the outside wall of our building. None of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Has Nordvik Bygg already provided a formal quote for this specific issue, or is this the first time a quote is being requested?","answerable":false},{"state":"quoted","button":"Won","question":"Has Nordvik Bygg already provided a formal quote for this specific issue, or is this the first time a quote is being requested?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"housing-board-cracks","need":"survey-enquiry","run":1,"target":"lost","record":{"address":"Our building, but I don't know the exact address","follow_up_1":{"answered":"I don't have it.","asked":"What is the exact address of the building?"},"name":"Anon","problem":"Cracks running up the outside wall. Don't know if serious."},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"What is the exact address of the building?","answerable":false}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"housing-board-cracks","need":"survey-enquiry","run":2,"target":"won","record":{"address":"12 Maple Avenue, Apt 3B, Springfield","email":"mia.torres@email.com","follow_up_1":{"answered":"No, I haven't received a quote or price estimate from Nordvik Bygg yet. I'm just hoping someone can come take a look and tell us what's going on first.","asked":"Have you already received a quote or price estimate from Nordvik Bygg for this assessment?"},"follow_up_2":{"answered":"No, we've never had a Nordvik Bygg rep visit. We've been trying to get someone out here to look at the cracks for months.","asked":"Has a Nordvik Bygg representative already visited the site and provided a written assessment and cost estimate?"},"name":"Mia Torres","problem":"There are significant cracks running up the exterior wall of our building. The masonry appears to be deteriorating, and we are unsure if this indicates structural failure or something less serious. We need a qualified professional to assess the cause and provide a report on the severity and necessary repairs."},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Have you already received a quote or price estimate from Nordvik Bygg for this assessment?","answerable":false},{"state":"quoted","button":"Won","question":"Has a Nordvik Bygg representative already visited the site and provided a written assessment and cost estimate?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-leaking-roof","need":"survey-enquiry","run":0,"target":"won","record":{"address":"1234 Pine Street, Apartment 5B, Atlanta, GA 30309","email":"spike@southernliving.com","follow_up_1":{"answered":"No, this is the first time anyone has inspected it.","asked":"Has Nordvik Bygg already inspected this property before, or is this the first time?"},"follow_up_2":{"answered":"No, this is the first time anyone has been called out to look at it.","asked":"Can you please confirm if Nordvik Bygg has already inspected this property before, or is this the first time?"},"name":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse.","problem":"Water is leaking through the ceiling every time it rains. I'm not sure if it's the roof or something else. Need someone to inspect it before the damage gets worse."},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Has Nordvik Bygg already inspected this property before, or is this the first time?","answerable":false},{"state":"quoted","button":"Won","question":"Can you please confirm if Nordvik Bygg has already inspected this property before, or is this the first time?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-leaking-roof","need":"survey-enquiry","run":1,"target":"lost","record":{"address":"Unknown address","email":"unknown@domain.com","follow_up_1":{"answered":"I don't have that info.","asked":"What is the address of the building?"},"name":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse.","problem":"Water leaking through ceiling during rain. Need inspection to determine if roof or other issue."},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"What is the address of the building?","answerable":false}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"homeowner-leaking-roof","need":"survey-enquiry","run":2,"target":"won","record":{"address":"37 Orchard Lane, Apartment 4B, Southhill","email":"not_sharing@protonmail.com","follow_up_1":{"answered":"The building is occupied. I live here, so there's always someone around when the rain starts.","asked":"Is the building currently occupied or vacant?"},"follow_up_2":{"answered":"I don't know. I'm not there all the time, and the landlord never told me. I just know the water comes down whenever it rains, and I'm tired of buckets.","asked":"Is the building currently occupied or vacant?"},"name":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse.","problem":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Is the building currently occupied or vacant?","answerable":true},{"state":"quoted","button":"Won","question":"Is the building currently occupied or vacant?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-extension","need":"build-price-enquiry","run":0,"target":"won","record":{"address":"42 Maple Street, Unit 3B, Portland, OR 97201","email":"sarah.chen@email.com","follow_up_1":{"answered":"I don't know if a site visit has been performed, but it's a necessary step to verify existing conditions and structural feasibility before drawing up plans.","asked":"Has a site visit been performed to verify the existing conditions and structural feasibility of the proposed addition?"},"follow_up_2":{"answered":"We require a site visit to verify existing conditions and structural feasibility before any design or cost estimation can proceed.","asked":"Has a site visit been performed to verify the existing conditions and structural feasibility of the proposed addition?"},"name":"Sarah Chen","project":"Addition of a 24' x 16' room above the existing garage. Two-story design with dormer windows. Open floor plan living area with master suite. Budget range: $250,000 - $350,000. Current garage to be converted to workshop/storage.","timeframe":"Within a year"},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Has a site visit been performed to verify the existing conditions and structural feasibility of the proposed addition?","answerable":false},{"state":"quoted","button":"Won","question":"Has a site visit been performed to verify the existing conditions and structural feasibility of the proposed addition?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-extension","need":"build-price-enquiry","run":1,"target":"lost","record":{"address":"123 Maple St, Anytown","email":"quickquote@example.com","follow_up_1":{"answered":"Yes, we still want to do it.","asked":"Is this project still a possibility, or have you already decided not to proceed?"},"name":"Quick Quote Bot","project":"Room addition above garage","timeframe":"Just exploring"},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"Is this project still a possibility, or have you already decided not to proceed?","answerable":true}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"homeowner-extension","need":"build-price-enquiry","run":2,"target":"won","record":{"address":"123 Maple Street, Anytown, State, 12345","email":"jane.smith@email.com","follow_up_1":{"answered":"No, I'm a new client inquiry and haven't received any quote from you yet.","asked":"Can you confirm that the quote has been prepared and sent to Jane Smith?"},"follow_up_2":{"answered":"I don't know. I haven't prepared or sent a quote to Jane Smith, and I have no idea who she is.","asked":"Can you confirm that the quote has been prepared and sent to Jane Smith?"},"name":"Jane Smith","project":"Addition of a 20'x24' room above existing single-car garage. Client has conceptual sketches but requires full architectural drawings, municipal permit set, and cost estimation for structural and MEP integration.","timeframe":"Within a year"},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Can you confirm that the quote has been prepared and sent to Jane Smith?","answerable":false},{"state":"quoted","button":"Won","question":"Can you confirm that the quote has been prepared and sent to Jane Smith?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"owner-basement-conversion","need":"build-price-enquiry","run":0,"target":"won","record":{"address":"123 Maple Street, Apt 4B, Cityville, CA 90210","email":"info@basementflat.arch","follow_up_1":{"answered":"No, I haven't visited the site yet. I'll need to see the space in person before I can give you accurate drawings, permits, or pricing.","asked":"Has a site visit been conducted to verify the current condition of the basement and confirm the proposed layout is feasible?"},"follow_up_2":{"answered":"No site visit has been conducted yet.","asked":"Can you please confirm that a site visit has been conducted to verify the current condition of the basement?"},"name":"I. Architect","project":"Conversion of basement into a residential flat with separate entrance, kitchenette, bathroom, and bedroom. Requires architectural drawings, planning permit application, and detailed cost estimate for client approval prior to commencement.","timeframe":"Within a year"},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Has a site visit been conducted to verify the current condition of the basement and confirm the proposed layout is feasible?","answerable":false},{"state":"quoted","button":"Won","question":"Can you please confirm that a site visit has been conducted to verify the current condition of the basement?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"owner-basement-conversion","need":"build-price-enquiry","run":1,"target":"lost","record":{"address":"123 Basement Lane","email":"me@basement.com","follow_up_1":{"answered":"Still exploring. Let's get the ball rolling.","asked":"Has your project moved forward, or would you still like to explore options?"},"name":"Me","project":"Convert basement into a flat","timeframe":"Just exploring"},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"Has your project moved forward, or would you still like to explore options?","answerable":true}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"owner-basement-conversion","need":"build-price-enquiry","run":2,"target":"won","record":{"address":"42 Maple Crescent, Basingstoke, RG24 9JX","email":"sarah.jenkins@email.com","follow_up_1":{"answered":"No, I haven't had a site visit yet. I'm waiting to get the project started properly.","asked":"Has a site visit been conducted to verify the existing conditions of the basement and the feasibility of the conversion?"},"follow_up_2":{"answered":"No, I haven't had a site visit yet. The plans I'm working from are based on the original building drawings and a quick look around, but I need someone to actually measure the space, check the ceiling height, and look at the services before I can give you proper drawings or a fixed price.","asked":"Has a site visit been conducted to verify the existing conditions of the basement and the feasibility of the conversion?"},"name":"Sarah Jenkins","project":"Convert existing basement into a one-bedroom flat with kitchenette, bathroom, and living area. Requires full architectural drawings, building regulation approval, and planning permission. Need detailed cost breakdown for structural work, MEP services, and finishes.","timeframe":"Within a year"},"states":["open","quoted","won"],"pressed":["open -> Quote sent","quoted -> Won"],"touches":4,"ask_backs":[{"state":"open","button":"Quote sent","question":"Has a site visit been conducted to verify the existing conditions of the basement and the feasibility of the conversion?","answerable":false},{"state":"quoted","button":"Won","question":"Has a site visit been conducted to verify the existing conditions of the basement and the feasibility of the conversion?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"electrician-more-work","need":"subcontractor-application","run":0,"target":"approved","record":{"company_name":"We're a small electrical firm","contact_email":"contact@weareaelectricalfirm.com","follow_up_1":{"answered":"We don't have a company registration number.","asked":"What is your company registration number?"},"insurance":"We have current public liability cover","registration_number":"We are registered but number not to hand right now","trade":"Electrical","trade_approval":""},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"What is your company registration number?","answerable":false}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"electrician-more-work","need":"subcontractor-application","run":1,"target":"declined","record":{"company_name":"We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books.","contact_email":"email@example.com","follow_up_1":{"answered":"I don't know what you're talking about.","asked":"What is your company registration number and insurance provider details?"},"insurance":"Registered and insured, just need to know who to talk to about getting on your books.","registration_number":"Registered and insured, just need to know who to talk to about getting on your books.","trade":"Electrical","trade_approval":""},"states":["open","declined"],"pressed":["open -> Decline"],"touches":2,"ask_backs":[{"state":"open","button":"Decline","question":"What is your company registration number and insurance provider details?","answerable":false}],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"electrician-more-work","need":"subcontractor-application","run":2,"target":"approved","record":{"company_name":"C&W Electrical Services Ltd","contact_email":"info@cwelectricalservices.co.uk","follow_up_1":{"answered":"Yes, we have submitted all required insurance certificates and signed the standard subcontractor agreement. We're ready to go.","asked":"Has the company submitted the required insurance certificates and signed the standard subcontractor agreement?"},"insurance":"Public liability insurance held with Hiscox policy number HL-987654, cover limit £2,000,000. Electrical indemnity insurance with Allianz policy number AL-345321, cover limit £1,000,000.","registration_number":"OC345678","trade":"Electrical","trade_approval":"NICEIC approved contractor since 2015"},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"Has the company submitted the required insurance certificates and signed the standard subcontractor agreement?","answerable":true}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"scaffolding-firm","need":"subcontractor-application","run":0,"target":"approved","record":{"company_name":"QuickSet Scaffolding Ltd","contact_email":"admin@quickset-scaffold.co.uk","follow_up_1":{"answered":"We are a scaffolding company, not a construction site with assigned operatives. We hire qualified scaffolders as needed, but we do not have CISRS cards for our own staff.","asked":"Do you have a valid and current CISRS card for the operatives assigned to Nordvik Bygg projects?"},"insurance":"Public Liability £5M / Employers Liability £10M","registration_number":"12345678","trade":"Scaffolding","trade_approval":"CISRS Registered - Ref: CIS/2024/001"},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"Do you have a valid and current CISRS card for the operatives assigned to Nordvik Bygg projects?","answerable":false}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"scaffolding-firm","need":"subcontractor-application","run":1,"target":"declined","record":{"company_name":"We put up and take down scaffolding for building sites.","contact_email":"contact@scaffoldingco.uk","follow_up_1":{"answered":"I don't have the registration number.","asked":"What is the company's registration number?"},"insurance":"We have public liability cover, policy number available on request.","registration_number":"Would prefer not to share this publicly.","trade":"Scaffolding"},"states":["open","declined"],"pressed":["open -> Decline"],"touches":2,"ask_backs":[{"state":"open","button":"Decline","question":"What is the company's registration number?","answerable":false}],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"scaffolding-firm","need":"subcontractor-application","run":2,"target":"approved","record":{"company_name":"Rapid Response Scaffolding Ltd","contact_email":"admin@rapidresponse-scaffold.co.uk","follow_up_1":{"answered":"No, I'm just a person writing a message on your behalf. You'll need to check with the actual scaffolding company about their certifications.","asked":"Do you have a valid and current scaffolding-specific certification (e.g., PASMA, CISRS) or relevant trade accreditation for the work you perform?"},"insurance":"Public Liability £5M; Employers Liability £10M; Certificate current to 31/12/2025","registration_number":"OC327489","trade":"Scaffolding","trade_approval":"N/A"},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"Do you have a valid and current scaffolding-specific certification (e.g., PASMA, CISRS) or relevant trade accreditation for the work you perform?","answerable":true}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"apprentice-asking","need":"job-application","run":0,"target":"hired","record":{"follow_up_1":{"answered":"206-555-0199","asked":"What is your phone number?"},"follow_up_2":{"answered":"I'm applying for an apprentice position.","asked":"Which specific carpentry role are you applying for (e.g., apprentice, journeyman, project lead)?"},"message":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after the apprenticeship. Are you taking anyone on right now?","name":"Jordan","role":"Apprentice carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":4,"ask_backs":[{"state":"open","button":"Invite to interview","question":"What is your phone number?","answerable":true},{"state":"interviewing","button":"Hire","question":"Which specific carpentry role are you applying for (e.g., apprentice, journeyman, project lead)?","answerable":true}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"apprentice-asking","need":"job-application","run":1,"target":"declined","record":{"email":"","follow_up_1":{"answered":"I don't know it.","asked":"What is your email address?"},"message":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after.","name":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after.","role":"Apprentice carpenter"},"states":["open","declined"],"pressed":["open -> Decline"],"touches":2,"ask_backs":[{"state":"open","button":"Decline","question":"What is your email address?","answerable":false}],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"apprentice-asking","need":"job-application","run":2,"target":"hired","record":{"follow_up_1":{"answered":"it's me@email.com","asked":"What is your email address?"},"follow_up_2":{"answered":"I'm not taking anyone on right now. I'm finishing up a job and sorting out my own schedule for next season. I don't have the time to train a new apprentice while I'm trying to keep my own crew running. If you're serious, ask me again in a few months when things settle down.","asked":"Do you want to proceed with hiring this applicant?"},"message":"I'm currently in my second year of carpentry apprenticeship and looking for a firm that will take me on permanently after I complete my training. I have hands-on experience with framing, finish work, and tool maintenance, and I'm eager to find a workplace where I can grow long-term.","name":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after.","role":"Apprentice carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":4,"ask_backs":[{"state":"open","button":"Invite to interview","question":"What is your email address?","answerable":true},{"state":"interviewing","button":"Hire","question":"Do you want to proceed with hiring this applicant?","answerable":false}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"experienced-carpenter","need":"job-application","run":0,"target":"hired","record":{"email":"alex.miller@example.com","follow_up_1":{"answered":"925-555-0198","asked":"What is your phone number?"},"follow_up_2":{"answered":"I'm available on the 15th, but I need to know the start time. I have a morning job that day, so I can only make it in after 10 AM.","asked":"Can you come in for an interview on [Date]?"},"message":"Eight years experience specializing in older buildings. I have hand tools for precise joinery and familiarity with period materials. Available for site work.","name":"Alex Miller","role":"Carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":4,"ask_backs":[{"state":"open","button":"Invite to interview","question":"What is your phone number?","answerable":true},{"state":"interviewing","button":"Hire","question":"Can you come in for an interview on [Date]?","answerable":true}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"experienced-carpenter","need":"job-application","run":1,"target":"declined","record":{"email":"eli.carpenter8@protonmail.com","message":"Eight years in older buildings. Prefer hand tools, lime mortar, and keeping things standing.","name":"Eli","role":"Carpenter"},"states":["open","declined"],"pressed":["open -> Decline"],"touches":1,"ask_backs":[],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"experienced-carpenter","need":"job-application","run":2,"target":"hired","record":{"email":"james.miller@example.com","follow_up_1":{"answered":"I'm a carpenter, not a citizen. I just have a passport.","asked":"Do you have the legal right to work in the country where Nordvik Bygg operates?"},"message":"I'm James, an experienced carpenter with eight years specializing in older buildings. I have a strong background in structural restoration, period joinery, and working with reclaimed materials. I'm looking for a position where I can apply my skills to heritage projects and continue learning from experienced craftsmen.","name":"James Miller","role":"Carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":3,"ask_backs":[{"state":"interviewing","button":"Hire","question":"Do you have the legal right to work in the country where Nordvik Bygg operates?","answerable":true}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"crew-loose-scaffold","need":"report-site-issue","run":0,"target":"closed","record":{"details":"Board feels loose under weight; gloves on, no time for detailed investigation","follow_up_1":{"answered":"First name's Mark, I'm a labourer on site. No time for faffing about.","asked":"What is your full name and role (e.g., employee or subcontractor) so I can assign the follow-up correctly?"},"follow_up_2":{"answered":"the crew member who flagged it","asked":"Which person marked this as fixed: the crew member who flagged it, or the subcontractor's worker?"},"issue_type":"Hazard","location":"Scaffold walkway near Zone 3"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"What is your full name and role (e.g., employee or subcontractor) so I can assign the follow-up correctly?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"Which person marked this as fixed: the crew member who flagged it, or the subcontractor's worker?","answerable":true}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"crew-loose-scaffold","need":"report-site-issue","run":1,"target":"closed","record":{"details":"Board feels loose under weight, gloves on, needs checking","follow_up_1":{"answered":"No, I was stepping on it.","asked":"Has a visual inspection of the scaffold board near main entrance been completed?"},"follow_up_2":{"answered":"No, I just noticed it.","asked":"Has a visual inspection of the scaffold board near main entrance been completed?"},"issue_type":"Hazard","location":"Scaffold board near main entrance"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"Has a visual inspection of the scaffold board near main entrance been completed?","answerable":false},{"state":"in_hand","button":"Mark fixed","question":"Has a visual inspection of the scaffold board near main entrance been completed?","answerable":false}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"crew-loose-scaffold","need":"report-site-issue","run":2,"target":"closed","record":{"details":"Scaffold board feels loose and unstable under foot. Gloves on, time limited. Board not sitting right, risk of slip or fall if stepped on. Flagging immediately to prevent injury.","follow_up_1":{"answered":"Scaffold bay 4, Level 3. The board is over the walkway. It's still in use, no cordon up yet. I just stepped on it and it dipped.","asked":"Can you confirm the exact location of the scaffold board issue? For example, which specific scaffold bay or level, and the current status of the area (e.g., is the scaffold still in use or has it been cordoned off)?"},"follow_up_2":{"answered":"Board is still up, no cordon up yet. I stepped on it to test it, wobbled a bit, then got off. Didn't tie it off or rope it off because I was in a rush and just wanted to warn the boss. Gonna go back with proper gear later to fix it for real.","asked":"Has the scaffold board been secured or removed, and has the area been cordoned off to prevent further use?"},"issue_type":"Hazard","location":"Scaffold area, near main entrance"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"Can you confirm the exact location of the scaffold board issue? For example, which specific scaffold bay or level, and the current status of the area (e.g., is the scaffold still in use or has it been cordoned off)?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"Has the scaffold board been secured or removed, and has the area been cordoned off to prevent further use?","answerable":true}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"subcontractor-wrong-delivery","need":"report-site-issue","run":0,"target":"closed","record":{"details":"Delivery this morning arrived with standard fiberglass batts instead of the specified mineral wool board. Packaging labels match the delivery note but not the structural drawings. Awaiting confirmation on whether to reject the shipment or hold for exchange.","follow_up_1":{"answered":"Counted 25 rolls of fiberglass batts against the spec for mineral wool. I only noticed because I cross-referenced the truck tag against the manifest before unloading.","asked":"What is the quantity of wrong materials delivered?"},"follow_up_2":{"answered":"Left on the truck. I haven't unloaded it yet, waiting for clarification before proceeding.","asked":"How has the wrong material been handled since delivery? (e.g., moved to quarantine, used in work, left in the storage area)"},"issue_type":"Wrong materials delivered","location":"Storage area, Zone B"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"What is the quantity of wrong materials delivered?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"How has the wrong material been handled since delivery? (e.g., moved to quarantine, used in work, left in the storage area)","answerable":true}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"subcontractor-wrong-delivery","need":"report-site-issue","run":1,"target":"closed","record":{"details":"Wrong type of insulation delivered this morning. Not what was on the drawings.","follow_up_1":{"answered":"No, the wrong insulation is still on site.","asked":"Has the wrong insulation been removed or replaced with the correct type?"},"issue_type":"Wrong materials delivered","location":"Main entrance staging area"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":3,"ask_backs":[{"state":"in_hand","button":"Mark fixed","question":"Has the wrong insulation been removed or replaced with the correct type?","answerable":false}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"subcontractor-wrong-delivery","need":"report-site-issue","run":2,"target":"closed","record":{"details":"The delivery arrived this morning. I was expecting the blue fiberglass batts shown on the project drawings, but the delivery contained mineral wool boards instead. The packaging was labeled for a different job number. I stopped the crew from offloading it. Someone needs to verify the correct material before it gets installed, as the R-value and fit are different from what's specified. I don't have the delivery ticket number handy, but the driver said it was a substitute from the supplier's stock.","follow_up_1":{"answered":"Yes, I have the delivery ticket number from the manifest on the pallet, but the supplier's contact details are just the generic office number on the invoice, not a specific representative. I can read the ticket number off the label if you need me to verify the substitution details.","asked":"Do you have the delivery ticket number or the supplier's contact details to verify the substitution?"},"follow_up_2":{"answered":"I don't have the delivery ticket or the label in front of me right now, so I can't read the number off the pallet. I need someone to physically check the pallet tag or look up the shipment record in the system to get that number and confirm what was actually delivered versus what was specified on the drawings.","asked":"Can you read the delivery ticket number from the label on the pallet to verify the substitution details?"},"issue_type":"Wrong materials delivered","location":"Warehouse staging area, Bay 4"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"Do you have the delivery ticket number or the supplier's contact details to verify the substitution?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"Can you read the delivery ticket number from the label on the pallet to verify the substitution details?","answerable":false}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
-706
@@ -1,706 +0,0 @@
|
||||
{
|
||||
"buckets": {
|
||||
"applicants": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Invite to interview",
|
||||
"to": "interviewing"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Hire",
|
||||
"to": "hired"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"interviewing": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"interviewing",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enquiries": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Quote sent",
|
||||
"to": "quoted"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Not for us",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Won",
|
||||
"to": "won"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Lost",
|
||||
"to": "lost"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"open": [
|
||||
"quoted",
|
||||
"lost"
|
||||
],
|
||||
"quoted": [
|
||||
"won",
|
||||
"lost"
|
||||
]
|
||||
}
|
||||
},
|
||||
"site_issues": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "safety_officer",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Look into it",
|
||||
"to": "in_hand"
|
||||
},
|
||||
{
|
||||
"from": "in_hand",
|
||||
"label": "Mark fixed",
|
||||
"to": "closed"
|
||||
}
|
||||
],
|
||||
"page": "/safety"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"in_hand": [
|
||||
"closed"
|
||||
],
|
||||
"open": [
|
||||
"in_hand"
|
||||
]
|
||||
}
|
||||
},
|
||||
"subcontractors": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Ask for missing papers",
|
||||
"to": "awaiting_papers"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"awaiting_papers": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"awaiting_papers",
|
||||
"approved",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"needs": [
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "survey-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get someone to look at a building",
|
||||
"expect": [
|
||||
"Get someone to look at a building"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What's wrong",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "someone from Nordvik Bygg to come and look at the building and tell them what a fix would cost",
|
||||
"who": "a housing board member or private owner with a problem in a building"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "build-price-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get a price for a build",
|
||||
"expect": [
|
||||
"Get a price for a build"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the site",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What you want built",
|
||||
"name": "project",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "When you'd like to start",
|
||||
"name": "timeframe",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"As soon as possible",
|
||||
"Within a year",
|
||||
"Just exploring"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "drawings, a permit application and a price for the work",
|
||||
"who": "an owner who already knows what they want built"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "subcontractor-application",
|
||||
"lands_in": "subcontractors",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Join our subcontractor list",
|
||||
"expect": [
|
||||
"Join our subcontractor list"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Company name",
|
||||
"name": "company_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "contact_email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Trade",
|
||||
"name": "trade",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Electrical",
|
||||
"Plumbing",
|
||||
"Scaffolding"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Company registration number",
|
||||
"name": "registration_number",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Insurance policy details",
|
||||
"name": "insurance",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Trade approval reference",
|
||||
"name": "trade_approval",
|
||||
"optional": true,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"approved"
|
||||
],
|
||||
"wants": "to get on Nordvik Bygg's list of subcontractors they call for work",
|
||||
"who": "a trade firm doing electrical, plumbing or scaffolding work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "job-application",
|
||||
"lands_in": "applicants",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Ask about working with us",
|
||||
"expect": [
|
||||
"Ask about working with us"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "What you do",
|
||||
"name": "role",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Carpenter",
|
||||
"Apprentice carpenter",
|
||||
"Other"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Anything else we should know",
|
||||
"name": "message",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"hired"
|
||||
],
|
||||
"wants": "to find out if Nordvik Bygg is hiring and put themselves forward",
|
||||
"who": "a carpenter or apprentice looking for work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"closed"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "safety_officer",
|
||||
"id": "report-site-issue",
|
||||
"lands_in": "site_issues",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Report something from site",
|
||||
"expect": [
|
||||
"Report something from site"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "What kind of issue",
|
||||
"name": "issue_type",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Hazard",
|
||||
"Near miss",
|
||||
"Wrong materials delivered"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Where on site",
|
||||
"name": "location",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What happened",
|
||||
"name": "details",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"closed"
|
||||
],
|
||||
"wants": "to flag a hazard, a near miss or wrong materials fast, from their phone",
|
||||
"who": "a crew member on site, ours or a subcontractor's"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": "project_managers",
|
||||
"handled_by": "project_managers",
|
||||
"id": "log-phone-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Log this enquiry",
|
||||
"expect": [
|
||||
"Log this enquiry"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Their name",
|
||||
"name": "caller_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Phone or email",
|
||||
"name": "contact",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What they told you",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "How soon",
|
||||
"name": "urgency",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"This week",
|
||||
"This month",
|
||||
"No rush"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "",
|
||||
"name": "Log this enquiry"
|
||||
}
|
||||
],
|
||||
"page": "/desk/phone-enquiry",
|
||||
"question": "What did they tell you?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "to get the enquiry into the system before it gets lost",
|
||||
"who": "a project manager who just took a call, email or text about a building"
|
||||
}
|
||||
],
|
||||
"personas": [
|
||||
{
|
||||
"id": "housing-board-cracks",
|
||||
"need": "survey-enquiry",
|
||||
"text": "There are cracks running up the outside wall of our building and none of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-leaking-roof",
|
||||
"need": "survey-enquiry",
|
||||
"text": "Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-extension",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "We want to add a room above the garage. We know roughly what we want, we just need someone to draw it up, sort the paperwork with the municipality, and tell us what it will cost."
|
||||
},
|
||||
{
|
||||
"id": "owner-basement-conversion",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "I'd like to turn the basement into a flat. Need drawings, the permit sorted, and a proper price before I commit to anything."
|
||||
},
|
||||
{
|
||||
"id": "electrician-more-work",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books."
|
||||
},
|
||||
{
|
||||
"id": "scaffolding-firm",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We put up and take down scaffolding for building sites. We'd like to be one of the firms you call when a job needs it."
|
||||
},
|
||||
{
|
||||
"id": "apprentice-asking",
|
||||
"need": "job-application",
|
||||
"text": "I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after. Are you taking anyone on right now?"
|
||||
},
|
||||
{
|
||||
"id": "experienced-carpenter",
|
||||
"need": "job-application",
|
||||
"text": "I've been doing carpentry for eight years, mostly older buildings. Wondered if you had any openings on site."
|
||||
},
|
||||
{
|
||||
"id": "crew-loose-scaffold",
|
||||
"need": "report-site-issue",
|
||||
"text": "Noticed a scaffold board that's not sitting right, feels loose when you step on it. Wanted to flag it straight away before someone gets hurt, but I've got gloves on and no time for a long form."
|
||||
},
|
||||
{
|
||||
"id": "subcontractor-wrong-delivery",
|
||||
"need": "report-site-issue",
|
||||
"text": "The delivery this morning was the wrong type of insulation, not what was on the drawings. Someone needs to know before it gets used."
|
||||
}
|
||||
]
|
||||
}
|
||||
-409
@@ -1,409 +0,0 @@
|
||||
{
|
||||
"build-price-enquiry": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 20,
|
||||
"ask_backs": 10,
|
||||
"unanswerable": 6,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Has a site visit been performed to verify the existing conditions and structural feasibility of the proposed addition?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has a site visit been performed to verify the existing conditions and structural feasibility of the proposed addition?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "Is this project still a possibility, or have you already decided not to proceed?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Can you confirm that the quote has been prepared and sent to Jane Smith?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Can you confirm that the quote has been prepared and sent to Jane Smith?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Has a site visit been conducted to verify the current condition of the basement and confirm the proposed layout is feasible?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Can you please confirm that a site visit has been conducted to verify the current condition of the basement?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "Has your project moved forward, or would you still like to explore options?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Has a site visit been conducted to verify the existing conditions of the basement and the feasibility of the conversion?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has a site visit been conducted to verify the existing conditions of the basement and the feasibility of the conversion?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"open -> Not for us": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"open -> Quote sent": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"quoted -> Won": [
|
||||
4,
|
||||
4
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"job-application": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 18,
|
||||
"ask_backs": 8,
|
||||
"unanswerable": 2,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Invite to interview",
|
||||
"question": "What is your phone number?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Which specific carpentry role are you applying for (e.g., apprentice, journeyman, project lead)?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Decline",
|
||||
"question": "What is your email address?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Invite to interview",
|
||||
"question": "What is your email address?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Do you want to proceed with hiring this applicant?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Invite to interview",
|
||||
"question": "What is your phone number?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Can you come in for an interview on [Date]?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Do you have the legal right to work in the country where Nordvik Bygg operates?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"interviewing -> Hire": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"open -> Decline": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"open -> Invite to interview": [
|
||||
4,
|
||||
3
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"report-site-issue": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 23,
|
||||
"ask_backs": 11,
|
||||
"unanswerable": 4,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "What is your full name and role (e.g., employee or subcontractor) so I can assign the follow-up correctly?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Which person marked this as fixed: the crew member who flagged it, or the subcontractor's worker?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "Has a visual inspection of the scaffold board near main entrance been completed?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Has a visual inspection of the scaffold board near main entrance been completed?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "Can you confirm the exact location of the scaffold board issue? For example, which specific scaffold bay or level, and the current status of the area (e.g., is the scaffold still in use or has it been cordoned off)?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Has the scaffold board been secured or removed, and has the area been cordoned off to prevent further use?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "What is the quantity of wrong materials delivered?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "How has the wrong material been handled since delivery? (e.g., moved to quarantine, used in work, left in the storage area)",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Has the wrong insulation been removed or replaced with the correct type?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "Do you have the delivery ticket number or the supplier's contact details to verify the substitution?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Can you read the delivery ticket number from the label on the pallet to verify the substitution details?",
|
||||
"answerable": false
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"in_hand -> Mark fixed": [
|
||||
6,
|
||||
6
|
||||
],
|
||||
"open -> Look into it": [
|
||||
6,
|
||||
5
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"subcontractor-application": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 12,
|
||||
"ask_backs": 6,
|
||||
"unanswerable": 4,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "What is your company registration number?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Decline",
|
||||
"question": "What is your company registration number and insurance provider details?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "Has the company submitted the required insurance certificates and signed the standard subcontractor agreement?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "Do you have a valid and current CISRS card for the operatives assigned to Nordvik Bygg projects?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Decline",
|
||||
"question": "What is the company's registration number?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "Do you have a valid and current scaffolding-specific certification (e.g., PASMA, CISRS) or relevant trade accreditation for the work you perform?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"open -> Approve": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"open -> Decline": [
|
||||
2,
|
||||
2
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"survey-enquiry": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 20,
|
||||
"ask_backs": 10,
|
||||
"unanswerable": 8,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Has Nordvik Bygg already provided a formal quote for this specific issue, or is this the first time a quote is being requested?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has Nordvik Bygg already provided a formal quote for this specific issue, or is this the first time a quote is being requested?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "What is the exact address of the building?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Have you already received a quote or price estimate from Nordvik Bygg for this assessment?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has a Nordvik Bygg representative already visited the site and provided a written assessment and cost estimate?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Has Nordvik Bygg already inspected this property before, or is this the first time?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Can you please confirm if Nordvik Bygg has already inspected this property before, or is this the first time?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "What is the address of the building?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Quote sent",
|
||||
"question": "Is the building currently occupied or vacant?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Is the building currently occupied or vacant?",
|
||||
"answerable": false
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"open -> Not for us": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"open -> Quote sent": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"quoted -> Won": [
|
||||
4,
|
||||
4
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
}
|
||||
}
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
{"persona":"housing-board-cracks","need":"survey-enquiry","run":0,"target":"won","record":{"address":"1200 Maple Avenue, Unit 4B, Springfield","email":"alex.ramirez@email.com","follow_up_1":{"answered":"We have a master key in the office, but the current caretaker is on leave until Tuesday. I can arrange access then, or you can coordinate with the building manager for an earlier time.","asked":"Do you have access to the building right now, or can you arrange for someone to let me in?"},"follow_up_2":{"answered":"The property manager is available on weekdays between 9am and 4pm. Please coordinate a specific time slot.","asked":"Are you or the building manager available to grant access to the property for a site visit?"},"follow_up_3":{"answered":"I can send a specific time slot for the site visit once you provide your availability. I typically request the building manager's preferred date and time, then confirm with the structural engineer's schedule before finalizing. I can usually accommodate a visit within 3-5 business days, depending on urgency and engineer availability.","asked":"Can you coordinate a specific time for a site visit that works for the building manager or property manager?"},"name":"Alex Ramirez","problem":"There are cracks running up the outside wall of our building. None of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Do you have access to the building right now, or can you arrange for someone to let me in?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Are you or the building manager available to grant access to the property for a site visit?","answerable":true},{"state":"quoted","button":"Won","question":"Can you coordinate a specific time for a site visit that works for the building manager or property manager?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"housing-board-cracks","need":"survey-enquiry","run":1,"target":"lost","record":{"address":"Our building, but I don't know the exact address","follow_up_1":{"answered":"I don't have it.","asked":"What is the exact address of the building?"},"name":"Anon","problem":"Cracks running up the outside wall. Don't know if serious."},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"What is the exact address of the building?","answerable":false}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"housing-board-cracks","need":"survey-enquiry","run":2,"target":"won","record":{"address":"12 Maple Avenue, Apt 3B, Springfield","email":"mia.torres@email.com","follow_up_1":{"answered":"We are occupied. It's a mixed-use building with retail on the ground floor and apartments above. Nobody has moved out, and we're all still here hoping this isn't something catastrophic.","asked":"Is the building currently occupied or vacant?"},"follow_up_2":{"answered":"I don't have a calendar or scheduling system. You'll need to check the voicemail or ask the office staff for available slots.","asked":"Can you provide a convenient time for a site visit?"},"follow_up_3":{"answered":"Yes, I have a convenient time tomorrow afternoon after 2 PM. Please send someone qualified to assess the structural integrity of the building.","asked":"Do you have a convenient time for a site visit?"},"name":"Mia Torres","problem":"There are significant cracks running up the exterior wall of our building. The masonry appears to be deteriorating, and we are unsure if this indicates structural failure or something less serious. We need a qualified professional to assess the cause and provide a report on the severity and necessary repairs."},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Is the building currently occupied or vacant?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Can you provide a convenient time for a site visit?","answerable":false},{"state":"quoted","button":"Won","question":"Do you have a convenient time for a site visit?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-leaking-roof","need":"survey-enquiry","run":0,"target":"won","record":{"address":"1234 Pine Street, Apartment 5B, Atlanta, GA 30309","email":"spike@southernliving.com","follow_up_1":{"answered":"No, I don't have access right now. I work full-time and the building is locked. I can do evenings or weekends if that works.","asked":"Do you have access to the building right now, or would you need to schedule an appointment?"},"follow_up_2":{"answered":"I'm at work during the day, so a morning appointment would be best.","asked":"Could you grant access to the building or schedule an appointment for us to inspect the leak?"},"follow_up_3":{"answered":"Yes, that works. I'll ensure someone is there.","asked":"Can you grant access to the building for an inspection during a morning appointment?"},"name":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse.","problem":"Water is leaking through the ceiling every time it rains. I'm not sure if it's the roof or something else. Need someone to inspect it before the damage gets worse."},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Do you have access to the building right now, or would you need to schedule an appointment?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Could you grant access to the building or schedule an appointment for us to inspect the leak?","answerable":true},{"state":"quoted","button":"Won","question":"Can you grant access to the building for an inspection during a morning appointment?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-leaking-roof","need":"survey-enquiry","run":1,"target":"lost","record":{"address":"Unknown address","email":"unknown@domain.com","follow_up_1":{"answered":"I don't have that info.","asked":"What is the address of the building?"},"name":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse.","problem":"Water leaking through ceiling during rain. Need inspection to determine if roof or other issue."},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"What is the address of the building?","answerable":false}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"homeowner-leaking-roof","need":"survey-enquiry","run":2,"target":"won","record":{"address":"37 Orchard Lane, Apartment 4B, Southhill","email":"not_sharing@protonmail.com","follow_up_1":{"answered":"212 Oakridge Avenue, Apartment 4B","asked":"Could you confirm the exact address of the building, including the street number and apartment/unit number?"},"follow_up_2":{"answered":"I don't have the exact address or unit number written down in front of me, but I know the building is on Maple Avenue and it's the third floor on the left side.","asked":"Can you confirm the exact address of the building, including the street number and apartment/unit number?"},"follow_up_3":{"answered":"123 Maple Avenue, Apt 4B","asked":"Can you provide the exact street number and apartment/unit number for the address?"},"name":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse.","problem":"Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Could you confirm the exact address of the building, including the street number and apartment/unit number?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Can you confirm the exact address of the building, including the street number and apartment/unit number?","answerable":false},{"state":"quoted","button":"Won","question":"Can you provide the exact street number and apartment/unit number for the address?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-extension","need":"build-price-enquiry","run":0,"target":"won","record":{"address":"42 Maple Street, Unit 3B, Portland, OR 97201","email":"sarah.chen@email.com","follow_up_1":{"answered":"Go ahead. I'm expecting you.","asked":"Can I have your permission to visit the property at 42 Maple Street, Unit 3B, Portland, OR 97201 to take measurements and assess the existing structure?"},"follow_up_2":{"answered":"Site visit is mandatory. I need to verify ceiling height, roof pitch, and load-bearing walls before drawing anything.","asked":"Is the owner available for a site visit to take measurements and assess the existing structure?"},"follow_up_3":{"answered":"No, they haven't signed the contract or submitted the deposit.","asked":"Has the owner signed the contract and submitted the deposit?"},"name":"Sarah Chen","project":"Addition of a 24' x 16' room above the existing garage. Two-story design with dormer windows. Open floor plan living area with master suite. Budget range: $250,000 - $350,000. Current garage to be converted to workshop/storage.","timeframe":"Within a year"},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Can I have your permission to visit the property at 42 Maple Street, Unit 3B, Portland, OR 97201 to take measurements and assess the existing structure?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Is the owner available for a site visit to take measurements and assess the existing structure?","answerable":true},{"state":"quoted","button":"Won","question":"Has the owner signed the contract and submitted the deposit?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"homeowner-extension","need":"build-price-enquiry","run":1,"target":"lost","record":{"address":"123 Maple St, Anytown","email":"quickquote@example.com","follow_up_1":{"answered":"Yes, we still want to do it.","asked":"Is this project still a possibility, or have you already decided not to proceed?"},"name":"Quick Quote Bot","project":"Room addition above garage","timeframe":"Just exploring"},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"Is this project still a possibility, or have you already decided not to proceed?","answerable":true}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"homeowner-extension","need":"build-price-enquiry","run":2,"target":"won","record":{"address":"123 Maple Street, Anytown, State, 12345","email":"jane.smith@email.com","follow_up_1":{"answered":null,"asked":"What is the current condition of the existing garage structure and the site (soil, grade, access) that would need to be surveyed?"},"follow_up_2":{"answered":"I don't have access to your property or the garage. You'll need to hire a surveyor or structural engineer to document the existing conditions, soil, and grade before any drawings can be done.","asked":"Can you provide the current condition of the existing garage structure and the site (soil, grade, access) that would need to be surveyed?"},"follow_up_3":{"answered":"No, we haven't hired a surveyor or structural engineer yet. We were hoping you could handle the design and coordinate those as part of the project, or at least tell us who to call and what order things need to happen in.","asked":"Has the surveyor or structural engineer been hired and completed the documentation of the existing conditions, soil, and grade?"},"name":"Jane Smith","project":"Addition of a 20'x24' room above existing single-car garage. Client has conceptual sketches but requires full architectural drawings, municipal permit set, and cost estimation for structural and MEP integration.","timeframe":"Within a year"},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"What is the current condition of the existing garage structure and the site (soil, grade, access) that would need to be surveyed?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Can you provide the current condition of the existing garage structure and the site (soil, grade, access) that would need to be surveyed?","answerable":false},{"state":"quoted","button":"Won","question":"Has the surveyor or structural engineer been hired and completed the documentation of the existing conditions, soil, and grade?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"owner-basement-conversion","need":"build-price-enquiry","run":0,"target":"won","record":{"address":"123 Maple Street, Apt 4B, Cityville, CA 90210","email":"info@basementflat.arch","follow_up_1":{"answered":"Currently unoccupied, but the lock needs changing before access can be granted.","asked":"Can we proceed with a site visit, or is the basement currently occupied/locked?"},"follow_up_2":{"answered":"No site visit has been conducted yet.","asked":"Has the site been visited to assess the current condition and verify the lock status?"},"follow_up_3":{"answered":"No, but I have the original blueprints and a full condition report from the previous owner.","asked":"Has a site visit been conducted to verify the lock status and current condition of the basement?"},"name":"I. Architect","project":"Conversion of basement into a residential flat with separate entrance, kitchenette, bathroom, and bedroom. Requires architectural drawings, planning permit application, and detailed cost estimate for client approval prior to commencement.","timeframe":"Within a year"},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Can we proceed with a site visit, or is the basement currently occupied/locked?","answerable":true},{"state":"surveyed","button":"Quote sent","question":"Has the site been visited to assess the current condition and verify the lock status?","answerable":false},{"state":"quoted","button":"Won","question":"Has a site visit been conducted to verify the lock status and current condition of the basement?","answerable":false}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"owner-basement-conversion","need":"build-price-enquiry","run":1,"target":"lost","record":{"address":"123 Basement Lane","email":"me@basement.com","follow_up_1":{"answered":"Still exploring. Let's get the ball rolling.","asked":"Has your project moved forward, or would you still like to explore options?"},"name":"Me","project":"Convert basement into a flat","timeframe":"Just exploring"},"states":["open","lost"],"pressed":["open -> Not for us"],"touches":2,"ask_backs":[{"state":"open","button":"Not for us","question":"Has your project moved forward, or would you still like to explore options?","answerable":true}],"outcome":{"outcome":"finished","detail":"lost"}}
|
||||
{"persona":"owner-basement-conversion","need":"build-price-enquiry","run":2,"target":"won","record":{"address":"42 Maple Crescent, Basingstoke, RG24 9JX","email":"sarah.jenkins@email.com","follow_up_1":{"answered":"No, I don't have the title deed. I'm just looking to turn the basement into a flat, so I haven't sorted out the paperwork yet.","asked":"Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?"},"follow_up_2":{"answered":"No, I do not have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX. I'm currently renting the basement or looking to convert it, but I haven't secured the legal paperwork yet.","asked":"Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?"},"follow_up_3":{"answered":"No, I don't have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX. I'm hoping to get one sorted before I proceed with the basement conversion, but right now I'm just the person wanting to turn it into a flat. I need to sort out the legal paperwork first.","asked":"Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?"},"name":"Sarah Jenkins","project":"Convert existing basement into a one-bedroom flat with kitchenette, bathroom, and living area. Requires full architectural drawings, building regulation approval, and planning permission. Need detailed cost breakdown for structural work, MEP services, and finishes.","timeframe":"Within a year"},"states":["open","surveyed","quoted","won"],"pressed":["open -> Looked at the building","surveyed -> Quote sent","quoted -> Won"],"touches":6,"ask_backs":[{"state":"open","button":"Looked at the building","question":"Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?","answerable":false},{"state":"surveyed","button":"Quote sent","question":"Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?","answerable":true},{"state":"quoted","button":"Won","question":"Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?","answerable":true}],"outcome":{"outcome":"finished","detail":"won"}}
|
||||
{"persona":"electrician-more-work","need":"subcontractor-application","run":0,"target":"approved","record":{"company_name":"We're a small electrical firm","contact_email":"contact@weareaelectricalfirm.com","follow_up_1":{"answered":"We don't have a company registration number.","asked":"What is your company registration number?"},"insurance":"We have current public liability cover","registration_number":"We are registered but number not to hand right now","trade":"Electrical","trade_approval":""},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"What is your company registration number?","answerable":false}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"electrician-more-work","need":"subcontractor-application","run":1,"target":"declined","record":{"company_name":"We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books.","contact_email":"email@example.com","follow_up_1":{"answered":"I don't know what you're talking about.","asked":"What is your company registration number and insurance provider details?"},"insurance":"Registered and insured, just need to know who to talk to about getting on your books.","registration_number":"Registered and insured, just need to know who to talk to about getting on your books.","trade":"Electrical","trade_approval":""},"states":["open","declined"],"pressed":["open -> Decline"],"touches":2,"ask_backs":[{"state":"open","button":"Decline","question":"What is your company registration number and insurance provider details?","answerable":false}],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"electrician-more-work","need":"subcontractor-application","run":2,"target":"approved","record":{"company_name":"C&W Electrical Services Ltd","contact_email":"info@cwelectricalservices.co.uk","follow_up_1":{"answered":"Yes, we have submitted all required insurance certificates and signed the standard subcontractor agreement. We're ready to go.","asked":"Has the company submitted the required insurance certificates and signed the standard subcontractor agreement?"},"insurance":"Public liability insurance held with Hiscox policy number HL-987654, cover limit £2,000,000. Electrical indemnity insurance with Allianz policy number AL-345321, cover limit £1,000,000.","registration_number":"OC345678","trade":"Electrical","trade_approval":"NICEIC approved contractor since 2015"},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"Has the company submitted the required insurance certificates and signed the standard subcontractor agreement?","answerable":true}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"scaffolding-firm","need":"subcontractor-application","run":0,"target":"approved","record":{"company_name":"QuickSet Scaffolding Ltd","contact_email":"admin@quickset-scaffold.co.uk","follow_up_1":{"answered":"We are a scaffolding company, not a construction site with assigned operatives. We hire qualified scaffolders as needed, but we do not have CISRS cards for our own staff.","asked":"Do you have a valid and current CISRS card for the operatives assigned to Nordvik Bygg projects?"},"insurance":"Public Liability £5M / Employers Liability £10M","registration_number":"12345678","trade":"Scaffolding","trade_approval":"CISRS Registered - Ref: CIS/2024/001"},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"Do you have a valid and current CISRS card for the operatives assigned to Nordvik Bygg projects?","answerable":false}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"scaffolding-firm","need":"subcontractor-application","run":1,"target":"declined","record":{"company_name":"We put up and take down scaffolding for building sites.","contact_email":"contact@scaffoldingco.uk","follow_up_1":{"answered":"I don't have the registration number.","asked":"What is the company's registration number?"},"insurance":"We have public liability cover, policy number available on request.","registration_number":"Would prefer not to share this publicly.","trade":"Scaffolding"},"states":["open","declined"],"pressed":["open -> Decline"],"touches":2,"ask_backs":[{"state":"open","button":"Decline","question":"What is the company's registration number?","answerable":false}],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"scaffolding-firm","need":"subcontractor-application","run":2,"target":"approved","record":{"company_name":"Rapid Response Scaffolding Ltd","contact_email":"admin@rapidresponse-scaffold.co.uk","follow_up_1":{"answered":"No, I'm just a person writing a message on your behalf. You'll need to check with the actual scaffolding company about their certifications.","asked":"Do you have a valid and current scaffolding-specific certification (e.g., PASMA, CISRS) or relevant trade accreditation for the work you perform?"},"insurance":"Public Liability £5M; Employers Liability £10M; Certificate current to 31/12/2025","registration_number":"OC327489","trade":"Scaffolding","trade_approval":"N/A"},"states":["open","approved"],"pressed":["open -> Approve"],"touches":2,"ask_backs":[{"state":"open","button":"Approve","question":"Do you have a valid and current scaffolding-specific certification (e.g., PASMA, CISRS) or relevant trade accreditation for the work you perform?","answerable":true}],"outcome":{"outcome":"finished","detail":"approved"}}
|
||||
{"persona":"apprentice-asking","need":"job-application","run":0,"target":"hired","record":{"follow_up_1":{"answered":"206-555-0199","asked":"What is your phone number?"},"follow_up_2":{"answered":"I'm applying for an apprentice position.","asked":"Which specific carpentry role are you applying for (e.g., apprentice, journeyman, project lead)?"},"message":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after the apprenticeship. Are you taking anyone on right now?","name":"Jordan","role":"Apprentice carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":4,"ask_backs":[{"state":"open","button":"Invite to interview","question":"What is your phone number?","answerable":true},{"state":"interviewing","button":"Hire","question":"Which specific carpentry role are you applying for (e.g., apprentice, journeyman, project lead)?","answerable":true}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"apprentice-asking","need":"job-application","run":1,"target":"declined","record":{"email":"","follow_up_1":{"answered":"I don't know it.","asked":"What is your email address?"},"message":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after.","name":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after.","role":"Apprentice carpenter"},"states":["open","declined"],"pressed":["open -> Decline"],"touches":2,"ask_backs":[{"state":"open","button":"Decline","question":"What is your email address?","answerable":false}],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"apprentice-asking","need":"job-application","run":2,"target":"hired","record":{"follow_up_1":{"answered":"it's me@email.com","asked":"What is your email address?"},"follow_up_2":{"answered":"I'm not taking anyone on right now. I'm finishing up a job and sorting out my own schedule for next season. I don't have the time to train a new apprentice while I'm trying to keep my own crew running. If you're serious, ask me again in a few months when things settle down.","asked":"Do you want to proceed with hiring this applicant?"},"message":"I'm currently in my second year of carpentry apprenticeship and looking for a firm that will take me on permanently after I complete my training. I have hands-on experience with framing, finish work, and tool maintenance, and I'm eager to find a workplace where I can grow long-term.","name":"I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after.","role":"Apprentice carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":4,"ask_backs":[{"state":"open","button":"Invite to interview","question":"What is your email address?","answerable":true},{"state":"interviewing","button":"Hire","question":"Do you want to proceed with hiring this applicant?","answerable":false}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"experienced-carpenter","need":"job-application","run":0,"target":"hired","record":{"email":"alex.miller@example.com","follow_up_1":{"answered":"925-555-0198","asked":"What is your phone number?"},"follow_up_2":{"answered":"I'm available on the 15th, but I need to know the start time. I have a morning job that day, so I can only make it in after 10 AM.","asked":"Can you come in for an interview on [Date]?"},"message":"Eight years experience specializing in older buildings. I have hand tools for precise joinery and familiarity with period materials. Available for site work.","name":"Alex Miller","role":"Carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":4,"ask_backs":[{"state":"open","button":"Invite to interview","question":"What is your phone number?","answerable":true},{"state":"interviewing","button":"Hire","question":"Can you come in for an interview on [Date]?","answerable":true}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"experienced-carpenter","need":"job-application","run":1,"target":"declined","record":{"email":"eli.carpenter8@protonmail.com","message":"Eight years in older buildings. Prefer hand tools, lime mortar, and keeping things standing.","name":"Eli","role":"Carpenter"},"states":["open","declined"],"pressed":["open -> Decline"],"touches":1,"ask_backs":[],"outcome":{"outcome":"finished","detail":"declined"}}
|
||||
{"persona":"experienced-carpenter","need":"job-application","run":2,"target":"hired","record":{"email":"james.miller@example.com","follow_up_1":{"answered":"I'm a carpenter, not a citizen. I just have a passport.","asked":"Do you have the legal right to work in the country where Nordvik Bygg operates?"},"message":"I'm James, an experienced carpenter with eight years specializing in older buildings. I have a strong background in structural restoration, period joinery, and working with reclaimed materials. I'm looking for a position where I can apply my skills to heritage projects and continue learning from experienced craftsmen.","name":"James Miller","role":"Carpenter"},"states":["open","interviewing","hired"],"pressed":["open -> Invite to interview","interviewing -> Hire"],"touches":3,"ask_backs":[{"state":"interviewing","button":"Hire","question":"Do you have the legal right to work in the country where Nordvik Bygg operates?","answerable":true}],"outcome":{"outcome":"finished","detail":"hired"}}
|
||||
{"persona":"crew-loose-scaffold","need":"report-site-issue","run":0,"target":"closed","record":{"details":"Board feels loose under weight; gloves on, no time for detailed investigation","follow_up_1":{"answered":"First name's Mark, I'm a labourer on site. No time for faffing about.","asked":"What is your full name and role (e.g., employee or subcontractor) so I can assign the follow-up correctly?"},"follow_up_2":{"answered":"the crew member who flagged it","asked":"Which person marked this as fixed: the crew member who flagged it, or the subcontractor's worker?"},"issue_type":"Hazard","location":"Scaffold walkway near Zone 3"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"What is your full name and role (e.g., employee or subcontractor) so I can assign the follow-up correctly?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"Which person marked this as fixed: the crew member who flagged it, or the subcontractor's worker?","answerable":true}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"crew-loose-scaffold","need":"report-site-issue","run":1,"target":"closed","record":{"details":"Board feels loose under weight, gloves on, needs checking","follow_up_1":{"answered":"No, I was stepping on it.","asked":"Has a visual inspection of the scaffold board near main entrance been completed?"},"follow_up_2":{"answered":"No, I just noticed it.","asked":"Has a visual inspection of the scaffold board near main entrance been completed?"},"issue_type":"Hazard","location":"Scaffold board near main entrance"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"Has a visual inspection of the scaffold board near main entrance been completed?","answerable":false},{"state":"in_hand","button":"Mark fixed","question":"Has a visual inspection of the scaffold board near main entrance been completed?","answerable":false}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"crew-loose-scaffold","need":"report-site-issue","run":2,"target":"closed","record":{"details":"Scaffold board feels loose and unstable under foot. Gloves on, time limited. Board not sitting right, risk of slip or fall if stepped on. Flagging immediately to prevent injury.","follow_up_1":{"answered":"Scaffold bay 4, Level 3. The board is over the walkway. It's still in use, no cordon up yet. I just stepped on it and it dipped.","asked":"Can you confirm the exact location of the scaffold board issue? For example, which specific scaffold bay or level, and the current status of the area (e.g., is the scaffold still in use or has it been cordoned off)?"},"follow_up_2":{"answered":"Board is still up, no cordon up yet. I stepped on it to test it, wobbled a bit, then got off. Didn't tie it off or rope it off because I was in a rush and just wanted to warn the boss. Gonna go back with proper gear later to fix it for real.","asked":"Has the scaffold board been secured or removed, and has the area been cordoned off to prevent further use?"},"issue_type":"Hazard","location":"Scaffold area, near main entrance"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"Can you confirm the exact location of the scaffold board issue? For example, which specific scaffold bay or level, and the current status of the area (e.g., is the scaffold still in use or has it been cordoned off)?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"Has the scaffold board been secured or removed, and has the area been cordoned off to prevent further use?","answerable":true}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"subcontractor-wrong-delivery","need":"report-site-issue","run":0,"target":"closed","record":{"details":"Delivery this morning arrived with standard fiberglass batts instead of the specified mineral wool board. Packaging labels match the delivery note but not the structural drawings. Awaiting confirmation on whether to reject the shipment or hold for exchange.","follow_up_1":{"answered":"Counted 25 rolls of fiberglass batts against the spec for mineral wool. I only noticed because I cross-referenced the truck tag against the manifest before unloading.","asked":"What is the quantity of wrong materials delivered?"},"follow_up_2":{"answered":"Left on the truck. I haven't unloaded it yet, waiting for clarification before proceeding.","asked":"How has the wrong material been handled since delivery? (e.g., moved to quarantine, used in work, left in the storage area)"},"issue_type":"Wrong materials delivered","location":"Storage area, Zone B"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"What is the quantity of wrong materials delivered?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"How has the wrong material been handled since delivery? (e.g., moved to quarantine, used in work, left in the storage area)","answerable":true}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"subcontractor-wrong-delivery","need":"report-site-issue","run":1,"target":"closed","record":{"details":"Wrong type of insulation delivered this morning. Not what was on the drawings.","follow_up_1":{"answered":"No, the wrong insulation is still on site.","asked":"Has the wrong insulation been removed or replaced with the correct type?"},"issue_type":"Wrong materials delivered","location":"Main entrance staging area"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":3,"ask_backs":[{"state":"in_hand","button":"Mark fixed","question":"Has the wrong insulation been removed or replaced with the correct type?","answerable":false}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
{"persona":"subcontractor-wrong-delivery","need":"report-site-issue","run":2,"target":"closed","record":{"details":"The delivery arrived this morning. I was expecting the blue fiberglass batts shown on the project drawings, but the delivery contained mineral wool boards instead. The packaging was labeled for a different job number. I stopped the crew from offloading it. Someone needs to verify the correct material before it gets installed, as the R-value and fit are different from what's specified. I don't have the delivery ticket number handy, but the driver said it was a substitute from the supplier's stock.","follow_up_1":{"answered":"Yes, I have the delivery ticket number from the manifest on the pallet, but the supplier's contact details are just the generic office number on the invoice, not a specific representative. I can read the ticket number off the label if you need me to verify the substitution details.","asked":"Do you have the delivery ticket number or the supplier's contact details to verify the substitution?"},"follow_up_2":{"answered":"I don't have the delivery ticket or the label in front of me right now, so I can't read the number off the pallet. I need someone to physically check the pallet tag or look up the shipment record in the system to get that number and confirm what was actually delivered versus what was specified on the drawings.","asked":"Can you read the delivery ticket number from the label on the pallet to verify the substitution details?"},"issue_type":"Wrong materials delivered","location":"Warehouse staging area, Bay 4"},"states":["open","in_hand","closed"],"pressed":["open -> Look into it","in_hand -> Mark fixed"],"touches":4,"ask_backs":[{"state":"open","button":"Look into it","question":"Do you have the delivery ticket number or the supplier's contact details to verify the substitution?","answerable":true},{"state":"in_hand","button":"Mark fixed","question":"Can you read the delivery ticket number from the label on the pallet to verify the substitution details?","answerable":false}],"outcome":{"outcome":"finished","detail":"closed"}}
|
||||
-720
@@ -1,720 +0,0 @@
|
||||
{
|
||||
"buckets": {
|
||||
"applicants": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Invite to interview",
|
||||
"to": "interviewing"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Hire",
|
||||
"to": "hired"
|
||||
},
|
||||
{
|
||||
"from": "interviewing",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"interviewing": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"interviewing",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
},
|
||||
"enquiries": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Looked at the building",
|
||||
"to": "surveyed"
|
||||
},
|
||||
{
|
||||
"from": "surveyed",
|
||||
"label": "Quote sent",
|
||||
"to": "quoted"
|
||||
},
|
||||
{
|
||||
"from": "surveyed",
|
||||
"label": "Not worth quoting",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Not for us",
|
||||
"to": "lost"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Won",
|
||||
"to": "won"
|
||||
},
|
||||
{
|
||||
"from": "quoted",
|
||||
"label": "Lost",
|
||||
"to": "lost"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"open": [
|
||||
"surveyed",
|
||||
"lost"
|
||||
],
|
||||
"quoted": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"surveyed": [
|
||||
"quoted",
|
||||
"lost"
|
||||
]
|
||||
}
|
||||
},
|
||||
"site_issues": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "safety_officer",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Look into it",
|
||||
"to": "in_hand"
|
||||
},
|
||||
{
|
||||
"from": "in_hand",
|
||||
"label": "Mark fixed",
|
||||
"to": "closed"
|
||||
}
|
||||
],
|
||||
"page": "/safety"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"in_hand": [
|
||||
"closed"
|
||||
],
|
||||
"open": [
|
||||
"in_hand"
|
||||
]
|
||||
}
|
||||
},
|
||||
"subcontractors": {
|
||||
"desks": [
|
||||
{
|
||||
"group": "project_managers",
|
||||
"moves": [
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Ask for missing papers",
|
||||
"to": "awaiting_papers"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "open",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Approve",
|
||||
"to": "approved"
|
||||
},
|
||||
{
|
||||
"from": "awaiting_papers",
|
||||
"label": "Decline",
|
||||
"to": "declined"
|
||||
}
|
||||
],
|
||||
"page": "/desk"
|
||||
}
|
||||
],
|
||||
"initial": "open",
|
||||
"self_moves": [],
|
||||
"transitions": {
|
||||
"awaiting_papers": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"open": [
|
||||
"awaiting_papers",
|
||||
"approved",
|
||||
"declined"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"needs": [
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "survey-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get someone to look at a building",
|
||||
"expect": [
|
||||
"Get someone to look at a building"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What's wrong",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "someone from Nordvik Bygg to come and look at the building and tell them what a fix would cost",
|
||||
"who": "a housing board member or private owner with a problem in a building"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "build-price-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Get a price for a build",
|
||||
"expect": [
|
||||
"Get a price for a build"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Address of the site",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What you want built",
|
||||
"name": "project",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "When you'd like to start",
|
||||
"name": "timeframe",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"As soon as possible",
|
||||
"Within a year",
|
||||
"Just exploring"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "drawings, a permit application and a price for the work",
|
||||
"who": "an owner who already knows what they want built"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"approved",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "subcontractor-application",
|
||||
"lands_in": "subcontractors",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Join our subcontractor list",
|
||||
"expect": [
|
||||
"Join our subcontractor list"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Company name",
|
||||
"name": "company_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "contact_email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "Trade",
|
||||
"name": "trade",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Electrical",
|
||||
"Plumbing",
|
||||
"Scaffolding"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Company registration number",
|
||||
"name": "registration_number",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Insurance policy details",
|
||||
"name": "insurance",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Trade approval reference",
|
||||
"name": "trade_approval",
|
||||
"optional": true,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"approved"
|
||||
],
|
||||
"wants": "to get on Nordvik Bygg's list of subcontractors they call for work",
|
||||
"who": "a trade firm doing electrical, plumbing or scaffolding work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"hired",
|
||||
"declined"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "project_managers",
|
||||
"id": "job-application",
|
||||
"lands_in": "applicants",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Ask about working with us",
|
||||
"expect": [
|
||||
"Ask about working with us"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Your name",
|
||||
"name": "name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Email",
|
||||
"name": "email",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "email"
|
||||
},
|
||||
{
|
||||
"label": "What you do",
|
||||
"name": "role",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Carpenter",
|
||||
"Apprentice carpenter",
|
||||
"Other"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Anything else we should know",
|
||||
"name": "message",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"hired"
|
||||
],
|
||||
"wants": "to find out if Nordvik Bygg is hiring and put themselves forward",
|
||||
"who": "a carpenter or apprentice looking for work"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"closed"
|
||||
],
|
||||
"enters_as": null,
|
||||
"handled_by": "safety_officer",
|
||||
"id": "report-site-issue",
|
||||
"lands_in": "site_issues",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Report something from site",
|
||||
"expect": [
|
||||
"Report something from site"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "What kind of issue",
|
||||
"name": "issue_type",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"Hazard",
|
||||
"Near miss",
|
||||
"Wrong materials delivered"
|
||||
],
|
||||
"type": "select"
|
||||
},
|
||||
{
|
||||
"label": "Where on site",
|
||||
"name": "location",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What happened",
|
||||
"name": "details",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "For housing boards and private owners with a problem in a building who want us to come and take a look.",
|
||||
"name": "Get someone to look at a building"
|
||||
},
|
||||
{
|
||||
"description": "For owners who already know what they want built and need drawings, a permit application and a price.",
|
||||
"name": "Get a price for a build"
|
||||
},
|
||||
{
|
||||
"description": "For electrical, plumbing and scaffolding firms who want to be one of the firms we call when a job needs them.",
|
||||
"name": "Join our subcontractor list"
|
||||
},
|
||||
{
|
||||
"description": "For carpenters and apprentices who want to know if we're hiring.",
|
||||
"name": "Ask about working with us"
|
||||
},
|
||||
{
|
||||
"description": "For crew on site, ours or a subcontractor's, who've spotted a hazard, a near miss or the wrong materials.",
|
||||
"name": "Report something from site"
|
||||
}
|
||||
],
|
||||
"page": "/",
|
||||
"question": "What brings you here?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"closed"
|
||||
],
|
||||
"wants": "to flag a hazard, a near miss or wrong materials fast, from their phone",
|
||||
"who": "a crew member on site, ours or a subcontractor's"
|
||||
},
|
||||
{
|
||||
"done_when": [
|
||||
"won",
|
||||
"lost"
|
||||
],
|
||||
"enters_as": "project_managers",
|
||||
"handled_by": "project_managers",
|
||||
"id": "log-phone-enquiry",
|
||||
"lands_in": "enquiries",
|
||||
"steps": [
|
||||
{
|
||||
"alternative": "Log this enquiry",
|
||||
"expect": [
|
||||
"Log this enquiry"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"label": "Their name",
|
||||
"name": "caller_name",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Phone or email",
|
||||
"name": "contact",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "Address of the building",
|
||||
"name": "address",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"label": "What they told you",
|
||||
"name": "problem",
|
||||
"optional": false,
|
||||
"options": [],
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"label": "How soon",
|
||||
"name": "urgency",
|
||||
"optional": false,
|
||||
"options": [
|
||||
"This week",
|
||||
"This month",
|
||||
"No rush"
|
||||
],
|
||||
"type": "select"
|
||||
}
|
||||
],
|
||||
"options": [
|
||||
{
|
||||
"description": "",
|
||||
"name": "Log this enquiry"
|
||||
}
|
||||
],
|
||||
"page": "/desk/phone-enquiry",
|
||||
"question": "What did they tell you?"
|
||||
}
|
||||
],
|
||||
"success": [
|
||||
"won"
|
||||
],
|
||||
"wants": "to get the enquiry into the system before it gets lost",
|
||||
"who": "a project manager who just took a call, email or text about a building"
|
||||
}
|
||||
],
|
||||
"personas": [
|
||||
{
|
||||
"id": "housing-board-cracks",
|
||||
"need": "survey-enquiry",
|
||||
"text": "There are cracks running up the outside wall of our building and none of us know if it's serious. We just want someone qualified to come look at it and tell us what we're dealing with."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-leaking-roof",
|
||||
"need": "survey-enquiry",
|
||||
"text": "Water's coming through the ceiling every time it rains. I don't know if it's the roof or something else, I just want someone to come out and have a look before it gets worse."
|
||||
},
|
||||
{
|
||||
"id": "homeowner-extension",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "We want to add a room above the garage. We know roughly what we want, we just need someone to draw it up, sort the paperwork with the municipality, and tell us what it will cost."
|
||||
},
|
||||
{
|
||||
"id": "owner-basement-conversion",
|
||||
"need": "build-price-enquiry",
|
||||
"text": "I'd like to turn the basement into a flat. Need drawings, the permit sorted, and a proper price before I commit to anything."
|
||||
},
|
||||
{
|
||||
"id": "electrician-more-work",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We're a small electrical firm and we'd like to pick up more building work. We're registered and insured, just need to know who to talk to about getting on your books."
|
||||
},
|
||||
{
|
||||
"id": "scaffolding-firm",
|
||||
"need": "subcontractor-application",
|
||||
"text": "We put up and take down scaffolding for building sites. We'd like to be one of the firms you call when a job needs it."
|
||||
},
|
||||
{
|
||||
"id": "apprentice-asking",
|
||||
"need": "job-application",
|
||||
"text": "I'm in my second year as an apprentice carpenter and looking for a firm that'll keep me on after. Are you taking anyone on right now?"
|
||||
},
|
||||
{
|
||||
"id": "experienced-carpenter",
|
||||
"need": "job-application",
|
||||
"text": "I've been doing carpentry for eight years, mostly older buildings. Wondered if you had any openings on site."
|
||||
},
|
||||
{
|
||||
"id": "crew-loose-scaffold",
|
||||
"need": "report-site-issue",
|
||||
"text": "Noticed a scaffold board that's not sitting right, feels loose when you step on it. Wanted to flag it straight away before someone gets hurt, but I've got gloves on and no time for a long form."
|
||||
},
|
||||
{
|
||||
"id": "subcontractor-wrong-delivery",
|
||||
"need": "report-site-issue",
|
||||
"text": "The delivery this morning was the wrong type of insulation, not what was on the drawings. Someone needs to know before it gets used."
|
||||
}
|
||||
]
|
||||
}
|
||||
-465
@@ -1,465 +0,0 @@
|
||||
{
|
||||
"build-price-enquiry": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 28,
|
||||
"ask_backs": 14,
|
||||
"unanswerable": 5,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Can I have your permission to visit the property at 42 Maple Street, Unit 3B, Portland, OR 97201 to take measurements and assess the existing structure?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Is the owner available for a site visit to take measurements and assess the existing structure?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has the owner signed the contract and submitted the deposit?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "Is this project still a possibility, or have you already decided not to proceed?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "What is the current condition of the existing garage structure and the site (soil, grade, access) that would need to be surveyed?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Can you provide the current condition of the existing garage structure and the site (soil, grade, access) that would need to be surveyed?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has the surveyor or structural engineer been hired and completed the documentation of the existing conditions, soil, and grade?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Can we proceed with a site visit, or is the basement currently occupied/locked?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Has the site been visited to assess the current condition and verify the lock status?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Has a site visit been conducted to verify the lock status and current condition of the basement?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "Has your project moved forward, or would you still like to explore options?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Do you have a valid title deed or proof of ownership for the property at 42 Maple Crescent, RG24 9JX?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"open -> Looked at the building": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"open -> Not for us": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"quoted -> Won": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"surveyed -> Quote sent": [
|
||||
4,
|
||||
4
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"job-application": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 18,
|
||||
"ask_backs": 8,
|
||||
"unanswerable": 2,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Invite to interview",
|
||||
"question": "What is your phone number?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Which specific carpentry role are you applying for (e.g., apprentice, journeyman, project lead)?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Decline",
|
||||
"question": "What is your email address?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Invite to interview",
|
||||
"question": "What is your email address?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Do you want to proceed with hiring this applicant?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Invite to interview",
|
||||
"question": "What is your phone number?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Can you come in for an interview on [Date]?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "interviewing",
|
||||
"button": "Hire",
|
||||
"question": "Do you have the legal right to work in the country where Nordvik Bygg operates?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"interviewing -> Hire": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"open -> Decline": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"open -> Invite to interview": [
|
||||
4,
|
||||
3
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"report-site-issue": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 23,
|
||||
"ask_backs": 11,
|
||||
"unanswerable": 4,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "What is your full name and role (e.g., employee or subcontractor) so I can assign the follow-up correctly?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Which person marked this as fixed: the crew member who flagged it, or the subcontractor's worker?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "Has a visual inspection of the scaffold board near main entrance been completed?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Has a visual inspection of the scaffold board near main entrance been completed?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "Can you confirm the exact location of the scaffold board issue? For example, which specific scaffold bay or level, and the current status of the area (e.g., is the scaffold still in use or has it been cordoned off)?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Has the scaffold board been secured or removed, and has the area been cordoned off to prevent further use?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "What is the quantity of wrong materials delivered?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "How has the wrong material been handled since delivery? (e.g., moved to quarantine, used in work, left in the storage area)",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Has the wrong insulation been removed or replaced with the correct type?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Look into it",
|
||||
"question": "Do you have the delivery ticket number or the supplier's contact details to verify the substitution?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "in_hand",
|
||||
"button": "Mark fixed",
|
||||
"question": "Can you read the delivery ticket number from the label on the pallet to verify the substitution details?",
|
||||
"answerable": false
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"in_hand -> Mark fixed": [
|
||||
6,
|
||||
6
|
||||
],
|
||||
"open -> Look into it": [
|
||||
6,
|
||||
5
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"subcontractor-application": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 12,
|
||||
"ask_backs": 6,
|
||||
"unanswerable": 4,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "What is your company registration number?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Decline",
|
||||
"question": "What is your company registration number and insurance provider details?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "Has the company submitted the required insurance certificates and signed the standard subcontractor agreement?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "Do you have a valid and current CISRS card for the operatives assigned to Nordvik Bygg projects?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Decline",
|
||||
"question": "What is the company's registration number?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Approve",
|
||||
"question": "Do you have a valid and current scaffolding-specific certification (e.g., PASMA, CISRS) or relevant trade accreditation for the work you perform?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"open -> Approve": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"open -> Decline": [
|
||||
2,
|
||||
2
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
},
|
||||
"survey-enquiry": {
|
||||
"cases": 6,
|
||||
"finished": 6,
|
||||
"stuck": 0,
|
||||
"misrouted": 0,
|
||||
"abandoned": 0,
|
||||
"touches": 28,
|
||||
"ask_backs": 14,
|
||||
"unanswerable": 4,
|
||||
"asked": [
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Do you have access to the building right now, or can you arrange for someone to let me in?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Are you or the building manager available to grant access to the property for a site visit?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Can you coordinate a specific time for a site visit that works for the building manager or property manager?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "What is the exact address of the building?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Is the building currently occupied or vacant?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Can you provide a convenient time for a site visit?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Do you have a convenient time for a site visit?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Do you have access to the building right now, or would you need to schedule an appointment?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Could you grant access to the building or schedule an appointment for us to inspect the leak?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Can you grant access to the building for an inspection during a morning appointment?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Not for us",
|
||||
"question": "What is the address of the building?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "open",
|
||||
"button": "Looked at the building",
|
||||
"question": "Could you confirm the exact address of the building, including the street number and apartment/unit number?",
|
||||
"answerable": true
|
||||
},
|
||||
{
|
||||
"state": "surveyed",
|
||||
"button": "Quote sent",
|
||||
"question": "Can you confirm the exact address of the building, including the street number and apartment/unit number?",
|
||||
"answerable": false
|
||||
},
|
||||
{
|
||||
"state": "quoted",
|
||||
"button": "Won",
|
||||
"question": "Can you provide the exact street number and apartment/unit number for the address?",
|
||||
"answerable": true
|
||||
}
|
||||
],
|
||||
"buttons": {
|
||||
"open -> Looked at the building": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"open -> Not for us": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"quoted -> Won": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"surveyed -> Quote sent": [
|
||||
4,
|
||||
4
|
||||
]
|
||||
},
|
||||
"stuck_at": [],
|
||||
"misroutes": [],
|
||||
"abandon_reasons": []
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user