Notes from the work

One email when a tutorial or migration write-up goes live. Nothing else, and one click to leave.

LeanZero

Two people in Romania doing Atlassian migrations, Forge apps and practical AI work for teams that would rather talk to the person doing the job. Most of what we learn ends up on this site.

Services

  • Atlassian Migrations
  • Atlassian FastShift
  • Atlassian Maintenance
  • Forge App Development
  • AI Development Consultation

Topics

  • Jira
  • Jira Service Management
  • Confluence
  • Bitbucket
  • Atlassian Forge
  • Cloud Migration
  • Local AI
  • AI Coding
  • Certifications
  • Atlassian Team
  • All topics

Company

  • Blog
  • Tutorials
  • Contact

Community

  • Join Discord
  • Support this site

© 2026 LeanZero. All rights reserved.

Privacy PolicyTerms of Service24/7 SupportTrust CenterSecurityDPALegal notice
  1. Home
  2. Portfolio
  3. Cost Slasher
Paid beta · preparing release

Cost Slasher

Put unused Atlassian licences back to work.

Explore the app Talk to us
Licence policiesReturning usersGroups and permissionsReportingBeta availabilityManual
Confluence · Jira · Jira Service Management agents

Access for the people who need it.

Set a separate inactivity policy for each managed app. Define its allowance, warning period and restore protection, and exclude specific people from automatic inactivity release.

The engine keeps unknown activity and uncertain changes visible. Existing access, reserved returns and unconfirmed writes stay accounted for in the seat pool.

Read the release conditions
Every release needs evidence
  1. Eligible, but inactiveComplete access and app activity observations.
  2. Warn and waitThe full warning period starts after confirmed delivery.
  3. Check before releaseFresh activity, eligibility, policy and protection checks.

A seat is reclaimed only after access is verified absent.

My access and time away

A clear way back to work.

Open Apps → Cost Slasher in Jira or Confluence to see your recorded access, inactivity allowance and next permitted action. Check access or request restoration explicitly; signing in does not grant a seat.

If access is denied, the organisation's configured Atlassian message points to a dedicated recovery website with Atlassian sign-in. After a verified restore, return to the original page or work item. Space and project permissions still apply.

Read the member journey

Going away for longer?

Choose the apps, departure, return date and time zone. Preview the return, then confirm a time-away booking separately.

A confirmed protected return reserves its seat while you are away. Restoration is scheduled before the recorded return, subject to current eligibility and provider availability.

How a protected return works
Development capture · 0.2.2. My access shows three 30-day inactivity allowances, unavailable activity, Confluence and Jira Service Management not checked, and Jira's last recorded access not permitted.
Development capture · 0.2.2. Three 30-day inactivity allowances. Access checks remain explicit and do not grant a licence.
Controlled access, scoped authority

Keep identity groups and paid access in step.

A SCIM-managed group establishes eligibility. A separate, explicitly writable group controls the selected paid app.

Route memberships deliberately

Preview Add, Mirror or Move rules before publishing them. Routing tracks its own contributions, preserves other owners and verifies a destination before removing an approved source membership.

Give each role the right reach

Members manage their own access. Operators, routing managers, auditors and administrators work within assigned app and site boundaries. Paid group changes require current licence authority too.

Set up with a visible next step

The setup guide opens the required control directly. Finish Storage safety first, then connect the organisation, map access groups and review recovery coverage before enabling release.

Integrate through a scoped REST API

Give an integration its own expiring token, approved apps and capabilities. REST uses the native command handlers and current permission checks, with previews, version checks and original request references for deferred work.

App mappings Permissions and routing REST integration
A management brief and the detail behind it

Share figures with their context.

Prepare a PDF, CSV or JSON management report for a chosen period and app scope. It separates verified access changes from already-present or absent access, and includes trends, dated capacity, source definitions and controls needing attention.

Management downloads contain aggregates without individual account identities. Optional seat-price assumptions produce a labelled planning estimate, with its observation dates and limits attached.

What the management report contains

Inspect the original event.

Filter the audit by date, app, category, outcome, entry point, exact account or reference. Open an event to see its action, reason, recorded and occurrence times, and available safe details.

Export all matching retained events as CSV or JSON, including the frozen filters and recording cutoff. A request accepted, a provider acknowledgement and a verified access change remain separate stages.

Explore audit and export controls
Development capture · 0.2.2. A prepared management brief shows zero verified access removals or grants and nine changes whose origin is unverified, with separate app counts and PDF, CSV and JSON controls.
Development capture · 0.2.2. This prepared report retains zero verified access changes and nine changes whose origin is unverified.
Paid beta preparation

A beta with clear boundaries.

Cost Slasher 0.4.2 has been uploaded as a paid beta and its Marketplace pricing is saved. The initial review received an automatic “Not enough details on listing” rejection. Review is blocked while those details are completed. Checks in the installed app and Atlassian approval are still required before customer availability.

What will beta participation cost?

The saved tariff starts at USD 13.20 per month or USD 132 per year for up to ten Jira users. The tariff is intended to fund AWS and Forge running costs, the Marketplace fee and an operating buffer under the launch workload estimates. Prices were saved and reloaded in Marketplace; approval and customer availability are still outstanding. Run costs vary with managed population, activity pages and retries; a Jira billing tier does not determine the number of people managed in Confluence or Jira Service Management. Your Atlassian subscriptions remain separate; this page does not start a subscription.

How does progressive pricing work?

Above ten Jira users, the saved monthly total adds USD 1.32 for each of the first 100 users, USD 0.40 for users 101–5,000 and USD 0.01 for users 5,001–100,000. The first-ten flat amount is not added again. For example, 100 users maps to USD 132 per month or USD 1,320 per year. Marketplace calculates annual pricing automatically at ten times the applicable monthly rate. These billing bands do not certify managed-user capacity. Confirm the final quote on Marketplace when the app is available.

How can my organisation take part?

Talk to LeanZero about your site, managed apps and intended scope. Customer availability depends on the accepted release and its actual Marketplace listing. This contact action does not issue an invitation or install the app.

What do the current captures show?

The images were recorded from development build 0.2.2 in an authorised test environment. Their original access states, unknown observations and report outcomes remain visible. Those recordings do not prove that the uploaded paid build or its licence effects have passed acceptance.

When can automatic release be enabled?

It starts disabled. Complete access adoption, verified app-specific activity, confirmed warning delivery and tested returning-user recovery are required. Jira Service Management automatic agent reclamation stays disabled until agent-activity evidence exists.

Which live journeys still need acceptance evidence?

Ordinary accounts with no paid seat, the actual denial-message entry, restoration, protected time-away return and SCIM-driven group effects still need their own deployed acceptance evidence. A screenshot of the interface does not establish those journeys.

Where does the app run and store data?

The native workspace and business records use Atlassian Forge. Recovery identity, controller registry, shared organisation budgeting and notification processing use AWS Ireland, with CloudFront transit. The organisation Admin API key stays in Forge secret storage. Read the dedicated privacy disclosure for the full boundary.

Do the reports prove billing savings or 20,000-user capacity?

No. A capacity value estimate is a planning assumption, not an invoice saving. Local synthetic tests do not certify 20,000-user tenant throughput; deployed scale and physical headroom remain separate checks.

Cost Slasher privacy Cost Slasher terms Data processing agreement

Read the published product privacy policy, paid terms and customer data processing agreement before planning an installation.

The manual

These guides describe the uploaded 0.4.2 paid beta, including storage-first setup and Saved requests. Its verified initial production upload was Forge 3.0.0; the retained native test baseline is 0.3.2. Checks in the new installation and Marketplace approval are still outstanding. Open the chapter you need.

In this manual
  • About this guide
  • Marketplace licence and existing commitments
  • Open your access
  • Get access back
  • Check a lost response
  • Plan time away
  • Read history and requests
  • Management reports and detailed audit
  • Find help
  • About this guide
  • Marketplace licence and existing commitments
  • Open the application
  • Member access and restoration
  • Check a lost native response
  • Time away
  • First administrator and storage preparation
  • Connect the organisation and save its API key
  • Pair the publisher recovery service
  • Connect each managed app
  • Configure the native recovery message and prove it
  • Policies and activity gates
  • Permissions, API tokens and routing
  • Operations, exports and notification results
  • Share a management report
  • Read consumption measurements
  • Privacy and support
  • Stop a controller before removal or handover
  • About this guide
  • Marketplace licence and existing commitments
  • Obtain the entry and credential
  • Request and response rules
  • Discover exact own access and restore
  • Page collections without assuming global emptiness
  • Preview and apply a reviewed bulk action
  • Time away and protected returns
  • Track requests and retrieve exports
  • Prepare management reporting
  • Administration and less common lifecycle actions
  • Verified controller shutdown and native storage checks
  • Policy inactivity exclusions and job timing

01About this guide

This guide covers Cost Slasher. The 0.4.2 paid beta was uploaded to production as Forge 3.0.0 from the verified v0.4.2 source. Upload does not qualify a new native installation or establish a customer release. The retained publisher native test baseline is 0.3.2, executing Forge 2.0.0 with app billing disabled; current storage bootstrap and ordinary-user checks still need their own evidence. Cost Slasher is Paid via Atlassian, billed against the required Jira installation's users; Confluence is optional and your Atlassian subscriptions and seats remain separate. The starting tariff of USD13.20 per month or USD132 per year for up to ten Jira users was saved and reloaded in Marketplace. Progressive prices are intended to fund AWS/Forge running costs, the Marketplace fee and an operating buffer under the launch workload estimates; see the pricing decision and actual saved pricing. App review ECOHELP-170877 was automatically rejected with Not enough details on listing; listing completion and review remain open. Customer admission remains closed. This guide does not announce public availability. Use the current quality state and implementation ledger to distinguish uploaded source, installed build and actual acceptance.

02Marketplace licence and existing commitments

In the uploaded paid build, fresh access checks, allocations, configuration and automation require the server's trusted Marketplace context to report an active Cost Slasher licence. A trial or other no-charge entitlement is valid only when Atlassian reports license.active: true; a missing or unknown value is refused. Opening a page, an OAuth identity grant or a Cost Slasher REST token does not purchase a subscription or confer licence authority. Current account, scope, permissions, eligibility, storage and provider safeguards still apply.

Recorded-result reads remain subject to current permissions. Narrow safety handling preserves an exact proven prior-release recovery or fully held return commitment, issued-effect readback and genuine security compensation after licence lapse; it is not a general unlicensed grant. Read the original operation's result rather than assuming a restore. The retained historical 0.3.2 native baseline did not execute these paid checks and does not qualify the uploaded build.

03Open your access

In Jira or Confluence, choose Apps → Cost Slasher. My access opens first; its heading is Your access. Jira Service Management agent access appears separately through the Jira entry. The views and actions available to you follow your Cost Slasher permissions.

The app follows Jira or Confluence's theme automatically. Change it through that app's Profile → Theme control.

Each configured Confluence, Jira or Jira Service Management app shows your recorded access status, inactivity allowance, last observed activity and permitted next action. Jira Service Management access means an agent seat, not customer portal access. Reasons, warning deadlines, protection, planned returns and current operations stay visible. Activity unavailable means the app has no verified activity observation; it does not mean you have been inactive. Expand Access details for the last verification time and seat-pool state.

Expand How inactivity works for the release conditions. An inactivity allowance alone does not enable automatic release. Release requires enabled app automation, verified inactivity, confirmed warning delivery, the configured warning period and fresh eligibility, activity and protection checks.

