Skip to content

Commit 603415e

Browse files
uppertoeclaude
andcommitted
copy: rego throughout the guests page, visitor page, tour, guides and emails
The second pass of the settled vocabulary. Every user-facing "car", "vehicle" or bare "plate" that means the rego on the permit now says rego: the guests page and its confirms, the visitor's own page, the schedule's remaining tooltips and errors, the Regos, Settings, Activity and onboarding pages, the landing page, the features tour, the FAQ and guides, and the failure, drift, expiry, re-link and driver emails. "Number plate" stays wherever it already appeared, and "car" stays where it means the physical vehicle: the car parked at the kerb, the car that is fined, the metal plate a rego is checked against, the paper permit that moved between cars. The overnight option no longer says every activation ends at the end of the day, which was wrong: when a window ends the roster takes over, and with nothing scheduled the rego stays on the permit until the next change. The guests intro says the rego a visitor puts on is their own, chosen from the household's saved list. Page and email goldens regenerated; the diff is the intended lines. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0121j6qgGwUSLGQ48jWZN98F
1 parent 492419a commit 603415e

137 files changed

Lines changed: 474 additions & 474 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

internal/notify/compose.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ func composeApply(o ApplyOutcome, portalURL string) (subject, body, priority, ta
185185
}
186186
if o.DisplacedReg != "" {
187187
if o.DisplacedTold {
188-
body += fmt.Sprintf("\n\nThis replaced %s, which an active booking had put on — we've emailed the person responsible for that car a heads-up.", o.DisplacedReg)
188+
body += fmt.Sprintf("\n\nThis replaced %s, which an active booking had put on. We have emailed the person whose rego that is.", o.DisplacedReg)
189189
} else {
190190
body += fmt.Sprintf("\n\nThis replaced %s, which an active booking had put on. We had no way to reach whoever drives it — if %s is still parked there, please let them know it's no longer covered.", o.DisplacedReg, o.DisplacedReg)
191191
}
@@ -212,9 +212,9 @@ func composeApply(o ApplyOutcome, portalURL string) (subject, body, priority, ta
212212
}
213213
lines := []string{fmt.Sprintf("p.stonn tried to set your %s to %s but couldn't.", o.PermitLabel, car)}
214214
if o.CurrentReg != "" {
215-
lines = append(lines, fmt.Sprintf("The permit still shows %s, so that is the vehicle currently covered.", o.CurrentReg))
215+
lines = append(lines, fmt.Sprintf("The permit still shows %s, so that is the rego currently covered.", o.CurrentReg))
216216
} else {
217-
lines = append(lines, "The vehicle on the permit has not been changed.")
217+
lines = append(lines, "The rego on the permit has not been changed.")
218218
}
219219
if o.Reason != "" {
220220
lines = append(lines, "", o.Reason)
@@ -227,7 +227,7 @@ func composeApply(o ApplyOutcome, portalURL string) (subject, body, priority, ta
227227
// pointing them at it would be impossible advice — the honest Action already
228228
// stands on its own.
229229
if !o.CouncilDown {
230-
lines = append(lines, "", "You can set the vehicle on your permit yourself at the council:", portalURL)
230+
lines = append(lines, "", "You can set the rego on your permit yourself at the council:", portalURL)
231231
}
232232
body = strings.Join(lines, "\n")
233233
}
@@ -252,7 +252,7 @@ func onboardNudgeMessage(to, appURL string, c mailTenant) (subject, body string)
252252
// button's label in the HTML alternative (see mailer/html.go). Folding the
253253
// label into the preceding sentence puts the whole sentence on the button.
254254
lines := []string{
255-
"You signed up for p.stonn, but it isn't connected to your council account yet — so nothing is running. The weekly plate schedule, guest QR codes and one-off bookings all start from that one connection.",
255+
"You signed up for p.stonn, but it isn't connected to your council account yet — so nothing is running. The weekly roster, guest QR codes and one-off bookings all start from that one connection.",
256256
"",
257257
say(c, "mail.nudge_connect", nil),
258258
"",
@@ -277,7 +277,7 @@ func onboardNudgeMessage(to, appURL string, c mailTenant) (subject, body string)
277277
"")
278278
}
279279
lines = append(lines,
280-
"One thing to know: p.stonn manages VISITOR permits only — the permit your guests' cars go on — and only one you already hold; it can't apply for one, and it never touches a resident permit.",
280+
"One thing to know: p.stonn manages VISITOR permits only — the permit your visitors' regos go on — and only one you already hold; it can't apply for one, and it never touches a resident permit.",
281281
"",
282282
say(c, "mail.nudge_apply", nil),
283283
"Register with the council:",

internal/notify/dispatch.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func (s *Service) NotifyRelinkRequired(ctx context.Context, owner, tenantID stri
2020
subject := "Action needed: reconnect your p.stonn council account"
2121
body := "Your council connection has expired, so p.stonn has stopped updating your visitor permit.\n\n" +
2222
"Please open the app and re-link your council account so your schedule keeps running. " +
23-
"Until you do, set your permit's vehicle directly with the council to avoid a fine."
23+
"Until you do, set the rego on your permit directly with the council to avoid a fine."
2424
if s.appURL != "" {
2525
body += "\n\nRe-link: " + s.appURL
2626
}
@@ -39,8 +39,8 @@ func (s *Service) NotifyReconnectStalled(ctx context.Context, owner, tenantID st
3939
subject := "p.stonn can't reach the council — your permit schedule is paused"
4040
body := "p.stonn's sign-in to the council expired, and it has not been able to sign back in for over an hour. " +
4141
"Until it can, your visitor permit schedule is NOT being applied.\n\n" +
42-
"That means any change your schedule should make will not happen: if a different car needs to be on the permit, " +
43-
"change the vehicle yourself on the council website now, or that car is not covered and can be fined.\n\n" +
42+
"That means any change your schedule should make will not happen: if a different rego needs to be on the permit, " +
43+
"change it yourself on the council website now, or that car is not covered and can be fined.\n\n" +
4444
"p.stonn keeps retrying automatically and your schedule resumes on its own once the council accepts the sign-in again. " +
4545
"If this persists, it will email you again if re-linking becomes necessary."
4646
body += "\n\nCouncil portal: " + s.tenantOf(ctx, owner, tenantID).Links.Portal
@@ -90,7 +90,7 @@ func (s *Service) NotifyPermitExpiry(ctx context.Context, owner, tenantID, permi
9090
date := expiry.Format("2 Jan 2006")
9191
subject := fmt.Sprintf("Your %s expires on %s", permitLabel, date)
9292
body := fmt.Sprintf("Your %s is due to expire on %s.\n\n", permitLabel, date) +
93-
"p.stonn keeps setting the vehicle, but it can't renew the permit itself — renew it with the council so it stays valid. " +
93+
"p.stonn keeps setting the rego, but it cannot renew the permit itself — renew it with the council so it stays valid. " +
9494
"Once you renew, you can copy your schedule onto the new permit in the app."
9595
if s.appURL != "" {
9696
body += "\n\nOpen p.stonn: " + s.appURL
@@ -559,7 +559,7 @@ func (s *Service) SendGuestLink(ctx context.Context, to, ownerEmail, tenantID, p
559559
if !s.mail.Enabled() {
560560
return nil
561561
}
562-
subject := "Your link to set a car on " + ownerEmail + "'s parking permit"
562+
subject := "Your link to put a rego on " + ownerEmail + "'s parking permit"
563563
lines := []string{
564564
// The label is free text the owner typed, and this recipient is whoever the
565565
// owner named — so it goes in stripped of anything the mail layer would turn
@@ -568,7 +568,7 @@ func (s *Service) SendGuestLink(ctx context.Context, to, ownerEmail, tenantID, p
568568
// household with more than one.
569569
say(s.tenantOf(ctx, ownerEmail, tenantID), "mail.guest_lead", map[string]any{"Owner": ownerEmail, "Label": neutraliseLinks(permitLabel)}),
570570
"",
571-
"When you arrive, open the link and choose your car. It stays on the permit until the end of the day.",
571+
"When you arrive, open the link and choose your rego. It stays on the permit until the end of the day.",
572572
"",
573573
url,
574574
"",
@@ -595,7 +595,7 @@ func (s *Service) NotifyDriverDisplaced(ctx context.Context, owner, to, permitLa
595595
subject := fmt.Sprintf("Heads up: %s is no longer covered on the visitor permit", oldReg)
596596
when := at.In(s.loc).Format("3:04pm")
597597
lines := []string{
598-
fmt.Sprintf("Your car %s came off the visitor parking permit for %s at %s %s.", oldReg, permitLabel, when, how),
598+
fmt.Sprintf("Your rego %s came off the visitor parking permit for %s at %s: %s.", oldReg, permitLabel, when, how),
599599
"",
600600
"If your car is still parked there it's no longer covered. Move it, or put it back on with your link, or check with the permit holder.",
601601
}
@@ -625,7 +625,7 @@ func (s *Service) NotifyDriverAdded(ctx context.Context, owner, tenantID, to, pl
625625
// blank lines; a "---" block becomes a section separator in the HTML render.
626626
subject := fmt.Sprintf("%s is on a %s visitor parking permit", plate, c.Short)
627627
lines := []string{
628-
fmt.Sprintf("Your car is now on a %s visitor parking permit, so you're covered to park where the permit applies.", c.Name),
628+
fmt.Sprintf("Your rego is now on a %s visitor parking permit, so you are covered to park where the permit applies.", c.Name),
629629
"",
630630
"---",
631631
"",
@@ -665,7 +665,7 @@ func (s *Service) NotifyDriverFailed(ctx context.Context, owner, tenantID, to, p
665665
}
666666
subject := fmt.Sprintf("%s couldn't be put on a %s visitor parking permit", plate, c.Short)
667667
lines := []string{
668-
fmt.Sprintf("Your car %s couldn't be put on the %s visitor parking permit %s. It may not be covered right now; p.stonn keeps trying and will put it on as soon as it can.", plate, c.Name, cause),
668+
fmt.Sprintf("Your rego %s could not be put on the %s visitor parking permit: %s. It may not be covered right now; p.stonn keeps trying and will put it on as soon as it can.", plate, c.Name, cause),
669669
"",
670670
"---",
671671
"",
@@ -691,11 +691,11 @@ func (s *Service) NotifyDriftChanged(ctx context.Context, owner, tenantID, permi
691691
c := s.tenantOf(ctx, owner, tenantID)
692692
var subject, body string
693693
if plate == "" {
694-
subject = fmt.Sprintf("The car was removed from your %s at the council", permitLabel)
695-
body = fmt.Sprintf("The car on your %s was removed at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.", permitLabel)
694+
subject = fmt.Sprintf("The rego was removed from your %s at the council", permitLabel)
695+
body = fmt.Sprintf("The rego on your %s was removed at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.", permitLabel)
696696
} else {
697697
subject = fmt.Sprintf("Your %s was changed to %s at the council", permitLabel, plate)
698-
body = fmt.Sprintf("The car on your %s was changed to %s at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.", permitLabel, plate)
698+
body = fmt.Sprintf("The rego on your %s was changed to %s at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.", permitLabel, plate)
699699
}
700700
if s.appURL != "" {
701701
body += "\n\n" + s.appURL

internal/notify/failure_cap_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ func TestDriverFailedNoticeCopy(t *testing.T) {
253253
t.Fatalf("queued = %d, want 2", len(rows))
254254
}
255255
bodies := rows[0].Body + "\n" + rows[1].Body
256-
for _, want := range []string{"Your car AAA111 couldn't be put on the", "the council's system is down right now", "Your car BBB222 couldn't be put on the", "p.stonn couldn't update the permit", "It may not be covered right now"} {
256+
for _, want := range []string{"Your rego AAA111 could not be put on the", "the council's system is down right now", "Your rego BBB222 could not be put on the", "p.stonn couldn't update the permit", "It may not be covered right now"} {
257257
if !strings.Contains(bodies, want) {
258258
t.Fatalf("driver notice missing %q in:\n%s", want, bodies)
259259
}

internal/notify/notify.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const (
2525
reasonAccount = "this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit"
2626
reasonGuest = "someone shared their visitor parking permit with you by email"
2727
reasonInvite = "someone gave this address shared access to their p.stonn account"
28-
reasonDisplace = "this address is the contact for a car that was on a visitor permit"
29-
reasonDriverOn = "this address is the contact for a car put on a visitor parking permit"
28+
reasonDisplace = "this address is the contact for a rego that was on a visitor permit"
29+
reasonDriverOn = "this address is the contact for a rego put on a visitor parking permit"
3030
reasonTest = "you asked p.stonn to send a test notification"
3131
reasonOnboard = "you signed up for p.stonn with it but haven't connected a council account yet"
3232
reasonReferral = "someone who uses p.stonn asked us to tell you about it"

internal/notify/testdata/golden/apply-failure-transient.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ Subject: Still updating your Visitor — it shows XYZ789 for now
33
Provenance: You received this at primary@example.com because this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit. p.stonn is a free, unofficial scheduler for City of Stonnington visitor parking permits.
44

55
p.stonn tried to set your Visitor to Van — ABC123 but couldn't.
6-
The permit still shows XYZ789, so that is the vehicle currently covered.
6+
The permit still shows XYZ789, so that is the rego currently covered.
77

88
The council was temporarily unavailable.
99
Nothing to do yet — p.stonn keeps trying.
1010

11-
You can set the vehicle on your permit yourself at the council:
11+
You can set the rego on your permit yourself at the council:
1212
https://parkingpermits.stonnington.vic.gov.au/ssp/
1313

1414
https://p.stonn.org
@@ -19,25 +19,25 @@ Priority: default
1919
Tags: warning
2020

2121
p.stonn tried to set your Visitor to Van — ABC123 but couldn't.
22-
The permit still shows XYZ789, so that is the vehicle currently covered.
22+
The permit still shows XYZ789, so that is the rego currently covered.
2323

2424
The council was temporarily unavailable.
2525
Nothing to do yet — p.stonn keeps trying.
2626

27-
You can set the vehicle on your permit yourself at the council:
27+
You can set the rego on your permit yourself at the council:
2828
https://parkingpermits.stonnington.vic.gov.au/ssp/
2929

3030
=== EMAIL to sam@example.com
3131
Subject: Still updating your Visitor — it shows XYZ789 for now
3232
Provenance: You received this at sam@example.com because this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit. p.stonn is a free, unofficial scheduler for City of Stonnington visitor parking permits.
3333

3434
p.stonn tried to set your Visitor to Van — ABC123 but couldn't.
35-
The permit still shows XYZ789, so that is the vehicle currently covered.
35+
The permit still shows XYZ789, so that is the rego currently covered.
3636

3737
The council was temporarily unavailable.
3838
Nothing to do yet — p.stonn keeps trying.
3939

40-
You can set the vehicle on your permit yourself at the council:
40+
You can set the rego on your permit yourself at the council:
4141
https://parkingpermits.stonnington.vic.gov.au/ssp/
4242

4343
https://p.stonn.org

internal/notify/testdata/golden/apply-failure-urgent.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ Subject: Action needed: your Visitor still shows XYZ789
33
Provenance: You received this at primary@example.com because this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit. p.stonn is a free, unofficial scheduler for City of Stonnington visitor parking permits.
44

55
p.stonn tried to set your Visitor to Van — ABC123 but couldn't.
6-
The permit still shows XYZ789, so that is the vehicle currently covered.
6+
The permit still shows XYZ789, so that is the rego currently covered.
77

88
The council rejected the change.
99
Check the permit on the council's site.
1010

11-
You can set the vehicle on your permit yourself at the council:
11+
You can set the rego on your permit yourself at the council:
1212
https://parkingpermits.stonnington.vic.gov.au/ssp/
1313

1414
https://p.stonn.org
@@ -19,25 +19,25 @@ Priority: high
1919
Tags: warning
2020

2121
p.stonn tried to set your Visitor to Van — ABC123 but couldn't.
22-
The permit still shows XYZ789, so that is the vehicle currently covered.
22+
The permit still shows XYZ789, so that is the rego currently covered.
2323

2424
The council rejected the change.
2525
Check the permit on the council's site.
2626

27-
You can set the vehicle on your permit yourself at the council:
27+
You can set the rego on your permit yourself at the council:
2828
https://parkingpermits.stonnington.vic.gov.au/ssp/
2929

3030
=== EMAIL to sam@example.com
3131
Subject: Action needed: your Visitor still shows XYZ789
3232
Provenance: You received this at sam@example.com because this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit. p.stonn is a free, unofficial scheduler for City of Stonnington visitor parking permits.
3333

3434
p.stonn tried to set your Visitor to Van — ABC123 but couldn't.
35-
The permit still shows XYZ789, so that is the vehicle currently covered.
35+
The permit still shows XYZ789, so that is the rego currently covered.
3636

3737
The council rejected the change.
3838
Check the permit on the council's site.
3939

40-
You can set the vehicle on your permit yourself at the council:
40+
You can set the rego on your permit yourself at the council:
4141
https://parkingpermits.stonnington.vic.gov.au/ssp/
4242

4343
https://p.stonn.org

internal/notify/testdata/golden/apply-success-guest-displaced.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Your Visitor is now set to GUEST1.
66

77
dad@example.com activated it with a guest link, so it overrides your schedule until that booking ends — then your roster takes over again.
88

9-
This replaced ABC123, which an active booking had put on — we've emailed the person responsible for that car a heads-up.
9+
This replaced ABC123, which an active booking had put on. We have emailed the person whose rego that is.
1010

1111
https://p.stonn.org
1212

@@ -19,7 +19,7 @@ Your Visitor is now set to GUEST1.
1919

2020
dad@example.com activated it with a guest link, so it overrides your schedule until that booking ends — then your roster takes over again.
2121

22-
This replaced ABC123, which an active booking had put on — we've emailed the person responsible for that car a heads-up.
22+
This replaced ABC123, which an active booking had put on. We have emailed the person whose rego that is.
2323

2424
=== EMAIL to sam@example.com
2525
Subject: Permit updated: Visitor now shows GUEST1
@@ -29,7 +29,7 @@ Your Visitor is now set to GUEST1.
2929

3030
dad@example.com activated it with a guest link, so it overrides your schedule until that booking ends — then your roster takes over again.
3131

32-
This replaced ABC123, which an active booking had put on — we've emailed the person responsible for that car a heads-up.
32+
This replaced ABC123, which an active booking had put on. We have emailed the person whose rego that is.
3333

3434
https://p.stonn.org
3535

internal/notify/testdata/golden/drift-changed.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22
Dedup: drift|primary@example.com|primary@example.com|Visitor|AMY602|email|primary@example.com
33
Subject: Your Visitor was changed to AMY602 at the council
44

5-
The car on your Visitor was changed to AMY602 at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.
5+
The rego on your Visitor was changed to AMY602 at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.
66

77
https://p.stonn.org
88

99
=== OUTBOX account= recipients= ntfy=pstonn-primary// reason=this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit
1010
Dedup: drift|primary@example.com|primary@example.com|Visitor|AMY602|ntfy
1111
Subject: Your Visitor was changed to AMY602 at the council
1212

13-
The car on your Visitor was changed to AMY602 at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.
13+
The rego on your Visitor was changed to AMY602 at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.
1414

1515
https://p.stonn.org
1616

1717
=== OUTBOX account= recipients=sam@example.com ntfy=// reason=this address manages, or shares access to, a p.stonn account that schedules a visitor parking permit
1818
Dedup: drift|sam@example.com|primary@example.com|Visitor|AMY602|email|sam@example.com
1919
Subject: Your Visitor was changed to AMY602 at the council
2020

21-
The car on your Visitor was changed to AMY602 at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.
21+
The rego on your Visitor was changed to AMY602 at the council directly — p.stonn didn't make this change. If that wasn't you or someone in your household, you may want to check it.
2222

2323
https://p.stonn.org
2424

0 commit comments

Comments
 (0)