Skip to content

docs: README and CHANGELOG for users; 0.3.0 - #8

Merged
secretpray merged 11 commits into
nextfrom
feat/next-docs-release
Nov 6, 2026
Merged

secretpray merged 11 commits into
nextfrom
feat/next-docs-release

Conversation

@secretpray

@secretpray secretpray commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Depends on #7. README, CHANGELOG and version 0.3.0.

Changes

  • README for users of the gem: API key, quick start, methods and return types, models and units, batch starts, restart semantics, sessions and SSH, errors, retries and configuration
  • CHANGELOG: the changes of this series, user-facing only
  • VERSION = "0.3.0"
  • Doc comments and the 401 hint updated; the default host constant is OctaSpace::DEFAULT_BASE_URL, and the persistent alias of keep_alive is removed
  • Files for maintainers only are removed from the repository

Verification

  • rake test on Ruby 3.3, 3.4 and 4.0: 0 failures; standardrb and bundle-audit: clean
  • gem build --strict: the gem contains only lib/**/*.rb, README, CHANGELOG and the license, and installs and loads on all three Rubies

The SDK becomes a bare library on the way to the next API:

- remove the Rails playground (test/dummy, bin/playground,
  lib/octaspace/playground), MockTransport, the Rails Engine and the
  Appraisal/Rails matrix; the Railtie stays (no Rails dependency)
- require Ruby >= 3.3 (3.2 is EOL); CI tests 3.3, 3.4 and 4.0
- CI: actions pinned to commit SHAs, read-only token, concurrency,
  runs on main and next and on every PR, strict gem build,
  bundler-audit job
- Dependabot for bundler and actions, targeting next, 3-day cooldown
- faraday >= 2.14.3 (fixes published advisories); minitest 6,
  current webmock/standard/rake; railties and puma removed
- docs/GIT_WORKFLOW_NEXT.md: how to work with the next branch
Transport for the next API (api-dev.octa.space):

- Authorization: Bearer <api_key>; a pasted "Bearer " prefix and
  whitespace are stripped; 401 with a non-octa_ak_ key explains that
  legacy tokens are refused
- per-endpoint auth mode: :required raises AuthenticationError before
  any request when no key is configured, :optional sends the key when
  present, :none never sends it
- default base URL https://api-dev.octa.space (BASE_URL_DEV); the
  production hosts still serve the legacy API
- errors: 400 -> ValidationError, 409 -> ConflictError, 503 ->
  ServiceUnavailableError; message taken from {"message"}; ApiError
  exposes retry_after, rate_limit and body
- RateLimit-* headers parsed into OctaSpace::RateLimit, the latest
  available as client.rate_limit; Retry-After as seconds or HTTP date
- retries only for GET and idempotent requests, on network errors and
  429/502/503/504, honouring Retry-After up to max_retry_after (60 s);
  POST start/restart are never retried
- failover across base_urls only for GET; a request that changes state
  is never sent to a second host
- JSON parsed by the SDK: empty 202/204 bodies are fine, a non-JSON
  2xx body raises ApiError
- logging is one line per request; headers (API key) and bodies are
  never logged, and on_request no longer sees headers
- faraday-retry dependency removed
- client.compute: list (GET /services/compute, key optional),
  start (object -> 201, returns the uuid), start_batch (array -> 200,
  per-item BatchResult), restart (POST .../restart -> 202; no params
  restarts with the original ones, params replace all of them)
- client.render: list, start(node_number:), start_batch
- typed read-only models (OctaSpace::Model) for ComputeMachine,
  RenderMachine, Gpu, Reliability and BatchResult; unknown fields are
  kept and reachable via [] / to_h
- listings repair "null" strings and string GPU integers so one
  misreporting node does not break the listing
- request bodies carry only the parameters that were set (ssh/fm
  stay tri-state), unknown parameters raise ArgumentError; batch items
  get their position as id, duplicate ids raise ArgumentError
- removed: services.mr, services.vpn, services.render,
  ProvisionRejectedError, PayloadHelpers.normalize_marketplace_bandwidth
