axstack 0.58.0 → 0.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axstack",
3
- "version": "0.58.0",
3
+ "version": "0.59.1",
4
4
  "description": "Axstack installer and setup CLI: installs owned chat skills and role data, configures supported harness settings, and checks T3 Code capabilities.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -47,8 +47,27 @@ A successful Codex response containing only a seven-day primary window (secondar
47
47
  absent/null) is authoritative single-window telemetry: the adapter explicitly marks
48
48
  session n/a. It does not synthesize session capacity. A plain incomplete snapshot
49
49
  without this provenance still holds; weekly is always required. An account needs
50
- remaining quota in every applicable window. Null or absent reset timing is valid for
51
- Claude session/weekly/scoped Opus and Codex windows. The adapter omits the missing
50
+ remaining quota in every applicable window.
51
+
52
+ Claude session n/a requires an explicit `five_hour: null`, valid `seven_day` usage
53
+ and future weekly reset, and exactly one active, unscoped `weekly_all` row in
54
+ `limits` with matching percentage and identical reset string. Every limits row
55
+ must be validated weekly metadata: only `weekly_all` and model-scoped
56
+ `weekly_scoped` rows with valid percentages, future weekly resets and boolean
57
+ `is_active` are supported. Scoped rows require a named model and null surface.
58
+ Any session row contradicts n/a, even when `is_active: false`; that flag never
59
+ hides a present session or scoped weekly usage. Unknown/malformed limits,
60
+ non-null legacy `seven_day_opus`/`seven_day_sonnet`, error fields, missing fields
61
+ or null without corroboration hold. No plan name, bootstrap outcome, zero usage
62
+ or fabricated reset establishes n/a. All accounts remain counted; supported scoped
63
+ rows remain in telemetry with existing Opus eligibility checks. Source/account
64
+ freshness and catalog guards still apply.
65
+ This narrowly supported response shape does not establish universal null semantics
66
+ or an account's plan/verification status. Model scope names retain their existing
67
+ meaning; no Fable-to-Opus mapping is inferred.
68
+
69
+ For ordinary Claude session/weekly/scoped Opus and Codex windows, null or absent
70
+ reset timing is valid. The adapter omits the missing
52
71
  reset; it never invents a timestamp. Unknown reset timing alone does **not** mean
53
72
  unused or not started: the reported used percentage still governs remaining quota,
54
73
  same-account eligibility and the primary-pool reserve, including exhaustion at 100% used.