Last verified access status describes the earlier access observation. Opening this page does not check current eligibility or recent app activity. An unverified status does not prove that access is absent; use the separate access check when offered, or ask your administrator to review the stated reason.

04Get access back

Use the action offered for the relevant app. Check my Confluence access, Check my Jira access or Check my agent access in the Jira Service Management row checks current eligibility without granting a seat. Assistive technology announces the agent button as Check my Jira Service Management agent access. After an eligible check, choose Restore Confluence, Restore Jira or Restore agent access separately. A Check and restore action performs the required fresh checks as part of your restoration request.

Read the actual operation result. Request recorded or Processing finished does not mean access has been restored. If no seat is available, check the waiting request's expiry and cancellation option. Do not submit another request to bypass an uncertain change. Once the result says Access restored, use the app link or return to your original page or work item tab and refresh. Space, project and work item permissions still apply.

If you cannot enter the app, your organisation's configured access-denial message can link to its recovery website. Use Sign in with Atlassian and check the displayed account, site and app before requesting restoration. Sign-in alone grants nothing. An ordinary account with no paid seat remains a separate acceptance journey; this guide does not promise that every denial screen or zero-seat OAuth journey is already verified.

An unconfirmed result is neither a verified restoration nor proof that the request made no change. Keep its original reference and use the offered original-request check or retry. Read the accompanying explanation before starting any further change.

05Check a lost response

If a native change loses its response, open Saved requests in the workspace and choose Check saved request. The browser retains request references across navigation and reload, tied to your current account, site, installation, app and environment. It saves no form values, credentials or one-time secrets. This check uses your current permissions and reads the original request; it does not submit the change again.

When offered, choose View recorded operation, View recorded request or View recorded storage check to inspect the actual result, then Refresh recorded work if it is still in progress. A recorded request is not proof that access changed. If the server cannot find an acceptance record, follow Return to action and the displayed guidance. Where a retry is permitted, re-enter the exact original input and reviewed version to use the retained reference; changed input is blocked while that intent remains unresolved. An unknown result does not mean no effect. Only an explicit server-confirmed no-effect result establishes that nothing was changed by that request.

Keep in recorded work removes this browser's entry after a fresh check of the retained server work. It does not cancel or complete that work. Your requests is the separate durable request history. Saved requests does not transfer to another account or installation and cannot recover a one-time credential secret.

06Plan time away

Choose Plan time away or open Time away. The shortcut opens planning after this page's access records load and at least one app permits a booking. After your access records load, if no app permits a booking, Plan time away stays disabled. Review the recorded reasons and use Review my access, or contact your administrator if that action is unavailable. The app does not open an unusable form. Loading remains a check in progress; a failed prerequisite offers a retry. An empty visible booking page with Next page asks you to continue through your bookings, not assume there are none. For permitted apps, select Apps, Departure, Return and Time zone, then choose Preview return. The dialog reveals and focuses the original check result. An unblocked preview has not reserved a return seat yet; blocked previews show the specific checks to resolve. Choose Confirm time away separately after reviewing the result. Inspect each booking's result: a pending booking is not a guaranteed return. A confirmed protected return keeps its seat reserved while you are away; restoration is scheduled to start 30 minutes before the recorded return, subject to current eligibility and provider availability. Protection follows the confirmed booking's actual terms. Use the booking's edit, cancel or I'm back early action when permitted.

Cancelling does not undo access work already started. Any access already restored is kept. Check the booking and your access status afterwards: a recorded cancellation may still need verification, and does not prove that its return seat reservation was released.

07Read history and requests

Choose View access history beside the Your access heading to bring the history section into view and move keyboard focus there. It does not check or change access. Your access history shows at most five visible events per page, newest recorded first. Known actions use readable labels, including Generate management report, Export audit and Check own app access. Request accepted, Result recorded and Processing finished describe recorded processing stages; they do not prove that a licence changed. The timestamp shows when the action happened. A delayed event can be recorded recently while showing an older action time; hover over the timestamp to see its Recorded time when the two differ.

Use Next page for earlier recorded events and Previous page to return. Page numbers describe visited pages, not a known total. If a page has no visible events but still offers Next page, continue; that page does not prove the remaining history is empty. During loading or a failed read, the requested page's events are unavailable; use the offered retry to check again.

Your requests loads its history only when you first open it; that history is not fetched for the initial collapsed My access view. It shows up to five durable requests per page. Use Open management report or Open audit export to retrieve the original prepared file. Inspect request remains beside these actions for the original processing status, reason, outcomes and available chunks, including earlier formats. Processing finished does not guarantee successful licence changes, delivery or deletion. Closing this panel retains your selected and in-flight processing result while you stay on My access; it does not cancel the request. Reloading or leaving the page does not promise to retain the open panel or its selected result.

Open Your data and privacy to request your own records or record a deletion request. Cost Slasher processes deletion requests to remove cached names and email addresses and expire personal exports; access safety and audit records are retained. Inspect the request result, including any pending recovery-session revocation. Your Atlassian account and app access are unchanged. Closing the panel preserves its in-flight result while you stay on the page.

08Management reports and detailed audit

If your assigned role includes reporting, open Reports, choose Period and the permitted App. For Custom dates, enter From date and the inclusive Through date before choosing Generate report. Reporting periods use UTC and may cover up to 366 days. Read the prepared brief and use Download PDF, Download CSV or JSON. Management downloads contain aggregates without individual account identities. The PDF is designed for sharing with management and includes verified access removals and grants, app outcomes, a daily trend, controls needing attention, separately dated capacity and source definitions. Expand Current capacity and planning estimate for each app's observation and reason; expand Sources, scope and metric definitions for the exact interval, recording cutoff, definitions and historical coverage limits.

The chart's Highest daily removals or grants is the largest count of either outcome on one UTC day, rather than the period total or the sum of removals and grants. One removal and one grant on the same day gives a scale of 1 while the period summary retains both outcomes.

Already-absent or already-present access is not counted as an access change. Missing historical write evidence stays Change origin unverified. Pending figures count recorded events, not outstanding cases or distinct people. An administrator can add an optional monthly seat-price assumption; its estimated free-capacity value is a planning estimate and does not prove invoice savings.

The management CSV contains summary, per-app outcome, daily trend, entry-point and purpose sections, dated capacity figures and reasons, source notes, metric definitions and estimate status. Keep these context rows with the figures when sharing or importing the spreadsheet. An unavailable capacity or value stays unavailable; an empty value does not mean zero. JSON preserves the complete aggregate report with its exact machine values.

For authorised auditors and administrators, Audit shows at most 20 events per page, newest recorded first. Edit Search, Period, Event category, Outcome and App, then choose Apply filters. Reset returns to the default period and starts paging again. Dates filter when the event occurred, from the first UTC day through the last. More filters adds entry point, exact actor and affected-account references, an event/object/operation reference search and exact action and outcome codes. An exact outcome code overrides the selected outcome category. Inspect opens the original action and outcome, occurrence and recording times, actor, affected account, product/site/object/version/operation references, reason and available safe structured details. Historical fields appear only when they were recorded. A command acceptance, provider acknowledgement and verified change are separate recorded stages.

Event and Outcome use readable labels for known codes. Request accepted, Result recorded and Processing finished do not confirm that access changed or a notification was delivered. Access present (verified) or Access absent (verified) describes the observed state, which may already have existed; it does not by itself prove that Cost Slasher made a membership change. Inspect → Exact action and Exact outcome, exact-code filters and CSV/JSON downloads keep the original codes. Unknown codes appear unchanged.

The App filter offers only apps covered by your current audit permissions. All assigned apps reads the records permitted by the server. Missing permission metadata disables app selection and preparation until you reload and check your permissions; saved filters and older exports are preserved.

Choose Download matching events, review Export app and the readable Export filters summary, then choose Prepare export. An explicit applied app filter is kept. If your authority permits separate app exports, select an authorised app for this file; the sole permitted app is selected for you. All assigned apps is available for export only when your current grant covers every app. This export choice does not change the live Audit view or previous exports. Expand Exact filter details only if you need the exact final machine filters. Download complete CSV or Download JSON retrieves every matching retained event across all pages, not only the visible page. The request freezes its original filters and recording cutoff. Changing the explorer's filters leaves that prepared export unchanged; prepare another export to download a different set of events.

Audit CSV has one export-metadata row and then event rows, identified by the recordType column. Keep the metadata row: it carries the original filters, cutoff, available-until time, complete-export totals and evidence limits, even when there are zero events. Filter recordType to event when analysing the event rows. JSON includes the same manifest and exact safe event values. Audit files contain individual actor and affected-account references; management reports contain aggregates.

Downloads verify every part and recheck your current role, ownership and expiry after formatting. Expired, missing or altered parts cannot produce a misleading complete file. The available-until time describes the prepared file's retrieval window in the app. During a report or audit download, only the selected action shows progress; the other download actions wait until it finishes. Download manifest is beside the whole-file audit downloads. For exports above the 32 MiB whole-file limit, expand Saved filters and numbered parts to inspect the saved filters and download individually validated parts. Each numbered CSV identifies its part and this file's event count separately from the original export total; it does not claim to contain the whole export. Import reference columns as text in spreadsheets. Retention or previously unpublished evidence can leave historical gaps; an empty retained result does not establish that nothing happened.

Prepared reports lead the Reports page, with their original period and apps attached. New report settings keeps preparation secondary; Prepare another report opens and focuses those settings. Opening optional settings generates nothing until you choose Generate report.

Choosing Generate report or Prepare export again checks the earlier recorded request before starting a new one. You can prepare another file with the same settings or different settings directly from Reports or Audit. The earlier request stays in Your requests. If its response was lost or its reference cannot be verified, use Saved requests before changing the input; the app does not replace an uncertain request with a new reference.

You can move between Reports, Audit and other app pages and return to the original prepared report or export within the current workspace session. Audit retains draft inputs and applied filters separately; Original export filters stays beside the original file's downloads. Returning retrieves the same owned request; it does not submit another preparation intent. A role change or expired result can still block retrieval or download. Browser reload or a new session clears selected references; Your requests → Open management report or Open audit export reopens an original durable request using fresh ownership, permission and expiry checks. Earlier requests may require paging. Automatic status checks pause while the tab is hidden, resume when you return and stop after 20 visible checks per open request view. Use Refresh report or Refresh export if checks have paused. Checking status, Preparing, Expired and unavailable-download guidance describe different conditions; an expired complete file is never represented as preparing.

09Find help

Open What's New for the installed build's authored release notes. The uploaded build's authored release is 0.4.2 Beta; the retained native test evidence is for 0.3.2 Free beta. Confirm the actual installed build separately. Expand Earlier releases to read the retained history. The App release footer opens the same page and shows the authored version; Forge deployment numbers and production acceptance are separate. When reporting a problem, expand the displayed operation, request or error reference and use Copy reference. Contact your organisation's administrator or LeanZero support. Never include credentials or recovery pairing secrets.

10About this guide

This manual covers Cost Slasher. The 0.4.2 paid beta was uploaded to production as Forge 3.0.0 from the verified v0.4.2 source. Upload does not qualify a new native installation or establish a customer release. The retained publisher native test baseline is 0.3.2, executing Forge 2.0.0 with app billing disabled; current storage bootstrap and ordinary-user checks still need their own evidence. Cost Slasher is Paid via Atlassian, billed against the required Jira installation's users; Confluence is optional and your Atlassian subscriptions and seats remain separate. The starting tariff of USD13.20 per month or USD132 per year for up to ten Jira users was saved and reloaded in Marketplace. Progressive prices are intended to fund AWS/Forge running costs, the Marketplace fee and an operating buffer under the launch workload estimates; see the pricing decision and actual saved pricing. App review ECOHELP-170877 was automatically rejected with Not enough details on listing; listing completion and review remain open. Customer admission remains closed. This guide does not announce public availability. Use the current quality state and implementation ledger to distinguish uploaded source, installed build and actual acceptance.

