Six short questions scaffold your review context, plan, participants, procedure, safeguards, and data. AI-related projects can then add a separate governance section.
+
Six short questions scaffold the protocol. AI-assisted review runs automatically after the materials are submitted.
No source material added yet0%
@@ -2093,56 +2154,57 @@
Study session setup
-
-
- Recruitment message
-
-
-
- Consent language
-
-
-
- Interview questions
-
-
-
- Workshop or activity plan
-
-
-
- Safety procedure
-
-
-
- Follow-up and data use
-
-
-
- AI ethics-review supplement
-
-
Why this appears: the prompts adapt AI-specific human-subjects review questions from Makridis et al. (2023) and university REC guidance from Connelly et al. (2025), alongside NIST AI RMF.
-
+
+
+
+
Protocol documents
+
Choose one document to edit. SafeBARS keeps all six connected behind this single workspace.
-
-
+ AI review · automatic
-
-
- Project researches or uses AI
-
-
-
- Optional bounded LLM critic · off by default
-
+
+
+
1 of 6 · not added
+
+
+
+
Invitation, eligibility, contact route, compensation, and pressure safeguards.
+
+
+
+
Comprehension, voluntariness, recording, data use, skipping, and withdrawal.
+
+
+
+
Prompts, sensitive topics, optional questions, and interviewer follow-ups.
+
+
+
+
Tasks, duration, technologies, breaks, accessibility, and alternatives.
+
+
+
+
Pause or stop triggers, responsible staff, escalation limits, and real support routes.
+
+
+
+
Debrief, complaints, access, storage, retention, deletion, and reporting.
+
+
+
+
+
+
+
@@ -2480,7 +2542,7 @@
Common final task submission
For researchers
Prepare and stress-test a sensitive human-facing protocol.
-
1
Complete Quick Intake
Answer six short questions about the review context, research plan, people, procedures, safeguards, and data. AI projects receive one structured ethics-review supplement.
+
1
Complete Quick Intake
Answer six protocol questions. AI-assisted review runs automatically after submission.
2
Review the populated fields
Correct the protocol materials in the left panel before analysis.
3
Build encounter map
Create the case, index passages, and inspect the participant journey.
4
Run selected traces
Choose breakdown scenarios and run the audit to identify issues and human handoffs.
@@ -2553,13 +2615,13 @@
Plain-language guide to interface terms
activity: "artifactActivity",
safety: "artifactSafety",
follow_up: "artifactFollowUp",
- ai_governance: "artifactAiGovernance",
};
+ const artifactEditorOrder = Object.keys(artifactInputs);
let intakePlan = null; // server-driven question schema; falls back to the built-in steps below
const coreIntakeSteps = [
- {id: "context", question: "Which research area and ethics-review context applies, and what research plan will be submitted?", hint: "Use two sections if possible:\nReview context: research area; university or organisation; school or department; ethics committee or review pathway; country or jurisdiction.\nProject plan: aim, setting, method, why human participation is needed, and either describe the AI role or write 'No AI'.", min: 30, detectAi: true, fallbackTarget: "projectContext", sections: [
+ {id: "context", question: "Which research area and ethics-review context applies, and what research plan will be submitted?", hint: "Use two sections if possible:\nReview context: research area; university or organisation; school or department; ethics committee or review pathway; country or jurisdiction.\nProject plan: aim, setting, method, and why human participation is needed.", min: 30, fallbackTarget: "projectContext", sections: [
{target: "projectReviewContext", labels: ["review context", "research area", "institution", "university", "organisation", "organization", "school", "department", "committee", "jurisdiction"]},
{target: "projectContext", labels: ["project plan", "plan", "aim", "purpose", "method", "research"]},
]},
@@ -2576,20 +2638,52 @@
Plain-language guide to interface terms
{id: "follow_up", target: "artifactFollowUp", question: "What happens after participation and to the research data?", hint: "Cover debriefing, complaints, follow-up, access, storage, security, retention, deletion, reporting, and withdrawal after collection.", min: 30},
];
- const aiIntakeStep = {id: "ai_governance", target: "artifactAiGovernance", question: "Complete the AI ethics-review supplement: how is AI used, governed, disclosed, tested, and corrected?", hint: "Use short labelled lines: AI role & decision authority; data source & intended population; participant disclosure & consent; performance & subgroup bias; privacy & security; human oversight & monitoring; stopping/fallback; correction, complaints & accountable owner.", min: 30};
-
function activeIntakeSteps() {
- const core = (intakePlan && Array.isArray(intakePlan.core)) ? intakePlan.core : coreIntakeSteps;
- let aiStep = (intakePlan && Array.isArray(intakePlan.conditional))
- ? intakePlan.conditional.find(s => s.id === "ai_governance")
- : null;
- if (!aiStep) aiStep = aiIntakeStep; // built-in fallback preserves live reactivity
- return [...core, ...($("usesAi").checked ? [aiStep] : [])];
+ return (intakePlan && Array.isArray(intakePlan.core)) ? intakePlan.core : coreIntakeSteps;
}
const $ = (id) => document.getElementById(id);
const escapeHtml = (value = "") => String(value).replace(/[&<>'"]/g, char => ({"&":"&","<":"<",">":">","'":"'",'"':"""}[char]));
+ function updateArtifactEditorStatus() {
+ const select = $("artifactEditorSelect");
+ if (!select) return;
+ const key = select.value;
+ const index = Math.max(0, artifactEditorOrder.indexOf(key));
+ const value = ($(artifactInputs[key])?.value || "").trim();
+ $("artifactEditorStatus").textContent = `${index + 1} of ${artifactEditorOrder.length} · ${value ? "added" : "not added"}`;
+ $("artifactEditorStatus").classList.toggle("complete", !!value);
+ }
+
+ function updateAiModeStatus() {
+ const legacySession = state.session
+ && (state.session.use_llm === false || state.session.project?.uses_ai === false);
+ const provider = state.options?.active_provider;
+ if (legacySession) {
+ $("aiModeText").textContent = "Legacy record · create AI version";
+ $("aiModeBadge").title = "This saved record predates always-on AI review. Create a new protocol version to apply the current AI workflow without rewriting its audit history.";
+ return;
+ }
+ $("aiModeText").textContent = provider
+ ? "AI review · automatic"
+ : "AI review · model setup needed";
+ $("aiModeBadge").title = provider
+ ? "A configured bounded model critic runs automatically."
+ : "No external model is configured. Framework routing and deterministic safeguards remain active.";
+ }
+
+ function selectArtifactEditor(key, focusEditor = false) {
+ if (!artifactInputs[key]) key = artifactEditorOrder[0];
+ $("artifactEditorSelect").value = key;
+ document.querySelectorAll("[data-artifact-panel]").forEach(panel => {
+ const active = panel.dataset.artifactPanel === key;
+ panel.hidden = !active;
+ panel.classList.toggle("active", active);
+ });
+ updateArtifactEditorStatus();
+ if (focusEditor) requestAnimationFrame(() => $(artifactInputs[key])?.focus());
+ }
+
function studyConditionValue() {
if (!STUDY_MODE) return "";
return state.session?.study_manifest?.condition || $("studyCondition").value;
@@ -2609,12 +2703,6 @@
$("intakeAnswer").disabled = false;
$("intakeAnswer").hidden = false;
$("intakeCompletePanel").hidden = true;
- appendIntakeMessage("bot", "I will use six short questions to organise your protocol. You may skip a question and edit every populated field later. If AI is involved, one structured ethics-review supplement will appear.");
+ appendIntakeMessage("bot", "I will use six short questions to organise your protocol. You may skip a question and edit every populated field later.");
askCurrentIntakeQuestion();
refreshIcons();
}
@@ -3147,13 +3227,6 @@
Plain-language guide to interface terms
}
function applyIntakeAnswer(step, answer) {
- if (step.detectAi) {
- const normalized = answer.toLowerCase();
- const explicitlyNoAi = /\b(no ai|without ai|does not use ai|do not use ai|not using ai)\b/.test(normalized);
- const mentionsAi = /\b(ai|artificial intelligence|llm|language model|machine learning|algorithmic|automated model)\b/.test(normalized);
- $("usesAi").checked = mentionsAi && !explicitlyNoAi;
- updateAiSupplementVisibility();
- }
if (step.sections) applySectionAnswer(answer, step.sections, step.fallbackTarget);
else if (step.appendTarget) {
const existing = $(step.appendTarget).value.trim();
@@ -3309,7 +3382,7 @@