You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[P1][Sprint 1][Subscriptions] Complete get, update, pause, and resume lifecycle #100
Premise check before implementation, verified 2026-09-13 against oilpriceapi-api origin/main and production.
Confirmed
Routes exist: resources :subscriptions, only: [:index, :show, :create, :update, :destroy] with member post :pause / post :resume (config/routes.rb, the #3245 Phase 2 block).
/v1/subscriptions is the Watch model (agent price watches). It is not billing: the controller touches no Stripe or plan state, and the model is named Watch specifically "to avoid colliding with Billing::Subscription". A live lifecycle smoke is therefore safe on the test key's own account.
Wire shape: every single-record action renders {"status":"success","data":{"subscription":{id,name,codes,interval_seconds,status,deliver_webhook,source,tool_name,last_evaluated_at,next_run_at,created_at}}}; unknown id is 404 {"error":{"code":"NOT_FOUND","message":"Subscription not found","request_id":...}} (probed live).
Corrections
"Test ... entitlement ... paths": only create can return an entitlement 402 (WATCH_LIMIT via enforce_watch_limit, INTERVAL_FLOOR via render_watch_save_failure). update routes every model failure, including the plan interval floor and webhook delivery without the entitlement, through render_watch_errors, a 422{"status":"fail","data":{"error":"VALIDATION_ERROR","message","details"}}. pause/resume have no entitlement gate. The PR tests the 402 on create and the entitlement refusals on update as 422.
"Document and release" / the sprint's "capabilities metadata": this repo has no machine-readable capabilities file (git grep -i capabilit origin/main hits only README prose; the one machine-readable artifact is the snippet manifest examples/snippets/manifest-source.json). No new metadata file is invented. The release is deferred: the PR adds a ## [Unreleased] CHANGELOG entry and no version bump or tag.
"Preserve server recovery metadata": already carried by the typed exceptions (request_id, code, remediation_url from upgrade_url, raw_body). The PR asserts it survives rather than adding a new mechanism.
Activity
karlwaldman commentedon Sep 13, 2026
Premise check before implementation, verified 2026-09-13 against oilpriceapi-api
origin/mainand production.Confirmed
resources :subscriptions, only: [:index, :show, :create, :update, :destroy]with memberpost :pause/post :resume(config/routes.rb, the#3245 Phase 2block)./v1/subscriptionsis theWatchmodel (agent price watches). It is not billing: the controller touches no Stripe or plan state, and the model is namedWatchspecifically "to avoid colliding with Billing::Subscription". A live lifecycle smoke is therefore safe on the test key's own account.{"status":"success","data":{"subscription":{id,name,codes,interval_seconds,status,deliver_webhook,source,tool_name,last_evaluated_at,next_run_at,created_at}}}; unknown id is 404{"error":{"code":"NOT_FOUND","message":"Subscription not found","request_id":...}}(probed live).Corrections
createcan return an entitlement 402 (WATCH_LIMITviaenforce_watch_limit,INTERVAL_FLOORviarender_watch_save_failure).updateroutes every model failure, including the plan interval floor and webhook delivery without the entitlement, throughrender_watch_errors, a 422{"status":"fail","data":{"error":"VALIDATION_ERROR","message","details"}}.pause/resumehave no entitlement gate. The PR tests the 402 oncreateand the entitlement refusals onupdateas 422.git grep -i capabilit origin/mainhits only README prose; the one machine-readable artifact is the snippet manifestexamples/snippets/manifest-source.json). No new metadata file is invented. The release is deferred: the PR adds a## [Unreleased]CHANGELOG entry and no version bump or tag.request_id,code,remediation_urlfromupgrade_url,raw_body). The PR asserts it survives rather than adding a new mechanism.fix(subscriptions): local refusals raise ValidationError, not ValueEr…
feat(subscriptions): get, update, pause, resume lifecycle (#100) (#143)
Merge origin/main (#143 subscriptions, #144 fuel-surcharge) into feat…
chore(release): 1.16.0 (#152)