11Marketplace licence and existing commitments

In the uploaded paid build, fresh access checks, allocations, configuration and automation require the server's trusted Marketplace context to report an active Cost Slasher licence. A trial or other no-charge entitlement is valid only when Atlassian reports license.active: true; a missing or unknown value is refused. Opening a page, an OAuth identity grant or a Cost Slasher REST token does not purchase a subscription or confer licence authority. Current account, scope, permissions, eligibility, storage and provider safeguards still apply.

Recorded-result reads remain subject to current permissions. Narrow safety handling preserves an exact proven prior-release recovery or fully held return commitment, issued-effect readback and genuine security compensation after licence lapse; it is not a general unlicensed grant. Read the original operation's result rather than assuming a restore. The retained historical 0.3.2 native baseline did not execute these paid checks and does not qualify the uploaded build.

12Open the application

Open Apps → Cost Slasher in Jira or in the connected Confluence site. My access is the default view for every authenticated member. Jira Service Management agent access appears separately through the Jira entry; this manages an agent seat, not customer portal access or a guest recovery space. The Forge installation requires Jira and can connect Confluence on the same site. A second site requires its own installation and registered controller.

Navigation follows current app capabilities. Members see My access, Time away and What's New. Operators can inspect Operations, People, Policies and Consumption in their assigned scope. Routing managers see Routing. Auditors can inspect their assigned operational, people, policy, audit, management-report and consumption records. Administrators receive configuration, permission and API-token controls. A visible button never overrides the server's account, site, app or object checks.

The native app follows the surrounding Jira or Confluence theme automatically. Change it through that app's Profile → Theme control; Cost Slasher has no separate native theme button or saved override. The standalone recovery website has its own theme control because it has no Atlassian app frame.

What's New and the App release footer show the installed build's authored release metadata. The uploaded build's authored release is 0.4.2 Beta; the retained native test evidence is for 0.3.2 Free beta. Confirm the actual installed build separately. The latest notes are shown first; expand Earlier releases for the retained history. The same notes are available in the release notes. This is separate from Forge's deployment numbering. The publisher's development-only Storage evidence → Executing app version inspector, when enabled by the server, is also separate from the installation's Storage safety check. Neither authored notes nor a version number proves a released production version.

An account without a paid app seat may be unable to open that app's Apps menu. Its route back is the configured native access-denial message and the linked recovery website. Arrival and sign-in do not grant access automatically.

Site labels use the hostname from the configured HTTPS site origin. The stored site title may come from Jira's server information and read simply “Jira”, even beside Confluence; it is not a separate app choice or a verified human site name. If no valid site origin is available, the interface uses only the supplied name or reports the site identity unavailable. Access, recovery, time-away, routing setup and administration use the same display rule; it does not alter the bound site identifier.

13Member access and restoration

My access keeps each configured Confluence, Jira and Jira Service Management app's status, inactivity allowance, last observed activity and permitted action visible. Jira Service Management refers to agent access. Warning deadlines, protection, planned returns, blocking reasons and current operations remain beside the relevant app. Expand Access details for the recorded verification time and seat-pool state; closing it does not hide those primary obligations.

My access shows the last recorded access information without making a fresh organisation-directory call or creating access. Last verified access status and Last verified identify an earlier membership observation, not current eligibility or recent app activity. The page retains the configured inactivity allowance, recorded warning and managed seat state; a return seat reservation is shown only when its matching evidence verifies it. Missing or unverified details do not establish current eligibility, available access or absence. When the current setup and permissions permit it, an unverified access entry offers the explicit check described below. Earlier unfinished requests block new restoration and booking actions. No per-account activity snapshot is currently published, so activity remains Activity unavailable; it is not proof of inactivity or a never-used account. A policy can exist while automatic release is disabled.

For a new or unverified safe target, choose Check my Confluence access, Check my Jira access or Check my agent access in the Jira Service Management row. The agent button's accessible name is Check my Jira Service Management agent access. An unknown target with no original verification time and an authorised explicit check displays Not checked yet. This describes the missing verification; it does not establish eligibility or available access. A completed check can record Access status unknown while another explicit Check remains permitted; for example, observed paid access outside the managed target requires reconciliation. Its original checked time is retained. That status does not establish absence, a free seat or eligibility for restoration. If the check is unavailable, the original disabled state and explanation remain visible. Last observed activity → Activity unavailable is separate: the access check does not produce an app-activity observation, so that field can remain unavailable after eligibility is positively checked. A recorded activity date is shown only with known activity; No use recorded requires explicit never-used evidence, not an absent date. The explicit access check verifies current account status, source membership, destination writability and paid-access mapping under your current permission and the shared provider budget. It grants nothing and reserves no seat. Incomplete evidence remains unknown. A positively refused expired observation or changed-binding publication offers Start a fresh access check; an uncertain delivery keeps the original check reference. A successful eligible check records a Ready to request access target and shows Restore Confluence, Restore Jira or Restore agent access; press it separately to request the licence. Current paid access outside the managed target is not silently adopted.

For a verified recorded Ready to request access or released state, use the app's Check and restore action when the server returns canRestore: true and a real access identifier. Current eligibility remains unknown until that explicit request performs the fresh complete account, membership, role and capacity checks. The application records an explicit request and shows its real operation state. A provider acknowledgement or a processing state is not successful re-entry. Wait for verified access, then use the app-home link or reload the original page or work item tab. Existing space, project and work item permissions still apply.

If the pool is full, the request remains waiting with its recorded expiry. Waiting allowance comes from the app policy (24 hours by default); inspect the actual request expiry rather than assuming the default. A member can cancel a cancellable waiting restore or request a permitted fresh check. Cancellation never revokes access that has already been granted. Cancellation cleanup pending or Expiry cleanup pending retains the original terminal request while its allocation/waiting cleanup settles; it does not reopen another request. A cancelled time-away booking likewise blocks a new booking while its original cleanup is pending. If a provider write is uncertain, the app reconciles it before deciding the outcome; submitting a different reference is not a safe way to force another grant.

The recovery URL is https://cost-slasher.leanzero.net/recover/<organisationLink>. Use Sign in with Atlassian, inspect the account and available site/app choices, then explicitly check a safe missing target or restore the selected recorded app. An uncertain access check keeps its original request reference: choose Retry original access check. It is not a restoration operation and is not polled as one. A successful eligible check still needs the separate Restore click. Account switching clears the previous account's records before starting a new OAuth journey. Normal recovery sign-in requests User Identity read:me only, has no offline refresh grant, and does not use an organisation API key. Recovery is visually consistent with the native app but is hosted outside Atlassian.

View access history beside the Your access heading reveals the history section and moves keyboard focus there without checking or changing access. Your access history starts with the latest recorded events and returns at most five visible events per page. Known actions and stages use the same vocabulary as Audit; the richer access and cancellation explanations remain. Request accepted, Result recorded and Processing finished do not prove a licence change. Ordering uses recordedAt, the time the app recorded the fact. The displayed timestamp uses occurredAt, when the action happened; a delayed event can therefore appear near the top with an older action time. When the times differ, hovering over the timestamp shows its Recorded time. Next page follows the server's continuation to earlier recorded events; Previous page returns to an earlier visited page. The page number is not a total. A sparse or empty page with Next page does not establish that the remaining history is empty; continue through the available pages. Loading and failed reads do not present the previous page's rows as the requested page.

Your requests and Your data and privacy start collapsed. Your requests loads its history only on first opening, showing up to five durable requests per page with Inspect request, current results and available chunks. Its history is not fetched for the initial collapsed My access view. Closing either panel preserves its selected or in-flight processing result while you stay on My access. It does not cancel the server request, save drafts permanently or promise that a reload will retain the open panel.

14Check a lost native response

Saved requests appears in the native workspace when this browser has a retained request reference. Those references survive navigation and reload in the same browser storage. They are bound to the current account, site, installation, app and Forge environment. Switching account or installation does not make another scope's saved work available. The browser retains the command, original request key, an input digest and safe work references; it stores no form values, credentials or one-time secrets for replay.

Choose Check saved request before submitting another change. This reads the original acceptance/result using freshly checked scope and your current permissions; it does not rerun the action. View recorded operation, View recorded request or View recorded storage check, when offered, opens the actual retained work. Use Refresh recorded work for a fresh read. A recorded request means the server retained it, not that the access change, delivery or other work succeeded.

If no acceptance record is found, that is not proof that nothing happened. Use Return to action and the accompanying guidance. Where a retry is permitted, enter the exact original input and reviewed version so the app can retain the same request reference; changed input is blocked while that intent remains unresolved. Only an explicit server-confirmed no-effect result establishes that this request had no effect. Keep in recorded work removes the browser's saved entry after a fresh accepted-work check; it neither cancels nor completes server work. Your requests remains the durable request history, distinct from this browser list. A lost token-creation response cannot recover its one-time secret here: inspect the credential and explicitly rotate or revoke it if needed.

15Time away

From My access choose Plan time away, or open Time away. The shortcut opens planning after this page's access records load and at least one app permits a booking. Select Apps whose stored records permit an explicit booking check, set Departure, Return and Time zone, then choose Preview return before confirming. canPlanAbsence permits that preview; it is not a forecast of eligibility or a seat reservation. The preview checks current eligibility, and confirmation makes the capacity decision. Ambiguous daylight-saving times require the selected occurrence; a nonexistent local time is refused.

If a successful access read finds no app that permits planning, Plan time away stays disabled. The page shows any recorded app reasons and offers Review my access, or asks you to contact your administrator if that navigation is unavailable. It does not open a booking form or run an access check automatically. While access is loading or could not be checked, the empty booking hint asks you to wait or retry rather than treating the result as known ineligibility. If an empty visible booking page still offers Next page, use it to continue; that page does not establish that no bookings exist. An unblocked preview has not reserved a return seat. Confirm time away, or Confirm changes when editing, requests the booking separately. Blocked previews retain their exact returned reasons. Preview results and errors are brought into view and focused inside the dialog, including on a narrow screen.

Confirmation requests a separate booking and return seat for every selected app. Inspect every returned booking: a pending result or unconfirmed seat reservation is not a guaranteed return. A confirmed return seat remains reserved while away; it does not become a free seat available to another person. Restoration is scheduled to start 30 minutes before the recorded return time, subject to current eligibility, account status, controller authority and provider availability.

Editing keeps the existing booking's app and requires its current version and a fresh preview. Make another booking to add another app. For an away booking, cancellation offers an explicit choice to request restoration now or keep access released. I'm back early requests restoration using the reserved return seat. Proven loss of eligibility invalidates future return commitments; incomplete directory reads cannot establish that loss. Check the booking and actual operation result after an edit, cancel or early return.

An unconfirmed access result is neither a verified change nor proof that the request made no change. Keep the original reference and use its offered check or retry. Cancelling time away does not undo access work already started, and any access already restored is kept. Check the booking and actual operation result afterwards: a recorded cancellation may still need verification and does not prove that its return seat reservation was released.

16First administrator and storage preparation

A freshly verified native Jira site administrator can bootstrap a genuinely empty permission roster. An unreadable roster is not treated as empty, and an existing roster cannot be replaced by bootstrap. Keep at least one directly assigned Administrator covering Confluence, Jira and Jira Service Management on this bound site; narrower administrators can coexist.

