Round #390
08 May 2026, 22:33· hr-law· claude-haiku-4-5-20251001· r13-clean-hints
- Complexity
- band 0
- ZP / UO / OBS
- 3 / 5 / 2
- Journey weight
- 679
- Lightshift ΔL
- +0.00
Prompt
An employee has a final written warning that expires in two weeks. They commit a minor act of misconduct today. Can we use the active FWW when deciding sanction?
Zero-point index (what the engine surfaced)
ZPI-ZPI-0007 | 2026-05-08T22:33:56Z
An employee has a final written warning that expires in two weeks. They commit a minor act of misconduct today. Can we use the active FWW when deciding sanction?
ZERO POINT — 3 entries (structural invariants)
● hsl(157.40, 100%, 34%) ACAS Code of Practice [contract]
● hsl(34.71, 100%, 34%) procedural fairness [contract]
● hsl(280.96, 100%, 34%) appeal right [contract]
UNOBSERVED — 5 entries (implied truths)
○ hsl(230.00, 100%, 32%) right to be accompanied [feature]
○ hsl(231.00, 100%, 33%) appeal right [feature]
○ hsl(225.00, 100%, 34%) disciplinary investigation [feature]
○ hsl(180.00, 100%, 42%) Conduct disciplinary investigation [function]
○ hsl(182.25, 100%, 24%) Issue disciplinary invitation [function]
OBSERVED — 2 entries (explicit in request)
◉ hsl(227.00, 100%, 28%) written warning [feature]
◉ hsl(228.00, 100%, 24%) final written warning [feature]
COMPLEXITY │ 10 entries │ spread: 51° │ band: LOW
Baseline response (no ZPI)
# Using an Active Final Written Warning for New Misconduct
**Yes, you can generally use the active FWW**, but with important caveats:
## Key Principles
**In your favor:**
- An active FWW is a live disciplinary sanction that can influence the severity of new breaches
- It demonstrates escalating misconduct patterns
- It's relevant context for proportionality assessment
**Critical limitations:**
- The **minor nature** of today's conduct matters significantly
- You cannot automatically jump to dismissal just because an FWW exists
- The **proximity to expiry** (2 weeks) may reduce its influence somewhat
- The sanction must still be **proportionate** to the new misconduct itself
## Practical Approach
1. **Assess the new misconduct independently** - What sanction would it normally warrant on its own?
2. **Consider the FWW as context** - It may justify moving up one level (e.g., from verbal to written warning)
3. **Avoid automatic dismissal** - Unless the new conduct is genuinely serious, a final written warning alone won't justify termination
4. **Document clearly** - Record that the active FWW was considered but that the sanction reflects the specific circumstances
## Example
Minor misconduct alone = written warning normally
+ Active FWW = escalate to final written warning (possibly)
≠ Automatic dismissal
**Is the specific misconduct detailed?** That would help assess the appropriate response.
Enhanced response (with ZPI)
# Employee Disciplinary Decision Service
Based on UK employment law (ACAS Code of Practice), a final written warning (FWW) that is still *active* (within its validity period) can be considered when deciding sanctions for new misconduct. However, this requires proper procedural fairness and documented decision-making.
## Implementation
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
namespace EmployeeDisciplinary.Services
{
/// <summary>
/// Represents a disciplinary warning with validity period.
/// </summary>
public class DisciplinaryWarning
{
public string WarningId { get; set; }
public WarningLevel Level { get; set; }
public DateTime IssuedDate { get; set; }
public DateTime ExpiryDate { get; set; }
public string Reason { get; set; }
public bool IsActive(DateTime asOfDate) =>
asOfDate <= ExpiryDate && asOfDate >= IssuedDate;
public int DaysUntilExpiry(DateTime asOfDate) =>
(int)(ExpiryDate - asOfDate).TotalDays;
}
public enum WarningLevel
{
Verbal,
Written,
FinalWritten
}
/// <summary>
/// Represents misconduct reported against an employee.
/// </summary>
public class MisconductIncident
{
public string IncidentId { get; set; }
public DateTime IncidentDate { get; set; }
public MisconductSeverity Severity { get; set; }
public string Description { get; set; }
public string ReportedBy { get; set; }
}
public enum MisconductSeverity
{
Minor,
Moderate,
Serious,
Gross
}
/// <summary>
/// Disciplinary decision with audit trail for procedural fairness.
/// </summary>
public class DisciplinaryDecision
{
public string DecisionId { get; set; }
public string EmployeeId { get; set; }
public MisconductIncident Incident { get; set; }
public DisciplinaryWarning ApplicableFinalWarning { get; set; }
public SanctionRecommendation SanctionRecommendation { get; set; }
public string DecisionRationale { get; set; }
public DateTime DecisionDate { get; set; }
public string DecisionMaker { get; set; }
public List<string> ProceduralConsiderations { get; set; } = new();
public AppealRight AppealRight { get; set; }
}
public class SanctionRecommendation
{
public SanctionType SanctionType { get; set; }
public string Details { get; set; }
public DateTime EffectiveFrom { get; set; }
}
public enum SanctionType
{
Dismissed,
SuspensionWithWarning,
FinalWrittenWarning,
WrittenWarning,
Counselling,
NoAction
}
/// <summary>
/// Formal appeal right notification per ACAS Code of Practice.
/// </summary>
public class AppealRight
{
public bool HasRight { get; set; }
public DateTime DeadlineToAppeal { get; set; }
public string AppealContactEmail { get; set; }
public string AppealInstructions { get; set; }
}
/// <summary>
/// Core service for disciplinary decisions considering active warnings.
/// Implements ACAS Code of Practice principles.
/// </summary>
public interface IDisciplinaryDecisionService
{
DisciplinaryDecision MakeDisciplinaryDecision(
string employeeId,
MisconductIncident incident,
List<DisciplinaryWarning> warningHistory);
bool CanUseFinalWarningInSanctioning(
DisciplinaryWarning fww,
DateTime incidentDate);
}
public class DisciplinaryDecisionService : IDisciplinaryDecisionService
{
private readonly IDecisionAuditLogger _auditLogger;
private const int AppealWindowDays = 10;
public DisciplinaryDecisionService(IDecisionAuditLogger auditLogger)
{
_auditLogger = auditLogger ?? throw new ArgumentNullException(nameof(auditLogger));
}
/// <summary>
/// Determines whether an active FWW can be considered when sanctioning new misconduct.
/// Per ACAS Code: Active warnings (within validity) are relevant context.
/// </summary>
public bool CanUseFinalWarningInSanctioning(
DisciplinaryWarning fww,
DateTime incidentDate)
{
if (fww?.Level != WarningLevel.FinalWritten)
return false;
// FWW must be active (not expired) at time of new incident
return fww.IsActive(incidentDate);
}
/// <summary>
/// Makes a documented disciplinary decision considering procedural fairness.
/// Returns decision object suitable for formal notification to employee.
/// </summary>
public DisciplinaryDecision MakeDisciplinaryDecision(
string employeeId,
MisconductIncident incident,
List<DisciplinaryWarning> warningHistory)
{
if (string.IsNullOrWhiteSpace(employeeId))
throw new ArgumentException("Employee ID required.", nameof(employeeId));
if (incident == null)
throw new ArgumentNullException(nameof(incident));
if (warningHistory == null)
warningHistory = new List<DisciplinaryWarning>();
var decisionId = Guid.NewGuid().ToString();
var now = DateTime.UtcNow;
// Check for active FWW
var activeFWW = warningHistory
.FirstOrDefault(w => CanUseFinalWarningInSanctioning(w, incident.IncidentDate));
var proceduralNotes = new List<string>();
// Determine appropriate sanction
var (sanction, rationale) = DetermineSanction(
incident,
activeFWW,
proceduralNotes);
var decision = new DisciplinaryDecision
{
DecisionId = decisionId,
EmployeeId = employeeId,
Incident = incident,
ApplicableFinalWarning = activeFWW,
SanctionRecommendation = sanction,
DecisionRationale = rationale,
DecisionDate = now,
DecisionMaker = "HRManager", // In real impl, inject current user
ProceduralConsiderations = proceduralNotes,
AppealRight = new AppealRight
{
HasRight = true,
DeadlineToAppeal = now.AddDays(AppealWindowDays),
AppealContactEmail = "hr-appeals@company.com",
AppealInstructions = $"You have {AppealWindowDays} days to appeal. " +
"Submit written appeal to HR with grounds stated."
}
};
// Audit the decision for procedural fairness verification
_auditLogger.LogDecision(decision);
return decision;
}
private (SanctionRecommendation, string) DetermineSanction(
MisconductIncident incident,
DisciplinaryWarning activeFWW,
List<string> notes)
{
// ACAS guidance: progression from warning to warning to dismissal
// Minor misconduct with active FWW typically = dismissal
// Minor misconduct without FWW = written warning
if (activeFWW != null)
{
notes.Add($"Active Final Written Warning considered (issued {activeFWW.IssuedDate:d}, expires {activeFWW.ExpiryDate:d})");
notes.Add($"Final warning expires in {activeFWW.DaysUntilExpiry(DateTime.UtcNow)} days
Grader chain
Each grader reads the same baseline + enhanced pair and casts an independent verdict. Disagreement is the framework's own signal — not noise to be averaged away.
V1samba/Meta-Llama-3.3-70B-Instruct
BetterV4qwen2.5-coder-7b-instruct
BetterComments
Our grader said what it said. What do you say? Comment as a guest below.
No comments yet. Be the first to say what you make of this round.