spacr.qt.maturity

Assign evidence-based maturity labels to Qt applications.

Application maturity is assessed from tests, command-line support or a stated GUI-only scope, documentation, tutorials, and use by other spaCR components. The labels have the following meanings:

stable

The application has a working pipeline or library, broad test coverage, and user documentation.

beta

The application is functional and tested but has less documentation or operational use than a stable application.

The apply() function updates spacr.qt.app.APP_STAGE from the assessments below. An application without an assessment or an explicitly declared stage is assigned UNASSESSED_STAGE ("alpha"). Explicit beta labels are retained, while recorded assessments take precedence.

PROMOTIONS contains applications whose labels changed; AFFIRMED contains reviewed applications whose labels were already appropriate.

Functions

apply(→ List[str])

Write the assessment into the shell's stage table, then fill the gaps.

assessed_keys(→ frozenset)

Every app key somebody has actually looked at, in any of the tables.

reason_for(→ str)

Why app_key is where it is, or "" when it was not assessed.

register(→ bool)

Entry point for spacr.qt.SELF_REGISTERING_MODULES.

unassessed_apps(→ List[str])

Registered apps nobody has assessed, in registry order.

Module Contents

spacr.qt.maturity.apply(stages: Dict[str, str] = None, keys=None) → List[str][source]

Write the assessment into the shell’s stage table, then fill the gaps.

Two phases, and they answer two different questions:

  1. PROMOTIONS — the apps somebody assessed and moved. Idempotent, and it never demotes: a module some other code has already promoted further than this table says stays where it is. That matters because the table is a snapshot of one assessment, and the next assessment should not be silently undone by re-importing this module.

  2. Every registered app that is in none of the assessment tables and has no line of its own is written in as UNASSESSED_STAGE. This is what stops a new module inheriting stable from the absence of an entry — see the module docstring. It only ever writes where there is nothing, so it cannot overrule an author, a plugin, or phase 1.

Parameters:
  • stages – the table to write into. Defaults to spacr.qt.app.APP_STAGE; injectable so a test does not have to mutate the live registry.

  • keys – the app keys phase 2 considers. Defaults to the live registry; pass () to run phase 1 alone.

Returns:

the app keys whose stage this call changed.

spacr.qt.maturity.assessed_keys() → frozenset[source]

Every app key somebody has actually looked at, in any of the tables.

spacr.qt.maturity.reason_for(app_key: str) → str[source]

Why app_key is where it is, or "" when it was not assessed.

An empty string is a real answer here and the UI is entitled to say it plainly: this module is alpha because nobody has checked it, not because somebody checked it and concluded alpha.

Parameters:

app_key – the app’s registry key, e.g. "align"; converted to str and looked up in PROMOTIONS, then AFFIRMED, then RETIREMENTS.

spacr.qt.maturity.register() → bool[source]

Entry point for spacr.qt.SELF_REGISTERING_MODULES.

Idempotent — apply() never demotes, so a second launch in one process (the test suite does this) is a no-op rather than a conflict.

spacr.qt.maturity.unassessed_apps(stages: Dict[str, str] = None, keys=None) → List[str][source]

Registered apps nobody has assessed, in registry order.

An app is unassessed when it appears in none of PROMOTIONS, AFFIRMED or RETIREMENTS. Whether it carries a stage is a different question: a module that declared alpha for itself is unassessed and correctly labelled, which is exactly the state most of the shelf is in.

Parameters:
  • stages – unused for the decision; accepted so callers can pass the same two arguments they pass apply().

  • keys – the app keys to consider; defaults to the live registry.