At first installation the app may show Preparing Cost Slasher with completed and total storage steps. Use Check setup progress to read the current migration result. Native checks retry while the tab is visible, with bounded attempts. A failed migration requires investigation; refreshing does not prove it has recovered.

Administrators see a compact setup guide on arrival with the next required step and one action. Choosing it opens the correct Administration section and focuses the relevant field or button; an app-specific policy action opens that app's editor. Members and scoped operators do not receive this guide or request administration/key metadata. Setup reads do not call Atlassian's organisation API or change licences.

After a setup change is acknowledged and a fresh matching read confirms that step, the existing next action is brought into view and receives focus. It does not open or submit the next task. Setup review dialogs preserve the field you have chosen and keep submitted controls and dismissal locked while processing; changing page, choosing another section or moving focus to the surrounding Atlassian page cancels an older handoff. Failed or superseded refreshes, unavailable health and queued adoption do not advance the guide. Capacity adoption needs its exact completed result and freshly verified pool readiness before it can qualify.

Administration retains four tabs: Setup, Permissions, API tokens and Support and privacy. On Setup, Setup status shows the next step, current storage qualification, bound organisation/site, controller authority, API-key health and selected-app readiness. View setup checklist expands the complete ordered journey. Finish storage safety before configuring the organisation. Unselected Confluence, Jira and Jira Service Management apps read Not managed; they are optional. A manual-access policy can keep automatic release off. Activity verification is required in the guide only for apps whose automatic-release policy is enabled. Current storage qualification is one specific check; it does not establish complete returning-user acceptance, provider throughput or production capacity.

The six sections, in order, are Storage safety, Organisation connection, Licence groups, Activity checks, Returning-user recovery and Controller shutdown. Initially they are closed; a guided action opens its exact section. Otherwise open one at a time by clicking its heading or using Enter or Space. Closed sections appear in two columns on a wide screen; an expanded section uses the full width. Narrow screens use one column.

Use Left or Right while an Administration tab has focus to select the adjacent tab, wrapping at either end. Home selects Setup; End selects Support and privacy. Tab leaves the strip for the selected panel. These keys do not change sections while you type in a field or use a review dialog.

Closing a Setup section preserves its unsaved fields, previews and in-flight results while you remain on Setup; it does not save configuration. The submitted credential clears after its save attempt while a newer unsent replacement draft is preserved; pairing secrets clear after an import attempt or dialog close. A new section error opens the relevant section and unresolved errors keep a visible problem indicator even after you close it. If another review dialog is open, the error section opens after that dialog closes. Permission checks, version checks and review dialogs still apply to every action.

Open Administration → Setup → Storage safety → Storage safety check and choose Start storage safety check. A freshly verified Jira site administrator with current Cost Slasher administration permission starts this check in the native app. No organisation API key or recovery pairing is needed for it. The server independently binds it to this exact installation, site, app, environment, executing source and storage schema. The uploaded 0.4.2 build's compiled recipe runs the full 18 safety cases in 88 units against actual Forge SQL and related storage, using disposable records and verified cleanup. This recipe needs its own installed qualification; the retained 0.3.2 report does not approve the changed source. Partial progress, a passing individual case or acceptance alone does not enable configuration or access writes.

The original server job continues after navigation or reload; reopening Storage safety retrieves it without a manually retained browser key. Refresh storage check reads its progress and complete case/cleanup result. Refresh storage readiness reads the current server approval. Storage approval published describes the report's publication; continue only when the fresh readiness check above says Storage is ready for this installation. An earlier report cannot replace current approval after a relevant source or schema change.

Storage check will retry means the server scheduled another attempt for that same job. Its original administrator's current Jira and Cost Slasher authority is rechecked before further work and publication. Storage needs attention without a scheduled retry requires investigation: retain the original diagnostic reference and contact support. A failed safety race or unresolved cleanup cannot be reset with a new request key or bypassed with a manually supplied certificate. Do not configure access while storage remains unqualified. This approval establishes the installation's storage safety contract only; app activity, recovery, notification delivery and capacity require their own checks.

The separate Storage evidence inspector is enabled only for the publisher's sanctioned Wolfaenpak development installation. It starts a read when that panel first opens; Refresh storage evidence makes a new observation. Closing and reopening retains that observation while you remain on Setup, and leaving Administration unloads it. It does not run the installation safety job, approve storage, verify an API key or substitute for current setup readiness. Customer storage qualification does not require this developer inspector.

17Connect the organisation and save its API key

Open Administration → Setup → Organisation connection. Under Organisation and directory, save the exact Organisation ID and Directory ID with Save connection details. After apps are mapped, rebinding to another organisation or directory is blocked and requires a safe controller handover.

Under Organisation Admin API key, enter the key in Admin API key and choose Save API key. It is stored in Forge secret storage, scoped to this installation; neither the recovery browser nor AWS identity service receives it. The consumed submitted key is cleared from its field; a newer unsent replacement draft is preserved. Use Replace API key to store a replacement key that you created in Atlassian Administration; Cost Slasher does not create or rotate the key there. Remove API key removes the stored key from Cost Slasher, blocks new Atlassian changes and retains accepted work for reconciliation; it does not revoke that key in Atlassian Administration. Cost Slasher API-token rotation and revocation are separate controls under API tokens.

If pairing and its controller lease are already current, saving the key also checks the connection against the exact saved revision while that save remains the current action. Starting another action, editing a newer draft or navigating away cancels this automatic follow-up. Otherwise the next guided action is Review Recovery pairing. The pairing is required for the shared organisation API budget; saving a key alone cannot bootstrap a provider check.

Use Check API key to make one bounded read of the exact configured directory. Healthy means Atlassian accepted that key and positively returned that directory; it does not prove group write permissions or successful restoration. Health is valid for 24 hours and is bound to the current installation, site, organisation, directory and saved key. Replacing the stored key or rebinding clears it. Not checked, Check again, Needs attention and Could not check describe distinct states. A 401 rejection or 403 permission refusal differs from a rate limit, provider outage or unverifiable response; those temporary/unknown results do not mark the key invalid or leave an old green status visible. The timestamp is the Last check attempt. Key expiry is not inferred or independently established by this directory check. Setup has no continuous automatic monitoring; read the in-app status and explicitly recheck when required.

For a separate group capability check, expand Advanced group permission check, set Test group ID and choose Check group permissions. It reads exact group metadata and role assignments without adding or removing a person. Negative provider results are recorded and replace earlier health evidence. An uncertain durable acknowledgement keeps the original request identity; it is not proof that the check did nothing.

An open visible workspace refreshes the stored setup projection once when recorded key health or the current controller lease expires; a hidden tab waits until it becomes visible. That read does not call the provider health-check command. A failed refresh removes current green indicators and offers retry; it does not repeat an uncertain provider check.

Policy editors explain Inactivity allowance (days) (days before a warning may become due), Warning period (hours) (minimum time after confirmed warning delivery before fresh checks may release access) and Restore protection (hours) (hours protected against inactivity release after a verified restore). Protected vacation returns are separate. The front-facing policy cards retain their concise facts. Returning-user recovery coverage and evidence choices show only the currently selected app mappings; optional unmapped apps do not request tests.

18Pair the publisher recovery service

Use Request pairing from LeanZero in the pairing section to open LeanZero support, even before a customer support URL is configured. The link sends no installation details or credentials. Pairing is a publisher/IAM operation, not an organisation administrator's email invitation and not a public registration endpoint. The actual provisioning CLI and private-file procedure are in OPERATIONS.md. Enrollment must identify the exact Forge installation, organisation, site, apps, recovery webtrigger and managed destination IDs. Existing ownership conflicts block enrollment.

The CLI writes separate recovery and notification keys to a mode-600 private export. Open Administration → Setup → Returning-user recovery → Recovery service pairing → Import private pairing. In Import recovery pairing, paste the complete export into the masked Private pairing export field, then choose Import and verify pairing. The server requires freshly verified native site-administrator authority and checks targetInstallationId and organisation against this exact installation. The field clears after every attempt and on close. After a lost acknowledgement, inspect controller status; while the dialog remains open, pasting the same export retries the same intent key. The command stores keys in Forge secret storage and verifies a controller lease. Pairing revocation is an implemented REST lifecycle command. Do not paste keys into audit reasons, screenshots, URLs, filenames or repository files.

19Connect each managed app

In Administration → Setup → Licence groups → Managed apps, choose Review app mapping to open Connect app access groups. In App, select Confluence, Jira or Jira Service Management. Enter Eligibility source group IDs, Licence group ID, Managed seat limit and Approval reference. Choose Preview mapping, review the current impact, then use Apply approved mapping only when it is unblocked.

Source groups establish eligibility. A SCIM-managed source stays a read-only source. The separate destination must be explicitly writable, in the exact directory, and grant exactly the selected paid app on the bound site. Mapping does not convert a SCIM group into a writable group or provision an account into another directory. A destination shared by multiple managed apps, an unregistered owner or unverifiable roles blocks setup.

Once mapped, replacing its paid destination, pool, resource or paid roles is blocked with HANDOVER_REQUIRED, even when the pool is currently free. Released-entitlement history and protected return commitments still belong to the original binding; this build does not migrate them to a replacement. Source eligibility, capacity and display/activity bookkeeping can change on the same paid binding. Capacity changes freeze the exact physical pool before publishing configuration, preserve occupied allocations and resume only a matching saved checkpoint. A changed or unverifiable target remains unavailable for operator review. Repeated unchanged discovery observations preserve the visible setup version and existing reviews.

Applying the mapping records app configuration, creates its disabled automatic-release policy, and queues a complete read-only discovery/adoption reconciliation. It does not grant every source member a seat. Capacity activation depends on the complete actual destination/effective-access snapshot. Existing paid access must be accounted for; an alternative grant is a conflict, not a reclaimed seat. Inspect Operations → Background work, its recorded reason and the relevant request result. Never certify adoption from a selected-person sample or an empty query without proving the exact target is visible. In Administration → Setup → Licence groups → Reconcile existing seats, choose Review existing seats to open Review complete licence group. Select an enabled mapped App, then Preview seat reconciliation. The scope must match its configured destination and pool. An incomplete preview shows observed members and “Not established” for the total; Queue seat reconciliation reconciles every remaining page without granting access. Inspect the returned request, its seat-reconciliation result and recorded reasons. Changing app or configuration requires a fresh preview.

20Configure the native recovery message and prove it

From Administration → Setup → Returning-user recovery → Recovery message, copy the generated Native access message and stable URL. An organisation administrator saves that message in Atlassian Administration → Apps → App access settings for the intended internal domains, with Direct access and Request access disabled. This build generates instructions and text; it does not save that Atlassian setting automatically.

Use Mark message configured only to acknowledge the actual saved setting. This acknowledgement is separate from Record actual journey evidence. For each app, use the same ordinary test account that has actually lost its paid seat: open its original page or work item and app home, see the denial message, follow the recovery link, sign in as that account, explicitly restore, and enter the app. Capture the old-link and app-home outcomes. For Jira Service Management test the real agent role and agent workspace; customer portal access is not evidence of an agent seat. An administrator screenshot, synthetic account or successful membership request is insufficient.

Record the actual tested account, app and evidence in the UI. That is administrator attestation; release acceptance also needs retained browser/provider evidence. Do not mark an app tested to hide an incomplete or unsupported denial surface. Recovery-message coverage and zero-seat OAuth remain acceptance gates until the ledger records those actual outcomes.

21Policies and activity gates

