pushframe 5.1.7__tar.gz → 5.1.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pushframe-5.1.7 → pushframe-5.1.9}/CHANGELOG.md +103 -38
- pushframe-5.1.9/PKG-INFO +645 -0
- pushframe-5.1.9/README.md +585 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/docs/CLI.md +90 -93
- pushframe-5.1.9/docs/DEVELOPING.md +114 -0
- pushframe-5.1.9/docs/ERRORS.md +85 -0
- pushframe-5.1.9/docs/INTERNALS.md +177 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/__init__.py +1 -1
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/cli.py +44 -6
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/enumerate.py +14 -3
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/gsync.py +12 -11
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/pairs.py +1 -1
- {pushframe-5.1.7 → pushframe-5.1.9}/pyproject.toml +1 -1
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_google_album.py +7 -2
- pushframe-5.1.9/tests/test_docs_hint.py +29 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_google_enumerate.py +27 -3
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_gsync_execute.py +1 -1
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_schedule.py +1 -1
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_version.py +1 -1
- {pushframe-5.1.7 → pushframe-5.1.9}/uv.lock +1 -1
- pushframe-5.1.7/PKG-INFO +0 -661
- pushframe-5.1.7/README.md +0 -601
- {pushframe-5.1.7 → pushframe-5.1.9}/.env.sample +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.freebuff/project-id +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.github/workflows/release.yml +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.github/workflows/tests.yml +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.gitignore +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.gsd/dispatch-isolation-sentinel.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/MILESTONES.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/PROJECT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/REQUIREMENTS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/RETROSPECTIVE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/STATE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/WINDOWS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/ARCHITECTURE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/CONCERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/CONVENTIONS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/INTEGRATIONS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/STACK.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/STRUCTURE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/codebase/TESTING.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/config.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/gsync-apply-budget-none-crash.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/knowledge-base.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/login-475-null-creds.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/resolved/cli-status-verbose-logging.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/resolved/inspect-asset-null-fields.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/resolved/select-asset-401-unauthorized.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/debug/status-crash-401-trip.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-LIVE-EVIDENCE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/.gitkeep +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-SECURITY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-UAT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-SECURITY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-UAT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-SECURITY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-REVIEW-FIX.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-SECURITY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-04-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-04-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW-FIX.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/.gitkeep +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-REVIEW-FIX.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/.gitkeep +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-04-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-04-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-SECURITY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-UAT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/COVERAGE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260630-qs8-make-main-py-load-a-local-env-file-at-st/260630-qs8-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260630-qs8-make-main-py-load-a-local-env-file-at-st/260630-qs8-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/260708-dt9-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/260708-dt9-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/deferred-items.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v2.0-quick/README.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-04-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-04-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-05-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-05-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-06-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-06-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-PATTERNS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-REVIEW.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DECISION-RECORD.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/COVERAGE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-DISCUSS-CHECKPOINT.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/17-google-link-album-selection/COVERAGE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-03-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-03-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-UAT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v4.0-phases/19-debt-closeout/19-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-ROADMAP.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/20-pushframe-rename-migration-repo-switch/20-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/OPERATOR-STEPS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/23-config-wizard-precedence/23-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/23-config-wizard-precedence/23-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/23-config-wizard-precedence/23-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/23-config-wizard-precedence/23-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/23-config-wizard-precedence/23-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-01-PLAN.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-01-SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-CONTEXT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-RESEARCH.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-VERIFICATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/ALBUM-ACCESS-V4-ADDENDUM.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/ALBUM-ACCESS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/ARCHITECTURE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/BROWSER-AUTOMATION.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/FEATURES.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/PITFALLS.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/STACK.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/research/SUMMARY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/state.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.planning/todos/completed/2026-07-06-promote-debug-flag-to-a-global-cli-convention.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/.python-version +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/CLAUDE.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/LICENSE +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/SECURITY.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/VERIFICATION-REPORT.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/docs/agents/domain.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/docs/agents/issue-tracker.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/docs/agents/triage-labels.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/docs/superpowers/specs/2026-07-09-write-rate-limiter-design.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/main.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/packaging/control-template +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/packaging/lintian-overrides +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/packaging/postinst +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/packaging/pushframe.copyright +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/.gitignore +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/README.md +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/browser_bootstrap.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/common.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/cookie_vault.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/fidelity_check.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/rpc_capture.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/probes/shared_link_probe.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/__init__.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/accountApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/activityApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/assetApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/baseApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/frameApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/notificationApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/peopleApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/api/playlistApi.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/aura.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/aws/__init__.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/aws/awsclient.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/aws/s3client.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/aws/sqsclient.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/cache.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/client.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/config_store.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/doctor.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/exif.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/export.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/__init__.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/bootstrap.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/cache.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/client.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/manifest.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/parsers.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/redaction.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/google/vault.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/migration.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/__init__.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/activity.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/asset.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/frame.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/meta.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/person.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/models/user.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/preflight.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/ratelimit.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/reconcile.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/schedule.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/session.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/sync.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/utils/dt.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/utils/io.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/pushframe/utils/settings.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/build-deb.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/make-apt-key.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/publish-apt-repo.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/test-apt-journey-container.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/test-config-journey-container.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/test-deb-container.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/test-install-journey-container.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/scripts/test-multipair-journey-container.sh +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/conftest.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/asset_unprocessed.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/assets_page1.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/assets_page2.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/assets_placeholders.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/error_envelope.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/frame_detail.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/frames.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/google_rpc_snackc_page.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/google_share_page_sample.html +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/login.json +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/fixtures/probe_af_initdata_sample.html +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/offline.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_asset_partial.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_asset_unprocessed.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_aura_logger.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_batch_update_contract.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_budget_identity.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_apply.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_google_link.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_inspect.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_push_budget_geo.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_reconcile.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_status.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_status_google.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_cli_sync.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_client_rate_limit.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_config_wizard.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_doctor.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_execute_plan.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_execute_plan_budget_geo.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_fixtures_validity.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_google_cache.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_google_client.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_google_manifest.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_google_parsers.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_google_vault.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_gsync_all.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_gsync_engine.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_imports.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_logout.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_migration.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_network_guard.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_offline_read_path.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_pairs.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_preflight_sweep.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_preflight_vault.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_prep_upload_formats.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_probe_browser.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_probe_shared_link.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_ratelimit.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_read_path.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_reconcile.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_retry_401.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_session.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_settings_budget.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_settings_resolution.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_sync_engine.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_token_refresh_extension.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_write_endpoints_failloud.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_write_formats_live.py +0 -0
- {pushframe-5.1.7 → pushframe-5.1.9}/tests/test_write_throttling.py +0 -0
|
@@ -12,12 +12,77 @@ every channel.
|
|
|
12
12
|
`pushframe` is an unofficial community CLI for Aura Frames digital photo
|
|
13
13
|
frames; it is not affiliated with Aura Frames Inc.
|
|
14
14
|
|
|
15
|
+
## [5.1.9] - 2026-10-01
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **`google-sync`/`google-album` no longer fail on albums whose final page is
|
|
20
|
+
short** (2026-10-01 live drift, the 757-item "Cadre" album): Google now
|
|
21
|
+
emits a continuation token even on a short final page (300+300+157), and
|
|
22
|
+
the past-the-end request answers the null-payload shape — which the loop
|
|
23
|
+
read as the September transient, burned its single retry on and failed
|
|
24
|
+
loud, hard-blocking every run on that album. The loop now treats a short
|
|
25
|
+
page (< 300 items) as terminal — the paginated-API convention — and never
|
|
26
|
+
requests past it; the single-retry transient recovery stays for the
|
|
27
|
+
genuine mid-listing case. One new test reproduces the drift with the live
|
|
28
|
+
page counts.
|
|
29
|
+
|
|
30
|
+
## [5.1.8] - 2026-10-01
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- **Documentation restructured around users, not development history.** The
|
|
35
|
+
README is now a user guide (highlight → install → connect → everyday use →
|
|
36
|
+
safety model → troubleshooting) and no longer carries the device-flow
|
|
37
|
+
transcripts, the write-path research narrative or the open
|
|
38
|
+
reverse-engineering questions; those moved to a new
|
|
39
|
+
[`docs/INTERNALS.md`](docs/INTERNALS.md) ("how it works" for curious
|
|
40
|
+
readers). docs/CLI.md's reconcile evidence story is condensed to what a
|
|
41
|
+
user needs. No behavior change.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **Every failed command now points at the documentation from the terminal**:
|
|
46
|
+
any non-zero exit prints one footer with the URLs of docs/ERRORS.md (every
|
|
47
|
+
error message explained) and docs/CLI.md (full command reference). It never
|
|
48
|
+
appears on success — a dry run or an aborted confirmation stays output-only.
|
|
49
|
+
- `docs/ERRORS.md`: every error message explained by symptom, meaning and
|
|
50
|
+
remedy (login/session, the refused-write 401 family, resolution ambiguity,
|
|
51
|
+
the Google safety gates, pacing/budget, scheduling) — the user's map from
|
|
52
|
+
"what does this message mean" to "what do I do".
|
|
53
|
+
- `docs/DEVELOPING.md`: the contributor guide — project layout, environment,
|
|
54
|
+
conventions (plain-language user text, offline-test contract, changelog
|
|
55
|
+
discipline), the verified-increment working method, and the release
|
|
56
|
+
process (one tag → PyPI + APT + GitHub Releases).
|
|
57
|
+
- `docs/INTERNALS.md`: how pushframe works internally — the
|
|
58
|
+
reverse-engineered cloud API, the Google mirror engine (cache, manifest,
|
|
59
|
+
safety gates), the anti-abuse findings, the device flows (documented from
|
|
60
|
+
code, not verified) and the open questions.
|
|
61
|
+
|
|
62
|
+
### Changed (docs)
|
|
63
|
+
|
|
64
|
+
- The README's requirements and install sections no longer assume a
|
|
65
|
+
uv/Python setup: prerequisites are just the two accounts, the install
|
|
66
|
+
channels are ordered by simplicity (APT repository first — no Python
|
|
67
|
+
required, then the one-off .deb, then `uv tool install`/pipx, then from
|
|
68
|
+
source), and each channel states exactly what it needs.
|
|
69
|
+
- `pushframe schedule --help` now answers "what gets scheduled": the timer
|
|
70
|
+
runs a `google-sync` of the Google album onto the frame (`--pair NAME` →
|
|
71
|
+
`google-sync "<album>" --frame "<frame>" --apply --yes --scheduled`),
|
|
72
|
+
with the `--album/--frame`, `--sync-dir` (local-directory sync) and
|
|
73
|
+
`--at "OnCalendar"` alternatives plus copy-pasteable examples.
|
|
74
|
+
docs/CLI.md and the README spell out the same.
|
|
75
|
+
- Internal task codes (SAFE-xx, phase N, plan 11-xx, D-xx, MTF/TMR/PRF/SEC,
|
|
76
|
+
UAT) removed from all user-facing documentation AND from the CLI's own
|
|
77
|
+
output (`--help` strings, the mass-hide confirmation and the scheduled
|
|
78
|
+
skip message now speak plain language); two tests pinning the old
|
|
79
|
+
strings updated.
|
|
80
|
+
|
|
15
81
|
## [5.1.7] - 2026-10-01
|
|
16
82
|
|
|
17
83
|
### Fixed
|
|
18
84
|
|
|
19
|
-
- **The live progress bar names the primitive that actually runs** (
|
|
20
|
-
venus 2026-10-01): the removal loop of `execute_plan` emitted a
|
|
85
|
+
- **The live progress bar names the primitive that actually runs** (2026-10-01): the removal loop of `execute_plan` emitted a
|
|
21
86
|
hardcoded `delete` kind on every per-item progress callback, so a hide
|
|
22
87
|
run's bar read `delete ok <asset>` mid-run even though the final summary
|
|
23
88
|
correctly said `Hidden` — the wording contract held on plan headers and
|
|
@@ -43,11 +108,11 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
43
108
|
|
|
44
109
|
- **`google-sync --apply` (and `sync --apply` / `push --apply` /
|
|
45
110
|
`reconcile --remove`) no longer crash building the write budget on a
|
|
46
|
-
token-session host** (
|
|
111
|
+
token-session host** (observed in production, 2026-09-30, debug session
|
|
47
112
|
gsync-apply-budget-none-crash): the budget's account email was read
|
|
48
113
|
from the ENVIRONMENT only while auth resolves env-then-stored-session
|
|
49
114
|
— the config/env duality was broken at exactly that layer. With a
|
|
50
|
-
stored token session and no env vars (
|
|
115
|
+
stored token session and no env vars (that install's intended posture), the
|
|
51
116
|
run authenticated fine, printed the plan, took the operator's `y`
|
|
52
117
|
confirmation, then died on `email.encode()` inside the budget state
|
|
53
118
|
filename. The identity now resolves through ONE helper
|
|
@@ -64,7 +129,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
64
129
|
|
|
65
130
|
### Removed
|
|
66
131
|
|
|
67
|
-
- The
|
|
132
|
+
- The preflight sweep's `gsync_no_creds` case: with the vault gate standing
|
|
68
133
|
BEFORE the Aura gate by design, a form-valid fake vault pushed the run
|
|
69
134
|
past the gate onto the REAL Google network with a bogus cookie (the
|
|
70
135
|
5.1.2 network guard covers pushd, not google.com). The Aura-side
|
|
@@ -75,13 +140,13 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
75
140
|
### Fixed
|
|
76
141
|
|
|
77
142
|
- **`google-sync` no longer claims "no Google session vault" on a healthy
|
|
78
|
-
vault** (
|
|
143
|
+
vault** (observed in production, 2026-09-30): the vault preflight probed the default path
|
|
79
144
|
WITHOUT `expanduser()` — a literal `~` path never exists, so the check
|
|
80
145
|
fired on every machine whose vault was perfectly healthy (a
|
|
81
146
|
`google-link` seconds earlier had saved it) — and its shape check
|
|
82
147
|
demanded a JSON object while the vault is a JSON list of cookie
|
|
83
|
-
records, so even the right path would have failed.
|
|
84
|
-
|
|
148
|
+
records, so even the right path would have failed. Two stacked
|
|
149
|
+
session-layer bugs, masked until now because CI has no vault either and the
|
|
85
150
|
scheduled `--pair` branch skips this block entirely. One tell was in
|
|
86
151
|
every transcript: `google-link` prints "existing Google session found"
|
|
87
152
|
only when a vault READ succeeds. The preflight now expands the default
|
|
@@ -95,10 +160,10 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
95
160
|
### Added
|
|
96
161
|
|
|
97
162
|
- **One-shot TTY token refresh on every frames-reading verb** — `status`,
|
|
98
|
-
`inspect`, `sync`, `push` and `google-sync` (
|
|
163
|
+
`inspect`, `sync`, `push` and `google-sync` (observed in production, 2026-09-30): when
|
|
99
164
|
the stored token is refused (401) and stdin is a terminal, the command
|
|
100
165
|
offers ONE re-login right there — the new token is persisted and the
|
|
101
|
-
same run continues (
|
|
166
|
+
same run continues (production proved a fresh login reads green while the
|
|
102
167
|
stored token was dead). All five verbs share one gate
|
|
103
168
|
(`session.frames_read_with_refresh`), so the behavior, the failure
|
|
104
169
|
shapes and the guardrails are byte-identical everywhere. Guardrails:
|
|
@@ -113,14 +178,14 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
113
178
|
### Fixed
|
|
114
179
|
|
|
115
180
|
- **`pushframe status` no longer tracebacks on a refused frames read**
|
|
116
|
-
(
|
|
181
|
+
(observed in production, debug session status-crash-401-trip): a 401 with the trip's
|
|
117
182
|
`logout:true` body prints a named diagnosis — the remedy is
|
|
118
183
|
`pushframe config` (refresh the stored token; a fresh login read frames
|
|
119
184
|
fine minutes later, so on a READ that body means a dead token first),
|
|
120
185
|
with the 24h-silence protocol reserved for the case where the same
|
|
121
186
|
body recurs on a genuinely fresh login. A 475/429 on the read prints a
|
|
122
187
|
named WAIT (never a re-login suggestion). Every shape exits 1 named —
|
|
123
|
-
the
|
|
188
|
+
the no-traceback contract now holds on the token path's first
|
|
124
189
|
authenticated call.
|
|
125
190
|
|
|
126
191
|
## [5.1.3] — 2026-09-30
|
|
@@ -128,7 +193,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
128
193
|
### Fixed
|
|
129
194
|
|
|
130
195
|
- **`pushframe config` — Enter now keeps the stored email, as the banner
|
|
131
|
-
always promised** (
|
|
196
|
+
always promised** (observed on 5.1.2): an empty answer on a configured
|
|
132
197
|
install aborted with "no email given — aborting" instead of keeping
|
|
133
198
|
it. With a stored token, Enter-Enter now finishes the wizard with ZERO
|
|
134
199
|
API calls (the anti-abuse rule: no gratuitous login); typing a new
|
|
@@ -166,8 +231,8 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
166
231
|
|
|
167
232
|
- **The `tests` workflow is green again** (red on master since v5.1.0 —
|
|
168
233
|
not a 5.1.1 regression): the 9 offline tests of the 401-retry and
|
|
169
|
-
write-throttling suites relied on the
|
|
170
|
-
(`aura.login`);
|
|
234
|
+
write-throttling suites relied on the old unconditional re-login default
|
|
235
|
+
(`aura.login`); the token-first session work made the default token-aware, which fails
|
|
171
236
|
named off-TTY without env credentials — exactly the CI case. A local
|
|
172
237
|
`.env` with real credentials masked it locally. All 9 `execute_plan`
|
|
173
238
|
call sites now pin `relogin=aura.login`; zero product code changed.
|
|
@@ -176,7 +241,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
176
241
|
|
|
177
242
|
### Changed
|
|
178
243
|
|
|
179
|
-
- **Credible client identity** (
|
|
244
|
+
- **Credible client identity** (production 2026-09-30 anti-abuse lesson): the
|
|
180
245
|
user agent is now a setting — `USER_AGENT` (env `PUSHFRAME_USER_AGENT`,
|
|
181
246
|
or `pushframe config set USER_AGENT …`) — whose default tracks a
|
|
182
247
|
current Play build (`Aura/4.7.4271 (Android 36; Client)`) instead of
|
|
@@ -196,48 +261,48 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
196
261
|
|
|
197
262
|
## [5.1.0] — 2026-09-29
|
|
198
263
|
|
|
199
|
-
### Added
|
|
264
|
+
### Added
|
|
200
265
|
|
|
201
|
-
- **Named pairs
|
|
202
|
-
`pairs` in config.json is a named dict (`{"
|
|
266
|
+
- **Named pairs**: `pushframe config pair add/remove/list` —
|
|
267
|
+
`pairs` in config.json is a named dict (`{"family": {"album": …,
|
|
203
268
|
"frame": …}}`); duplicates and unknown names fail named.
|
|
204
|
-
- **`google-sync --pair <name>` / `--all
|
|
269
|
+
- **`google-sync --pair <name>` / `--all`**: per-pair state
|
|
205
270
|
(manifest `~/.config/pushframe/pairs/<name>/`, cache
|
|
206
271
|
`~/.local/state/pushframe/pairs/<name>/cache/`); `--all` runs every pair
|
|
207
|
-
in sorted order with ONE shared write budget (
|
|
272
|
+
in sorted order with ONE shared write budget (the mass-hide guard applies account-wide);
|
|
208
273
|
a failing pair is reported and never blocks the others; exit 1 if any
|
|
209
274
|
failed.
|
|
210
|
-
- **`pushframe schedule add/list/remove
|
|
275
|
+
- **`pushframe schedule add/list/remove`**: systemd USER
|
|
211
276
|
timers (no root) — `pushframe-<job>.service/.timer`, oneshot,
|
|
212
277
|
`Restart=no` (the next tick is the retry), `RandomizedDelaySec`, per-job
|
|
213
278
|
log at `~/.local/state/pushframe/<job>.log`. ExecStart is fully
|
|
214
|
-
non-interactive (token session); **`--scheduled` flips
|
|
215
|
-
skip-and-log** (a timed run never mass-hides silently and never fails
|
|
279
|
+
non-interactive (token session); **`--scheduled` flips the mass-hide
|
|
280
|
+
threshold to skip-and-log** (a timed run never mass-hides silently and never fails
|
|
216
281
|
the unit over a safety decision). Preflight names the systemd user
|
|
217
282
|
session requirement with the `loginctl enable-linger` remedy
|
|
218
283
|
(documented; never executed by the tool).
|
|
219
284
|
|
|
220
285
|
## [5.0.7] — 2026-09-29
|
|
221
286
|
|
|
222
|
-
### Added (
|
|
287
|
+
### Added (Token-First Sessions & Preflight Sweep)
|
|
223
288
|
|
|
224
|
-
- **One session path for every command
|
|
289
|
+
- **One session path for every command**: `inspect`,
|
|
225
290
|
`reconcile`, `sync`, `push` and `google-sync` now run from the stored
|
|
226
291
|
token session (0600) with no password and no login call; env vars stay
|
|
227
292
|
the override; a terminal session gets ONE password prompt whose token is
|
|
228
|
-
persisted (
|
|
293
|
+
persisted (the password is never written anywhere — file-content
|
|
229
294
|
tested); non-interactive runs without credentials fail named.
|
|
230
|
-
- **Token expiry
|
|
295
|
+
- **Token expiry**: a 401 while resuming the stored session prompts
|
|
231
296
|
once in a terminal (new token persisted, command continues) and raises
|
|
232
297
|
`SessionExpiredError` with the remedy in scheduled runs. `execute_plan`'s
|
|
233
298
|
401-retry relogin is token-aware (it previously assumed a password).
|
|
234
|
-
- **`pushframe logout
|
|
299
|
+
- **`pushframe logout`**: deletes the stored token (and only
|
|
235
300
|
the token) — email and settings survive, mode stays 0600, idempotent.
|
|
236
|
-
- **Preflights
|
|
301
|
+
- **Preflights**: `google-sync` checks the vault up front
|
|
237
302
|
(remedy: `google-link` + the headless ssh -X recipe); `sync`/`push` fail
|
|
238
303
|
named on a nonexistent source directory BEFORE any network call (an
|
|
239
304
|
empty directory remains a friendly "nothing to do").
|
|
240
|
-
- **The traceback-free sweep
|
|
305
|
+
- **The traceback-free sweep**: a parametrized test over the
|
|
241
306
|
failure-mode inventory proves every foreseeable mode ends named, with a
|
|
242
307
|
remedy, and never a traceback.
|
|
243
308
|
|
|
@@ -248,7 +313,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
248
313
|
owned by the session path.
|
|
249
314
|
|
|
250
315
|
## [5.0.6] — 2026-09-29
|
|
251
|
-
- **`pushframe doctor`** — the field write-probe the
|
|
316
|
+
- **`pushframe doctor`** — the field write-probe the production regressions
|
|
252
317
|
demanded: one 4×4 test image through the REAL write path (S3 +
|
|
253
318
|
select_asset + batch_update), verify + cleanup, then a GO/NO-GO verdict
|
|
254
319
|
with the 401 body classified. `--no-write` for reads-only. Closes the
|
|
@@ -259,7 +324,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
259
324
|
|
|
260
325
|
### Added
|
|
261
326
|
|
|
262
|
-
- **`pushframe config`** (v5.1
|
|
327
|
+
- **`pushframe config`** (v5.1): interactive wizard that asks for
|
|
263
328
|
the email + password (hidden input), **verifies the login against the real
|
|
264
329
|
Aura API before writing anything**, and stores email + session token —
|
|
265
330
|
never the password — in `~/.config/pushframe/config.json` (0600, atomic
|
|
@@ -274,7 +339,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
274
339
|
|
|
275
340
|
### Fixed
|
|
276
341
|
|
|
277
|
-
- **`google-sync`/`sync`/`push` apply feedback was opaque** (
|
|
342
|
+
- **`google-sync`/`sync`/`push` apply feedback was opaque** (a production
|
|
278
343
|
regression): the progress bar sat silent for minutes at a time — budget
|
|
279
344
|
waits and inter-chunk cooldowns never reached the bar — and failures
|
|
280
345
|
showed a bare `upload FAIL` with no cause. The bar now shows a live
|
|
@@ -289,14 +354,14 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
289
354
|
- The abort message on the 5-consecutive-failures breaker now states what
|
|
290
355
|
to expect: confirmed items ARE on the frame, the next run recognizes
|
|
291
356
|
them and will not upload them twice, wait ~30 min before retrying.
|
|
292
|
-
- **Scoped-trip honesty** (second
|
|
357
|
+
- **Scoped-trip honesty** (second production regression): `pushframe status`
|
|
293
358
|
staying green does NOT mean writes will work — the anti-abuse trip can
|
|
294
359
|
be scoped to the assets surface (write endpoints AND the
|
|
295
360
|
`asset_for_local_identifier` verify-probe read) while login/frames keep
|
|
296
361
|
answering. The abort message no longer suggests status as an all-clear;
|
|
297
362
|
it prescribes 60+ min from the abort and a single, solitary retry call.
|
|
298
363
|
- **"Request Unauthenticated" + logout:true identified as the trip's
|
|
299
|
-
disguise** (fourth
|
|
364
|
+
disguise** (fourth production regression, decisive capture): the body arrived
|
|
300
365
|
on a FRESH token immediately after a successful re-login, one item after
|
|
301
366
|
a doctor probe had WRITTEN fine — so Pushd's "Request Unauthenticated"
|
|
302
367
|
here means "we refuse your writes (trip)", not "your token is bad". The
|
|
@@ -315,7 +380,7 @@ frames; it is not affiliated with Aura Frames Inc.
|
|
|
315
380
|
Forwarded only when supplied — the historical default (50) otherwise
|
|
316
381
|
rules. The anti-trip drill (doctor → wait → batch-size) is documented in
|
|
317
382
|
docs/CLI.md.
|
|
318
|
-
- **401 bodies are captured and classified** (third
|
|
383
|
+
- **401 bodies are captured and classified** (third production regression): an
|
|
319
384
|
HTTP 401 exception now carries the server's response body (redacted
|
|
320
385
|
through the same filter as request logs, truncated to 300 chars, also
|
|
321
386
|
debug-logged) — so per-item failure reasons, verify-probe errors and the
|
|
@@ -452,7 +517,7 @@ Milestone summary — see `.planning/MILESTONES.md` for the full retros.
|
|
|
452
517
|
`google-link` (dedicated Chrome profile, cookie vault `0600`),
|
|
453
518
|
`google-album` (full walk, exact byte counts), `google-sync`
|
|
454
519
|
(hide-by-default mirror semantics, pruned cache + persistent manifest,
|
|
455
|
-
|
|
520
|
+
mirror safety gates); live two-run proof (upload run → zero-upload
|
|
456
521
|
steady state); debt closeout (AWS config out of code, single logger
|
|
457
522
|
per process, transport seam).
|
|
458
523
|
- **v3.0 — direct transport rewrite**: `Client` over `httpx` (HTTP/2),
|