verify(container): execute container deployment scenarios and enforce migration refusal #90

Merged
yuris merged 6 commits from feat/issue-86-container into main 2026-09-23 10:54:20 +00:00
Owner

Closes #86

Result

Hardened container and service-directory startup behavior at commit 83d92b5.

  • Startup refuses unsupported database schema before binding the listener.
  • The service-directory lock retains fs2 advisory compatibility and an atomic owner marker across bind-mounted storage.
  • IPv6 listen addresses preserve bracketed host syntax.
  • Calendar parsing skips known unrelated components and refuses unknown or unsupported component data instead of reporting an empty readable inventory.
  • The runtime image runs as UID 10001:10001 with the configured serve entrypoint.

Build evidence

Image: life:issue86-review
Digest: life@sha256:08a6bb53e819dff7f89bd3b3809d3ab6ff6ecb5510f8ba049a45e42af4327643
Size: 8153368 bytes
User: 10001:10001

Runtime evidence

  • Authenticated live endpoint returned HTTP 200.
  • Two containers using the exact same data bind mount were started from the same image. The second exited 1 before binding and logged the owner-marker and advisory-lock refusal, with no address-in-use failure.
  • Graceful stop removed life.lock.owner while retaining life.lock.

Focused verification

  • cargo check
  • history lock compatibility tests
  • service directory lock tests
  • CalDAV report tests: 13 passed
  • cargo fmt -- --check

Subagent review comments:

The complete project-wide validation suite is run by the coordinator after integration.

Closes #86 ## Result Hardened container and service-directory startup behavior at commit 83d92b5. - Startup refuses unsupported database schema before binding the listener. - The service-directory lock retains fs2 advisory compatibility and an atomic owner marker across bind-mounted storage. - IPv6 listen addresses preserve bracketed host syntax. - Calendar parsing skips known unrelated components and refuses unknown or unsupported component data instead of reporting an empty readable inventory. - The runtime image runs as UID 10001:10001 with the configured serve entrypoint. ## Build evidence Image: life:issue86-review Digest: life@sha256:08a6bb53e819dff7f89bd3b3809d3ab6ff6ecb5510f8ba049a45e42af4327643 Size: 8153368 bytes User: 10001:10001 ## Runtime evidence - Authenticated live endpoint returned HTTP 200. - Two containers using the exact same data bind mount were started from the same image. The second exited 1 before binding and logged the owner-marker and advisory-lock refusal, with no address-in-use failure. - Graceful stop removed life.lock.owner while retaining life.lock. ## Focused verification - cargo check - history lock compatibility tests - service directory lock tests - CalDAV report tests: 13 passed - cargo fmt -- --check Subagent review comments: - Initial review and requested fix: https://git.nokopia.com/yuris/life-service/pulls/90#issuecomment-4574 - Follow-up review at 83d92b5: https://git.nokopia.com/yuris/life-service/pulls/90#issuecomment-4576 The complete project-wide validation suite is run by the coordinator after integration.
Propagate DatabaseWorker initialization errors during api serve before binding the TCP listener, enforcing scenario D09 migration discipline where an unsupported database schema version halts startup rather than continuing without durable history.
yuris force-pushed feat/issue-86-container from 63acc83ca8 to 0cb4eddd65 2026-09-23 09:43:39 +00:00 Compare
Author
Owner

Subagent review — request changes

Reviewed head: 0c4d8949d8
Base: main at 273b4a05b7
Severity: P1
Anchor: src/calendar/report.rs lines 507-520

Reject unknown calendar components instead of treating them as complete reads. A REPORT item containing an unsupported or malformed component such as BEGIN:X-ACME now sets saw_unrelated_component because this helper negates an allowlist, then parse_components returns Ok(empty) at lines 492-495. Unlike the explicitly supported unrelated components, this silently drops the resource: scan_collection and live_candidates treat Ok as a readable collection, so an item in that resource can be reported not_found and a collection can be reported complete despite unreadable calendar data. Reproduce with calendar-data containing BEGIN:VCALENDAR, BEGIN:X-ACME, END:X-ACME, END:VCALENDAR; parse_components returns Ok([]). Restrict this path to explicitly recognized unrelated component names, or pass the requested kinds and reject unknown components, so unsupported data remains calendar_unsupported/incomplete.

Subagent review — request changes Reviewed head: 0c4d8949d8102619e21f5b65ef3eb6d8d67fb321 Base: main at 273b4a05b71866f3516d43b70279af340d07d223 Severity: P1 Anchor: src/calendar/report.rs lines 507-520 Reject unknown calendar components instead of treating them as complete reads. A REPORT item containing an unsupported or malformed component such as BEGIN:X-ACME now sets saw_unrelated_component because this helper negates an allowlist, then parse_components returns Ok(empty) at lines 492-495. Unlike the explicitly supported unrelated components, this silently drops the resource: scan_collection and live_candidates treat Ok as a readable collection, so an item in that resource can be reported not_found and a collection can be reported complete despite unreadable calendar data. Reproduce with calendar-data containing BEGIN:VCALENDAR, BEGIN:X-ACME, END:X-ACME, END:VCALENDAR; parse_components returns Ok([]). Restrict this path to explicitly recognized unrelated component names, or pass the requested kinds and reject unknown components, so unsupported data remains calendar_unsupported/incomplete.
Author
Owner

Subagent follow-up review at head 83d92b5 against base 273b4a0. The mixed VEVENT/VTODO parser behavior, IPv6 configured bind construction, and shared-volume lock compatibility are corrected. Unknown VAVAILABILITY, VPOLL, and X-FOO resources intentionally remain explicit Preservation refusals, covered by the new regression test. No remaining actionable correctness or security findings.

Subagent follow-up review at head 83d92b5 against base 273b4a0. The mixed VEVENT/VTODO parser behavior, IPv6 configured bind construction, and shared-volume lock compatibility are corrected. Unknown VAVAILABILITY, VPOLL, and X-FOO resources intentionally remain explicit Preservation refusals, covered by the new regression test. No remaining actionable correctness or security findings.
yuris merged commit 12aa495d93 into main 2026-09-23 10:54:20 +00:00
Author
Owner

Subagent review follow-up — superseded finding

Reviewed current head: 83d92b504b
Base: main at 273b4a05b7

The P1 finding in comment 4574 was anchored to superseded head 0c4d894 and is fixed by the current head: unknown calendar components now return Preservation instead of Ok(empty), with regression coverage for VAVAILABILITY, VPOLL, and X-FOO. I found no additional actionable defect in the current head. The API formal request-changes endpoint rejects this PR author self-review, so these findings are recorded as issue comments.

Subagent review follow-up — superseded finding Reviewed current head: 83d92b504bc1dc22f1e94cbb5ccd44ad1f5da73c Base: main at 273b4a05b71866f3516d43b70279af340d07d223 The P1 finding in comment 4574 was anchored to superseded head 0c4d894 and is fixed by the current head: unknown calendar components now return Preservation instead of Ok(empty), with regression coverage for VAVAILABILITY, VPOLL, and X-FOO. I found no additional actionable defect in the current head. The API formal request-changes endpoint rejects this PR author self-review, so these findings are recorded as issue comments.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
yuris/life-service!90
No description provided.