Open Policies → Edit policy. Set Inactivity allowance (days), Warning period (hours) and Restore protection (hours), then preview before saving. New mappings default to 30 days inactivity, a 48-hour warning period, 48 hours restore protection, a 24-hour waiting allowance and automatic release off. App policies are separate.

For this beta, keep automatic inactivity release off for each app until returning-user recovery, confirmed warning delivery, activity coverage and seat capacity have been verified in that environment. A storage pass does not establish these outcomes. Jira Service Management agent inactivity release remains disabled without reliable agent-activity evidence.

The warning period must be a whole number from 24 to 720 hours. The minimum accounts for Atlassian's activity reporting delay and applies even when automatic release is off, so a saved policy remains valid for explicit restore and release. Native validation, REST previews/saves and the licence engine enforce the same minimum. Restore protection is a separate setting. The waiting allowance is the request's expiry window, not a promised time to receive a seat.

Unknown or unparseable activity is not a never-used account and is not a release candidate. Activation requires complete adoption, verified app-specific activity coverage and tested native-message recovery. Jira Service Management also requires agent-activity evidence; ordinary Jira activity or customer portal activity is insufficient. In Administration → Setup → Activity checks → Verify activity checks, choose Verify app activity for a mapped Confluence or Jira app. In Verify recorded app activity, enter the exact Test account ID in its managed group, a recent controlled UTC activity window of at most 72 hours, and a Test evidence reference, then choose Check actual activity. The server reads every activity page and requires the exact mapped resource ID and product key plus an actual timestamp inside that window. Inspect the returned account, resource, product key, observation, checked time and reference. A delayed, empty, malformed or partial source does not pass. Jira Service Management is deliberately unavailable in this control; automatic agent reclamation remains disabled. Do not edit stored readiness booleans as an alternative.

Atlassian defines this activity as a product-page view of at least two seconds and can report it up to 24 hours later. Plan the controlled ordinary-account exercise accordingly, then repeat the check when the actual observation is available. Atlassian last-active documentation.

Automatic inactivity work warns first and rechecks the current policy, sources, account status, protection and activity before removal. Warning transport acceptance is not confirmed delivery. A removal counts as reclaimed only after effective access is verified absent. Manual restore/release and scheduled return use the same capacity, ownership and evidence engine.

Open Inactivity exclusions inside the policy editor to add or remove specific accounts for this app. Find people searches only your permitted app scope, with ten results per page; no roster is loaded while the section is closed. Add by Atlassian account ID accepts an exact known identifier when search is unavailable. Saved IDs remain selected even when the person is absent from the search. Five selected accounts are shown per page. Adding or removing an account invalidates the earlier preview; use Preview impact → Apply reviewed policy to save the reviewed set and current version. A fresh readback compares the actual account identities, not their count. Use Refresh policies after a conflict or an unconfirmed readback.

Exclusions apply only to automatic inactivity release for this app. They neither grant eligibility nor prevent security, eligibility-loss or separately reviewed changes. Removing one restarts the current policy warning checks; a previous warning cannot bypass the new revision or its full warning period. The final inactivity-release dispatch rereads eligibility, activity, entitlement and policy after recording its intent. A last read is not an atomic transaction with Atlassian; uncertain provider results remain occupied until verified.

22Permissions, API tokens and routing

In Administration → Permissions → Cost Slasher permissions, use Add permission to open Add Cost Slasher permission. Choose Person or group, Role, the exact account or group ID, Site IDs and Apps. Blank scope grants nothing. Routing manager grants also require approved source and destination boundaries. Edit permission and Remove permission use the roster's current version, not the individual grant row version. Unknown group membership does not confer authority. Cost Slasher roles do not change the person's Atlassian administrator role or space/project permissions.

Group authority requires a fresh, unambiguous response for exactly the acting account in the configured directory, with active account and organisation membership and an explicit matching group. Foreign or duplicate accounts, missing status, malformed groups, incomplete pagination, partial HTTP responses or a changed organisation binding leave membership unknown and deny that group grant. An absent embedded group is not proof of non-membership. Direct app grants remain separate; REST credentials also require their owner's current active organisation status and current app roles. Queued fresh writes recheck the original actor and token revision. This source repair does not by itself verify a deployed tenant; see the permission evidence contract.

RoleAdditional authority in assigned scope
MemberOwn access, explicit eligible restore, bookings, history and own data requests.
OperatorLicence operations, People, policy reads, scheduled cases and Consumption; no permission, credential or cap changes.
Routing managerRouting authoring and management within approved source/destination boundaries.
AuditorOperation, People, policy, audit/export, management reports and Consumption; no licence or configuration writes.
AdministratorPolicies, pools, setup, permissions, API credentials, audit/export, management reports/rates and retention.

Paid group routing, including moving out of a paid source, also needs current scoped Operator/licence authority on every affected app. A Routing manager grant alone cannot change paid access. Runtime rechecks preserve the original publisher identity and do not invent a privileged service actor.

In Routing, save a draft, preview its current impact and publish. Add contributes matching membership; Mirror maintains only its owned contribution; Move verifies the destination before removing explicitly approved writable source memberships. Manual and other-rule contributions are preserved. Pause an active rule before editing its boundaries. Current previews are bounded account slices and must report continuation/partial coverage; they are not invented directory totals. Choose Remove rule, then explicitly choose Keep existing memberships or Remove only this rule's owned contributions. Review the preview before confirming. The selected handling is fixed once removal is recorded. Retain stops the rule and preserves its memberships. Cleanup runs in bounded, restartable pages and preserves manual access, other owners, uncertain receipts and protected returns. A partial preview is not a whole-directory count, and a recorded cleanup is not completed removal; follow the rule and background status until verification finishes.

In Administration → API tokens → Cost Slasher API tokens, choose Create token. In Create API token, enter Token name, Token expiry, Allowed apps and Allowed capabilities, review the bound Site, then choose Create scoped token. The secret is displayed once. Store it before I have stored it. A token lasts at most one year and never exceeds the owner's current authority; revocation, suspension, unknown issuer status or loss of issuing authority prevents new use. Rotate invalidates the old secret and its captured issuance for queued fresh writes; Revoke refuses subsequent calls and unissued work from that token. Already-issued changes still receive readback and genuine compensation, and an exact protected held return remains an existing commitment. Read the REST guide for object IDs, previews, expected versions and operation/request tracking.

23Operations, exports and notification results

Operations displays recorded exceptions, Managed seats, scoped returns, recent operations and background work. A blank page with Next page is not a global empty result. Follow server continuations. Free capacity is unavailable when the pool is not verified; held returns and unknown writes remain occupied. Existing waiting restores are queued again when that same pool is fully verified or an owned seat is actually freed. The app resumes the original request in FIFO order; do not submit another restore to make it move. Queue delivery or permission checks can still defer processing, and the five-minute scheduled sweep remains the recovery fallback.

Work titles describe the returned action and app: Restore Confluence, Release Confluence, Reconcile Confluence or Check scheduled returns. A verified restore displays Access restored; a verified release displays Access released. Waiting, refused, cancelled and reconciliation states remain separate from a completed change. Expand the shortened Operation reference, Job reference or Request reference to inspect its full value and use Copy reference when reporting an issue. A pending request without a returned app keeps a general title; the interface does not invent its scope.

People searches within assigned scope and preserves every visible app entry for each whole account. Choose the exact app in App to manage before selecting people for a bulk restore/release. Add a reason, preview the exact selected accounts, then Apply reviewed changes. Processing acceptance does not mean every account's access changed; inspect the request's chunks and each operation reference.

Background pause/resume reviews the exact public job ID, app and version. Reconcile an app starts a new app request through jobs.start; choose a managed app in Review app reconciliation. A row's Reconcile app uses jobs.reconcile with that existing job's public ID and matching app. Both record requests and do not immediately settle provider effects. A state conflict requires refreshing the current job. Exception Retry check queues verification and must not blindly repeat an unknown membership write.

Reconciliation and adoption handoffs currently checkpoint with a five-minute retry before the five-minute scheduled sweep. Recorded can therefore remain visible between processing steps, even when a pool has already been verified. Refresh the same request reference and inspect its actual completion/results. Submitting another request does not prove the first completed or make an uncertain provider change safe to repeat.

Audit supports case-insensitive Search, occurrence dates through Period, Event category, Outcome, App and More filters for entry point, exact actor/subject, reference search and exact action/outcome codes. Inspect shows original occurred/recorded times, action/outcome, actor/subject, site/product/object/version/operation, reason and allowlisted structured details. New routing evidence records intent, provider acknowledgement/unknown/rejection, pending readback and final observed membership. Warning acceptance/unavailability differs from confirmed delivery; only first confirmed delivery starts the complete warning window. Missing older details are not reconstructed as historical facts.

The Event and Outcome columns use readable labels for known codes. Check API key directory access, Save app mapping and Record administrator-attested recovery journey describe different actions. Request accepted, Result recorded and Processing finished describe recorded stages; none confirms an access change or notification delivery. Inspect → Exact action and Exact outcome, the exact-code filters and exported CSV/JSON retain the original codes. Unknown codes appear unchanged.

Access present (verified) and Access absent (verified) describe the achieved access state. The state may already have existed, so these labels alone do not establish that Cost Slasher performed a membership write. Available recorded details, including appWriteVerified, retain that distinction; absent historical provenance remains unverified. Management access-change counts still require their separate matching original write evidence.

Editing a filter changes its draft. Apply filters updates the query and the displayed Applied scope. The App choices follow a separate accepted audit-permission descriptor; policy-management permission does not imply audit authority. All assigned apps reads only current permitted records. Missing metadata does not infer scope from visible navigation or a flat capability. A saved app filter outside newly assigned scope remains visible with guidance to choose a permitted app or reset; it is not silently rewritten. Unapplied edits do not change a prepared export. Rows return at most twenty events per page. On a narrow screen, the event table scrolls horizontally to its actor, outcome and Inspect columns.

Choose Download matching events, review Export app and the readable Export filters summary, then choose Prepare export to freeze those exact filters and the recording cutoff. An explicit applied app stays fixed. A productless read can be visibly narrowed to one authorised export app without changing the live view; a single permitted app is selected for you, while multiple separate app grants require a choice. A combined all-app export requires one covering current grant; separate app grants cannot be unioned to invent that authority. REST issuance also limits the accepted descriptor. The server independently rechecks current permissions when preparing and retrieving each export. Exact filter details optionally reveals the final machine filters. New audit exports include all matching retained hot/archive events and publish a v2 manifest with row, byte, part and digest totals. Download complete CSV and Download JSON validate the whole traversal and recheck current authority. Download manifest is beside the whole-file downloads. Saved filters and numbered parts reveals the saved filters and individually validated parts when a whole file exceeds 32 MiB. During a download, only the selected action shows progress; other download actions wait until it finishes. CSV quotes Unicode and multiline fields and protects spreadsheet formulas; import reference columns as text. JSON preserves exact safe machine values. Retrieval cannot recover expired or unpublished source evidence. New v2 audit/report parts are read one bounded part per page; older request families retain their ten-part page contract.

The selected report and audit export remain available when moving between Reports and Audit in the current workspace session. Their original scope, reference and expiry remain unchanged; returning to them does not prepare another artifact. To reopen an earlier own request, use Operations → Your requests → Open management report or Open audit export. Inspect request remains available for recorded outcomes and older request chunks. Every artifact read still checks current permission and expiry; a completed historical request is not a promise that its download is still available.

Your requests on My access and Operations shows the current member's durable requests. An export/deletion/delivery test reports every recorded result and reason. Processing finished is a processing state, not a guarantee of delivery, deletion or successful licence changes.

