@@ -27,22 +27,23 @@ async def init_db():
2727 await conn .run_sync (SQLModel .metadata .create_all )
2828 logger .info ("database_initialized" , url = settings .DATABASE_URL )
2929
30- async def get_user_reliability (user_id : str ) -> tuple [float , str | None ]:
30+ async def get_user_reliability (user_id : str ) -> tuple [float , str | None , int ]:
3131 """
32- Fetch the reliability score and slack_id for a given user using SQLModel .
32+ Fetch the reliability score, slack_id, and consecutive firm intervetions .
3333 """
3434 async with AsyncSessionLocal () as session :
3535 statement = select (UserHistory ).where (UserHistory .user_id == user_id )
3636 results = await session .execute (statement )
3737 user = results .scalar_one_or_none ()
3838
3939 if user :
40- return user .reliability_score , user .slack_id
41- return 100.0 , None
40+ return user .reliability_score , user .slack_id , user . consecutive_firm_interventions
41+ return 100.0 , None , 0
4242
43- async def update_user_reliability (user_id : str , was_failure : bool ):
43+
44+ async def update_user_reliability (user_id : str , was_failure : bool , tone_used : str = "supportive" ):
4445 """
45- Update historical stats using SQLModel/SQLAlchemy .
46+ Update historical stats and track ethical Tone-Damping status .
4647 """
4748 async with AsyncSessionLocal () as session :
4849 statement = select (UserHistory ).where (UserHistory .user_id == user_id )
@@ -61,11 +62,20 @@ async def update_user_reliability(user_id: str, was_failure: bool):
6162 if was_failure :
6263 user .failed_commitments += 1
6364
65+ # Ethical Counter Management
66+ if tone_used in ["firm" , "confrontational" ]:
67+ user .consecutive_firm_interventions += 1
68+ user .last_intervention_at = datetime .now ().isoformat ()
69+ else :
70+ # Cooling-off logic: Reset counter if a supportive/neutral tone is successfuly used
71+ user .consecutive_firm_interventions = 0
72+
6473 # Calculate new score
6574 user .reliability_score = ((user .total_commitments - user .failed_commitments ) / user .total_commitments ) * 100
6675
6776 await session .commit ()
68- logger .info ("reliability_updated" , user_id = user_id , new_score = user .reliability_score )
77+ logger .info ("reliability_updated" , user_id = user_id , new_score = user .reliability_score , consecutive_strict = user .consecutive_firm_interventions )
78+
6979
7080async def set_slack_id (user_id : str , slack_id : str ):
7181 """
0 commit comments