Skip to main content
rula-reba-assessor Rapid Upper Limb Assessment (RULA) and Rapid Entire Body Assessment (REBA) skill for posture evaluation.
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/a5c-ai/babysitter --skill rula-reba-assessor명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... 이 저장소의 다른 Skills Reference for querying the Atlas knowledge graph through its MCP tools — the SECONDARY enrichment/comparison layer that adds best-practice context to systems you have ALREADY scanned from your real sources (`az`, repos, dirs). Use when you need to look up nodes, edges, kinds, clusters, stats, or wiki pages in Atlas to compare against your real inventory. (atlas graph, query atlas, atlas mcp, search the graph, graph neighbors, atlas record, atlas kinds, enrichment layer)
Atlas turns your STATED NEED into a real systems atlas by SCANNING your actual sources (Azure via `az`, git repos, local dirs) and process/data mining them, THEN enriching against the Atlas knowledge graph. Use this skill when asked to inventory/map your real systems, scan your cloud + repos + directories, mine the real processes or data they contain, or collect their real constraints/gotchas. (atlas, scan my systems, inventory our azure account, map my repos, real systems atlas, process mining, data mining, collect nuances, system discovery)
assimilate-popular-workflows This skill should be used when the user asks to "find skills in the wild", "assimilate popular workflows", "discover SKILL.md files in repos", "research external skills", "find workflow patterns", "survey the skill landscape", "what skills exist out there", or wants to investigate public repositories for extractable processes, babysitter plugins, and reusable procedural insights. Searches GitHub for SKILL.md files, classifies repos by archetype, and maintains structured research under docs/reference-repos/.
name rula-reba-assessor description Rapid Upper Limb Assessment (RULA) and Rapid Entire Body Assessment (REBA) skill for posture evaluation. allowed-tools Bash(*) Read Write Edit Glob Grep WebFetch metadata {"author":"babysitter-sdk","version":"1.0.0","category":"ergonomics","backlog-id":"SK-IE-021"} graph {"domains":["domain:industrial-engineering"],"skillAreas":["skill-area:statistical-analysis","skill-area:organizational-design","skill-area:data-analysis"],"roles":["role:operations-analyst","role:research-engineer"]}
rula-reba-assessor
You are rula-reba-assessor - a specialized skill for evaluating work postures using RULA and REBA methodologies.
Overview
This skill enables AI-powered posture assessment including:
RULA scoring for upper extremity tasks
REBA scoring for whole body postures
Body segment angle measurement guidance
Risk level classification
Action level determination
Photo/video-based assessment
Comparative assessment reports
Improvement recommendation generation
Capabilities
1. RULA Assessment
dataclasses dataclass
typing
:
upper_arm_angle:
upper_arm_abducted: =
shoulder_raised: =
arm_supported: =
lower_arm_angle:
working_across_midline: =
working_outside_body: =
wrist_angle:
wrist_bent_from_midline: =
wrist_twist: =
neck_angle:
neck_twisted: =
neck_side_bent: =
trunk_angle:
trunk_twisted: =
trunk_side_bent: =
legs_supported: =
muscle_use_score: =
force_load_score: =
( ):
inputs.upper_arm_angle <= :
upper_arm =
inputs.upper_arm_angle <= :
upper_arm =
inputs.upper_arm_angle <= :
upper_arm =
:
upper_arm =
inputs.shoulder_raised:
upper_arm +=
inputs.upper_arm_abducted:
upper_arm +=
inputs.arm_supported:
upper_arm -=
upper_arm = ( , ( , upper_arm))
<= inputs.lower_arm_angle <= :
lower_arm =
:
lower_arm =
inputs.working_across_midline inputs.working_outside_body:
lower_arm +=
lower_arm = ( , lower_arm)
inputs.wrist_angle == :
wrist =
(inputs.wrist_angle) <= :
wrist =
:
wrist =
inputs.wrist_bent_from_midline:
wrist +=
wrist = ( , wrist)
wrist_twist = inputs.wrist_twist ==
table_a = get_table_a_score(upper_arm, lower_arm, wrist, wrist_twist)
inputs.neck_angle <= :
neck =
inputs.neck_angle <= :
neck =
inputs.neck_angle <= :
neck =
:
neck =
inputs.neck_twisted:
neck +=
inputs.neck_side_bent:
neck +=
neck = ( , neck)
inputs.trunk_angle == :
trunk =
inputs.trunk_angle <= :
trunk =
inputs.trunk_angle <= :
trunk =
:
trunk =
inputs.trunk_twisted:
trunk +=
inputs.trunk_side_bent:
trunk +=
trunk = ( , trunk)
legs = inputs.legs_supported
table_b = get_table_b_score(neck, trunk, legs)
posture_a = table_a + inputs.muscle_use_score + inputs.force_load_score
posture_b = table_b + inputs.muscle_use_score + inputs.force_load_score
final_score = get_table_c_score(posture_a, posture_b)
{
: final_score,
: table_a,
: table_b,
: posture_a,
: posture_b,
: {
: upper_arm,
: lower_arm,
: wrist,
: wrist_twist,
: neck,
: trunk,
: legs
},
: get_rula_action_level(final_score)
}
( ):
score <= :
{ : , : }
score <= :
{ : , : }
score <= :
{ : , : }
:
{ : , : }
from
import
from
import
Optional
@dataclass
class
RULAInput
float
bool
False
bool
False
bool
False
float
bool
False
bool
False
float
bool
False
str
"mid"
float
bool
False
bool
False
float
bool
False
bool
False
bool
True
int
0
int
0
def
calculate_rula
inputs: RULAInput
"""
Calculate RULA score
"""
if
20
1
elif
45
2
elif
90
3
else
4
if
1
if
1
if
1
max
1
min
6
if
60
100
1
else
2
if
or
1
min
3
if
0
1
elif
abs
15
2
else
3
if
1
min
4
1
if
"mid"
else
2
if
10
1
elif
20
2
elif
45
3
else
4
if
1
if
1
min
6
if
0
1
elif
20
2
elif
60
3
else
4
if
1
if
1
min
6
1
if
else
2
return
"final_score"
"group_a_score"
"group_b_score"
"posture_a"
"posture_b"
"component_scores"
"upper_arm"
"lower_arm"
"wrist"
"wrist_twist"
"neck"
"trunk"
"legs"
"action_level"
def
get_rula_action_level
score
if
2
return
"level"
1
"action"
"Posture acceptable if not maintained for long periods"
elif
4
return
"level"
2
"action"
"Further investigation needed, changes may be required"
elif
6
return
"level"
3
"action"
"Investigation and changes required soon"
else
return
"level"
4
"action"
"Investigation and changes required immediately"
2. REBA Assessment @dataclass
class REBAInput :
trunk_angle: float
trunk_twisted: bool = False
trunk_side_bent: bool = False
neck_angle: float
neck_twisted: bool = False
neck_side_bent: bool = False
legs_bilateral: bool = True
knee_flexion: float = 0
upper_arm_angle: float
shoulder_raised: bool = False
upper_arm_abducted: bool = False
arm_supported: bool = False
lower_arm_angle: float
wrist_angle: float
wrist_twisted: bool = False
load_kg: float = 0
shock_or_rapid: bool = False
coupling: str = "good"
static_posture: bool = False
repeated_actions: bool = False
rapid_changes: bool = False
def calculate_reba (inputs: REBAInput ):
"""
Calculate REBA score
"""
if inputs.trunk_angle == 0 :
trunk = 1
elif abs (inputs.trunk_angle) <= 20 :
trunk = 2
elif 20 < inputs.trunk_angle <= 60 :
trunk = 3
else :
trunk = 4
if inputs.trunk_twisted:
trunk += 1
if inputs.trunk_side_bent:
trunk += 1
if 0 <= inputs.neck_angle <= 20 :
neck = 1
else :
neck = 2
if inputs.neck_twisted or inputs.neck_side_bent:
neck += 1
legs = 1 if inputs.legs_bilateral else 2
if 30 <= inputs.knee_flexion <= 60 :
legs += 1
elif inputs.knee_flexion > 60 :
legs += 2
table_a = get_reba_table_a(trunk, neck, legs)
if inputs.load_kg < 5 :
load = 0
elif inputs.load_kg <= 10 :
load = 1
else :
load = 2
if inputs.shock_or_rapid:
load += 1
score_a = table_a + load
if inputs.upper_arm_angle <= 20 :
upper_arm = 1
elif inputs.upper_arm_angle <= 45 :
upper_arm = 2
elif inputs.upper_arm_angle <= 90 :
upper_arm = 3
else :
upper_arm = 4
if inputs.shoulder_raised or inputs.upper_arm_abducted:
upper_arm += 1
if inputs.arm_supported:
upper_arm -= 1
if 60 <= inputs.lower_arm_angle <= 100 :
lower_arm = 1
else :
lower_arm = 2
if abs (inputs.wrist_angle) <= 15 :
wrist = 1
else :
wrist = 2
if inputs.wrist_twisted:
wrist += 1
table_b = get_reba_table_b(upper_arm, lower_arm, wrist)
coupling_scores = {"good" : 0 , "fair" : 1 , "poor" : 2 , "unacceptable" : 3 }
coupling = coupling_scores.get(inputs.coupling.lower(), 0 )
score_b = table_b + coupling
table_c = get_reba_table_c(score_a, score_b)
activity = 0
if inputs.static_posture:
activity += 1
if inputs.repeated_actions:
activity += 1
if inputs.rapid_changes:
activity += 1
final_score = table_c + activity
return {
"final_score" : final_score,
"score_a" : score_a,
"score_b" : score_b,
"table_c" : table_c,
"activity_score" : activity,
"risk_level" : get_reba_risk_level(final_score),
"action_level" : get_reba_action_level(final_score)
}
def get_reba_risk_level (score ):
if score == 1 :
return "Negligible"
elif score <= 3 :
return "Low"
elif score <= 7 :
return "Medium"
elif score <= 10 :
return "High"
else :
return "Very High"
def get_reba_action_level (score ):
if score == 1 :
return {"level" : 0 , "action" : "None necessary" }
elif score <= 3 :
return {"level" : 1 , "action" : "May be necessary" }
elif score <= 7 :
return {"level" : 2 , "action" : "Necessary" }
elif score <= 10 :
return {"level" : 3 , "action" : "Necessary soon" }
else :
return {"level" : 4 , "action" : "Necessary NOW" }
3. Angle Measurement Guidance def get_measurement_guidance (body_part: str ):
"""
Provide guidance for measuring body segment angles
"""
guidance = {
"trunk" : {
"reference" : "Vertical line through hip" ,
"measurement_point" : "Angle between trunk and vertical" ,
"neutral" : "0 degrees (upright)" ,
"tips" : [
"Use plumb line or vertical reference" ,
"Measure at shoulder level relative to hip" ,
"Note any twisting or side bending"
]
},
"neck" : {
"reference" : "Vertical line through trunk" ,
"measurement_point" : "Angle of neck flexion/extension" ,
"neutral" : "0-10 degrees slight flexion" ,
"tips" : [
"Measure from ear to shoulder alignment" ,
"Note if looking up (extension) or down (flexion)" ,
"Check for rotation and side bending"
]
},
"upper_arm" : {
"reference" : "Vertical line through shoulder" ,
"measurement_point" : "Angle of upper arm from vertical" ,
"neutral" : "0-20 degrees" ,
"tips" : [
"Measure from shoulder joint" ,
"Note if arm is in front or behind body" ,
"Check for shoulder elevation and abduction"
]
},
"lower_arm" : {
"reference" : "Upper arm position" ,
"measurement_point" : "Angle at elbow joint" ,
"neutral" : "60-100 degrees (elbow bent)" ,
"tips" : [
"Measure elbow flexion angle" ,
"Note if forearm crosses body midline"
]
},
"wrist" : {
"reference" : "Neutral forearm position" ,
"measurement_point" : "Angle of wrist flexion/extension" ,
"neutral" : "0 degrees (straight)" ,
"tips" : [
"Measure deviation from straight line with forearm" ,
"Note radial/ulnar deviation" ,
"Check for wrist rotation"
]
}
}
return guidance.get(body_part.lower(), {"error" : "Unknown body part" })
4. Comparative Assessment def compare_postures (assessments: list , method: str = "RULA" ):
"""
Compare multiple posture assessments
"""
comparisons = []
for assessment in assessments:
if method == "RULA" :
result = calculate_rula(assessment['inputs' ])
else :
result = calculate_reba(assessment['inputs' ])
comparisons.append({
"name" : assessment.get('name' , 'Unnamed' ),
"description" : assessment.get('description' , '' ),
"score" : result['final_score' ],
"action_level" : result['action_level' ],
"component_scores" : result.get('component_scores' , {})
})
comparisons.sort(key=lambda x: x['score' ])
if len (comparisons) > 1 :
baseline = comparisons[-1 ]
best = comparisons[0 ]
improvement = {
"score_reduction" : baseline['score' ] - best['score' ],
"baseline" : baseline['name' ],
"best_option" : best['name' ]
}
else :
improvement = None
return {
"method" : method,
"comparisons" : comparisons,
"improvement_potential" : improvement
}
5. Recommendation Generator def generate_posture_recommendations (result: dict , method: str = "RULA" ):
"""
Generate specific recommendations based on assessment
"""
recommendations = []
component_scores = result.get('component_scores' , {})
if method == "RULA" :
if component_scores.get('upper_arm' , 0 ) >= 3 :
recommendations.append({
"body_part" : "Upper Arm" ,
"issue" : "Upper arm elevation too high" ,
"suggestions" : [
"Lower work surface" ,
"Raise worker platform" ,
"Bring work closer to body"
]
})
if component_scores.get('wrist' , 0 ) >= 3 :
recommendations.append({
"body_part" : "Wrist" ,
"issue" : "Excessive wrist deviation" ,
"suggestions" : [
"Use ergonomic tools with inline grip" ,
"Adjust work angle" ,
"Redesign workstation layout"
]
})
if component_scores.get('neck' , 0 ) >= 3 :
recommendations.append({
"body_part" : "Neck" ,
"issue" : "Neck flexion or extension excessive" ,
"suggestions" : [
"Position work at eye level" ,
"Use document holders" ,
"Adjust monitor height"
]
})
if component_scores.get('trunk' , 0 ) >= 3 :
recommendations.append({
"body_part" : "Trunk" ,
"issue" : "Forward bending or twisting" ,
"suggestions" : [
"Raise work surface" ,
"Eliminate need to reach" ,
"Provide adjustable seating"
]
})
return {
"action_level" : result['action_level' ],
"recommendations" : recommendations,
"priority" : recommendations[0 ]['body_part' ] if recommendations else None
}
Process Integration This skill integrates with the following processes:
ergonomic-risk-assessment.js
workstation-design-optimization.js
Output Format {
"method" : "RULA" ,
"final_score" : 5 ,
"action_level" : {
"level" : 3 ,
"action" : "Investigation and changes required soon"
} ,
"component_scores" : {
"upper_arm" : 3 ,
"lower_arm" : 2 ,
"wrist" : 3 ,
"neck" : 2 ,
"trunk" : 3
} ,
"recommendations" : [
{
"body_part" : "Upper Arm" ,
"suggestions" : [ "Lower work surface" ]
}
]
}
Best Practices
Assess worst posture - Evaluate most strenuous position
Multiple observations - Assess several cycles
Use photos/video - Capture postures for analysis
Train observers - Ensure consistent scoring
Compare before/after - Validate improvements
Consider task duration - Factor in exposure time
Constraints
Subjective measurement requires training
Snap assessment - may miss variations
Does not account for all risk factors
Use with other tools for complete analysis