For older request families, use View available chunks to retrieve at most ten published chunks per page. Inspect each chunk and Download chunk N as JSON. Every download re-reads the bounded page so current permission and expiry checks apply. Request chunks expire after 30 days; an empty chunk page does not prove that source records are absent. Downloads contain returned section, index, expiry and rows; there is no public pre-signed export URL in this build.

Under Administration → Support and privacy → Notification delivery, Send delivery test targets the signed-in account. Inspect its request status. Accepted is not Delivered. Customer delivery readiness also depends on SES sandbox/verified-recipient restrictions; a configured domain or successful send request is not mailbox proof.

A complete eligible inactivity scan is scheduled again one day after it finishes. Partial scans interrupted by an Atlassian request limit or a short worker deadline keep their original progress and resume after the recorded retry time. Discovery also preserves those unfinished reads; a request limit alone does not establish unknown membership. Event polling remains every five minutes. An unverified event response retains an unknown status and uses a daily source-reconciliation fallback; verified new event IDs can request an earlier refresh. These timings do not establish that a large directory completes within one day. Scheduled returns and existing operations keep their separate prompt checks.

Background work separates the recorded control state from timing evidence. Fresh at check means this one recorded job was complete, paused, deferred, leased or within its expected scheduler window at the dated check; it does not establish whole-engine health. Progress overdue means no recorded progress after its due/retry/lease boundary and one five-minute scheduler opportunity. Missing or inconsistent timing is Freshness unknown. Checks expire after at most five minutes without automatic network polling; use Refresh background work for current records. Existing Pause, Resume and Reconcile controls keep their current permissions and revision checks. Sparse, empty or paged results do not prove that all jobs are healthy.

24Share a management report

Open Reports, choose Last 30 days, Last 90 days, Previous calendar month or Custom dates in Period, and select your assigned scope in App. For Custom dates, enter From date and the inclusive Through date before choosing Generate report. Dates use UTC; a current day ends at the displayed server cutoff. The maximum window is 366 days. Generate report records a resumable request and changes no licence. Once prepared, its management brief and PDF, CSV and JSON downloads appear first. During a download, only the selected action shows progress; other download actions wait until it finishes. New report settings and Prepare another report reveal the controls without generating anything; use the separate Generate report action for a new request. Reports require reports.read/reports.export, granted to scoped Auditors and Administrators. A complete REST generation/download workflow needs explicit reports.export, reports.read and me.read in the API token, within its site/products and the issuer's current authority. Native roles already include me.read; tokens do not inherit omitted capabilities. Narrow scopes cannot silently become all products. REST GET with requestId returns owned status/results/chunk-count metadata; the full report is the validated management-report artifact from requests.parts. See the REST guide for the exact routes.

The management brief contains Verified access removals, Verified access grants, already-absent/present outcomes, Change origin unverified, per-app/day/channel/cause aggregates and separately dated capacity. An access-change count requires the matching original acknowledged write journal and verified effective-access outcome; missing retired journals remain unknown. Capacity requires the exact completely adopted and verified current mapping/pool and coherent physical allocation totals, with fresh binding/pool checks. Unknown or unconfigured capacity is not zero. Held returns, pending writes, unknown and external allocations remain distinct from free seats.

The chart's Highest daily removals or grants is the largest count of either outcome on one UTC day, rather than the period total or the sum of removals and grants. One removal and one grant on the same day gives a scale of 1 while the period summary retains both outcomes.

Expand Optional capacity value estimate to supply monthly seat-price assumptions and a three-letter currency. This needs current site-level app administration.manage throughout generation and every status/artifact read; assumptions are frozen for the report. A REST token also needs that capability explicitly and issuance for all three apps to pass the site-level administration check, even for a single-app report. App-limited tokens have canSetRates:false. Losing administrator authority blocks later retrieval of a report containing these assumptions even if ordinary report access remains granted. The estimate uses verified free capacity only, is labelled as a planning estimate and does not represent invoice savings, billing totals or historical seat-days. The sharing PDF has no individual account identities; its source section includes the report/site references, period, cutoff, scan/observation dates and definitions. A completed scan covers available retained records only and explicitly does not establish complete historical coverage. Published reports expire after 30 days and every download rereads current permission and the frozen report.

Publisher deployment must configure a dedicated encrypted COST_SLASHER_AUDIT_CURSOR_KEY (32 random bytes encoded as 64 hexadecimal characters) in each Forge environment and redeploy. Public audit continuations are authenticated to this installation/site and normalized filters; changing filters resets the continuation. An absent/invalid key fails closed. Rotation invalidates existing public audit continuations; it does not rewrite original audit facts, encrypted archives, internal keysets or prior export formats. See reporting implementation and acceptance.

25Read consumption measurements

Consumption shows the selected app's observation window and recorded source coverage. Background work → Records handled counts records handled during application background processing, not the provider's invocation total. App network payloads → Observed payload bytes covers only explicitly observed payloads; unavailable bytes remain Unavailable, not zero. Partial coverage, Complete coverage, Unavailable and Not used describe the returned collection evidence. Complete coverage for one source does not establish an organisation-wide total. Unknown source, metric and coverage codes appear unchanged. Read each source's explanation alongside its figure.

Consumption reports retain applicable warning reasons after background archiving, including a warning observed before the day it was recorded. If older evidence cannot be verified, coverage remains partial. Missing evidence is never presented as a verified zero.

26Privacy and support

Business records are stored in Forge for the required Jira installation. Recovery identity, registry and minimal notification processing use AWS Ireland, with CloudFront global transit. Normal users have no refresh-token grant. A separate publisher-only read:me/offline_access grant supports Atlassian personal-data reporting and is encrypted in Secrets Manager.

Defaults are 365 days business audit and 90 days usage retention. In Administration → Support and privacy → Privacy and retention, enter reviewed audit and/or usage days from 1 to 3650 and choose Save retention. Leaving one field empty preserves its current setting. A changed retention setting applies to newly recorded events. Existing events keep their recorded expiry, including idempotent replay; changing the setting does not rewrite history. Minute usage aggregates keep the latest expiry of their contributing measurements. Consumption shows the current setting and the actual app-scoped collection window; an unverifiable setting stops new recording and report metadata rather than substituting a default. Recovery sessions expire after eight hours, OAuth attempts after ten minutes, nonces after two minutes and proxy/minimal notification receipts after 30 days. Account inventories use a 48-hour fallback erasure-index margin and a scheduled 17-minute cleanup; revocation/write-fence hashes expire after eight hours plus five minutes. TTL deletion and encrypted backup removal are not immediate deletion guarantees.

Members can open Your data and privacy to request their records or deletion. Cost Slasher processes deletion requests to remove cached names and email addresses and expire personal exports; access safety and audit records are retained. Inspect the resulting request: the worker reports retained/scrubbed records and verifies recovery-session revocation separately, which can need attention or remain unverified. It leaves the Atlassian account and app access unchanged. See the actual public privacy disclosure, beta terms, security policy and incident runbook. Support is the Cost Slasher support portal.

Ordinary-account zero-seat recovery, deployed provider throughput, verified activity and routing journeys, and physical storage headroom at 20,000 users remain acceptance gates. The compact UI, local journeys and this manual do not establish those outcomes. Check the implementation ledger for the latest exact deployed evidence before enabling customer-facing automatic release.

27Stop a controller before removal or handover

In Administration → Setup → Controller shutdown, inspect the current generation, revision and unresolved-record count. Review controller shutdown → Stop and verify pending work freezes new work at the reviewed revision. Only operations proven never to have started can be cancelled; existing paid access is preserved and unknown provider effects remain counted. A lost acknowledgement retries the same intent and reviewed revision. Refresh shutdown status reads the current result; an unavailable count remains “Not verified”. Inspect the recorded reason and separate operation, membership, capacity and unfinished-cancellation counts. These are unresolved journal records, not distinct people or HTTP writes. Handover proof recorded appears only after the controller is locally frozen, every unresolved count is verified zero and the registry confirms its stop. There is no automatic controller resume or unattended uninstall handover. The publisher follows the exact replacement procedure in OPERATIONS.md.

28About this guide

This REST guide covers Cost Slasher. The 0.4.2 paid beta was uploaded to production as Forge 3.0.0 from the verified v0.4.2 source. Upload does not qualify a new native installation or establish a customer release. The retained publisher native test baseline is 0.3.2, executing Forge 2.0.0 with app billing disabled; current storage bootstrap and ordinary-user checks still need their own evidence. Cost Slasher is Paid via Atlassian, billed against the required Jira installation's users; Confluence is optional and your Atlassian subscriptions and seats remain separate. The starting tariff of USD13.20 per month or USD132 per year for up to ten Jira users was saved and reloaded in Marketplace. Progressive prices are intended to fund AWS/Forge running costs, the Marketplace fee and an operating buffer under the launch workload estimates; see the pricing decision and actual saved pricing. App review ECOHELP-170877 was automatically rejected with Not enough details on listing; listing completion and review remain open. Customer admission remains closed. This guide does not announce public availability. Use the current quality state and implementation ledger to distinguish uploaded source, installed build and actual acceptance.

The API is dispatched through the exact installation's cost-slasher-api dynamic Forge v2 webtrigger. It shares the native command handlers and floors. It is separate from the recovery website's browser/session API and signed recovery webtrigger. Refer to API-CONTRACT.md for the route inventory and the evidence ledger for live acceptance limits. An inventoried native-only command is not a callable REST integration endpoint.

29Marketplace licence and existing commitments

In the uploaded paid build, fresh access checks, allocations, configuration and automation require the server's trusted Marketplace context to report an active Cost Slasher licence. A trial or other no-charge entitlement is valid only when Atlassian reports license.active: true; a missing or unknown value is refused. Opening a page, an OAuth identity grant or a Cost Slasher REST token does not purchase a subscription or confer licence authority. Current account, scope, permissions, eligibility, storage and provider safeguards still apply.

Recorded-result reads remain subject to current permissions. Narrow safety handling preserves an exact proven prior-release recovery or fully held return commitment, issued-effect readback and genuine security compensation after licence lapse; it is not a general unlicensed grant. Read the original operation's result rather than assuming a restore. The retained historical 0.3.2 native baseline did not execute these paid checks and does not qualify the uploaded build.

30Obtain the entry and credential

An authorised administrator first completes Administration → Setup → Storage safety → Start storage safety check in the native app. This exact-installation check needs current Jira site-administrator and Cost Slasher administration authority, not an organisation API key. The uploaded 0.4.2 build's compiled recipe requires all 18 cases and 88 units, cleanup and current server approval to pass before saving organisation connections or managing access. An earlier-source approval cannot qualify this changed recipe. The original server job resumes after navigation or reload; a failed safety race cannot be reset with a fresh request key. Follow the administrator guide for progress, scheduled retry and investigation guidance.

Then bind the organisation, save its organisation Admin API key and import the publisher's exact-installation pairing through native Setup. Initial issuer/provider verification needs the paired shared organisation budget; an unpaired REST token is not a bootstrap workaround. API-token authentication must establish the issuer's active account status; an unconfigured or unreadable organisation is not an active issuer.

Create a scoped token under Administration → API tokens. Select capabilities, the bound site, products and an expiry within one year. Keep the one-time secret in your integration's secret store. This app token is not an organisation API key, an Atlassian OAuth access token or the publisher pairing secret. The current implementation also rechecks the owner's apiCredentials.manage issuing floor, so an ordinary member cannot independently mint a recovery integration token.

