Use this for provenance verification and authenticity claims. The function extracts timestamps from multiple sources within the canvas archive and combines them to produce a forensically defensible creation window. The start time comes from high-confidence MP4 metadata (QuickTime epoch), while the stop time uses filtered tile modification times with timezone inference.
Method: 1. **Start (high confidence)**: Earliest non-empty timelapse MP4 `mvhd` creation time, stored in UTC (QuickTime epoch). 2. **Timezone inference**: Compare MP4 UTC times with ZIP entry local times to infer the artist's device timezone offset. 3. **Stop (moderate confidence)**: Latest tile/chunk write time, filtered to exclude "resave windows" (bulk updates when re-opening the file), then converted to UTC using the inferred offset.
Usage
verify_creation_period(
path,
tile_threshold = 200L,
resave_minutes = 10L,
offset_max_days = 90,
mp4_zip_window_days = 180,
verbose = TRUE
)Arguments
- path
Character. Path to a .procreate file (ZIP archive) or an already- extracted directory. The function auto-detects the type based on file vs directory and .procreate extension.
- tile_threshold
Integer >= 50. Number of tiles modified in the exact same second that indicates a bulk resave (not genuine editing). When this many tiles share a timestamp, that second is excluded from stop time calculation. Default 200.
- resave_minutes
Integer >= 1. Time window (in minutes) around Document.archive modification time to consider for resave detection. Bulk tile updates within this window are treated as resave artifacts. Default 10.
- offset_max_days
Integer. Maximum days allowed between an MP4 UTC time and its corresponding ZIP entry local time when inferring timezone offset. Pairs with larger gaps are excluded as outliers. Default 90.
- mp4_zip_window_days
Integer. Window (± days) around the median ZIP entry modification time to accept MP4 creation times as valid. MP4 times outside this window may be stale (from copied/reused canvases). Default 180.
- verbose
Logical. If TRUE (default), prints a one-line summary with start/stop times, inferred offset, and confidence levels.
Value
List with creation window data:
- start_utc
POSIXct. Estimated creation start time in UTC
- stop_utc
POSIXct. Estimated creation end time in UTC
- interval_utc
lubridate::interval. The creation window as an interval object for duration calculations
- tz_offset_hours
Numeric. Inferred timezone offset in hours (e.g., -7 for PDT). NA if inference failed
- start_confidence
Character. Confidence level for start time (e.g., "high (mp4 mvhd UTC)")
- stop_confidence
Character. Confidence level for stop time (e.g., "moderate (tile writes filtered; tz inferred)")
- document_archive_mtime_local
POSIXct. Modification time of Document.archive in local timezone
- counts_per_second
table. Distribution of tile counts per second
- resave_seconds
POSIXct vector. Timestamps identified as resave artifacts and excluded
- n_mp4_segments
Integer. Count of timelapse MP4 segments found
- n_tile_files
Integer. Count of tile/chunk files found
Details
Compute a defensible creation window (start → stop) for a Procreate canvas. Works with a zipped `.procreate` file or an already unzipped folder.
See also
Other canvas validation functions:
assess_procreate_canvas(),
valid-canvas
