FAQ
Common questions about Rosa, your data, jobs, outputs, integration, and the free trial.
About Rosa
What does Rosa stand for?
Rosa is named after Rosa Parks. It stands for nothing formally - it is a name, not an acronym.
Is Rosa the same as AIF360 or Fairlearn?
No. AIF360 and Fairlearn are model-centric tools that constrain a model's training loss. Rosa operates at the data layer: it transforms your dataset before any model training. See the Overview page for a full comparison.
Does Rosa sacrifice model accuracy?
No. When all three models are evaluated against the same unbiased ground truth, the Rosa-debiased model achieves the best R² of the three with near-zero bias - it beats both the biased model and the parity-constrained baseline on R² (accuracy is close across all three, so R² - how well each model tracks the fair signal - is the deciding measure). The parity baseline reaches marginally lower bias, but only by trading away predictive quality: its R² is the lowest of the three, below even the biased model. See the Model Validation page for the figures.
What kind of algorithm is the FAN?
Rosa's Fair Adversarial Network is standalone (it runs as a pre-processing step with no coupling to your downstream model), nonlinear (it captures complex relationships, not just linear correlations), multivariate (it considers all features jointly, which is how it finds proxy variables), and distribution-agnostic - it makes no assumptions about the shape of your data's distribution, so it works regardless of how your data is shaped. (A neural network is technically a parametric model, so "distribution-agnostic" is the precise claim here, not "nonparametric": no assumptions about the input distribution, rather than an absence of parameters.)
How does Rosa find and remove proxy variables?
Because the FAN is multivariate, its discriminator looks at all columns at once - so it detects the protected attribute even when no single column is labelled as a proxy, by combining the partial signals several columns carry. The encoder then rank-maps each column (reorders the values already in that column) until the discriminator can no longer predict the protected attribute better than chance. You only declare the bias column; Rosa works out which other columns leak it and how. Rank-mapping breaks each column's correlation with the protected attribute while preserving its marginal distribution.
Are there proxies Rosa cannot fully remove?
One case. Because rank-mapping only reorders values that already exist in a column, it cannot fully neutralise a near-deterministic categorical proxy - a category whose value almost exclusively identifies one group (for example a first-name column drawn from exclusively male or female name pools, or a title such as Mr/Ms). Rosa still reduces the dataset-level association, but each such value carries strong group-specific signal that reordering cannot remove, so as a proxy's correlation with the protected attribute approaches 1.0 the residual bias rises. Numerical proxies and ordinary categorical proxies - values that appear in both groups at different rates, which is the usual shape of real data - are removed cleanly. This is why Test 1 uses numerical gender proxies at a moderate correlation: representative of real-world proxies, and well within the range Rosa drives to a low residual bias (on Test 1, the honest held-out bias dial falls from strong recoverability before debiasing to low residual recoverability after, varying run to run).
Why does the residual bias differ each time I train Test 1?
Because Rosa's Fair Adversarial Network is a neural-network training, and like any such training it is stochastic - it is not pinned to a fixed random seed. So each training job lands on a slightly different residual bias: on Test 1 the honest held-out bias dial falls from strong recoverability before debiasing to low residual recoverability after, with the exact residual varying from run to run. This is why the residual is best read as "low, characterised across runs" rather than one fixed number - the same reason the Diagnose report presents the discriminator accuracy as an average across multiple training instances with a standard deviation. The directional result that holds every time is the one that matters: the residual collapses to a low level, and because the score is a held-out permutation test, a low reading is a proven result you cannot get by over-fitting.
I ran Diagnose on the debiased inference output and still see residual bias - is that a failure?
No - this is expected, and worth understanding. Training and inference are different operations. Training fits the FAN to your data and drives the debiased training output to a low residual bias (on Test 1 the honest held-out bias dial falls to low residual recoverability). Inference applies that already-trained mapping to new, unseen rows - it does not re-optimise - so the debiased inference output keeps more residual signal - a fresh Diagnose of Test 1's held-out rows reads materially higher than the near-zero residual of the debiased training data. That is the honest operational picture, not a defect - in production you train once and then apply the model to fresh data it never saw. The proof that debiasing worked is not that Diagnosing the inference output reads zero; it is that Model B - trained on Rosa's debiased training data and then run on that debiased inference output - stays fair on the unbiased ground truth (on the Model Validation page it reaches the best R² of the three models, with near-zero bias). Diagnose is a training-time measurement tool; for a deployed model the bias was measured at training time and the dials live on the Training job's Outputs page.
Data and configuration
What is a bias column (bias_columns)?
The protected attribute you want Rosa to remove association with. The trial supports one bias column per job. It must be categorical with fewer than approximately 10 distinct values. Continuous attributes (e.g. raw age in years) must be binned first.
What must go in cat_columns?
Any column that should be treated as categorical rather than numeric. This includes string columns (required) and integer-coded categoricals (e.g. gender stored as 0/1). Rosa does not auto-detect this. If a categorical column is missing from cat_columns, results may be incorrect.
What goes in ignore_columns?
Columns that should not be debiased or included as features - typically the target/outcome label. Rosa transforms features; it does not touch ignored columns. If you omit the outcome column from ignore_columns, Rosa may modify it, breaking downstream model training. Direct identifiers (names, email addresses, customer IDs) should also go in ignore_columns, not cat_columns - they add no fairness signal, and placing them in cat_columns would record their distinct values in the permanently-retained Run Manifest.
Why does the debiased CSV have fewer columns than my input?
Rosa removes the bias column(s) from the output. The protected attribute is suppressed entirely from the output dataset.
What is the 150 post-encoding dimension limit?
Rosa one-hot-encodes categorical columns. A column with N distinct values expands to N binary columns. If the total after expansion exceeds 150, the job is rejected. This limit is a deliberate product cap for the trial - it keeps a worst-case trial job to about 15 minutes on the shared queue.
Does Rosa train on my whole dataset?
For training and diagnose, datasets over ~10,000 rows are down-sampled to a representative ~10,000-row subset before the debiasing model is trained, so trial runtime depends on the number of columns rather than the number of rows. Your full dataset is then debiased end-to-end at the inference step.
Is there an enterprise option without the free-tier caps?
Yes. The free trial is a shared service with the limits above. For enterprises, a paid Proof of Concept over 12 weeks on a dedicated instance in your own region - your own compute and encrypted storage, sized to your production data, with the row, column, and monthly-job-quota caps all lifted and no shared-queue wait - is available as the next step. Contact support@rosadebias.com for more details.
How does Rosa handle missing values?
Rosa imputes missing values automatically - the column mean for numeric columns, the most frequent value for categorical columns. Keep missing values below roughly 5% per column: above that, imputation quality degrades and your results become less reliable. Missing values must be represented as null / NaN (an empty cell). Other conventions such as an empty string, -999, or "N/A" are not recognised as missing and will be treated as real data values. The Run Manifest records the per-column missing-value count so you can audit data quality from the result.
Is there a minimum dataset size?
Yes, for Diagnose and Training: at least 1,000 rows. Below that the bias statistics are unreliable and the FAN cannot learn a dependable transformation. Inference has no minimum - it applies an already-trained model to whatever you submit.
What does Rosa do to my data before debiasing?
Every job runs through a pre-processing pipeline before any debiasing: input data checks (file and schema validation), configuration validation (modes, bias/cat/ignore columns, size limits), type coercion, and statistical checks (per-column distributions and missing-value analysis). These steps make the run robust and feed the figures that appear in your Run Manifest and PDF report.
Does Rosa check that my inference data matches the trained model?
Yes. Before running inference, Rosa checks the new dataset against the data the model was trained on (the reference values come from the model metadata produced by the training job). Two structural checks are enforced - if either fails, the job is rejected immediately with INFERENCE_STATS_MISMATCH, before any compute is consumed: (1) every training column must be present and identically named; (2) each categorical column must contain exactly the categories seen during training - no new values, and none missing. A third check is advisory: if a non-categorical column's minimum or maximum falls more than 10% outside the training range, Rosa logs a warning but still runs the job - out-of-range data is handled (debiasing may simply be less effective far from the training distribution), so it does not fail. This catches a structurally incompatible dataset early, while still letting you run inference on data whose values have drifted.
Do my training and inference data need to contain the same categories?
Yes - and it is easy to miss with small samples or rare categorical values. As well as containing no new categories (the check above), the inference data must contain every categorical value that was present in the training data. A value that was seen during training but is absent from the inference set leaves the trained model expecting an encoding the new data cannot supply, and the job fails. This bites most often when you split one dataset into separate train and test files: if a category is rare, a random split can place all of its rows on one side, so the other side never sees it. To avoid it, use a stratified split that keeps every categorical value represented in both sets, or drop categories too rare to appear reliably in both before you split. In short, the inference set's categorical values must match the training set's exactly - no new ones, and none missing.
Jobs and quotas
How many jobs can I run?
20 jobs per workspace per calendar month (resets on the 1st). Both Diagnose and Training jobs consume the same quota - they run the same FAN training loop.
Is Rosa limited to 50,000 rows and 100 columns?
No - those are the limits of this free tier only, not of the Rosa engine. The underlying FAN algorithm scales to millions of rows and thousands of columns. The row, column, and monthly-job caps here exist to keep the shared free service responsive for everyone; a production deployment is sized to your data and is not bound by these figures.
Why are Diagnose and Training the same quota cost?
Diagnose runs the full FAN training loop internally to produce its bias report. It is not a quick scan - it costs approximately the same compute as a Training job.
How long do jobs take?
Depends on dataset size and mode. For Test 1 (2,000 rows, 24 columns): Diagnose/Training typically about 3 minutes each; Inference is much faster (seconds). For a job at the maximum width (150 post-encoding dimensions): up to ~15 minutes. Training down-samples to ~10,000 rows, so runtime depends on the number of columns, not the number of rows.
How does inference scale with data size?
Very well. Once a FAN model is trained, applying it to new data is fast - inference scales roughly linearly with the number of rows, so you can debias large operational datasets and run inference continuously in production. Training and Diagnose are the heavier steps; inference is the light one.
Can I cancel a job?
Yes. If a job is queued or running, a Cancel button appears on that row in the Jobs page history. Cancellation kills the processing within a few seconds and marks the job cancelled. A cancelled job's Run Manifest is preserved for audit purposes. Jobs that are already complete cannot be cancelled.
My job failed - what do I do?
Open the Run Manifest for the failed job (a manifest is written for every terminal state). Its error field records exactly why the job was rejected. The most common causes are a column listed in cat_columns that is not present in your CSV, the bias_columns value missing from cat_columns, or a dataset below the 1,000-row minimum. Correct the config or the data and resubmit - a rejected job does not consume your monthly quota. A training job can also occasionally fail if the model diverges on your data. Rosa handles typical skewed / outlier-heavy real-world data directly (it debiases raw COMPAS with no pre-conditioning), but very extreme columns can sometimes trigger a divergence. That fails safely (the run is aborted and Rosa never returns altered or garbage data), the error field says so, and pre-scaling those columns resolves it.
What happens to my data after the job completes?
Input CSVs and output artifacts are retained for 7 days. Model checkpoints are retained for 1 year (so you can run inference against a training job later). Run Manifests are retained indefinitely.
Outputs and downloads
What does the debiased CSV contain?
The same rows as your input, with feature values transformed to suppress the protected attribute. The bias column itself is removed from the output. Row order and count are preserved.
Do the statistical properties of my data change?
No. Rosa's rank-mapping step preserves each column's marginal distribution - the sorted values are unchanged. This holds exactly in both Training and Inference modes: the debiased column contains the same values as your input, reordered, preserved to float64 CSV precision (~13 significant figures). Column means, standard deviations, and percentiles are unchanged. Cross-column correlations may change where they were encoding bias.
What is the PDF report?
For Diagnose jobs: a bias evidence report showing random baseline accuracy, discriminator accuracy, per-feature debiasing-adjustment scores, and a feature-association proxy table. For Training jobs: a bias reduction report showing residual discriminator performance post-debiasing.
Where can I find definitions of the terms in the report?
A plain-English Glossary (PDF) defines every term Rosa emits in the PDF report and the Run Manifest - Bias Characteristic, Proxy Variables, Random Baseline Accuracy, Best Random Accuracy, Average Discriminator Performance, Bias and Residual Bias, Feature Associations, and the Debiasing Adjustment by Feature. It is also linked from the Test 1 and COMPAS download rows on the Jobs and Data Validation pages.
What is the Run Manifest?
A machine-readable JSON record written for every job - including Diagnose, cancelled, and failed jobs - and retained indefinitely as the permanent evidence of the run. It records what was processed and how: job id and timestamps, the mode, row and column counts, the declared bias / ignore / categorical columns, the bias measurement (before and, for Training, the residual after debiasing), per-column statistics, and SHA-256 hashes of the input file and every output artifact. It contains no row-level data. Open it on the Run Manifest page, download it, and use its hashes to prove a specific dataset was processed unaltered at a specific time - the per-run audit trail an EU AI Act Article 10 or SOC 2 review expects.
Can I verify the debiased CSV has not been tampered with?
Yes. The Run Manifest contains SHA-256 hashes of all output artifacts. Compute the SHA-256 of your downloaded file and compare against output_artifact_hashes in the manifest using the verification tool on the Run Manifest page. The raw input CSV is verifiable the same way: the manifest's input_hash (SHA-256 of the exact file you submitted, computed before any processing) lets you confirm Rosa processed the file you sent. This also works for Diagnose, cancelled, and failed jobs, which produce no output artifacts - input_hash is then the only hash to check.
Integration (REST API and MCP)
What is the base URL?
https://api.rosadebias.com/v1
How do I authenticate?
X-API-Key: <your_key> or Authorization: Bearer <your_key> on every request.
How do I submit a job via the API?
POST /v1/jobs with multipart/form-data containing csv_file and config (JSON string). Returns HTTP 202 with job_id. Poll GET /v1/jobs/{job_id} until status == "complete". To retrieve your full job history (every job for your workspace, newest first), call GET /v1/jobs.
How do I list my past jobs?
GET /v1/jobs returns every job for your workspace, newest first, with the same fields as GET /v1/jobs/{job_id} (job_id, mode, status, submitted_at, started_at, completed_at, row_count, error) across every state - queued, running, complete, failed, cancelled, interrupted. This is what the portal's Jobs page uses to rebuild your history after you sign out. For billing-style records of completed jobs only, use GET /v1/usage instead.
Can I use Rosa from an AI agent?
Yes. Rosa exposes eight MCP tools: rosa_diagnose, rosa_remove_bias, rosa_job_status, rosa_get_report, rosa_get_artifacts, rosa_get_manifest, rosa_list_jobs, rosa_cancel_job. Connect your MCP client to the Rosa server with ROSA_API_BASE_URL=https://api.rosadebias.com and your ROSA_API_KEY. See the API/MCP page for the full tool list and an example Claude Desktop config.
What is a training_job_id?
To run inference, you provide the job_id of a completed training job. Rosa uses it to locate the trained model checkpoint automatically. You never upload model files directly.
Security and compliance
Where is my data processed?
AWS EC2, eu-west-2 (London, UK). Data does not leave the UK. EU-to-UK transfers are covered by the EU-UK adequacy decision.
Is the connection encrypted?
Yes. TLSv1.3 + AES-256-GCM via nginx. All HTTP requests redirect to HTTPS.
Is my data stored encrypted?
Yes. All job artifacts, model checkpoints, and manifests are stored on AES-256 encrypted EBS volumes.
Is my API key stored securely?
Your API key is hashed using argon2id (OWASP-recommended). The plaintext key is only ever shown once (at creation or rotation). Rosa cannot recover it.
Is there multi-tenant isolation?
Yes. All job data is scoped to your workspace_id. Requests for another workspace's jobs return 404, not 403 - your workspace's existence is not revealed to other tenants.
Does Rosa's Diagnose output count as EU AI Act Article 10 data governance evidence?
It is designed to. Article 10 requires operators of high-risk AI systems to examine training data for potential biases and document that examination before deploying. Rosa's Diagnose mode produces a structured Data Bias Audit: it identifies which features carry protected-attribute signal, quantifies the degree of association, and generates a cryptographically hashed PDF report (the Run Manifest records the SHA-256 of every output artifact). This is the kind of per-dataset, per-run evidence record an Article 10 audit trail requires. A parity output adjustment does not satisfy this requirement. A regulator who asks “can gender be predicted from your features?” gets “yes” from a parity-adjusted model's underlying data - the data itself is unchanged. Rosa changes the data. After Rosa debiasing, gender is not reliably predictable from the feature set, and the Run Manifest provides the cryptographic proof that this change was applied to a specific dataset at a specific point in time. For legal advice on EU AI Act compliance, consult a qualified professional.
Does Rosa keep an audit log of API access?
Yes. Every API request is recorded as a structured access-log entry - UTC timestamp, method, endpoint, response status, source IP, request duration, and a non-reversible fingerprint of the API key used (never the key itself) - and every job emits lifecycle events (submitted, started, completed/failed/cancelled) to a separate application log. Both ship to AWS CloudWatch, centralised and append-only, retained for 365 days, and are joined by a per-request correlation id returned in the X-Request-ID response header. Neither log ever contains your CSV contents or any personal data - only job and request metadata. This is the logging-and-monitoring control for SOC 2, and it complements the per-job Run Manifest (the immutable record of what was done to each dataset).
Is the API rate limited?
Yes. Each API key has separate per-minute limits for read requests (job status, artifacts, manifests) and write requests (job submission and other mutations), and all traffic is additionally bounded by a per-IP limit that absorbs keyless or credential-stuffing floods. A request over a limit receives a standard 429 RATE_LIMITED response with a Retry-After header telling the client when to retry; normal portal use stays well within the limits. Rate limiting protects service availability and is separate from your monthly job quota.
How do you keep dependencies secure?
Every build audits Rosa's software dependencies for known vulnerabilities and fails if any fixable one is present, so a vulnerable package cannot reach production unnoticed; a 72-hour patching target applies to critical advisories. Dependabot additionally opens automated update pull requests for dependencies, CI actions, and container base images. The one exception is the frozen machine-learning engine (TensorFlow 2.13), pinned for reproducibility until a planned migration - its advisories are tracked on a documented, auditable allow-list and reviewed, never silently ignored. This is the dependency-management control for SOC 2.
How do you protect against leaked credentials?
Every code change is automatically scanned for committed secrets before it can merge, and the full commit history is periodically rescanned. Operational secrets are kept in protected, root-only stores off the application and out of process listings, with a defined rotation policy. This sits on top of continuous third-party security scanning across our code, dependencies, infrastructure, and cloud configuration.
What does signing out do?
Signing out clears this browser session only - your key and cached job history are removed from the browser. It does not revoke your API key: the key stays valid for the REST API, MCP, and your next sign-in. To invalidate a key, rotate it - use the Rotate key link in the header or POST /v1/workspaces/me/rotate-key.
Commercial model and service tiers
How will Rosa be offered commercially?
Rosa is offered around its buyer segments - regulators, auditors, and enterprises - each on their own dedicated instance, with a shared instance for AI-agent (MCP) usage:
- Regulators, auditors and enterprises - organisations in regulated sectors (financial services, healthcare, law enforcement) and the supervisory bodies and auditors who assess them each get a dedicated instance: a separate compute instance, its own encrypted storage volume, and its own encryption key, for physical tenant isolation. This tier carries the compliance posture (Data Processing Agreement, dedicated data residency, audit evidence) that these buyers require.
- AI agents via MCP - agent-native usage over the MCP tools runs on a shared instance with logical isolation (every job scoped to your workspace_id), consistent with standard SaaS multi-tenancy. This shared MCP / AI-agent tier comes later.
During the current free trial everyone shares one instance. Physical co-location on a shared volume is disclosed before onboarding; regulated workloads should use a dedicated instance.
Free trial and getting help
Is this really free?
Yes. The free trial is funded by Rosa. No credit card required. 20 jobs per month per workspace.
When will pricing start?
Rosa will transition to a commercial model when your free trial phase ends (usually after 3 months). You will be notified in advance at the email address you registered with.
How do I rotate, reset, or get a second API key?
You can rotate your own key at any time - use the Rotate key link in the portal header, or call POST /v1/workspaces/me/rotate-key directly. The current key stops working immediately, the new key is shown once, and your workspace_id and full job history are preserved. This is also the recovery path if a key is compromised. For a separate additional workspace, email support@rosadebias.com.
I found a bug or have a question.
Email support@rosadebias.com.