The publisher commands below are development-only examples for the sanctioned Wolfaenpak test installation; they do not establish a production entry or customer admission. A customer integration must use the actual approved installation's supplied API URL. Using the new app directory and Node 22, discover the development installation webtrigger without changing any other application:

node scripts/forge.mjs webtrigger list -e development -s wolfaenpak.atlassian.net -p Jira -f cost-slasher-api

If the development installation has no entry, the authorised publisher can create that exact entry:

node scripts/forge.mjs webtrigger create -e development -s wolfaenpak.atlassian.net -p Jira -f cost-slasher-api

Append the catalogue path to the returned v2 base URL. The entry validates userPath and request method; do not invoke the recovery webtrigger as the public REST surface. URLs and IDs in the examples below are deliberately placeholders, not deployed endpoints or real credentials. A new entry, a reachable URL or an HTTP success does not prove a returning-user grant.

31Request and response rules

Send Authorization: Bearer <Cost Slasher token>. GET uses query parameters and no body. Nonempty request bodies require Content-Type: application/json; maximum body size is 131,072 bytes. The route determines the command. Do not supply acting actor, door, credentialId, credentialRevision, verifiedNativeAdministrator or installationId. Own endpoints do not accept another acting account. Conflicting path, query and body fields are refused.

Mutations require a unique Idempotency-Key of 16–128 ASCII letters, digits, underscores or hyphens. Retain that key when retrying the same exact intent after a lost acknowledgement. Reusing it with a changed command, input or expected version is an idempotency conflict. An uncertain receipt is reconciled; a new reference must not be used to force a repeat provider write. Preview and search POSTs are read-only at the catalogue boundary and do not require a mutation key.

The native Saved requests feature retains only browser request references and input digests; it does not save form data or secrets for replay. Its me.mutations.read command requires the native account and trusted installation scope and freshly rechecks permissions. It is not a public REST replay or secret-recovery endpoint, despite its catalogue path /v1/me/mutations/{idempotencyKey}. REST integrations must retain their own original key, exact input and expected version, retry only that same intent when permitted, and inspect the normal operation/request routes below. A missing acceptance record or an unknown outcome is not proof of no effect.

For versioned changes send If-Match: "N" or JSON expectedVersion: N, using the exact returned current version. A disagreement is refused. Permission grant edits/removal use permissions.list.data.version, the singleton roster version. Job pause/resume handlers also require the job version even though the catalogue's general version flag is false. Token rotation/revocation accepts an expected version and the native UI always supplies it.

Accepted deferred work keeps the original token's server-validated issuance revision. Before any new provider write, the worker checks that exact active revision, the issuer's current permissions and organisation status, and the current site, product and group boundaries. Rotation or revocation cannot authorise an unwritten action through an old queued token; a legacy queued REST intent without its issuance revision also cannot start a write. Already-issued effects still require reconciliation or compensation. An independently verified protected return retains its existing commitment under the same eligibility and allocation checks; a request labelled as a return is not proof of that commitment. Source regressions and live limits.

All calls return an envelope:

{
  "ok": true,
  "data": { "items": [], "cursor": null, "complete": true }
}

or:

{
  "ok": false,
  "error": {
    "code": "PERMISSION_DENIED",
    "message": "You do not have current authority for this action and scope.",
    "retryable": false,
    "reference": "example-reference"
  }
}

The Forge REST entry uses HTTP 202 for an operation/request reference in accepted, waiting, running, verifying or compensating state, and 200 for other successful results. Inspect ok and the actual state; neither status establishes effective access or completed processing. Error mapping includes authentication 401, denied scope 403, unavailable record 404, conflict/replay 409, retryable unavailability 503, and invalid requests 400; explicit ingress errors can use 405, 413, 415 or 429. There is no universal Location operation header or Retry-After header contract.

Default token budget is 90 requests per minute. Provider work also uses the organisation-wide gateway budget and persisted retry holds. Respect refusal/retry outcomes rather than issuing parallel retries to bypass either limit.

32Discover exact own access and restore

Before using these examples, capture the issued token in the current Bash or zsh session. Run this command, paste the token when input waits, then press Return; input is hidden. The token stays in the shell variable and is not written into shell history.

read -r -s COST_SLASHER_REST_TOKEN

Each example passes its authentication configuration through curl's standard input, keeping the expanded token out of process arguments. Replace the endpoint and resource placeholders with your exact installation values. Do not enable shell tracing while using a credential.

curl --config - --request GET \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/me/access' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

data is {account, capabilities, items, sites, version, configured}. Every item identifies its product and site, a nullable entitlementId, recorded status, eligibility, inactivity allowance, observation dates, protection, openUrl, verification, poolState, restorationCheckRequired, canRestore, canCheckAccess and canPlanAbsence. waitingExpiresHours is the validated policy allowance or null. The GET reads stored projections only and neither calls the business directory/profile provider nor creates an entitlement. A missing record has no public access identifier and remains unknown. verification: recorded means its original verification time is retained; it does not prove current eligibility. There is no published per-account activity snapshot in this cut, so eligibility and activity stay unknown on landing. canRestore permits an explicit fresh-check request, and canPlanAbsence permits the existing eligibility preview; neither forecasts a grant or protected return. Items follow the token's current product scope; a single-product token cannot inspect another product through this own endpoint. Do not infer restoration authority from eligibility alone. Null dates and unknown activity remain unknown.

When canCheckAccess:true, a never-discovered safe target can first perform an explicit check:

curl --config - --request POST \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example_own_check_0001' \
  --data '{"siteId":"REPLACE_WITH_SITE_ID","product":"confluence"}' \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/me/access/check' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

The check requires current own me.restore, offering and scope authority. The uploaded paid build requires server-verified current Marketplace licence authority for a fresh check. A valid trial is accepted only when Atlassian reports license.active: true. The retained historical 0.3.2 native baseline had billing disabled; it does not qualify this uploaded paid build. Installation, permission and all access controls still apply. The check returns data:{item,message,checkedAt,outcome} and creates no operation or paid provider effect. Complete fresh eligible/no-paid-access evidence can record a safe unallocated Ready target; incomplete evidence creates no target, and existing allocations/original unresolved work remain pinned. An eligible result is not a restored licence. Same-key replay preserves the original result and time without another provider request. Uncertain results must retain the original key; do not poll a check as an operation. ACCESS_CHECK_EXPIRED / ACCESS_CHECK_CHANGED positively refuse before target mutation and permits a new explicit check key.

Then submit a separate Restore using the exact returned entitlementId, site and product and a distinct idempotency key:

curl --config - --request POST \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example_restore_intent_0001' \
  --data '{"siteId":"REPLACE_WITH_SITE_ID","product":"confluence","reason":"Account explicitly requested restoration"}' \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/me/access/REPLACE_WITH_ENTITLEMENT_ID/restore' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

The response contains operation, with public operationId, product, site, kind, state, message, dates and any waiting expiry, retryable, canCancel or verified. Poll GET /v1/operations/{operationId}. If a cancelled/expired operation has cleanupPending:true, its original cleanup is still unsettled; keep observing that operation before starting a new intent. An owner can read their operation without administrator privileges; cancel/retry owner exceptions apply only to their permitted explicit restore, not another actor's release or scheduled work. verified: true establishes the engine's effective-access result, after which the real product entry must still be tested.

33Page collections without assuming global emptiness

Collections use {items, cursor, complete}. Treat cursor as an opaque continuation, URL-encode it, and keep filters unchanged across pages. Reset it when filters change. An empty page with a continuation is not an empty directory, request history or audit log. Native lists use bounded integer limits; general server pages default to at most 100 records. Older request families return at most ten parts per page; new v2 audit/report artifacts return one bounded part. Follow every required continuation to assess whole-scope completeness.

curl --config - --request GET --get \
  --data-urlencode 'product=confluence' \
  --data-urlencode 'query=Example person' \
  --data-urlencode 'limit=25' \
  --data-urlencode 'cursor=REPLACE_WITH_SERVER_CURSOR' \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/people' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

People pages contain whole accounts with all authorised product entries. A search page may be empty before a later matching account. Audit accepts q (casefolded Unicode text, up to 160 characters), family, outcome (exact stored code or group:verified|pending|refused|failed|cancelled|unknown|recorded), product, door, exact actorId/accountId/action, substring reference, and canonical UTC from inclusive/to exclusive occurrence bounds. query is not an audit search contract. Supported families are licences, returns, routing, policies, permissions, setup, requests, privacy, security, other. Entry points are native, rest, recovery, schedule, event. Public continuations are bound to normalized filters and installation/site. Group search uses POST with query; the native picker displays a bounded set and asks users to refine it.

34Preview and apply a reviewed bulk action

The bulk access command requires one product, exact accountIds (1–1,000), action restore or release, and reason. Preview the same input first:

curl --config - --request POST \
  --header 'Content-Type: application/json' \
  --data '{"product":"confluence","accountIds":["REPLACE_WITH_ACCOUNT_ID"],"action":"release","reason":"Reviewed managed-access action"}' \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/access-actions/preview' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

Inspect every change and blocker. The preview is account-, installation-, command-, input- and revision-bound and expires after five minutes. Apply only the exact reviewed input, adding its returned previewId; use the returned version and a mutation key:

curl --config - --request POST \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example_bulk_intent_0001' \
  --header 'If-Match: "0"' \
  --data '{"product":"confluence","accountIds":["REPLACE_WITH_ACCOUNT_ID"],"action":"release","reason":"Reviewed managed-access action","previewId":"REPLACE_WITH_PREVIEW_ID"}' \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/access-actions' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

The example version 0 is illustrative; replace it with the returned version. The apply response is a durable data.requestId, not a fabricated operation total. The worker rechecks current configuration and authority for every item and creates individual operation references. Finished request processing does not verify their access.

35Time away and protected returns

POST /v1/me/absences/preview with products, precise UTC departureAt/returnAt and an IANA timezone. To preview an edit also include the existing absenceId; editing retains its single product. A preview does not reserve a seat.

POST /v1/me/absences with the same dates/products/timezone and previewId, plus an idempotency key. The response contains `data.items`, one booking per product, and aggregate hasCommitment. Inspect every item instead of assuming a single combined absence or all-or-nothing success. Each booking returns its public absenceId, version, state, confirmed protection and returnStartsAt.

PATCH /v1/me/absences/{absenceId} uses a fresh edit preview and current expected version. Cancellation uses POST .../cancel with choice: "restore-now" or "keep-released"; early return uses POST .../return-early. Owner actions remain account-bound. Operator /v1/absences actions require the actual target product's licence floor. An advertised upcoming list is not a separate authoritative count; inspect the returned dates.

36Track requests and retrieve exports

Read GET /v1/me/requests, then GET /v1/me/requests/{requestId}. The result has kind, state, created/updated dates, every recorded results entry, reason, chunkCount and an explanatory message. States are accepted, running, complete, attention. The native UI labels complete Processing finished because a completed request can contain retained data, a transport acceptance or operations still awaiting verification.

Export/purge/privacy/test requests use this result family. REST status and part retrieval require explicit me.read in the issued token, plus audit.export for audit exports or reports.read for management reports. Native Auditors and Administrators already receive me.read with their role; a REST token does not inherit capabilities omitted at issuance. Privacy requests target only the signed-in owner. Audit downloads and every chunk's capability/product rows are re-authorised against current permission. An expired, unpublished or mismatched chunk is not returned.

curl --config - --request GET \
  'https://REPLACE_WITH_FORGE_V2_BASE/v1/me/requests/REPLACE_WITH_REQUEST_ID/parts' <<COST_SLASHER_AUTH