@@ -0,0 +1,68 @@
1
+ # Independent delivery
2
+
3
+ Apply this contract during Spec, Tickets and Implement within the accepted
4
+ scope identity. Keep the existing spec, ticket map or small-change intent as
5
+ the record; this adds neither a planning artifact nor execution authority.
6
+
7
+ ## Plan outcomes and boundaries
8
+
9
+ Spec must name independently deliverable outcomes, their acceptance checks,
10
+ and produced and consumed interfaces. An outcome is independently deliverable
11
+ when its accepted result can be verified and delivered without waiting for an
12
+ unrelated outcome. Shared files, interfaces, release targets and other scarce
13
+ resources can still constrain execution.
14
+
15
+ Tickets must map each outcome to an accountable scope driver marked accepted
16
+ or proposed, write and resource boundaries, dependency milestones, and evidence
17
+ with invalidation conditions. Record what a consumer actually needs: for
18
+ example an accepted immutable interface, a versioned artifact, an exact
19
+ reviewed code revision, or a merged change. Choose the sufficient milestone
20
+ from acceptance and integration needs rather than requiring every producer to
21
+ be reviewed or merged. Mapping can leave actual SHAs unresolved until execution.
22
+
23
+ Default to separate accountable scope drivers for independent outcomes when
24
+ explicitly authorized and supported by the runtime. Tasks within an accepted
25
+ scope remain native delegates of its accountable driver. Reuse accepted owners
26
+ and current attempts before proposing new drivers. Follow
27
+ [Coordinating multiple drivers](t3-runtime.md#coordinating-multiple-drivers)
28
+ for project binding, acceptance handbacks, record ownership and launch rules.
29
+
30
+ Planning never grants launch permission or execution authority. Missing
31
+ new-driver launch permission holds only that launch, subject to dependency and
32
+ scoped-hold rules. The existing driver can progress only work already inside
33
+ its accepted authority. A proposed scope driver is a plan entry, not an
34
+ accepted owner. Preserve existing owners until an explicit accepted transfer
35
+ under [Lifecycle](lifecycle.md#native-handoff-and-resume).
36
+
37
+ ## Admit and reconcile during execution
38
+
39
+ During Implement, admit newly discovered independent outcomes through the same
40
+ scope, interface and dependency map. Reuse the accepted scope where it covers
41
+ the work; materially changed scope follows the existing approval boundary.
42
+ Before dispatch, reconcile semantic and write conflicts, milestone and
43
+ revision evidence, ownership and current attempts, writer exclusivity and
44
+ capacity with native and forge state. Separate worktrees never prove semantic
45
+ independence. Queue conflicting work or resolve its boundaries before dispatch;
46
+ keep one writer per candidate and record. Driver separation alone grants no
47
+ additional capacity or routing authority.
48
+
49
+ Use main or the recorded integration target as the branch base unless a genuine
50
+ unfinished code predecessor requires its exact reviewed revision. An artifact-only
51
+ dependency can be satisfied by an accepted immutable interface or artifact
52
+ milestone without Git ancestry. Follow [PR chains](pr-chain.md) for actual code
53
+ ancestry, reviewed-parent branching, child invalidation and base updates.
54
+
55
+ Bind each consumed milestone to actual current evidence at execution, including
56
+ the producer revision or immutable artifact identity, receipt and acceptance
57
+ state. Unknown or stale dependency evidence holds affected consumers until
58
+ reconciled. When a producer revision changes, invalidate affected consumer
59
+ evidence and revalidate those consumers while unrelated scopes progress.
60
+ Keep artifact identities and code revisions distinct when determining which
61
+ consumers are affected. A planned dependency or completion message alone is
62
+ insufficient execution evidence.
63
+
64
+ Follow [Lifecycle receipts](lifecycle.md#receipts-bind-each-decision-to-evidence)
65
+ for current-attempt completion and advancement, [Autopilot](autopilot.md#advance-and-hold)
66
+ for scoped and run-wide holds, and [Implement](../../axstack-implement/SKILL.md)
67
+ for dispatch, review and delivery gates. This contract changes none of their
68
+ ownership, serial preflight, capacity, hold, merge or completion requirements.
@@ -24,8 +24,8 @@ function pool(accounts, driver, now) {
24
24
  if (u?.unavailable || !fresh(u?.checkedAt, now, 300000) || !Array.isArray(u?.windows)) throw Error(`unknown ${driver} telemetry`);
25
25
  const windows = ['session', 'weekly'].map((kind) => {
26
26
  const found = u.windows.filter((w) => w.kind === kind && !(driver === 'claudeAgent' && w.id?.startsWith('seven_day_')));
27
- if (!found.length && driver === 'codex' && kind === 'session'
28
- && u.notApplicable?.session === 'verified Codex weekly-only response') return null;
27
+ const weeklyOnly = driver === 'codex' ? 'verified Codex weekly-only response' : 'verified Claude weekly-only response';
28
+ if (!found.length && kind === 'session' && u.notApplicable?.session === weeklyOnly) return null;
29
29
  if (found.length !== 1) throw Error(`missing or ambiguous ${driver} ${kind} window`);
30
30
  const w = found[0];
31
31
  if (!Number.isFinite(w.usedPercent) || w.usedPercent < 0 || w.usedPercent > 100
@@ -1,4 +1,26 @@
1
1
  import { managementKey } from './hub-secret.js';
2
+
3
+ // Null alone is ambiguous. Accept only corroborated weekly metadata, never plan names.
4
+ function claudeWeeklyOnly(usage, now) {
5
+ const weekly = usage.seven_day;
6
+ const percent = (value) => Number.isFinite(value) && value >= 0 && value <= 100;
7
+ const reset = (value) => typeof value === 'string' && Number.isFinite(Date.parse(value))
8
+ && Date.parse(value) > now && Date.parse(value) - now <= 604800000;
9
+ if (usage.five_hour !== null || Object.hasOwn(usage, 'error') || Object.hasOwn(usage, 'errors')
10
+ || !percent(weekly?.utilization) || !reset(weekly?.resets_at) || !Array.isArray(usage.limits)
11
+ || usage.seven_day_opus != null || usage.seven_day_sonnet != null) return false;
12
+ const aggregate = usage.limits.filter((w) => w?.kind === 'weekly_all');
13
+ return aggregate.length === 1 && usage.limits.every((w) => {
14
+ if (!w || w.group !== 'weekly' || typeof w.is_active !== 'boolean' || !percent(w.percent)
15
+ || !reset(w.resets_at)) return false;
16
+ if (w.kind === 'weekly_all') return w.is_active === true && w.scope === null
17
+ && w.percent === weekly.utilization && w.resets_at === weekly.resets_at;
18
+ // A session row contradicts absence even when inactive. Unknown limits also hold.
19
+ return w.kind === 'weekly_scoped' && typeof w.scope?.model?.display_name === 'string'
20
+ && w.scope.model.display_name.trim().length > 0 && w.scope.surface === null;
21
+ });
22
+ }
23
+
2
24
  // Read-only subset of T3 0.1.3 makeCliproxyApi. Never fetch token files or reset credits.
3
25
  async function management(config, path, body) {
4
26
  const base = new URL(config.url.endsWith('/') ? config.url : `${config.url}/`);
@@ -54,10 +76,15 @@ async function accountUsage(config, account, now) {
54
76
  label: `Weekly · ${w.scope?.model?.display_name ?? ''}`, usedPercent: w.percent, ...(w.resets_at == null ? {} : { resetsAt: w.resets_at }), windowDurationMins: 10080 });
55
77
  }
56
78
  }
57
- const weeklyOnly = driver === 'codex' && usage.rate_limit?.primary_window?.limit_window_seconds === 604800
58
- && usage.rate_limit.secondary_window == null && windows.length === 1 && windows[0].kind === 'weekly';
79
+ let weeklyOnly;
80
+ if (driver === 'codex' && usage.rate_limit?.primary_window?.limit_window_seconds === 604800
81
+ && usage.rate_limit.secondary_window == null && windows.length === 1 && windows[0].kind === 'weekly') {
82
+ weeklyOnly = 'verified Codex weekly-only response';
83
+ } else if (driver === 'claudeAgent' && claudeWeeklyOnly(usage, now)) {
84
+ weeklyOnly = 'verified Claude weekly-only response';
85
+ }
59
86
  return { ...base, usageLimits: { checkedAt, windows,
60
- ...(weeklyOnly ? { notApplicable: { session: 'verified Codex weekly-only response' } } : {}) } };
87
+ ...(weeklyOnly ? { notApplicable: { session: weeklyOnly } } : {}) } };
61
88
  } catch {
62
89
  return { ...base, usageLimits: { checkedAt, windows: [], unavailable: { reason: 'probeFailed' } } };
63
90
  }
@@ -19,6 +19,8 @@ run later reconciles merges and closes out.
19
19
 
20
20
  ## 1. Admit the work
21
21
 
22
+ At admission and before dispatch, load and follow [Independent delivery](../axstack/references/independent-delivery.md).
23
+
22
24
  Before consequential work, load the standing contracts, follow their required
23
25
  edge into the lifecycle (including its audit hook), then apply shared routing:
24
26
 
@@ -205,6 +207,7 @@ Record: <progress.md path or tiny-task brief>
205
207
  Candidate: <PR or branch> base <sha> revision <sha>
206
208
  Owner: <profile + session ID + worktree>
207
209
  Scope: <approved spec + capability | small-change intent | maintenance snapshot>
210
+ Delivery map: <record pointer; outcomes/accepted scope drivers; current milestone evidence; held launches>
208
211
  Shape: <total> lines vs base <sha>; bulk: <buckets>; theme: <one line>
209
212
  TDD: <normal red/green | structure-preserving old-green/same-check-new-green evidence | F-repair base-green/removal-inversion-red/rewording-green evidence>
210
213
  Token limit: <staged-file size check command + observed advisories/errors before each commit>
@@ -25,6 +25,8 @@ and the lifecycle's [audit skill](../axstack-audit/SKILL.md) hook.
25
25
 
26
26
  ## Procedure
27
27
 
28
+ Before drafting, load and follow [Independent delivery](../axstack/references/independent-delivery.md).
29
+
28
30
  1. **Select the authoritative store.** Use Linear through the executor MCP only
29
31
  for repositories in `defi-com`. Keep specs for other repositories on GitHub;
30
32
  if the issue, PR or repository-file location is unclear, ask before creating
@@ -22,6 +22,11 @@ or risk only in supporting detail.
22
22
 
23
23
  ## Execution requirements
24
24
 
25
+ Follow [Independent delivery](../../axstack/references/independent-delivery.md)
26
+ when planning outcomes. In execution requirements, describe each outcome with
27
+ acceptance and produced and consumed interfaces. Keep these in the existing
28
+ specification rather than a separate delivery artifact.
29
+
25
30
  Group precise requirements and observable acceptance by capability, using stable
26
31
  IDs where useful. Include behavior, interfaces, data, invariants, failure cases
27
32
  and validation that determine success. Put routine file-by-file task and PR
@@ -74,6 +79,9 @@ whole-dataset export and its cleanup cost. Proposed choice: filtered export.
74
79
 
75
80
  ## Execution requirements
76
81
  ### Filtered export
82
+ Outcome: independently deliverable filtered CSV export.
83
+ Produces: CSV rows in visible column order. Consumes: the existing table filter
84
+ and column-order interfaces; no unfinished code predecessor is required.
77
85
  EXP-1: On click, capture the active filter and visible column order, label the
78
86
  action “Export filtered rows”, and export only matching rows in those columns.
79
87
  Acceptance for EXP-1: with a two-row dataset and a filter matching one row,
@@ -25,6 +25,8 @@ no dispatch preflight.
25
25
 
26
26
  ## Procedure
27
27
 
28
+ Before mapping, load and follow [Independent delivery](../axstack/references/independent-delivery.md).
29
+
28
30
  1. **Pin scope and storage.** Confirm the approved spec identity before mapping.
29
31
  Hold on unapproved or materially changed scope; a still-valid approval is
30
32
  never repeated. Use the explicitly selected Markdown, GitHub Issues, or
@@ -71,11 +73,19 @@ no dispatch preflight.
71
73
  ```text
72
74
  Spec: <approved revision>
73
75
  Capability: <Markdown ref, GitHub issue URL, or Linear issue URL> <title>
76
+ Outcome: <independently deliverable result>
77
+ Scope: <accepted boundary>
78
+ Driver: <accepted or proposed accountable scope driver + record/link>
74
79
  Internal task: <task> -> <PR owner> -> <worktree>
80
+ Writes/resources: <write, semantic-interface and shared-resource boundaries>
81
+ Produces/consumes: <interfaces or artifacts>
75
82
  Theme: <one behavior or component>
76
83
  Size est: <coarse size estimate>
77
84
  Acceptance: <checks from approved spec rev>
78
85
  Depends: <task IDs or none>
86
+ Milestones: <per dependency: required acceptance state + producer/artifact identity; planned revisions allowed>
87
+ Evidence/invalidation: <required receipt/check + producer changes that invalidate affected consumers>
88
+ Branch: <main/integration target | exact reviewed unfinished code predecessor + reason>
79
89
  ```
80
90
 
81
91
  4. **Reconcile lifecycle state.** Compare each run capability with its required