{% extends "html/base.template.html" %} {% from "html/macros/layout.html" import narrative as render_narrative, summary_card %} {% from "html/macros/visualizations.html" import figure %} {% from "html/macros/forms.html" import analysis_review %} {% block human_content %}

{{ t('tasks.feature-analysis.feature-overview') }}

{{ render_narrative(narrative.userBehaviorExplanation, "featureAnalysis.userNarrative.userBehaviorExplanation") }}

{{ t('tasks.feature-analysis.subject') }} {{ feature.target.requestedValue | inline_code }}

{{ t('tasks.feature-analysis.how-a-user-moves-through-it') }}

{{ render_narrative(narrative.flowExplanation, "featureAnalysis.userNarrative.flowExplanation") }} {{ figure(flowFigure) }}
{% for row in feature.flows %}

{{ row.id | inline_code }} · {{ row.kind }}

    {% for step in row.steps %}
  1. {{ step.action | inline_code }}
  2. {% endfor %}
{% endfor %}

{{ t('tasks.feature-analysis.rules-and-state-changes') }}

{{ render_narrative(narrative.rulesAndStateExplanation, "featureAnalysis.userNarrative.rulesAndStateExplanation") }}

{{ t('tasks.feature-analysis.domain-rules') }}

{% for row in feature.domainRules %}{{ summary_card(row.id ~ " · " ~ row.condition, row.outcome, anchor=row.id) }}{% endfor %}

{{ t('tasks.feature-analysis.state-change') }}

{% for row in feature.stateChanges %}{{ summary_card(row.id ~ " · " ~ row.field, row.change, anchor=row.id) }}{% endfor %}

{{ t('tasks.feature-analysis.external-interactions') }}

{% for row in feature.externalInteractions %}{{ summary_card(row.target, row.input ~ " → " ~ row.output ~ ". " ~ t('tasks.feature-analysis.on-failure') ~ " " ~ row.failureHandling) }}{% endfor %}

{{ t('tasks.feature-analysis.tests-and-gaps') }}

{{ render_narrative(narrative.testGapExplanation, "featureAnalysis.userNarrative.testGapExplanation") }} {% for row in feature.testCoverage %}{{ summary_card(row.id, t('tasks.feature-analysis.tests') ~ " " ~ (row.testPaths | join(', ')) ~ "; " ~ t('tasks.feature-analysis.gaps') ~ " " ~ ((row.gaps | join(', ')) or t('macros.layout.none')), anchor=row.id) }}{% endfor %}

{{ t('tasks.feature-analysis.precondition') }}

{% for row in feature.preconditions %}{% else %}{% endfor %}
{{ t('tasks.feature-analysis.body') }}{{ t('tasks.feature-analysis.evidence') }}
{{ row.description | inline_code }}{{ row.currentCodeEvidence | code_evidence }}
{{ t('tasks.feature-analysis.nothing-was-recorded') }}

{{ t('tasks.feature-analysis.state-once-it-is-done') }}

{% for row in feature.postconditions %}{% else %}{% endfor %}
{{ t('tasks.feature-analysis.body') }}{{ t('tasks.feature-analysis.evidence') }}
{{ row.description | inline_code }}{{ row.currentCodeEvidence | code_evidence }}
{{ t('tasks.feature-analysis.nothing-was-recorded') }}

{{ t('tasks.feature-analysis.permissions-and-flags') }}

{% for row in feature.permissionsAndFlags %}{% else %}{% endfor %}
{{ t('tasks.feature-analysis.body') }}{{ t('tasks.feature-analysis.evidence') }}
{{ row.description | inline_code }}{{ row.currentCodeEvidence | code_evidence }}
{{ t('tasks.feature-analysis.nothing-was-recorded') }}

{{ t('tasks.feature-analysis.non-functional-concerns') }}

{% for row in feature.nonFunctionalConcerns %}{% else %}{% endfor %}
{{ t('tasks.feature-analysis.body') }}{{ t('tasks.feature-analysis.evidence') }}
{{ row.description | inline_code }}{{ row.currentCodeEvidence | code_evidence }}
{{ t('tasks.feature-analysis.nothing-was-recorded') }}
{{ analysis_review(analysisReviewIds) }} {% endblock %}