header = "Authorization: Bearer ${COST_SLASHER_REST_TOKEN}"
COST_SLASHER_AUTH

Older parts contain {partId,index,section,expiresAt,rows} and an opaque continuation, with at most ten parts per page and 100 rows per part. New audit v2/report parts additionally contain digest, bytes, rowCount, with one byte-bounded part per page. Follow continuations explicitly, inspect all recorded reasons, and save the authorised JSON. There is no pre-signed export-link endpoint. Chunks expire 30 days after request creation; absence of a downloadable chunk does not prove that the source record never existed.

POST /v1/audit/exports with the same filter fields and an idempotency key. The request freezes normalized filters, oldest-recorded-first ordering and its original creation time as the recording cutoff. A completed request contains a cost-slasher-audit-export-v2 manifest with filters, recordedThrough, expiresAt, exportedRows, exportedBytes, chunkCount, partsDigest, source/retention notes and complete:true. Traverse every owned requests.parts page and validate section, expiry, ordinal, count, byte length and SHA-256 digest; verify the complete manifest totals and digest chain before treating the file as complete. Digests use the shared canonical JSON artifact encoding (recursive sorted object keys); original audit/body serialization and v1 formats are unchanged. Downloaded JSON contains the manifest and exact safe events. CSV contains event/time/actor/subject/entry-point/action/outcome/product/site/object/version/operation/reason/structured-details columns. Neither export reconstructs expired or unpublished source records. The native whole-file reader has a 32 MiB limit and offers numbered parts above it.

37Prepare management reporting

GET /v1/reports/management reads definitions, assigned products, allowed maximum period and server-default period, requiring current reports.read. POST the same route with an idempotency key and {from,to,product?} to create a bounded resumable reports.generate request, requiring reports.export. from/to are canonical UTC ISO timestamps, exclusive upper bound, maximum 366 days, with to no later than request creation. Omitting product requires authority for all requested products; narrow scopes must supply the permitted product.

For the complete REST generation and download workflow, issue reports.export, reports.read and me.read for the intended site and products. reports.export admits and scans the request; publication of its artifact also checks reports.read. Every owned status/artifact read checks me.read and reports.read, including GET with requestId. The token's current owner must retain API issuing authority as well as the required report permissions; rotation, revocation or loss of that authority refuses subsequent reads and pending work.

Optional {currency:"EUR",unitMonthlyRates:{confluence:12.5}} assumptions require current site-level app administration.manage throughout generation and on every metadata/artifact read. For REST, the token must explicitly include administration.manage and all three products (confluence, jira, jsm-agent) because this administration check has site-wide scope, even when the report itself selects one product. A product-limited token cannot set or retrieve these assumptions; its definitions return canSetRates:false. Rates are nonnegative, at most 1,000,000 and at most four decimal places; currency is a three-letter uppercase code. They do not change policy or billing. Only verified currently free seats contribute to the planning estimate; uncertain and protected capacity does not.

Read the owned requests.read status until complete. GET /v1/reports/management?requestId=... returns the same owned status metadata: requestId, kind, state, created/updated dates, results, reason, chunkCount and message. It accepts only a management-report request and does not return the full report body. Retrieve that body through GET /v1/me/requests/{requestId}/parts (requests.parts), whose single management-report part contains the report in rows[0] after current authority, completion, integrity and expiry checks.

The cost-slasher-management-report-v1 artifact includes site/report references, products, frozen period/request time, generated time, source cutoff/scan/retention caveats, verified actual app removals/grants, already-state and unknown-provenance counts, per-product/day/channel/cause aggregates, dated capacity, optional estimated value and metric definitions. It contains no individual account identities. source.scanComplete:true means the retained scan finished; source.retainedWindowComplete:false explicitly refuses a historical completeness claim. Missing original acknowledged-write journals cannot become app-change counts.

Clear the token variable when you finish:

unset COST_SLASHER_REST_TOKEN

38Administration and less common lifecycle actions

POST /v1/setup/connection/check requires administration.manage, an Idempotency-Key, and If-Match: "N" for the current installation configuration. Send an empty JSON object, or supply JSON expectedVersion: N instead of the header. It reads at most one exact-directory page after the paired shared request budget admits it, then records scoped health evidence. It changes no group membership. A completed result returns {credential,version,message}; credential.state is healthy, rejected or unavailable, with a sanitized reason and checkedAt. A healthy result also includes validUntil; a rate limit may include retryAt. Completed negative health is still an acknowledged result, not an unsuccessful delivery to resubmit under a new identity. A lost durable acknowledgement remains uncertain.

GET /v1/setup returns current missing/not-checked/healthy/stale/rejected/unavailable credential state, pairing presence, actual controller lease, scoped selected-product readiness and a safe storage qualification summary. Its qualified and state values come from the exact current installation's server-validated approval and job; it does not expose the native diagnostic report or confer authority to start one. Health becomes stale after 24 hours, and rotation/rebinding invalidates earlier evidence. accessReady excludes activity coverage; ready additionally requires activity/recovery policy evidence only when automatic release is enabled. Disabled/unmapped products are Not managed. Credential healthy and product ready do not substitute for storage.qualified:true with storage.state:"qualified", establish key expiry or product-role writability, or prove returning-user restoration. See the directory API reference for the exact provider read and read:directories:admin scope.

The full inventory lists binding, credential, mapping/pool previews, pairing, controlled activity verification, policy lifecycle, grants, token lifecycle, routing, jobs, support and privacy settings. These actions use the same scoped authority as the native UI. Some implemented lifecycle commands are REST-only in the current UI, including pairing revocation, retention purge and policy archive. A route's existence is not permission to perform a production configuration change.

setup.activity.verify uses {product,accountId,from,to,evidenceReference} and the configuration expected version. It reads complete actual product activity and records proof only for a matched recent controlled window (at most 72 hours). Confluence/Jira are supported; JSM agent activity is refused. The result is {product,version,coverageVerified,proof,message}; an evidence string alone does not establish coverage.

permissions.settings does not install a wildcard or permissive default. It returns the current explicit-scope policy. permissions.recoverAdministration requires the freshly verified native bootstrap authority and an actually empty roster; an API token cannot forge that flag.

routingRules.delete requires a fresh deletion preview and the current rule version. Preview with {ruleId,action:"delete",contributionDisposition:"retain"} or the explicit disposition "cleanup-owned"; then submit the same ruleId and disposition plus previewId, expected version and idempotency key to DELETE /v1/routing-rules/{ruleId}. The reviewed choice is immutable after acceptance. Retain archives the rule without membership removal. Cleanup freezes new contributions, checks its paged ownership ledger and removes only proven app-owned contributions under current authority, preserving manual/shared/unknown access and protected returns. Its deleting state is pending work, not verified cleanup.

jobs.pause/jobs.resume need exact job ID and current version. POST /v1/jobs (jobs.start) records a new reconciliation request for the selected configured product; native Reconcile a product uses this route without a job ID. POST /v1/jobs/{jobId}/reconcile (jobs.reconcile) requires a valid existing public job ID and must match its stored product; native row-level Reconcile product uses that exact job. Inspect the returned request and background result before claiming a pool is reconciled.

Reconciliation/adoption handoffs can wait for a five-minute retry and the subsequent five-minute scheduled sweep. Poll the recorded request with backoff; do not create another request to bypass that wait. Pool verification and the request's finished reconciliation result are separate evidence.

The current source wakes accepted waiting requests when a pool becomes verified or a release makes capacity available. It retains the same request and FIFO position, rechecks each original actor, and serialises competing drains and fresh claims. An uncertain check yields with its recorded backoff; held allocations and unknown effects never become available through a wake. Lost queue acknowledgements retain the internal signal for bounded scheduled recovery. Consult the current deployment ledger before treating source tests as installed latency evidence.

diagnostics.sqlFence, diagnostics.sqlFence.status and diagnostics.sqlFence.read serve the native installation storage safety flow. Each requires freshly verified native Jira site-administrator identity and current Cost Slasher administration permission. A REST token cannot start or inspect that job, or impersonate its original administrator. The separate diagnostics.storage.read inspector remains restricted to the publisher's sanctioned Wolfaenpak development installation; it is not a customer bootstrap mechanism.

Provider or authority failures expose a machine code, readable message and reference. For VERSION_CONFLICT or PREVIEW_EXPIRED, re-read and review a fresh preview. For COMMAND_UNCERTAIN, provider unknown/write-unsettled or lease loss, retain the request reference and follow OPERATIONS.md; do not resubmit with a new key or erase operational records.

Audit and usage retention settings accept integer days from 1 to 3650. Their current setting applies to newly recorded facts; prior event expiries and idempotent replays remain unchanged. Usage minute aggregates keep the latest contributing expiry. usage.read requires an explicit product for a narrowly scoped caller and returns window: {from,to}, sources, coverage, complete, collectedAt and current retentionDays. Null or unavailable source measurements remain unknown. An unverifiable retention setting fails closed rather than reporting a default.

39Verified controller shutdown and native storage checks

GET /v1/controller returns {state,version,controllerGeneration,localStopped,zeroPendingVerified,registryStopped,canHandover,pendingWriteCount,counts,checkedAt,reason?}. An administrator can submit POST /v1/controller/stop with an empty JSON body, retained Idempotency-Key and If-Match containing this controller version. It freezes new work and queues exact reconciliation; existing paid access stays in place. Poll the read route and inspect every count and recorded reason. The counts are unresolved records, not distinct HTTP writes. Only exact zero plus matching local freeze and confirmed registry stop permits controlled publisher handover. A stopped controller has no public automatic resume.

The catalogue inventories POST /diagnostics/sql-fence (start), GET /diagnostics/sql-fence (current status) and GET /diagnostics/sql-fence/{proofId} (job read). These commands are native-only, not REST integration calls. The native UI retains the original start key and reads the server's current job after reload. A job projection includes {jobId,state,progress:{completed,total,caseName},report,approvalPublished,auditPending,retryPending,reason?}. retryPending:true describes a scheduled retry of that original job, not permission to create a replacement. Only the complete passing recipe, verified cleanup, approval publication and fresh matching current approval establish qualified storage. A failed race, unresolved cleanup, partial progress or old-source report cannot enable writes; there is no manual certificate bypass. See the administrator setup guide for the actual UI journey.

40Policy inactivity exclusions and job timing

policies.preview and versioned policies.update accept excludedAccountIds, an array of up to 1,000 nonempty account identifiers. The server trims and deduplicates valid strings. Omit the property to preserve the saved set, or send [] to remove all exclusions; supplied null, booleans, numbers and empty strings are refused. Use the exact reviewed array with its preview ID and current policy version. The same command, permission and audit boundaries serve native and REST requests. Exclusions affect automatic inactivity only, and a new policy revision requires a new delivered warning before an inactivity release. Other access-change purposes retain their separate rules.

GET /v1/jobs adds response checkedAt and a per-item health object: {state,reason,message,checkedAt,validUntil,expectedBy?}. Health states are fresh, overdue and unknown. The separate existing item state remains the control state; health never authorises a write or retry. The check derives only from validated stored timestamps, explicit retry/due times and bounded worker leases. One five-minute scheduler opportunity is allowed after the relevant boundary; a future deferral, completed run or paused run is not overdue. Unknown evidence has no validity deadline; known observations expire within five minutes. Preserve the scoped storage cursor even for an empty visible page. This bounded read makes no directory calls, scheduling changes or whole-engine health assertion.

Discuss Cost Slasher beta access.

Tell us about your apps, identity groups and intended scope while the paid beta is prepared.

Talk to us