One commit: f8027fc — in-place host duration editing. This is the final implementation checkpoint of the agreed host-privileges plan, following #87's creation/reschedule duration choices.
Hosts can choose Change duration on an existing appointment, shorten or extend it using the existing host choices, and keep its start time and identity unchanged. No replacement appointment or token is created.
Agreed behavior
Only actual occupied-time overlaps reject the resulting interval. Working hours, buffers and daily caps are ignored for this operation; it is not validated as a new offered start slot.
Valid duration choices and active pending/confirmed lifecycle checks remain. In-progress appointments may change while their current end is future; the new end must remain future. Ended/terminal appointments cannot be revived.
Start, ID, status, origin, guest token, video choices/resources and unrelated fields remain unchanged.
End time, calendar revision, ICS sequence and duration history update together. Existing edited-by-host reconciliation updates calendar/invites and mail using the actual saved times. Existing recipient policy stays confirmed guest+host, pending host-only.
An unchanged duration performs no write, log or enqueue. Repeating an absolute total does not double-extend; it also does not promise to recover an earlier unconfirmed update submission.
Focused execution and data ownership
A dedicated duration operation uses the existing immediate transaction, current-row read, duration profile, action-log and reconciliation primitives. It owns read/check/no-op/derive-end/conflict/write/commit/enqueue in one flow rather than adding duration modes to the standing-video/general-details editor.
The actual-conflict helper uses the supplied transaction connection, active local intervals across all types, self-exclusion by ID and the configured calendar mirrors. Older long intervals are not missed by a start-window cutoff; touching is allowed. There are no provider calls or guest-policy constraint registries.
The dialog owns only its draft and request receipt. Rejections remain editable; known-saved and transport-uncertain outcomes cannot be mistaken for rollback or blindly resubmitted. No automatic refresh can erase a saved receipt: acknowledgement precedes native reload. Current configuration and a shared end-time gate suppress duration controls on unavailable/ended appointments.
A narrow reschedule integration guard rechecks duration membership against the fresh transactional row. Otherwise a host edit could revoke an old guest booked-length exception after route validation but before the stale reschedule writes. This adds no version field or broad availability-locking redesign.
Reviews and validation
Owner manual testing looked good. Independent code and readability reviews are clear after correcting the receipt-refresh, ended-pending visibility and stale-duration race findings.
Shared declarations built before consumer checks; workspace typechecks, lint, coverage and builds passed.
2,091 workspace tests passed: config 135, DB 107, calendar 174, jobs 24, video 78, CLI 48, web 966, worker 559. Worker coverage was rerun separately after a whole-command timeout; its complete suite passed. No timed-out run is counted as success.
54 browser tests passed, fresh isolated production fixture after builds, CI=1, retries=0, workers=4; six new editor cases also passed independently.
Real SQLite proofs cover identity/field preservation, lifecycle/no-op, conflicts across types/long spans/mirrors, ignored soft limits, transaction ownership and durable writes when enqueue fails. Five integration cases cover the stale guest exception and permitted controls.
Browser proofs cover actual extension outside working hours beside a touching neighbor, guest/private-action denial, inline overlap errors and shortening, in-progress/past-end rules, ended-pending visibility, honest transport uncertainty, acknowledgement-before-reload and retained saved receipts. The simulated saved-warning browser receipt is explicitly distinguished from the real enqueue-failure unit proof.
Desktop/light and 320px mobile/dark screenshots inspected. Web check: zero errors/warnings; whitespace and new/touched async-readability checks clean.
One fixed-app-group patch changeset included.
Scope and limits
No schema, dependency, native workflow graph, provider, general edit, guest wizard or operating-documentation changes. Existing bugs #85 and #86 remain separate; the new scoped editor handles its own action results without redesigning those flows.
This operation's conflict check/write is one immediate local transaction. It does not introduce a global no-overlap guarantee across other writers' existing prechecks, or a live/fresh external-calendar guarantee. Mirror data remains last-known. Saved-but-unconfirmed background submission remains visibly unresolved without an outbox/custom retry system.
Existing CLI esbuild ES2025 warnings are unchanged and nonblocking. No live application/queue data or config, provider/SMTP calls, services/Docker restarts, releases or deployments were used. Not merged; ready for owner review and CI on this commit.
## Summary
One commit: **f8027fc — in-place host duration editing**. This is the final implementation checkpoint of the agreed host-privileges plan, following #87's creation/reschedule duration choices.
Hosts can choose **Change duration** on an existing appointment, shorten or extend it using the existing host choices, and keep its start time and identity unchanged. No replacement appointment or token is created.
## Agreed behavior
- Only **actual occupied-time overlaps** reject the resulting interval. **Working hours, buffers and daily caps are ignored** for this operation; it is not validated as a new offered start slot.
- Valid duration choices and active pending/confirmed lifecycle checks remain. In-progress appointments may change while their current end is future; the new end must remain future. Ended/terminal appointments cannot be revived.
- Start, ID, status, origin, guest token, video choices/resources and unrelated fields remain unchanged.
- End time, calendar revision, ICS sequence and duration history update together. Existing edited-by-host reconciliation updates calendar/invites and mail using the actual saved times. Existing recipient policy stays confirmed guest+host, pending host-only.
- An unchanged duration performs no write, log or enqueue. Repeating an absolute total does not double-extend; it also does **not** promise to recover an earlier unconfirmed update submission.
## Focused execution and data ownership
A dedicated duration operation uses the existing immediate transaction, current-row read, duration profile, action-log and reconciliation primitives. It owns read/check/no-op/derive-end/conflict/write/commit/enqueue in one flow rather than adding duration modes to the standing-video/general-details editor.
The actual-conflict helper uses the supplied transaction connection, active local intervals across all types, self-exclusion by ID and the configured calendar mirrors. Older long intervals are not missed by a start-window cutoff; touching is allowed. There are no provider calls or guest-policy constraint registries.
The dialog owns only its draft and request receipt. Rejections remain editable; known-saved and transport-uncertain outcomes cannot be mistaken for rollback or blindly resubmitted. **No automatic refresh can erase a saved receipt:** acknowledgement precedes native reload. Current configuration and a shared end-time gate suppress duration controls on unavailable/ended appointments.
A narrow reschedule integration guard rechecks duration membership against the fresh transactional row. Otherwise a host edit could revoke an old guest booked-length exception after route validation but before the stale reschedule writes. This adds no version field or broad availability-locking redesign.
## Reviews and validation
Owner manual testing looked good. Independent code and readability reviews are clear after correcting the receipt-refresh, ended-pending visibility and stale-duration race findings.
- Shared declarations built before consumer checks; workspace typechecks, lint, coverage and builds passed.
- **2,091 workspace tests passed:** config 135, DB 107, calendar 174, jobs 24, video 78, CLI 48, web 966, worker 559. Worker coverage was rerun separately after a whole-command timeout; its complete suite passed. No timed-out run is counted as success.
- **54 browser tests passed**, fresh isolated production fixture after builds, CI=1, retries=0, workers=4; six new editor cases also passed independently.
- Real SQLite proofs cover identity/field preservation, lifecycle/no-op, conflicts across types/long spans/mirrors, ignored soft limits, transaction ownership and durable writes when enqueue fails. Five integration cases cover the stale guest exception and permitted controls.
- Browser proofs cover actual extension outside working hours beside a touching neighbor, guest/private-action denial, inline overlap errors and shortening, in-progress/past-end rules, ended-pending visibility, honest transport uncertainty, acknowledgement-before-reload and retained saved receipts. The simulated saved-warning browser receipt is explicitly distinguished from the real enqueue-failure unit proof.
- Desktop/light and 320px mobile/dark screenshots inspected. Web check: zero errors/warnings; whitespace and new/touched async-readability checks clean.
- One fixed-app-group patch changeset included.
## Scope and limits
No schema, dependency, native workflow graph, provider, general edit, guest wizard or operating-documentation changes. Existing bugs #85 and #86 remain separate; the new scoped editor handles its own action results without redesigning those flows.
This operation's conflict check/write is one immediate local transaction. It does not introduce a global no-overlap guarantee across other writers' existing prechecks, or a live/fresh external-calendar guarantee. Mirror data remains last-known. Saved-but-unconfirmed background submission remains visibly unresolved without an outbox/custom retry system.
Existing CLI esbuild ES2025 warnings are unchanged and nonblocking. No live application/queue data or config, provider/SMTP calls, services/Docker restarts, releases or deployments were used. Not merged; ready for owner review and CI on this commit.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
One commit:
f8027fc— in-place host duration editing. This is the final implementation checkpoint of the agreed host-privileges plan, following #87's creation/reschedule duration choices.Hosts can choose Change duration on an existing appointment, shorten or extend it using the existing host choices, and keep its start time and identity unchanged. No replacement appointment or token is created.
Agreed behavior
Focused execution and data ownership
A dedicated duration operation uses the existing immediate transaction, current-row read, duration profile, action-log and reconciliation primitives. It owns read/check/no-op/derive-end/conflict/write/commit/enqueue in one flow rather than adding duration modes to the standing-video/general-details editor.
The actual-conflict helper uses the supplied transaction connection, active local intervals across all types, self-exclusion by ID and the configured calendar mirrors. Older long intervals are not missed by a start-window cutoff; touching is allowed. There are no provider calls or guest-policy constraint registries.
The dialog owns only its draft and request receipt. Rejections remain editable; known-saved and transport-uncertain outcomes cannot be mistaken for rollback or blindly resubmitted. No automatic refresh can erase a saved receipt: acknowledgement precedes native reload. Current configuration and a shared end-time gate suppress duration controls on unavailable/ended appointments.
A narrow reschedule integration guard rechecks duration membership against the fresh transactional row. Otherwise a host edit could revoke an old guest booked-length exception after route validation but before the stale reschedule writes. This adds no version field or broad availability-locking redesign.
Reviews and validation
Owner manual testing looked good. Independent code and readability reviews are clear after correcting the receipt-refresh, ended-pending visibility and stale-duration race findings.
Scope and limits
No schema, dependency, native workflow graph, provider, general edit, guest wizard or operating-documentation changes. Existing bugs #85 and #86 remain separate; the new scoped editor handles its own action results without redesigning those flows.
This operation's conflict check/write is one immediate local transaction. It does not introduce a global no-overlap guarantee across other writers' existing prechecks, or a live/fresh external-calendar guarantee. Mirror data remains last-known. Saved-but-unconfirmed background submission remains visibly unresolved without an outbox/custom retry system.
Existing CLI esbuild ES2025 warnings are unchanged and nonblocking. No live application/queue data or config, provider/SMTP calls, services/Docker restarts, releases or deployments were used. Not merged; ready for owner review and CI on this commit.