- client.sessions: list (GET /sessions), get (GET /services/{uuid}/info),
  logs(uuid, tail:) (GET /services/{uuid}/logs), stop (POST .../stop ->
  202, retried as idempotent), wait_ready (polls until "ready", yields
  each state, SessionStoppedError on 404, WaitTimeoutError), and
  wait_stopped (polls until 404)
- typed sessions picked by the service discriminator: ComputeSession,
  RenderSession, and a plain Session for an unknown service; NodeHw,
  SessionSsh/SshEndpoint (endpoint prefers direct over proxy),
  SessionLogs/LogEntry; started_time / time convert Unix milliseconds
- Model.redact: inspect hides ssh.web and fm, URLs that grant access
- removed: services.session(uuid) proxy (info/logs/stop),
  logs(recent:), stop(score:), sessions.list(**params) and the old
  Types::Session
- client.hosting: nodes (GET /hosting/nodes, online nodes only) as
  HostingNode with prices, services (offered?/reason), activity,
  system (memory/disk usage, GPUs), location, online_time;
  set_prices(number, base:, storage:, traffic:, min_rent_minutes:)
  (PATCH -> 204), only given fields, integers only
- client.stats: gpu_current(verified:), gpu_history(gpu_name:,
  verified:, from:, to:, step:) keyed by model with GpuHistory#points
  turning the parallel arrays into points, gpu_locations; no key sent
- client.accounts.balance -> Balance {balance, currency, decimals}
  with to_usd / formatted; client.network.info -> typed Network
- OctaSpace::Money: format, to_usd (Rational), from_usd; exact
  integer micro-USD arithmetic
- "null" strings repaired in stats and hosting GPU data
- removed: nodes (list/find/ident/logs/reboot/update_prices), apps,
  idle_jobs, accounts.profile / generate_wallet, PayloadHelpers and
  the old Types::Account/Balance/Node value objects
- README rewritten for the next API: API keys, resources table,
  models, units, batch starts, restart semantics, sessions and SSH,
  error hierarchy, retry policy, configuration, Rails
- docs/migration-next.md: 0.2.x -> 0.3 mapping of client,
  resources, data, errors and behaviour
- CHANGELOG: 0.3.0 (unreleased)
- bin/smoke: live checks of every read endpoint; --compute NODE adds
  a paid start / wait_ready / logs / stop round trip that always stops
  the session it started
- CI: read-only smoke job on pushes (never on pull requests)
- version 0.3.0; doc comments no longer point at legacy hosts
The repository is public; its documentation is for people who use the
gem, not for its development process.

- remove docs/GIT_WORKFLOW_NEXT.md, docs/migration-next.md,
  PUBLISHING.md, bin/smoke and the CI smoke job
- README: drop the branch/test-stand banner, the "next-generation"
  wording, installation from a branch, the development section and the
  feature list; use placeholder node numbers
- CHANGELOG 0.3.0: user-facing changes only
- code comments and the 401 hint no longer talk about "next" or
  "legacy" APIs; drop BASE_URL_DEV and the persistent alias
- test fixtures move out of test/fixtures/next
- dependabot: drop the comment about branch plans
@secretpray secretpray changed the title docs!: README, migration guide and smoke test for the next API; 0.3.0 docs: user-facing README and CHANGELOG; 0.3.0 Nov 3, 2026
@secretpray secretpray changed the title docs: user-facing README and CHANGELOG; 0.3.0 docs: README and CHANGELOG for users; 0.3.0 Nov 6, 2026
README, guides under docs/, CHANGELOG, YARD comments, gem metadata and LICENSE for users of the gem; placeholder data in test fixtures.
@secretpray
secretpray changed the base branch from feat/next-hosting-stats to next November 6, 2026 10:34
@secretpray
secretpray merged commit 74dde41 into next Nov 6, 2026
5 checks passed
@secretpray
secretpray deleted the feat/next-docs-release branch November 6, 2026 10:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant